mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-28 04:23:32 +01:00
Git - improve handling of first commit (#224165)
This commit is contained in:
@@ -1506,6 +1506,21 @@ export class Repository {
|
||||
return parseGitChanges(this.repositoryRoot, gitResult.stdout);
|
||||
}
|
||||
|
||||
async diffTrees(treeish1: string, treeish2?: string): Promise<Change[]> {
|
||||
const args = ['diff-tree', '-r', '--name-status', '-z', '--diff-filter=ADMR', treeish1];
|
||||
|
||||
if (treeish2) {
|
||||
args.push(treeish2);
|
||||
}
|
||||
|
||||
const gitResult = await this.exec(args);
|
||||
if (gitResult.exitCode) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return parseGitChanges(this.repositoryRoot, gitResult.stdout);
|
||||
}
|
||||
|
||||
async getMergeBase(ref1: string, ref2: string, ...refs: string[]): Promise<string | undefined> {
|
||||
try {
|
||||
const args = ['merge-base'];
|
||||
|
||||
@@ -146,13 +146,9 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec
|
||||
|
||||
try {
|
||||
// Get the common ancestor commit, and commits
|
||||
const [mergeBaseCommit, commits] = await Promise.all([
|
||||
this.repository.getCommit(options.limit.id),
|
||||
this.repository.log({ range: `${options.limit.id}..`, refNames, shortStats: true })
|
||||
]);
|
||||
|
||||
// Add common ancestor commit
|
||||
commits.push(mergeBaseCommit);
|
||||
const commit = await this.repository.getCommit(options.limit.id);
|
||||
const commitParentId = commit.parents.length > 0 ? commit.parents[0] : await this.repository.getEmptyTree();
|
||||
const commits = await this.repository.log({ range: `${commitParentId}..`, refNames, shortStats: true });
|
||||
|
||||
await ensureEmojis();
|
||||
|
||||
@@ -180,24 +176,18 @@ export class GitHistoryProvider implements SourceControlHistoryProvider, FileDec
|
||||
}
|
||||
|
||||
async provideHistoryItemSummary(historyItemId: string, historyItemParentId: string | undefined): Promise<SourceControlHistoryItem> {
|
||||
if (!historyItemParentId) {
|
||||
const commit = await this.repository.getCommit(historyItemId);
|
||||
historyItemParentId = commit.parents.length > 0 ? commit.parents[0] : `${historyItemId}^`;
|
||||
}
|
||||
|
||||
historyItemParentId = historyItemParentId ?? await this.repository.getEmptyTree();
|
||||
const allChanges = await this.repository.diffBetweenShortStat(historyItemParentId, historyItemId);
|
||||
|
||||
return { id: historyItemId, parentIds: [historyItemParentId], message: '', statistics: allChanges };
|
||||
}
|
||||
|
||||
async provideHistoryItemChanges(historyItemId: string, historyItemParentId: string | undefined): Promise<SourceControlHistoryItemChange[]> {
|
||||
if (!historyItemParentId) {
|
||||
const commit = await this.repository.getCommit(historyItemId);
|
||||
historyItemParentId = commit.parents.length > 0 ? commit.parents[0] : `${historyItemId}^`;
|
||||
}
|
||||
historyItemParentId = historyItemParentId ?? await this.repository.getEmptyTree();
|
||||
|
||||
const historyItemChangesUri: Uri[] = [];
|
||||
const historyItemChanges: SourceControlHistoryItemChange[] = [];
|
||||
const changes = await this.repository.diffBetween(historyItemParentId, historyItemId);
|
||||
const changes = await this.repository.diffTrees(historyItemParentId, historyItemId);
|
||||
|
||||
for (const change of changes) {
|
||||
const historyItemUri = change.uri.with({
|
||||
|
||||
@@ -718,6 +718,8 @@ export class Repository implements Disposable {
|
||||
private _untrackedGroup: SourceControlResourceGroup;
|
||||
get untrackedGroup(): GitResourceGroup { return this._untrackedGroup as GitResourceGroup; }
|
||||
|
||||
private _EMPTY_TREE: string | undefined;
|
||||
|
||||
private _HEAD: Branch | undefined;
|
||||
get HEAD(): Branch | undefined {
|
||||
return this._HEAD;
|
||||
@@ -1112,6 +1114,10 @@ export class Repository implements Disposable {
|
||||
return this.run(Operation.Diff, () => this.repository.diffBetweenShortStat(ref1, ref2));
|
||||
}
|
||||
|
||||
diffTrees(treeish1: string, treeish2?: string): Promise<Change[]> {
|
||||
return this.run(Operation.Diff, () => this.repository.diffTrees(treeish1, treeish2));
|
||||
}
|
||||
|
||||
getMergeBase(ref1: string, ref2: string, ...refs: string[]): Promise<string | undefined> {
|
||||
return this.run(Operation.MergeBase, () => this.repository.getMergeBase(ref1, ref2, ...refs));
|
||||
}
|
||||
@@ -1602,6 +1608,15 @@ export class Repository implements Disposable {
|
||||
return await this.repository.getCommit(ref);
|
||||
}
|
||||
|
||||
async getEmptyTree(): Promise<string> {
|
||||
if (!this._EMPTY_TREE) {
|
||||
const result = await this.repository.exec(['hash-object', '-t', 'tree', '/dev/null']);
|
||||
this._EMPTY_TREE = result.stdout.trim();
|
||||
}
|
||||
|
||||
return this._EMPTY_TREE;
|
||||
}
|
||||
|
||||
async getCommitCount(range: string): Promise<{ ahead: number; behind: number }> {
|
||||
return await this.run(Operation.RevList, () => this.repository.getCommitCount(range));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user