Skip to content

Commit e8abd52

Browse files
authored
Git - provideOriginalResource() should handle symbolic links (microsoft#249920)
1 parent 8ce0cc5 commit e8abd52

File tree

1 file changed

+24
-4
lines changed

1 file changed

+24
-4
lines changed

extensions/git/src/repository.ts

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import TelemetryReporter from '@vscode/extension-telemetry';
77
import * as fs from 'fs';
88
import * as path from 'path';
99
import picomatch from 'picomatch';
10-
import { CancellationError, CancellationToken, CancellationTokenSource, Command, commands, Disposable, Event, EventEmitter, FileDecoration, l10n, LogLevel, LogOutputChannel, Memento, ProgressLocation, ProgressOptions, QuickDiffProvider, RelativePattern, scm, SourceControl, SourceControlInputBox, SourceControlInputBoxValidation, SourceControlInputBoxValidationType, SourceControlResourceDecorations, SourceControlResourceGroup, SourceControlResourceState, TabInputNotebookDiff, TabInputTextDiff, TabInputTextMultiDiff, ThemeColor, Uri, window, workspace, WorkspaceEdit } from 'vscode';
10+
import { CancellationError, CancellationToken, CancellationTokenSource, Command, commands, Disposable, Event, EventEmitter, FileDecoration, FileType, l10n, LogLevel, LogOutputChannel, Memento, ProgressLocation, ProgressOptions, QuickDiffProvider, RelativePattern, scm, SourceControl, SourceControlInputBox, SourceControlInputBoxValidation, SourceControlInputBoxValidationType, SourceControlResourceDecorations, SourceControlResourceGroup, SourceControlResourceState, TabInputNotebookDiff, TabInputTextDiff, TabInputTextMultiDiff, ThemeColor, Uri, window, workspace, WorkspaceEdit } from 'vscode';
1111
import { ActionButton } from './actionButton';
1212
import { ApiRepository } from './api/api1';
1313
import { Branch, BranchQuery, Change, CommitOptions, FetchOptions, ForcePushMode, GitErrorCodes, LogOptions, Ref, RefType, Remote, Status } from './api/git';
@@ -1024,11 +1024,19 @@ export class Repository implements Disposable {
10241024
return l10n.t('Git Local Changes (Working Tree)');
10251025
}
10261026

1027-
provideOriginalResource(uri: Uri): Uri | undefined {
1027+
async provideOriginalResource(uri: Uri): Promise<Uri | undefined> {
10281028
this.logger.trace(`[Repository][provideOriginalResource] Resource: ${uri.toString()}`);
10291029

10301030
if (uri.scheme !== 'file') {
1031-
return;
1031+
this.logger.trace(`[Repository][provideOriginalResource] Resource is not a file: ${uri.scheme}`);
1032+
return undefined;
1033+
}
1034+
1035+
// Ignore symbolic links
1036+
const stat = await workspace.fs.stat(uri);
1037+
if ((stat.type & FileType.SymbolicLink) !== 0) {
1038+
this.logger.trace(`[Repository][provideOriginalResource] Resource is a symbolic link: ${uri.toString()}`);
1039+
return undefined;
10321040
}
10331041

10341042
// Ignore path that is not inside the current repository
@@ -2836,9 +2844,21 @@ export class StagedResourceQuickDiffProvider implements QuickDiffProvider {
28362844
private readonly logger: LogOutputChannel
28372845
) { }
28382846

2839-
provideOriginalResource(uri: Uri): Uri | undefined {
2847+
async provideOriginalResource(uri: Uri): Promise<Uri | undefined> {
28402848
this.logger.trace(`[StagedResourceQuickDiffProvider][provideOriginalResource] Resource: ${uri.toString()}`);
28412849

2850+
if (uri.scheme !== 'file') {
2851+
this.logger.trace(`[StagedResourceQuickDiffProvider][provideOriginalResource] Resource is not a file: ${uri.scheme}`);
2852+
return undefined;
2853+
}
2854+
2855+
// Ignore symbolic links
2856+
const stat = await workspace.fs.stat(uri);
2857+
if ((stat.type & FileType.SymbolicLink) !== 0) {
2858+
this.logger.trace(`[StagedResourceQuickDiffProvider][provideOriginalResource] Resource is a symbolic link: ${uri.toString()}`);
2859+
return undefined;
2860+
}
2861+
28422862
// Ignore resources that are not in the index group
28432863
if (!this._repository.indexGroup.resourceStates.some(r => pathEquals(r.resourceUri.fsPath, uri.fsPath))) {
28442864
this.logger.trace(`[StagedResourceQuickDiffProvider][provideOriginalResource] Resource is not part of a index group: ${uri.toString()}`);

0 commit comments

Comments
 (0)