mirror of
https://github.com/Microsoft/vscode
synced 2024-09-13 21:55:38 +00:00
parent
0a7bd0a19e
commit
564b9a8a1e
|
@ -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 {
|
||||
|
|
25
extensions/git/src/uri.ts
Normal file
25
extensions/git/src/uri.ts
Normal file
|
@ -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
|
||||
})
|
||||
});
|
||||
}
|
Loading…
Reference in a new issue