提交 564b9a8a 编写于 作者: J Joao Moreno

🐛 isolate git uri handling

fixes #23297
上级 0a7bd0a1
......@@ -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') {
......
......@@ -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 '';
}
......
......@@ -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 {
......
/*---------------------------------------------------------------------------------------------
* 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
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册