Skip to content

Commit 3f1996b

Browse files
committed
Use merge base instead pr base commit for file diff.
1 parent 4df1658 commit 3f1996b

File tree

5 files changed

+37
-1
lines changed

5 files changed

+37
-1
lines changed

src/common/repository.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -398,6 +398,15 @@ export class Repository {
398398
let result = await this.run(['diff', '--no-ext-diff', '--exit-code']);
399399
return result.exitCode !== 0;
400400
}
401+
402+
async getMergeBase(a: string, b: string) {
403+
let result = await this.run(['merge-base', a, b]);
404+
if (result.exitCode === 0) {
405+
return result.stdout.trim();
406+
} else {
407+
return null;
408+
}
409+
}
401410
}
402411

403412
function parseRemote(remoteName: string, url: string): Remote | null {

src/github/interface.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ export interface IPullRequestManager {
131131
mayHaveMorePages(): boolean;
132132
getPullRequestComments(pullRequest: IPullRequestModel): Promise<Comment[]>;
133133
getPullRequestCommits(pullRequest: IPullRequestModel): Promise<Commit[]>;
134+
getPullRequestMergeBase(pullRequest: IPullRequestModel): Promise<string>;
134135
getCommitChangedFiles(pullRequest: IPullRequestModel, commit: Commit): Promise<FileChange[]>;
135136
getReviewComments(pullRequest: IPullRequestModel, reviewId: string): Promise<Comment[]>;
136137
getTimelineEvents(pullRequest: IPullRequestModel): Promise<TimelineEvent[]>;

src/github/pullRequestGitHelper.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,4 +223,19 @@ export class PullRequestGitHelper {
223223
let prConfigKey = `branch.${branchName}.${PullRequestMetadataKey}`;
224224
await repository.setConfig(prConfigKey, PullRequestGitHelper.buildPullRequestMetadata(pullRequest));
225225
}
226+
227+
static async getPullRequestMergeBase(repository: Repository, remote: Remote, pullRequest: IPullRequestModel): Promise<string> {
228+
let mergeBase = await repository.getMergeBase(pullRequest.base.sha, pullRequest.head.sha);
229+
230+
if (mergeBase) {
231+
return mergeBase;
232+
}
233+
234+
const pullrequestHeadRef = `refs/pull/${pullRequest.prNumber}/head`;
235+
await repository.fetch(remote.remoteName, pullrequestHeadRef);
236+
await repository.fetch(remote.remoteName, pullRequest.base.ref);
237+
mergeBase = await repository.getMergeBase(pullRequest.base.sha, pullRequest.head.sha);
238+
239+
return mergeBase;
240+
}
226241
}

src/github/pullRequestManager.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,16 @@ export class PullRequestManager implements IPullRequestManager {
236236
}
237237
}
238238

239+
async getPullRequestMergeBase(pullRequest: IPullRequestModel): Promise<string> {
240+
try {
241+
const { remote } = await (pullRequest as PullRequestModel).githubRepository.ensure();
242+
return PullRequestGitHelper.getPullRequestMergeBase(this._repository, remote, pullRequest);
243+
} catch (e) {
244+
vscode.window.showErrorMessage(`Fetching Pull Request merge base failed: ${formatError(e)}`);
245+
return null;
246+
}
247+
}
248+
239249
async getCommitChangedFiles(pullRequest: IPullRequestModel, commit: Commit): Promise<FileChange[]> {
240250
try {
241251
const { octokit, remote } = await (pullRequest as PullRequestModel).githubRepository.ensure();

src/view/treeNodes/pullRequestNode.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,8 @@ export class PRNode extends TreeNode {
137137
const comments = await this._prManager.getPullRequestComments(this.pullRequestModel);
138138
const data = await this._prManager.getPullRequestChangedFiles(this.pullRequestModel);
139139
await this._prManager.fullfillPullRequestCommitInfo(this.pullRequestModel);
140-
const rawChanges = await parseDiff(data, this.repository, this.pullRequestModel.base.sha);
140+
let mergeBase = await this._prManager.getPullRequestMergeBase(this.pullRequestModel);
141+
const rawChanges = await parseDiff(data, this.repository, mergeBase || this.pullRequestModel.base.sha);
141142
this._contentChanges = rawChanges.map(change => {
142143
if (change instanceof SlimFileChange) {
143144
return new RemoteFileChangeNode(

0 commit comments

Comments
 (0)