Skip to content

Commit c7ad864

Browse files
authored
Git - add the ability to limit command palatte commands to repository types (microsoft#257261)
1 parent 1075c32 commit c7ad864

File tree

3 files changed

+30
-7
lines changed

3 files changed

+30
-7
lines changed

extensions/git/src/commands.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,7 @@ class StashItem implements QuickPickItem {
340340

341341
interface ScmCommandOptions {
342342
repository?: boolean;
343+
repositoryFilter?: ('repository' | 'submodule' | 'worktree')[];
343344
}
344345

345346
interface ScmCommand {
@@ -3385,7 +3386,7 @@ export class CommandCenter {
33853386
}
33863387
}
33873388

3388-
@command('git.createWorktree', { repository: true })
3389+
@command('git.createWorktree', { repository: true, repositoryFilter: ['repository', 'submodule'] })
33893390
async createWorktree(repository: Repository): Promise<void> {
33903391
await this._createWorktree(repository, undefined, undefined);
33913392
}
@@ -4895,10 +4896,8 @@ export class CommandCenter {
48954896

48964897
if (repository) {
48974898
repositoryPromise = Promise.resolve(repository);
4898-
} else if (this.model.repositories.length === 1) {
4899-
repositoryPromise = Promise.resolve(this.model.repositories[0]);
49004899
} else {
4901-
repositoryPromise = this.model.pickRepository();
4900+
repositoryPromise = this.model.pickRepository(options.repositoryFilter);
49024901
}
49034902

49044903
result = repositoryPromise.then(repository => {

extensions/git/src/model.ts

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { workspace, WorkspaceFoldersChangeEvent, Uri, window, Event, EventEmitter, QuickPickItem, Disposable, SourceControl, SourceControlResourceGroup, TextEditor, Memento, commands, LogOutputChannel, l10n, ProgressLocation, WorkspaceFolder } from 'vscode';
6+
import { workspace, WorkspaceFoldersChangeEvent, Uri, window, Event, EventEmitter, QuickPickItem, Disposable, SourceControl, SourceControlResourceGroup, TextEditor, Memento, commands, LogOutputChannel, l10n, ProgressLocation, WorkspaceFolder, ThemeIcon } from 'vscode';
77
import TelemetryReporter from '@vscode/extension-telemetry';
88
import { IRepositoryResolver, Repository, RepositoryState } from './repository';
99
import { memoize, sequentialize, debounce } from './decorators';
@@ -32,6 +32,17 @@ class RepositoryPick implements QuickPickItem {
3232
.join(' ');
3333
}
3434

35+
@memoize get iconPath(): ThemeIcon {
36+
switch (this.repository.kind) {
37+
case 'submodule':
38+
return new ThemeIcon('archive');
39+
case 'worktree':
40+
return new ThemeIcon('list-tree');
41+
default:
42+
return new ThemeIcon('repo');
43+
}
44+
}
45+
3546
constructor(public readonly repository: Repository, public readonly index: number) { }
3647
}
3748

@@ -840,13 +851,22 @@ export class Model implements IRepositoryResolver, IBranchProtectionProviderRegi
840851
openRepository.dispose();
841852
}
842853

843-
async pickRepository(): Promise<Repository | undefined> {
854+
async pickRepository(repositoryFilter?: ('repository' | 'submodule' | 'worktree')[]): Promise<Repository | undefined> {
844855
if (this.openRepositories.length === 0) {
845856
throw new Error(l10n.t('There are no available repositories'));
846857
}
847858

848-
const picks = this.openRepositories.map((e, index) => new RepositoryPick(e.repository, index));
859+
const repositories = this.openRepositories
860+
.filter(r => !repositoryFilter || repositoryFilter.includes(r.repository.kind));
861+
862+
if (repositories.length === 0) {
863+
throw new Error(l10n.t('There are no available repositories matching the filter'));
864+
} else if (repositories.length === 1) {
865+
return repositories[0].repository;
866+
}
867+
849868
const active = window.activeTextEditor;
869+
const picks = repositories.map((e, index) => new RepositoryPick(e.repository, index));
850870
const repository = active && this.getRepository(active.document.fileName);
851871
const index = picks.findIndex(pick => pick.repository === repository);
852872

extensions/git/src/repository.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,10 @@ export class Repository implements Disposable {
837837
return this.repository.dotGit;
838838
}
839839

840+
get kind(): 'repository' | 'submodule' | 'worktree' {
841+
return this.repository.kind;
842+
}
843+
840844
private _historyProvider: GitHistoryProvider;
841845
get historyProvider(): GitHistoryProvider { return this._historyProvider; }
842846

0 commit comments

Comments
 (0)