diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 851fb50fb17..eeccf86f2dc 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -8,6 +8,7 @@ import { Uri, commands, scm, Disposable, window, workspace, QuickPickItem, OutputChannel, Range, WorkspaceEdit, Position, LineChange, SourceControlResourceState } from 'vscode'; import { Ref, RefType, Git } from './git'; import { Model, Resource, Status, CommitOptions, WorkingTreeGroup, IndexGroup, MergeGroup } from './model'; +import { toGitUri, fromGitUri } from './uri'; import * as staging from './staging'; import * as path from 'path'; import * as os from 'os'; @@ -138,10 +139,10 @@ export class CommandCenter { switch (resource.type) { case Status.INDEX_MODIFIED: case Status.INDEX_RENAMED: - return resource.original.with({ scheme: 'git', query: 'HEAD' }); + return toGitUri(resource.original, 'HEAD'); case Status.MODIFIED: - return resource.resourceUri.with({ scheme: 'git', query: '~' }); + return toGitUri(resource.resourceUri, '~'); } } @@ -150,14 +151,12 @@ export class CommandCenter { case Status.INDEX_MODIFIED: case Status.INDEX_ADDED: case Status.INDEX_COPIED: - return resource.resourceUri.with({ scheme: 'git' }); - case Status.INDEX_RENAMED: - return resource.resourceUri.with({ scheme: 'git' }); + return toGitUri(resource.resourceUri, ''); case Status.INDEX_DELETED: case Status.DELETED: - return resource.resourceUri.with({ scheme: 'git', query: 'HEAD' }); + return toGitUri(resource.resourceUri, 'HEAD'); case Status.MODIFIED: case Status.UNTRACKED: @@ -325,7 +324,7 @@ export class CommandCenter { return; } - const originalUri = modifiedUri.with({ scheme: 'git', query: '~' }); + const originalUri = toGitUri(modifiedUri, '~'); const originalDocument = await workspace.openTextDocument(originalUri); const selections = textEditor.selections; const selectedDiffs = diffs.filter(diff => { @@ -359,7 +358,7 @@ export class CommandCenter { return; } - const originalUri = modifiedUri.with({ scheme: 'git', query: '~' }); + const originalUri = toGitUri(modifiedUri, '~'); const originalDocument = await workspace.openTextDocument(originalUri); const selections = textEditor.selections; const selectedDiffs = diffs.filter(diff => { @@ -431,7 +430,7 @@ export class CommandCenter { return; } - const originalUri = modifiedUri.with({ scheme: 'git', query: 'HEAD' }); + const originalUri = toGitUri(modifiedUri, 'HEAD'); const originalDocument = await workspace.openTextDocument(originalUri); const selections = textEditor.selections; const selectedDiffs = diffs.filter(diff => { @@ -821,7 +820,8 @@ export class CommandCenter { } if (uri.scheme === 'git') { - uri = uri.with({ scheme: 'file' }); + const { path } = fromGitUri(uri); + uri = Uri.file(path); } if (uri.scheme === 'file') { diff --git a/extensions/git/src/contentProvider.ts b/extensions/git/src/contentProvider.ts index db94790c545..38d2032e5d5 100644 --- a/extensions/git/src/contentProvider.ts +++ b/extensions/git/src/contentProvider.ts @@ -7,6 +7,7 @@ import { workspace, Uri, Disposable, Event, EventEmitter, window } from 'vscode'; import { debounce, throttle } from './decorators'; +import { fromGitUri } from './uri'; import { Model } from './model'; interface CacheRow { @@ -32,8 +33,7 @@ export class GitContentProvider { constructor(private model: Model) { this.disposables.push( model.onDidChangeRepository(this.eventuallyFireChangeEvents, this), - workspace.registerTextDocumentContentProvider('git', this), - workspace.registerTextDocumentContentProvider('git-original', this) + workspace.registerTextDocumentContentProvider('git', this) ); setInterval(() => this.cleanup(), FIVE_MINUTES); @@ -59,25 +59,17 @@ export class GitContentProvider { this.cache[cacheKey] = cacheValue; - if (uri.scheme === 'git-original') { - try { - return await this.model.show('', uri.query); - } catch (err) { - return ''; - } - } - - let ref = uri.query; + let { path, ref } = fromGitUri(uri); if (ref === '~') { - const fileUri = uri.with({ scheme: 'file', query: '' }); + const fileUri = Uri.file(path); const uriString = fileUri.toString(); const [indexStatus] = this.model.indexGroup.resources.filter(r => r.original.toString() === uriString); ref = indexStatus ? '' : 'HEAD'; } try { - return await this.model.show(ref, uri.fsPath); + return await this.model.show(ref, path); } catch (err) { return ''; } diff --git a/extensions/git/src/scmProvider.ts b/extensions/git/src/scmProvider.ts index befd5e1a93f..0786a565a47 100644 --- a/extensions/git/src/scmProvider.ts +++ b/extensions/git/src/scmProvider.ts @@ -10,6 +10,7 @@ import { Model, State } from './model'; import { StatusBarCommands } from './statusbar'; import { CommandCenter } from './commands'; import { mapEvent } from './util'; +import { toGitUri } from './uri'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); @@ -99,13 +100,7 @@ export class GitSCMProvider { return; } - // As a mitigation for extensions like ESLint showing warnings and errors - // for git URIs, let's change the file extension of these uris to .git. - return new Uri().with({ - scheme: 'git-original', - query: uri.fsPath, - path: uri.path + '.git' - }); + return toGitUri(uri, ''); } private onDidModelChange(): void { diff --git a/extensions/git/src/uri.ts b/extensions/git/src/uri.ts new file mode 100644 index 00000000000..f9390631c2c --- /dev/null +++ b/extensions/git/src/uri.ts @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { Uri } from 'vscode'; + +export function fromGitUri(uri: Uri): { path: string; ref: string; } { + return JSON.parse(uri.query); +} + +// As a mitigation for extensions like ESLint showing warnings and errors +// for git URIs, let's change the file extension of these uris to .git. +export function toGitUri(uri: Uri, ref: string): Uri { + return uri.with({ + scheme: 'git', + path: `${uri.path}.git`, + query: JSON.stringify({ + path: uri.fsPath, + ref + }) + }); +} \ No newline at end of file