Merge commit 'refs/pull/61149/head' of github.com:Microsoft/vscode into pr/61149

This commit is contained in:
Joao Moreno 2019-05-27 15:20:08 +02:00
commit 5540e01820
4 changed files with 39 additions and 5 deletions

View file

@ -26,6 +26,11 @@ export interface Ref {
readonly remote?: string;
}
export interface TrackingShip {
readonly local: string;
readonly upstream: string;
}
export interface UpstreamRef {
readonly remote: string;
readonly name: string;
@ -235,4 +240,4 @@ export const enum GitErrorCodes {
CantRebaseMultipleBranches = 'CantRebaseMultipleBranches',
PatchDoesNotApply = 'PatchDoesNotApply',
NoPathFound = 'NoPathFound'
}
}

View file

@ -52,11 +52,20 @@ class CheckoutRemoteHeadItem extends CheckoutItem {
}
async run(repository: Repository): Promise<void> {
if (!this.ref.name) {
const ref = this.ref.name;
if (!ref) {
return;
}
await repository.checkoutTracking(this.ref.name);
// Check whether there's a local branch which already has the target branch as an upstream
const trackings = await repository.getTracking(ref);
if (trackings.length > 0) {
//Just checkout the local branch
await repository.checkout(trackings[0].local);
} else {
// Default: checkout a new local branch tracking the upstream
await repository.checkoutTracking(ref);
}
}
}

View file

@ -14,7 +14,7 @@ import * as filetype from 'file-type';
import { assign, groupBy, denodeify, IDisposable, toDisposable, dispose, mkdirp, readBytes, detectUnicodeEncoding, Encoding, onceEvent } from './util';
import { CancellationToken, Uri, workspace } from 'vscode';
import { detectEncoding } from './encoding';
import { Ref, RefType, Branch, Remote, GitErrorCodes, LogOptions, Change, Status } from './api/git';
import { Ref, RefType, Branch, Remote, GitErrorCodes, LogOptions, Change, Status, TrackingShip } from './api/git';
const readfile = denodeify<string, string | null, string>(fs.readFile);
@ -1578,6 +1578,21 @@ export class Repository {
}
}
async GetTracking(upstreamBranch: string): Promise<TrackingShip[]> {
const result = await this.run(['for-each-ref', '--format', '%(if)%(upstream:short)%(then)%(refname:short)->%(upstream:short) %(else)* %(end)', 'refs/heads']);
return result.stdout.trim().split('\n')
.map(line => line.trim())
.filter(line => line !== '*')
.map(line => {
const splited = line.split('->');
return {
local: splited[0],
upstream: splited[1]
} as TrackingShip;
})
.filter(trackingShip => trackingShip.upstream === upstreamBranch);
}
async getRefs(): Promise<Ref[]> {
const result = await this.run(['for-each-ref', '--format', '%(refname) %(objectname)', '--sort', '-committerdate']);

View file

@ -13,7 +13,7 @@ import * as path from 'path';
import * as nls from 'vscode-nls';
import * as fs from 'fs';
import { StatusBarCommands } from './statusbar';
import { Branch, Ref, Remote, RefType, GitErrorCodes, Status, LogOptions, Change } from './api/git';
import { Branch, Ref, Remote, RefType, GitErrorCodes, Status, LogOptions, Change, TrackingShip } from './api/git';
const timeout = (millis: number) => new Promise(c => setTimeout(c, millis));
@ -299,6 +299,7 @@ export const enum Operation {
GetObjectDetails = 'GetObjectDetails',
SubmoduleUpdate = 'SubmoduleUpdate',
RebaseContinue = 'RebaseContinue',
GetTracking = 'GetTracking',
Apply = 'Apply',
Blame = 'Blame',
Log = 'Log',
@ -909,6 +910,10 @@ export class Repository implements Disposable {
await this.run(Operation.CheckoutTracking, () => this.repository.checkout(treeish, [], { track: true }));
}
async getTracking(treeish: string): Promise<TrackingShip[]> {
return await this.run(Operation.GetTracking, () => this.repository.GetTracking(treeish));
}
async getCommit(ref: string): Promise<Commit> {
return await this.repository.getCommit(ref);
}