diff --git a/extensions/git/src/commands.ts b/extensions/git/src/commands.ts index c4582db790b..028678a4cf5 100644 --- a/extensions/git/src/commands.ts +++ b/extensions/git/src/commands.ts @@ -5,7 +5,7 @@ 'use strict'; -import { Uri, commands, scm, Disposable, window, workspace, QuickPickItem, OutputChannel, Range, WorkspaceEdit, Position, LineChange, SourceControlResourceState, TextDocumentShowOptions, ViewColumn } from 'vscode'; +import { Uri, commands, scm, Disposable, window, workspace, QuickPickItem, OutputChannel, Range, WorkspaceEdit, Position, LineChange, SourceControlResourceGroup, SourceControlResourceState, TextDocumentShowOptions, ViewColumn } from 'vscode'; import { Ref, RefType, Git, GitErrorCodes, Branch } from './git'; import { Repository, Resource, Status, CommitOptions, ResourceGroupType } from './repository'; import { Model } from './model'; @@ -444,8 +444,22 @@ export class CommandCenter { await this.model.add(resources); } - @command('git.stageAll', { repository: true }) - async stageAll(repository: Repository): Promise { + @command('git.stageAll') + async stageAll(group?: SourceControlResourceGroup): Promise { + let repository: Repository | undefined = undefined; + + if (group) { + repository = this.model.getRepositoryFromResourceGroup(group); + } + + if (!repository) { + repository = await this.model.pickRepository(); + } + + if (!repository) { + return; + } + await repository.add([]); } @@ -550,9 +564,23 @@ export class CommandCenter { await this.model.revert(resources); } - @command('git.unstageAll', { repository: true }) - async unstageAll(repository: Repository): Promise { - return await repository.revert([]); + @command('git.unstageAll') + async unstageAll(group?: SourceControlResourceGroup): Promise { + let repository: Repository | undefined = undefined; + + if (group) { + repository = this.model.getRepositoryFromResourceGroup(group); + } + + if (!repository) { + repository = await this.model.pickRepository(); + } + + if (!repository) { + return; + } + + await repository.revert([]); } // TODO@Joao does this command really receive a model? @@ -642,8 +670,22 @@ export class CommandCenter { await this.model.clean(resources); } - @command('git.cleanAll', { repository: true }) - async cleanAll(repository: Repository): Promise { + @command('git.cleanAll') + async cleanAll(group?: SourceControlResourceGroup): Promise { + let repository: Repository | undefined = undefined; + + if (group) { + repository = this.model.getRepositoryFromResourceGroup(group); + } + + if (!repository) { + repository = await this.model.pickRepository(); + } + + if (!repository) { + return; + } + const config = workspace.getConfiguration('git'); let scope = config.get('discardAllScope') || 'prompt'; let resources = repository.workingTreeGroup.resourceStates; @@ -1220,6 +1262,10 @@ export class CommandCenter { if (!options.repository) { result = Promise.resolve(method.apply(this, args)); } else { + console.log(args[0]); + // if (args[0] instanceof SourceControlResourceGroup) { + // } + result = this.model.pickRepository().then(repository => { if (!repository) { return Promise.reject(localize('modelnotfound', "Git model not found")); diff --git a/extensions/git/src/model.ts b/extensions/git/src/model.ts index 5f7f4f728f3..1db5cda3767 100644 --- a/extensions/git/src/model.ts +++ b/extensions/git/src/model.ts @@ -5,7 +5,7 @@ 'use strict'; -import { Uri, window, QuickPickItem, Disposable } from 'vscode'; +import { Uri, window, QuickPickItem, Disposable, SourceControlResourceGroup } from 'vscode'; import { Repository, IRepository, State } from './repository'; import { memoize } from './decorators'; import { toDisposable, filterEvent, once } from './util'; @@ -44,6 +44,15 @@ export class Model implements IRepository { } async pickRepository(): Promise { + if (this.repositories.size === 0) { + throw new Error(localize('no repositories', "There are no available repositories")); + } + + // TODO@joao enable this code + // if (this.repositories.size === 1) { + // return this.repositories.values().next().value; + // } + const picks = Array.from(this.repositories.entries(), ([uri, model]) => new RepositoryPick(uri, model)); const placeHolder = localize('pick repo', "Choose a repository"); const pick = await window.showQuickPick(picks, { placeHolder }); @@ -51,15 +60,25 @@ export class Model implements IRepository { return pick && pick.repository; } + getRepositoryFromResourceGroup(resourceGroup?: SourceControlResourceGroup): Repository | undefined { + for (let [, repository] of this.repositories) { + if (resourceGroup === repository.mergeGroup || resourceGroup === repository.indexGroup || resourceGroup === repository.workingTreeGroup) { + return repository; + } + } + + return undefined; + } + getRepository(resource: Uri): Repository | undefined { const resourcePath = resource.fsPath; - for (let [repositoryRoot, model] of this.repositories) { - const repositoryRootPath = repositoryRoot.fsPath; + for (let [root, repository] of this.repositories) { + const repositoryRootPath = root.fsPath; const relativePath = path.relative(repositoryRootPath, resourcePath); if (!/^\./.test(relativePath)) { - return model; + return repository; } }