Skip to content

Commit 8d0d731

Browse files
authored
SCM - add scm.historyProviderCount context key (microsoft#236694)
1 parent dc96726 commit 8d0d731

File tree

2 files changed

+29
-17
lines changed

2 files changed

+29
-17
lines changed

src/vs/workbench/contrib/scm/browser/scm.contribution.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ import { IViewsService } from '../../../services/views/common/viewsService.js';
3838
import { IListService, WorkbenchList } from '../../../../platform/list/browser/listService.js';
3939
import { isSCMRepository } from './util.js';
4040
import { SCMHistoryViewPane } from './scmHistoryViewPane.js';
41-
import { IsWebContext } from '../../../../platform/contextkey/common/contextkeys.js';
42-
import { RemoteNameContext } from '../../../common/contextkeys.js';
4341
import { QuickDiffModelService, IQuickDiffModelService } from './quickDiffModel.js';
4442
import { QuickDiffEditorController } from './quickDiffWidget.js';
4543
import { EditorContributionInstantiation, registerEditorContribution } from '../../../../editor/browser/editorExtensions.js';
@@ -137,14 +135,8 @@ viewsRegistry.registerViews([{
137135
weight: 40,
138136
order: 2,
139137
when: ContextKeyExpr.and(
140-
// Repository Count
141-
ContextKeyExpr.and(
142-
ContextKeyExpr.has('scm.providerCount'),
143-
ContextKeyExpr.notEquals('scm.providerCount', 0)),
144-
// Not Serverless
145-
ContextKeyExpr.and(
146-
IsWebContext,
147-
RemoteNameContext.isEqualTo(''))?.negate()
138+
ContextKeyExpr.has('scm.historyProviderCount'),
139+
ContextKeyExpr.notEquals('scm.historyProviderCount', 0),
148140
),
149141
containerIcon: sourceControlViewIcon
150142
}], viewContainer);

src/vs/workbench/contrib/scm/common/scmService.ts

Lines changed: 27 additions & 7 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 { Disposable, DisposableStore, IDisposable, toDisposable } from '../../../../base/common/lifecycle.js';
6+
import { Disposable, DisposableStore, toDisposable } from '../../../../base/common/lifecycle.js';
77
import { Event, Emitter } from '../../../../base/common/event.js';
88
import { ISCMService, ISCMProvider, ISCMInput, ISCMRepository, IInputValidator, ISCMInputChangeEvent, SCMInputChangeReason, InputValidationType, IInputValidation } from './scm.js';
99
import { ILogService } from '../../../../platform/log/common/log.js';
@@ -17,6 +17,7 @@ import { Iterable } from '../../../../base/common/iterator.js';
1717
import { IWorkspaceContextService } from '../../../../platform/workspace/common/workspace.js';
1818
import { Schemas } from '../../../../base/common/network.js';
1919
import { IUriIdentityService } from '../../../../platform/uriIdentity/common/uriIdentity.js';
20+
import { runOnChange } from '../../../../base/common/observable.js';
2021

2122
class SCMInput extends Disposable implements ISCMInput {
2223

@@ -188,7 +189,7 @@ class SCMRepository implements ISCMRepository {
188189
constructor(
189190
public readonly id: string,
190191
public readonly provider: ISCMProvider,
191-
private disposable: IDisposable,
192+
private readonly disposables: DisposableStore,
192193
inputHistory: SCMInputHistory
193194
) {
194195
this.input = new SCMInput(this, inputHistory);
@@ -204,7 +205,7 @@ class SCMRepository implements ISCMRepository {
204205
}
205206

206207
dispose(): void {
207-
this.disposable.dispose();
208+
this.disposables.dispose();
208209
this.provider.dispose();
209210
}
210211
}
@@ -355,6 +356,7 @@ export class SCMService implements ISCMService {
355356

356357
private inputHistory: SCMInputHistory;
357358
private providerCount: IContextKey<number>;
359+
private historyProviderCount: IContextKey<number>;
358360

359361
private readonly _onDidAddProvider = new Emitter<ISCMRepository>();
360362
readonly onDidAddRepository: Event<ISCMRepository> = this._onDidAddProvider.event;
@@ -370,7 +372,9 @@ export class SCMService implements ISCMService {
370372
@IUriIdentityService private readonly uriIdentityService: IUriIdentityService
371373
) {
372374
this.inputHistory = new SCMInputHistory(storageService, workspaceContextService);
375+
373376
this.providerCount = contextKeyService.createKey('scm.providerCount', 0);
377+
this.historyProviderCount = contextKeyService.createKey('scm.historyProviderCount', 0);
374378
}
375379

376380
registerSCMProvider(provider: ISCMProvider): ISCMRepository {
@@ -380,17 +384,33 @@ export class SCMService implements ISCMService {
380384
throw new Error(`SCM Provider ${provider.id} already exists.`);
381385
}
382386

383-
const disposable = toDisposable(() => {
387+
const disposables = new DisposableStore();
388+
389+
const historyProviderCount = () => {
390+
return Array.from(this._repositories.values())
391+
.filter(r => !!r.provider.historyProvider).length;
392+
};
393+
394+
disposables.add(toDisposable(() => {
384395
this._repositories.delete(provider.id);
385396
this._onDidRemoveProvider.fire(repository);
397+
386398
this.providerCount.set(this._repositories.size);
387-
});
399+
this.historyProviderCount.set(historyProviderCount());
400+
}));
388401

389-
const repository = new SCMRepository(provider.id, provider, disposable, this.inputHistory);
402+
const repository = new SCMRepository(provider.id, provider, disposables, this.inputHistory);
390403
this._repositories.set(provider.id, repository);
391-
this._onDidAddProvider.fire(repository);
404+
405+
disposables.add(runOnChange(provider.historyProvider, () => {
406+
this.historyProviderCount.set(historyProviderCount());
407+
}));
392408

393409
this.providerCount.set(this._repositories.size);
410+
this.historyProviderCount.set(historyProviderCount());
411+
412+
this._onDidAddProvider.fire(repository);
413+
394414
return repository;
395415
}
396416

0 commit comments

Comments
 (0)