disable auto fetch

fixes #34684
This commit is contained in:
Joao Moreno 2017-11-24 11:12:33 +01:00
parent 16942f8438
commit 548bfe91af
7 changed files with 79 additions and 15 deletions

View file

@ -234,6 +234,11 @@
"title": "%command.createTag%",
"category": "Git"
},
{
"command": "git.fetch",
"title": "%command.fetch%",
"category": "Git"
},
{
"command": "git.pull",
"title": "%command.pull%",
@ -818,7 +823,7 @@
"git.autofetch": {
"type": "boolean",
"description": "%config.autofetch%",
"default": true
"default": false
},
"git.confirmSync": {
"type": "boolean",

View file

@ -31,6 +31,7 @@
"command.renameBranch": "Rename Branch...",
"command.merge": "Merge Branch...",
"command.createTag": "Create Tag",
"command.fetch": "Fetch",
"command.pull": "Pull",
"command.pullRebase": "Pull (Rebase)",
"command.pullFrom": "Pull from...",

View file

@ -5,14 +5,22 @@
'use strict';
import { workspace, Disposable, EventEmitter } from 'vscode';
import { workspace, Disposable, EventEmitter, Memento, window, MessageItem, ConfigurationTarget } from 'vscode';
import { GitErrorCodes } from './git';
import { Repository } from './repository';
import { eventToPromise, filterEvent } from './util';
import { Repository, Operation } from './repository';
import { eventToPromise, filterEvent, onceEvent } from './util';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
function isRemoteOperation(operation: Operation): boolean {
return operation === Operation.Pull || operation === Operation.Push || operation === Operation.Sync || operation === Operation.Fetch;
}
export class AutoFetcher {
private static readonly Period = 3 * 60 * 1000 /* three minutes */;
private static DidInformUser = 'autofetch.didInformUser';
private _onDidChange = new EventEmitter<boolean>();
private onDidChange = this._onDidChange.event;
@ -23,9 +31,39 @@ export class AutoFetcher {
private disposables: Disposable[] = [];
constructor(private repository: Repository) {
constructor(private repository: Repository, private globalState: Memento) {
workspace.onDidChangeConfiguration(this.onConfiguration, this, this.disposables);
this.onConfiguration();
const didInformUser = !globalState.get<boolean>(AutoFetcher.DidInformUser);
if (this.enabled && !didInformUser) {
globalState.update(AutoFetcher.DidInformUser, true);
}
const shouldInformUser = !this.enabled && didInformUser;
if (shouldInformUser) {
const onGoodRemoteOperation = filterEvent(repository.onDidRunOperation, ({ operation, error }) => !error && isRemoteOperation(operation));
this.disposables.push(onceEvent(onGoodRemoteOperation)(async () => {
const yes: MessageItem = { title: localize('yes', "Yes") };
const no: MessageItem = { isCloseAffordance: true, title: localize('no', "No") };
const askLater: MessageItem = { title: localize('not now', "Not Now") };
const result = await window.showInformationMessage(localize('suggest auto fetch', "Would you like to enable auto fetching of Git repositories?"), yes, no, askLater);
if (result === askLater) {
return;
}
if (result === yes) {
const gitConfig = workspace.getConfiguration('git');
gitConfig.update('autofetch', true, ConfigurationTarget.Global);
}
globalState.update(AutoFetcher.DidInformUser, true);
}));
}
}
private onConfiguration(): void {

View file

@ -1230,6 +1230,16 @@ export class CommandCenter {
await repository.tag(name, message);
}
@command('git.fetch', { repository: true })
async fetch(repository: Repository): Promise<void> {
if (repository.remotes.length === 0) {
window.showWarningMessage(localize('no remotes to fetch', "This repository has no remotes configured to fetch from."));
return;
}
await repository.fetch();
}
@command('git.pullFrom', { repository: true })
async pullFrom(repository: Repository): Promise<void> {
const remotes = repository.remotes;

View file

@ -29,7 +29,7 @@ async function init(context: ExtensionContext, outputChannel: OutputChannel, dis
const askpass = new Askpass();
const env = await askpass.getEnv();
const git = new Git({ gitPath: info.path, version: info.version, env });
const model = new Model(git);
const model = new Model(git, context.globalState);
disposables.push(model);
const onRepository = () => commands.executeCommand('setContext', 'gitOpenRepositoryCount', `${model.repositories.length}`);

View file

@ -5,7 +5,7 @@
'use strict';
import { workspace, WorkspaceFoldersChangeEvent, Uri, window, Event, EventEmitter, QuickPickItem, Disposable, SourceControl, SourceControlResourceGroup, TextEditor } from 'vscode';
import { workspace, WorkspaceFoldersChangeEvent, Uri, window, Event, EventEmitter, QuickPickItem, Disposable, SourceControl, SourceControlResourceGroup, TextEditor, Memento } from 'vscode';
import { Repository, RepositoryState } from './repository';
import { memoize, sequentialize, debounce } from './decorators';
import { dispose, anyEvent, filterEvent } from './util';
@ -71,7 +71,7 @@ export class Model {
private configurationChangeDisposable: Disposable;
private disposables: Disposable[] = [];
constructor(private git: Git) {
constructor(private git: Git, private globalState: Memento) {
const config = workspace.getConfiguration('git');
this.enabled = config.get<boolean>('enabled') === true;
@ -209,7 +209,7 @@ export class Model {
return;
}
const repository = new Repository(this.git.open(repositoryRoot));
const repository = new Repository(this.git.open(repositoryRoot), this.globalState);
this.open(repository);
} catch (err) {

View file

@ -5,7 +5,7 @@
'use strict';
import { Uri, Command, EventEmitter, Event, scm, SourceControl, SourceControlInputBox, SourceControlResourceGroup, SourceControlResourceState, SourceControlResourceDecorations, Disposable, ProgressLocation, window, workspace, WorkspaceEdit, ThemeColor, DecorationData } from 'vscode';
import { Uri, Command, EventEmitter, Event, scm, SourceControl, SourceControlInputBox, SourceControlResourceGroup, SourceControlResourceState, SourceControlResourceDecorations, Disposable, ProgressLocation, window, workspace, WorkspaceEdit, ThemeColor, DecorationData, Memento } from 'vscode';
import { Repository as BaseRepository, Ref, Branch, Remote, Commit, GitErrorCodes, Stash, RefType, GitError } from './git';
import { anyEvent, filterEvent, eventToPromise, dispose, find } from './util';
import { memoize, throttle, debounce } from './decorators';
@ -381,6 +381,11 @@ export interface GitResourceGroup extends SourceControlResourceGroup {
resourceStates: Resource[];
}
export interface OperationResult {
operation: Operation;
error: any;
}
export class Repository implements Disposable {
private _onDidChangeRepository = new EventEmitter<Uri>();
@ -398,8 +403,8 @@ export class Repository implements Disposable {
private _onRunOperation = new EventEmitter<Operation>();
readonly onRunOperation: Event<Operation> = this._onRunOperation.event;
private _onDidRunOperation = new EventEmitter<Operation>();
readonly onDidRunOperation: Event<Operation> = this._onDidRunOperation.event;
private _onDidRunOperation = new EventEmitter<OperationResult>();
readonly onDidRunOperation: Event<OperationResult> = this._onDidRunOperation.event;
@memoize
get onDidChangeOperations(): Event<void> {
@ -462,7 +467,8 @@ export class Repository implements Disposable {
private disposables: Disposable[] = [];
constructor(
private readonly repository: BaseRepository
private readonly repository: BaseRepository,
globalState: Memento
) {
const fsWatcher = workspace.createFileSystemWatcher('**');
this.disposables.push(fsWatcher);
@ -492,7 +498,7 @@ export class Repository implements Disposable {
this.disposables.push(this.indexGroup);
this.disposables.push(this.workingTreeGroup);
this.disposables.push(new AutoFetcher(this));
this.disposables.push(new AutoFetcher(this, globalState));
const statusBar = new StatusBarCommands(this);
this.disposables.push(statusBar);
@ -802,6 +808,8 @@ export class Repository implements Disposable {
}
const run = async () => {
let error: any = null;
this._operations.start(operation);
this._onRunOperation.fire(operation);
@ -814,6 +822,8 @@ export class Repository implements Disposable {
return result;
} catch (err) {
error = err;
if (err.gitErrorCode === GitErrorCodes.NotAGitRepository) {
this.state = RepositoryState.Disposed;
}
@ -821,7 +831,7 @@ export class Repository implements Disposable {
throw err;
} finally {
this._operations.end(operation);
this._onDidRunOperation.fire(operation);
this._onDidRunOperation.fire({ operation, error });
}
};