Skip to content
This repository was archived by the owner on Sep 30, 2024. It is now read-only.

Commit 617599b

Browse files
authored
fix(svelte): Preserve selected lines in codehost URL (#63334)
1 parent 7396ee0 commit 617599b

File tree

5 files changed

+80
-22
lines changed

5 files changed

+80
-22
lines changed

client/web-sveltekit/src/lib/repo/HistoryPanel.svelte

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
}
6464
6565
$: selectedRev = $page.url?.searchParams.get('rev')
66+
$: diffEnabled = $page.url?.searchParams.has('diff')
6667
$: closeURL = SourcegraphURL.from($page.url).deleteSearchParameter('rev', 'diff').toString()
6768
</script>
6869

@@ -89,8 +90,8 @@
8990
<td><Timestamp date={new Date(commit.author.date)} strict /></td>
9091
{#if enableViewAtCommit}
9192
<td>
92-
<Tooltip tooltip={selected ? 'Close commit' : 'View at commit'}>
93-
<a href={selected ? closeURL : `?rev=${commit.oid}`}
93+
<Tooltip tooltip={selected && !diffEnabled ? 'Close commit' : 'View at commit'}>
94+
<a href={selected && !diffEnabled ? closeURL : `?rev=${commit.oid}`}
9495
><Icon icon={ILucideFileText} inline aria-hidden /></a
9596
>
9697
</Tooltip>
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import type { LineOrPositionOrRange } from '$lib/common'
2+
import { ExternalServiceKind, type ExternalLink } from '$lib/graphql-types'
3+
4+
interface GetExternalURLOptions {
5+
externalLink: Pick<ExternalLink, 'url' | 'serviceKind'>
6+
lineOrPosition?: LineOrPositionOrRange
7+
}
8+
9+
/**
10+
* Extends the external link with additional information depending on the service kind.
11+
*
12+
* @param externalLink The external link to process.
13+
* @param lineOrPosition The line or position to add to the external link.
14+
* @returns The external URL.
15+
*/
16+
export function getExternalURL({ externalLink, lineOrPosition }: GetExternalURLOptions): string {
17+
let url = externalLink.url
18+
19+
switch (externalLink.serviceKind) {
20+
case ExternalServiceKind.GITHUB: {
21+
// Add range or position path to the code host URL.
22+
if (lineOrPosition?.line !== undefined) {
23+
url += `#L${lineOrPosition.line}`
24+
25+
if (lineOrPosition.endLine) {
26+
url += `-L${lineOrPosition.endLine}`
27+
}
28+
}
29+
break
30+
}
31+
case ExternalServiceKind.GITLAB: {
32+
// Add range or position path to the code host URL.
33+
if (lineOrPosition?.line !== undefined) {
34+
url += `#L${lineOrPosition.line}`
35+
36+
if (lineOrPosition.endLine) {
37+
url += `-${lineOrPosition.endLine}`
38+
}
39+
}
40+
break
41+
}
42+
}
43+
44+
return url
45+
}

client/web-sveltekit/src/routes/[...repo=reporev]/(validrev)/(code)/-/blob/[...path]/DiffView.svelte

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@
1919
</script>
2020

2121
<FileHeader type="blob" repoName={data.repoName} revision={data.revision} path={data.filePath}>
22-
{#if $commit.value?.blob}
23-
<FileIcon slot="icon" file={$commit.value.blob} inline />
24-
{/if}
22+
<svelte:fragment slot="icon">
23+
{#if $commit.value?.blob}
24+
<FileIcon file={$commit.value.blob} inline />
25+
{/if}
26+
</svelte:fragment>
2527
</FileHeader>
2628

2729
<div class="info">

client/web-sveltekit/src/routes/[...repo=reporev]/(validrev)/(code)/-/blob/[...path]/FileView.svelte

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
import { renderMermaid } from '$lib/repo/mermaid'
2222
import OpenInEditor from '$lib/repo/open-in-editor/OpenInEditor.svelte'
2323
import Permalink from '$lib/repo/Permalink.svelte'
24-
import { createCodeIntelAPI } from '$lib/shared'
24+
import { createCodeIntelAPI, replaceRevisionInURL } from '$lib/shared'
2525
import { isLightTheme, settings } from '$lib/stores'
2626
import { TELEMETRY_RECORDER } from '$lib/telemetry'
2727
import { createPromiseStore, formatBytes } from '$lib/utils'
@@ -85,6 +85,10 @@
8585
$: showFileModeSwitcher = blob && !isBinaryFile && !embedded
8686
$: showFormattedView = isRichFile && fileViewModeFromURL === CodeViewMode.Default
8787
$: showBlameView = fileViewModeFromURL === CodeViewMode.Blame
88+
$: rawURL = (function () {
89+
const url = `${repoURL}/-/raw/${filePath}`
90+
return revisionOverride ? replaceRevisionInURL(url, revisionOverride.abbreviatedOID) : url
91+
})()
8892
8993
$: codeIntelAPI =
9094
!isBinaryFile && !showFormattedView && !disableCodeIntel
@@ -148,26 +152,24 @@
148152
<slot name="actions" />
149153
</svelte:fragment>
150154
</FileHeader>
151-
{:else if revisionOverride}
152-
<FileHeader type="blob" repoName={data.repoName} path={data.filePath} {revision}>
153-
<FileIcon slot="icon" file={blob} inline />
154-
</FileHeader>
155155
{:else}
156156
<FileHeader type="blob" repoName={data.repoName} path={data.filePath} {revision}>
157157
<FileIcon slot="icon" file={blob} inline />
158158
<svelte:fragment slot="actions">
159-
{#await data.externalServiceType then externalServiceType}
160-
{#if externalServiceType && !isBinaryFile}
161-
<OpenInEditor {externalServiceType} updateUserSetting={data.updateUserSetting} />
162-
{/if}
163-
{/await}
159+
{#if !revisionOverride}
160+
{#await data.externalServiceType then externalServiceType}
161+
{#if externalServiceType && !isBinaryFile}
162+
<OpenInEditor {externalServiceType} updateUserSetting={data.updateUserSetting} />
163+
{/if}
164+
{/await}
165+
{/if}
164166
{#if blob}
165-
<OpenInCodeHostAction data={blob} />
167+
<OpenInCodeHostAction data={blob} lineOrPosition={data.lineOrPosition} />
166168
{/if}
167169
<Permalink {commitID} />
168170
</svelte:fragment>
169171
<svelte:fragment slot="actionmenu">
170-
<MenuLink href="{repoURL}/-/raw/{filePath}" target="_blank">
172+
<MenuLink href={rawURL} target="_blank">
171173
<Icon icon={ILucideEye} inline aria-hidden /> View raw
172174
</MenuLink>
173175
<MenuButton

client/web-sveltekit/src/routes/[...repo=reporev]/(validrev)/(code)/-/blob/[...path]/OpenInCodeHostAction.svelte

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,33 @@
11
<script lang="ts">
2+
import type { LineOrPositionOrRange } from '$lib/common'
23
import { getHumanNameForCodeHost } from '$lib/repo/shared/codehost'
4+
import { getExternalURL } from '$lib/repo/url'
35
import CodeHostIcon from '$lib/search/CodeHostIcon.svelte'
46
import { TELEMETRY_RECORDER } from '$lib/telemetry'
57
import Tooltip from '$lib/Tooltip.svelte'
68
79
import type { OpenInCodeHostAction } from './OpenInCodeHostAction.gql'
810
911
export let data: OpenInCodeHostAction
12+
export let lineOrPosition: LineOrPositionOrRange | undefined = undefined
1013
1114
function handleOpenCodeHostClick(): void {
1215
TELEMETRY_RECORDER.recordEvent('repo.goToCodeHost', 'click')
1316
}
1417
</script>
1518

16-
{#each data.externalURLs as { url, serviceKind } (url)}
19+
{#each data.externalURLs as externalLink (externalLink.url)}
1720
<Tooltip tooltip="Open in code host">
18-
<a href={url} target="_blank" rel="noopener noreferrer" on:click={handleOpenCodeHostClick}>
19-
{#if serviceKind}
20-
<CodeHostIcon repository={serviceKind} disableTooltip />
21+
<a
22+
href={getExternalURL({ externalLink, lineOrPosition })}
23+
target="_blank"
24+
rel="noopener noreferrer"
25+
on:click={handleOpenCodeHostClick}
26+
>
27+
{#if externalLink.serviceKind}
28+
<CodeHostIcon repository={externalLink.serviceKind} disableTooltip />
2129
<span data-action-label>
22-
{getHumanNameForCodeHost(serviceKind)}
30+
{getHumanNameForCodeHost(externalLink.serviceKind)}
2331
</span>
2432
{:else}
2533
Code host

0 commit comments

Comments
 (0)