-
Notifications
You must be signed in to change notification settings - Fork 27.9k
/
scmService.ts
119 lines (85 loc) · 3.21 KB
/
scmService.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
'use strict';
import { IDisposable, toDisposable } from 'vs/base/common/lifecycle';
import Event, { Emitter } from 'vs/base/common/event';
import { ISCMService, ISCMProvider, ISCMInput, ISCMRepository } from './scm';
import { ILogService } from 'vs/platform/log/common/log';
class SCMInput implements ISCMInput {
private _value = '';
get value(): string {
return this._value;
}
set value(value: string) {
this._value = value;
this._onDidChange.fire(value);
}
private _onDidChange = new Emitter<string>();
get onDidChange(): Event<string> { return this._onDidChange.event; }
private _placeholder = '';
get placeholder(): string {
return this._placeholder;
}
set placeholder(placeholder: string) {
this._placeholder = placeholder;
this._onDidChangePlaceholder.fire(placeholder);
}
private _onDidChangePlaceholder = new Emitter<string>();
get onDidChangePlaceholder(): Event<string> { return this._onDidChangePlaceholder.event; }
private _warningLength: number | undefined;
get warningLength(): number | undefined {
return this._warningLength;
}
set warningLength(warningLength: number) {
this._warningLength = warningLength;
}
}
class SCMRepository implements ISCMRepository {
private _onDidFocus = new Emitter<void>();
readonly onDidFocus: Event<void> = this._onDidFocus.event;
readonly input: ISCMInput = new SCMInput();
constructor(
public readonly provider: ISCMProvider,
private disposable: IDisposable
) { }
focus(): void {
this._onDidFocus.fire();
}
dispose(): void {
this.disposable.dispose();
this.provider.dispose();
}
}
export class SCMService implements ISCMService {
_serviceBrand: any;
private _providerIds = new Set<string>();
private _repositories: ISCMRepository[] = [];
get repositories(): ISCMRepository[] { return [...this._repositories]; }
private _onDidAddProvider = new Emitter<ISCMRepository>();
get onDidAddRepository(): Event<ISCMRepository> { return this._onDidAddProvider.event; }
private _onDidRemoveProvider = new Emitter<ISCMRepository>();
get onDidRemoveRepository(): Event<ISCMRepository> { return this._onDidRemoveProvider.event; }
constructor( @ILogService private logService: ILogService) { }
registerSCMProvider(provider: ISCMProvider): ISCMRepository {
this.logService.trace('SCMService#registerSCMProvider');
if (this._providerIds.has(provider.id)) {
throw new Error(`SCM Provider ${provider.id} already exists.`);
}
this._providerIds.add(provider.id);
const disposable = toDisposable(() => {
const index = this._repositories.indexOf(repository);
if (index < 0) {
return;
}
this._providerIds.delete(provider.id);
this._repositories.splice(index, 1);
this._onDidRemoveProvider.fire(repository);
});
const repository = new SCMRepository(provider, disposable);
this._repositories.push(repository);
this._onDidAddProvider.fire(repository);
return repository;
}
}