mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-24 18:49:00 +01:00
diff: snappier stage
This commit is contained in:
@@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
import { workspace, Uri, Disposable, Event, EventEmitter, window } from 'vscode';
|
import { workspace, Uri, Disposable, Event, EventEmitter, window } from 'vscode';
|
||||||
import { debounce, throttle } from './decorators';
|
import { debounce, throttle } from './decorators';
|
||||||
import { fromGitUri } from './uri';
|
import { fromGitUri, toGitUri } from './uri';
|
||||||
import { Model, ModelChangeEvent } from './model';
|
import { Model, ModelChangeEvent, OriginalResourceChangeEvent } from './model';
|
||||||
import { filterEvent, eventToPromise } from './util';
|
import { filterEvent, eventToPromise } from './util';
|
||||||
|
|
||||||
interface CacheRow {
|
interface CacheRow {
|
||||||
@@ -25,8 +25,8 @@ const FIVE_MINUTES = 1000 * 60 * 5;
|
|||||||
|
|
||||||
export class GitContentProvider {
|
export class GitContentProvider {
|
||||||
|
|
||||||
private onDidChangeEmitter = new EventEmitter<Uri>();
|
private _onDidChange = new EventEmitter<Uri>();
|
||||||
get onDidChange(): Event<Uri> { return this.onDidChangeEmitter.event; }
|
get onDidChange(): Event<Uri> { return this._onDidChange.event; }
|
||||||
|
|
||||||
private changedRepositoryRoots = new Set<string>();
|
private changedRepositoryRoots = new Set<string>();
|
||||||
private cache: Cache = Object.create(null);
|
private cache: Cache = Object.create(null);
|
||||||
@@ -35,6 +35,7 @@ export class GitContentProvider {
|
|||||||
constructor(private model: Model) {
|
constructor(private model: Model) {
|
||||||
this.disposables.push(
|
this.disposables.push(
|
||||||
model.onDidChangeRepository(this.onDidChangeRepository, this),
|
model.onDidChangeRepository(this.onDidChangeRepository, this),
|
||||||
|
model.onDidChangeOriginalResource(this.onDidChangeOriginalResource, this),
|
||||||
workspace.registerTextDocumentContentProvider('git', this)
|
workspace.registerTextDocumentContentProvider('git', this)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -46,6 +47,14 @@ export class GitContentProvider {
|
|||||||
this.eventuallyFireChangeEvents();
|
this.eventuallyFireChangeEvents();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private onDidChangeOriginalResource({ uri }: OriginalResourceChangeEvent): void {
|
||||||
|
if (uri.scheme !== 'file') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._onDidChange.fire(toGitUri(uri, '', true));
|
||||||
|
}
|
||||||
|
|
||||||
@debounce(1100)
|
@debounce(1100)
|
||||||
private eventuallyFireChangeEvents(): void {
|
private eventuallyFireChangeEvents(): void {
|
||||||
this.fireChangeEvents();
|
this.fireChangeEvents();
|
||||||
@@ -64,7 +73,7 @@ export class GitContentProvider {
|
|||||||
|
|
||||||
for (const root of this.changedRepositoryRoots) {
|
for (const root of this.changedRepositoryRoots) {
|
||||||
if (fsPath.startsWith(root)) {
|
if (fsPath.startsWith(root)) {
|
||||||
this.onDidChangeEmitter.fire(uri);
|
this._onDidChange.fire(uri);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,6 +35,11 @@ export interface ModelChangeEvent {
|
|||||||
uri: Uri;
|
uri: Uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface OriginalResourceChangeEvent {
|
||||||
|
repository: Repository;
|
||||||
|
uri: Uri;
|
||||||
|
}
|
||||||
|
|
||||||
interface OpenRepository extends Disposable {
|
interface OpenRepository extends Disposable {
|
||||||
repository: Repository;
|
repository: Repository;
|
||||||
}
|
}
|
||||||
@@ -54,6 +59,9 @@ export class Model {
|
|||||||
private _onDidChangeRepository = new EventEmitter<ModelChangeEvent>();
|
private _onDidChangeRepository = new EventEmitter<ModelChangeEvent>();
|
||||||
readonly onDidChangeRepository: Event<ModelChangeEvent> = this._onDidChangeRepository.event;
|
readonly onDidChangeRepository: Event<ModelChangeEvent> = this._onDidChangeRepository.event;
|
||||||
|
|
||||||
|
private _onDidChangeOriginalResource = new EventEmitter<OriginalResourceChangeEvent>();
|
||||||
|
readonly onDidChangeOriginalResource: Event<OriginalResourceChangeEvent> = this._onDidChangeOriginalResource.event;
|
||||||
|
|
||||||
private openRepositories: OpenRepository[] = [];
|
private openRepositories: OpenRepository[] = [];
|
||||||
get repositories(): Repository[] { return this.openRepositories.map(r => r.repository); }
|
get repositories(): Repository[] { return this.openRepositories.map(r => r.repository); }
|
||||||
|
|
||||||
@@ -217,10 +225,14 @@ export class Model {
|
|||||||
const onDidDisappearRepository = filterEvent(repository.onDidChangeState, state => state === RepositoryState.Disposed);
|
const onDidDisappearRepository = filterEvent(repository.onDidChangeState, state => state === RepositoryState.Disposed);
|
||||||
const disappearListener = onDidDisappearRepository(() => dispose());
|
const disappearListener = onDidDisappearRepository(() => dispose());
|
||||||
const changeListener = repository.onDidChangeRepository(uri => this._onDidChangeRepository.fire({ repository, uri }));
|
const changeListener = repository.onDidChangeRepository(uri => this._onDidChangeRepository.fire({ repository, uri }));
|
||||||
|
const originalResourceChangeListener = repository.onDidChangeOriginalResource(uri => this._onDidChangeOriginalResource.fire({ repository, uri }));
|
||||||
|
|
||||||
const dispose = () => {
|
const dispose = () => {
|
||||||
disappearListener.dispose();
|
disappearListener.dispose();
|
||||||
changeListener.dispose();
|
changeListener.dispose();
|
||||||
|
originalResourceChangeListener.dispose();
|
||||||
repository.dispose();
|
repository.dispose();
|
||||||
|
|
||||||
this.openRepositories = this.openRepositories.filter(e => e !== openRepository);
|
this.openRepositories = this.openRepositories.filter(e => e !== openRepository);
|
||||||
this._onDidCloseRepository.fire(repository);
|
this._onDidCloseRepository.fire(repository);
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -315,6 +315,9 @@ export class Repository implements Disposable {
|
|||||||
private _onDidChangeStatus = new EventEmitter<void>();
|
private _onDidChangeStatus = new EventEmitter<void>();
|
||||||
readonly onDidChangeStatus: Event<void> = this._onDidChangeStatus.event;
|
readonly onDidChangeStatus: Event<void> = this._onDidChangeStatus.event;
|
||||||
|
|
||||||
|
private _onDidChangeOriginalResource = new EventEmitter<Uri>();
|
||||||
|
readonly onDidChangeOriginalResource: Event<Uri> = this._onDidChangeOriginalResource.event;
|
||||||
|
|
||||||
private _onRunOperation = new EventEmitter<Operation>();
|
private _onRunOperation = new EventEmitter<Operation>();
|
||||||
readonly onRunOperation: Event<Operation> = this._onRunOperation.event;
|
readonly onRunOperation: Event<Operation> = this._onRunOperation.event;
|
||||||
|
|
||||||
@@ -460,6 +463,7 @@ export class Repository implements Disposable {
|
|||||||
async stage(resource: Uri, contents: string): Promise<void> {
|
async stage(resource: Uri, contents: string): Promise<void> {
|
||||||
const relativePath = path.relative(this.repository.root, resource.fsPath).replace(/\\/g, '/');
|
const relativePath = path.relative(this.repository.root, resource.fsPath).replace(/\\/g, '/');
|
||||||
await this.run(Operation.Stage, () => this.repository.stage(relativePath, contents));
|
await this.run(Operation.Stage, () => this.repository.stage(relativePath, contents));
|
||||||
|
this._onDidChangeOriginalResource.fire(resource);
|
||||||
}
|
}
|
||||||
|
|
||||||
async revert(resources: Uri[]): Promise<void> {
|
async revert(resources: Uri[]): Promise<void> {
|
||||||
|
|||||||
Reference in New Issue
Block a user