Skip to content

Commit 111449f

Browse files
Copilotalexr00
andcommitted
Fix unpredictable markdown link text when copying permalink from gutter
- Add range field to PermalinkInfo to track the range used for the permalink - Update getMarkdownLinkText to accept and use the permalink range - When copying markdown permalink, extract text from the correct line/range - Fixes issue where right-clicking gutter would use previous selection text Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com>
1 parent 9359f28 commit 111449f

File tree

2 files changed

+24
-11
lines changed

2 files changed

+24
-11
lines changed

src/issues/issueFeatureRegistrar.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,10 +1439,20 @@ ${options?.body ?? ''}\n
14391439
}
14401440
}
14411441

1442-
private getMarkdownLinkText(): string | undefined {
1442+
private getMarkdownLinkText(range?: vscode.Range | vscode.NotebookRange): string | undefined {
14431443
if (!vscode.window.activeTextEditor) {
14441444
return undefined;
14451445
}
1446+
1447+
// If a specific range is provided (e.g., from a gutter click), use that
1448+
if (range && !(range instanceof vscode.NotebookRange)) {
1449+
const text = vscode.window.activeTextEditor.document.getText(range);
1450+
if (text) {
1451+
return text;
1452+
}
1453+
}
1454+
1455+
// Otherwise fall back to the current selection
14461456
let editorSelection: vscode.Range | undefined = vscode.window.activeTextEditor.selection;
14471457
if (editorSelection.start.line !== editorSelection.end.line) {
14481458
editorSelection = new vscode.Range(
@@ -1466,7 +1476,7 @@ ${options?.body ?? ''}\n
14661476
const withPermalinks: (PermalinkInfo & { permalink: string })[] = links.filter((link): link is PermalinkInfo & { permalink: string } => !!link.permalink);
14671477

14681478
if (withPermalinks.length === 1) {
1469-
const selection = this.getMarkdownLinkText();
1479+
const selection = this.getMarkdownLinkText(withPermalinks[0].range);
14701480
if (selection) {
14711481
return vscode.env.clipboard.writeText(`[${selection.trim()}](${withPermalinks[0].permalink})`);
14721482
}

src/issues/util.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ export interface PermalinkInfo {
225225
permalink: string | undefined;
226226
error: string | undefined;
227227
originalFile: vscode.Uri | undefined;
228+
range: vscode.Range | vscode.NotebookRange | undefined;
228229
}
229230

230231
export function getSimpleUpstream(repository: Repository) {
@@ -284,12 +285,12 @@ export async function createSinglePermalink(
284285
): Promise<PermalinkInfo> {
285286
const { uri, range } = getFileAndPosition(context, positionInfo);
286287
if (!uri) {
287-
return { permalink: undefined, error: vscode.l10n.t('No active text editor position to create permalink from.'), originalFile: undefined };
288+
return { permalink: undefined, error: vscode.l10n.t('No active text editor position to create permalink from.'), originalFile: undefined, range: undefined };
288289
}
289290

290291
const repository = getRepositoryForFile(gitAPI, uri);
291292
if (!repository) {
292-
return { permalink: undefined, error: vscode.l10n.t('The current file isn\'t part of repository.'), originalFile: uri };
293+
return { permalink: undefined, error: vscode.l10n.t('The current file isn\'t part of repository.'), originalFile: uri, range };
293294
}
294295

295296
let commitHash: string | undefined;
@@ -301,7 +302,7 @@ export async function createSinglePermalink(
301302
try {
302303
const log = await repository.log({ maxEntries: 1, path: uri.fsPath });
303304
if (log.length === 0) {
304-
return { permalink: undefined, error: vscode.l10n.t('No branch on a remote contains the most recent commit for the file.'), originalFile: uri };
305+
return { permalink: undefined, error: vscode.l10n.t('No branch on a remote contains the most recent commit for the file.'), originalFile: uri, range };
305306
}
306307
// Now that we know that the file existed at some point in the repo, use the head commit to construct the URI.
307308
if (repository.state.HEAD?.commit && (log[0].hash !== repository.state.HEAD?.commit)) {
@@ -318,7 +319,7 @@ export async function createSinglePermalink(
318319

319320
const rawUpstream = await getBestPossibleUpstream(repositoriesManager, repository, commitHash);
320321
if (!rawUpstream || !rawUpstream.fetchUrl) {
321-
return { permalink: undefined, error: vscode.l10n.t('The selection may not exist on any remote.'), originalFile: uri };
322+
return { permalink: undefined, error: vscode.l10n.t('The selection may not exist on any remote.'), originalFile: uri, range };
322323
}
323324
const upstream: Remote & { fetchUrl: string } = rawUpstream as Remote & { fetchUrl: string };
324325

@@ -330,7 +331,8 @@ export async function createSinglePermalink(
330331
permalink: (`${originOfFetchUrl}/${getOwnerAndRepo(repositoriesManager, repository, upstream)}/blob/${commitHash
331332
}${includeFile ? `${encodedPathSegment}${includeRange ? rangeString(range) : ''}` : ''}`),
332333
error: undefined,
333-
originalFile: uri
334+
originalFile: uri,
335+
range
334336
};
335337
Logger.debug(`permalink generated: ${result.permalink}`, PERMALINK_COMPONENT);
336338
return result;
@@ -404,11 +406,11 @@ export async function createSingleGitHubLink(
404406
): Promise<PermalinkInfo> {
405407
const { uri, range } = getFileAndPosition(context);
406408
if (!uri) {
407-
return { permalink: undefined, error: vscode.l10n.t('No active text editor position to create permalink from.'), originalFile: undefined };
409+
return { permalink: undefined, error: vscode.l10n.t('No active text editor position to create permalink from.'), originalFile: undefined, range: undefined };
408410
}
409411
const folderManager = managers.getManagerForFile(uri);
410412
if (!folderManager) {
411-
return { permalink: undefined, error: vscode.l10n.t('Current file does not belong to an open repository.'), originalFile: undefined };
413+
return { permalink: undefined, error: vscode.l10n.t('Current file does not belong to an open repository.'), originalFile: undefined, range: undefined };
412414
}
413415
let branchName = folderManager.repository.state.HEAD?.name;
414416
if (!branchName) {
@@ -419,7 +421,7 @@ export async function createSingleGitHubLink(
419421
}
420422
const upstream = getSimpleUpstream(folderManager.repository);
421423
if (!upstream?.fetchUrl) {
422-
return { permalink: undefined, error: vscode.l10n.t('Repository does not have any remotes.'), originalFile: undefined };
424+
return { permalink: undefined, error: vscode.l10n.t('Repository does not have any remotes.'), originalFile: undefined, range: undefined };
423425
}
424426
const pathSegment = uri.path.substring(folderManager.repository.rootUri.path.length);
425427
const originOfFetchUrl = getUpstreamOrigin(upstream).replace(/\/$/, '');
@@ -428,7 +430,8 @@ export async function createSingleGitHubLink(
428430
permalink: (`${originOfFetchUrl}/${new Protocol(upstream.fetchUrl).nameWithOwner}/blob/${encodedBranchAndFilePath
429431
}${includeRange ? rangeString(range) : ''}`),
430432
error: undefined,
431-
originalFile: uri
433+
originalFile: uri,
434+
range
432435
};
433436
}
434437

0 commit comments

Comments
 (0)