diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index 1f785725633..0cdffc48a73 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -24,20 +24,20 @@ function openFile(model: Model, resource: Resource): void { log('open file', resource); } -function stage(model: Model, resource: Resource): void { - log('stage', resource); +async function stage(model: Model, resource: Resource): Promise { + return await model.stage(resource); } -function stageAll(model: Model, resourceGroup: ResourceGroup): void { - log('stageAll', resourceGroup); +async function stageAll(model: Model): Promise { + return await model.stage(); } -function unstage(model: Model, resource: Resource): void { - log('unstage', resource); +async function unstage(model: Model, resource: Resource): Promise { + return await model.unstage(resource); } -function unstageAll(model: Model, resourceGroup: ResourceGroup): void { - log('unstageAll', resourceGroup); +async function unstageAll(model: Model): Promise { + return await model.unstage(); } function clean(model: Model, resource: Resource): void { @@ -56,6 +56,11 @@ function skipUndefined(command: (t: T) => R): (t: T | undefined) => R | un return t => t === undefined ? undefined : command(t); } +// TODO: do more with these errors +function catchErrors(command: (t: T) => Promise): (t: T) => void { + return t => command(t).catch(err => console.error(err)); +} + function compose(command: Command, ...args: Function[]): Command { return args.reduce((r, fn) => fn(r), command) as Command; } @@ -67,10 +72,10 @@ export function registerCommands(model: Model): Disposable { commands.registerCommand('git.refresh', compose(refresh, bindModel)), commands.registerCommand('git.openChange', compose(openChange, bindModel, resolveURI, skipUndefined)), commands.registerCommand('git.openFile', compose(openFile, bindModel, resolveURI, skipUndefined)), - commands.registerCommand('git.stage', compose(stage, bindModel, resolveURI, skipUndefined)), - commands.registerCommand('git.stageAll', compose(stageAll, bindModel, resolveURI, skipUndefined)), - commands.registerCommand('git.unstage', compose(unstage, bindModel, resolveURI, skipUndefined)), - commands.registerCommand('git.unstageAll', compose(unstageAll, bindModel, resolveURI, skipUndefined)), + commands.registerCommand('git.stage', compose(stage, bindModel, resolveURI, skipUndefined, catchErrors)), + commands.registerCommand('git.stageAll', compose(stageAll, bindModel, catchErrors)), + commands.registerCommand('git.unstage', compose(unstage, bindModel, resolveURI, skipUndefined, catchErrors)), + commands.registerCommand('git.unstageAll', compose(unstageAll, bindModel, catchErrors)), commands.registerCommand('git.clean', compose(clean, bindModel, resolveURI, skipUndefined)), commands.registerCommand('git.cleanAll', compose(cleanAll, bindModel, resolveURI, skipUndefined)), ]; diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 334fc5dd4aa..1689997d0fb 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -174,7 +174,7 @@ export class Model { update(now = false): void { if (now) { - this._update(); + this.updateNow(); } else { this.eventuallyUpdate(); } @@ -182,11 +182,11 @@ export class Model { @debounce(500) private eventuallyUpdate(): void { - this._update(); + this.updateNow(); } @decorate(throttle) - private async _update(): Promise { + private async updateNow(): Promise { const status = await this.repository.getStatus(); let HEAD: IRef | undefined; @@ -266,4 +266,16 @@ export class Model { return resources; } + + async stage(...resources: Resource[]): Promise { + const paths = resources.map(r => r.uri.fsPath); + await this.repository.add(paths); + await this.updateNow(); + } + + async unstage(...resources: Resource[]): Promise { + const paths = resources.map(r => r.uri.fsPath); + await this.repository.revertFiles('HEAD', paths); + await this.updateNow(); + } } \ No newline at end of file