mirror of
https://github.com/Microsoft/vscode
synced 2024-10-12 06:17:18 +00:00
💄
This commit is contained in:
parent
5540e01820
commit
f454c2c402
5
extensions/git/src/api/git.d.ts
vendored
5
extensions/git/src/api/git.d.ts
vendored
|
@ -26,11 +26,6 @@ export interface Ref {
|
|||
readonly remote?: string;
|
||||
}
|
||||
|
||||
export interface TrackingShip {
|
||||
readonly local: string;
|
||||
readonly upstream: string;
|
||||
}
|
||||
|
||||
export interface UpstreamRef {
|
||||
readonly remote: string;
|
||||
readonly name: string;
|
||||
|
|
|
@ -52,19 +52,16 @@ class CheckoutRemoteHeadItem extends CheckoutItem {
|
|||
}
|
||||
|
||||
async run(repository: Repository): Promise<void> {
|
||||
const ref = this.ref.name;
|
||||
if (!ref) {
|
||||
if (!this.ref.name) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 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);
|
||||
const branches = await repository.findTrackingBranches(this.ref.name);
|
||||
|
||||
if (branches.length > 0) {
|
||||
await repository.checkout(branches[0].name!);
|
||||
} else {
|
||||
// Default: checkout a new local branch tracking the upstream
|
||||
await repository.checkoutTracking(ref);
|
||||
await repository.checkoutTracking(this.ref.name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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, TrackingShip } from './api/git';
|
||||
import { Ref, RefType, Branch, Remote, GitErrorCodes, LogOptions, Change, Status } from './api/git';
|
||||
|
||||
const readfile = denodeify<string, string | null, string>(fs.readFile);
|
||||
|
||||
|
@ -1578,19 +1578,12 @@ 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']);
|
||||
async findTrackingBranches(upstreamBranch: string): Promise<Branch[]> {
|
||||
const result = await this.run(['for-each-ref', '--format', '%(refname:short)%00%(upstream:short)', '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);
|
||||
.map(line => line.trim().split('\0'))
|
||||
.filter(([_, upstream]) => upstream === upstreamBranch)
|
||||
.map(([ref]) => ({ name: ref, type: RefType.Head } as Branch));
|
||||
}
|
||||
|
||||
async getRefs(): Promise<Ref[]> {
|
||||
|
|
|
@ -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, TrackingShip } from './api/git';
|
||||
import { Branch, Ref, Remote, RefType, GitErrorCodes, Status, LogOptions, Change } from './api/git';
|
||||
|
||||
const timeout = (millis: number) => new Promise(c => setTimeout(c, millis));
|
||||
|
||||
|
@ -299,7 +299,7 @@ export const enum Operation {
|
|||
GetObjectDetails = 'GetObjectDetails',
|
||||
SubmoduleUpdate = 'SubmoduleUpdate',
|
||||
RebaseContinue = 'RebaseContinue',
|
||||
GetTracking = 'GetTracking',
|
||||
FindTrackingBranches = 'GetTracking',
|
||||
Apply = 'Apply',
|
||||
Blame = 'Blame',
|
||||
Log = 'Log',
|
||||
|
@ -910,8 +910,8 @@ 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 findTrackingBranches(upstreamRef: string): Promise<Branch[]> {
|
||||
return await this.run(Operation.FindTrackingBranches, () => this.repository.findTrackingBranches(upstreamRef));
|
||||
}
|
||||
|
||||
async getCommit(ref: string): Promise<Commit> {
|
||||
|
|
Loading…
Reference in a new issue