diff --git a/extensions/git/package.json b/extensions/git/package.json index 6f75b8c4967..5f4f14737e9 100644 --- a/extensions/git/package.json +++ b/extensions/git/package.json @@ -1024,6 +1024,12 @@ "usesOnlineServices" ] }, + "git.autofetchPeriod": { + "type": "number", + "scope": "resource", + "description": "%config.autofetchPeriod%", + "default": 3 + }, "git.branchValidationRegex": { "type": "string", "description": "%config.branchValidationRegex%", diff --git a/extensions/git/package.nls.json b/extensions/git/package.nls.json index 41850a1f77d..118e0f1cd64 100644 --- a/extensions/git/package.nls.json +++ b/extensions/git/package.nls.json @@ -68,6 +68,7 @@ "config.autoRepositoryDetection.openEditors": "Scan for parent folders of open files.", "config.autorefresh": "Whether auto refreshing is enabled.", "config.autofetch": "When enabled, commits will automatically be fetched from the default remote of the current Git repository.", + "config.autofetchPeriod": "Duration in minutes between each automatic git fetch, when `git.autofetch` is enabled.", "config.confirmSync": "Confirm before synchronizing git repositories.", "config.countBadge": "Controls the git badge counter.", "config.countBadge.all": "Count all changes.", @@ -119,4 +120,4 @@ "colors.ignored": "Color for ignored resources.", "colors.conflict": "Color for resources with conflicts.", "colors.submodule": "Color for submodule resources." -} +} \ No newline at end of file diff --git a/extensions/git/src/autofetch.ts b/extensions/git/src/autofetch.ts index bd95f7dc03f..08a104614d6 100644 --- a/extensions/git/src/autofetch.ts +++ b/extensions/git/src/autofetch.ts @@ -17,16 +17,19 @@ function isRemoteOperation(operation: Operation): boolean { export class AutoFetcher { - private static readonly Period = 3 * 60 * 1000 /* three minutes */; private static DidInformUser = 'autofetch.didInformUser'; - private _onDidChange = new EventEmitter(); + private _onDidChange = new EventEmitter(); private onDidChange = this._onDidChange.event; private _enabled: boolean = false; get enabled(): boolean { return this._enabled; } set enabled(enabled: boolean) { this._enabled = enabled; this._onDidChange.fire(enabled); } + private _timeout: number = workspace.getConfiguration('git').get('autofetchPeriod', 3) * 60 * 1000; + private get timeout(): number { return this._timeout; } + private set timeout(minutes: number) { this._timeout = minutes * 60 * 1000; this._onDidChange.fire(minutes); } + private disposables: Disposable[] = []; constructor(private repository: Repository, private globalState: Memento) { @@ -70,19 +73,19 @@ export class AutoFetcher { private onConfiguration(): void { const gitConfig = workspace.getConfiguration('git'); + const minutes = gitConfig.get('autofetchPeriod', 3); + const autofetch = gitConfig.get('autofetch'); - if (gitConfig.get('autofetch') === false) { - this.disable(); - } else { - this.enable(); + if (this.timeout !== minutes) { + this.timeout = minutes; + } + + if (this.enabled !== autofetch) { + autofetch ? this.enable() : this.disable(); } } enable(): void { - if (this.enabled) { - return; - } - this.enabled = true; this.run(); } @@ -111,9 +114,9 @@ export class AutoFetcher { return; } - const timeout = new Promise(c => setTimeout(c, AutoFetcher.Period)); - const whenDisabled = eventToPromise(filterEvent(this.onDidChange, enabled => !enabled)); - await Promise.race([timeout, whenDisabled]); + const timeout = new Promise(c => setTimeout(c, this.timeout)); + const onChanged = eventToPromise(filterEvent(this.onDidChange, () => true)); + await Promise.race([timeout, onChanged]); } }