Skip to content

Commit d4938e0

Browse files
author
Rachel Macfarlane
committed
Fix position mapping for creating comment on file with local changes
1 parent bca5a8b commit d4938e0

3 files changed

Lines changed: 23 additions & 19 deletions

File tree

src/common/diffPositionMapping.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,19 +102,16 @@ export function getDiffLineByPosition(diffHunks: DiffHunk[], diffLineNumber: num
102102
}
103103

104104
export function mapHeadLineToDiffHunkPosition(diffHunks: DiffHunk[], localDiff: string, line: number, isBase: boolean = false): number {
105-
let delta = 0;
106-
107105
let localDiffReader = parseDiffHunk(localDiff);
108106
let localDiffIter = localDiffReader.next();
109107
let lineInPRDiff = line;
110108

111109
while (!localDiffIter.done) {
112110
let diffHunk = localDiffIter.value;
113-
if (diffHunk.newLineNumber + diffHunk.newLength - 1 < line) {
114-
delta += diffHunk.oldLength - diffHunk.newLength;
115-
} else {
116-
lineInPRDiff = line + delta;
111+
if (diffHunk.oldLineNumber > line) {
117112
break;
113+
} else {
114+
lineInPRDiff += diffHunk.oldLength - diffHunk.newLength;
118115
}
119116

120117
localDiffIter = localDiffReader.next();

src/common/repository.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,24 @@ export class Repository {
413413

414414
return result.exitCode === 0;
415415
}
416+
417+
418+
/**
419+
* Returns the diff between the document's current content and the document's content at lastCommitSha.
420+
*/
421+
async getFileContentDiff(document: vscode.TextDocument, fileName: string, lastCommitSha: string): Promise<string> {
422+
if (document.isDirty) {
423+
const documentText = document.getText();
424+
const idAtLastCommit = await this.getFileObjectId(lastCommitSha, fileName);
425+
const idOfCurrentText = await this.hashObject(documentText);
426+
427+
// git diff <blobid> <blobid>
428+
return await this.diffHashed(idAtLastCommit, idOfCurrentText);
429+
} else {
430+
// git diff sha -- fileName
431+
return await this.diff(fileName, lastCommitSha);
432+
}
433+
}
416434
}
417435

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

src/view/reviewManager.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ export class ReviewManager implements vscode.DecorationProvider {
269269
const isBase = query && query.base;
270270

271271
// git diff sha -- fileName
272-
const contentDiff = await this._repository.diff(matchedFile.fileName, this._lastCommitSha);
272+
const contentDiff = await this._repository.getFileContentDiff(document, matchedFile.fileName, this._lastCommitSha);
273273
const position = mapHeadLineToDiffHunkPosition(matchedFile.diffHunks, contentDiff, range.start.line + 1, isBase);
274274

275275
if (position < 0) {
@@ -647,18 +647,7 @@ export class ReviewManager implements vscode.DecorationProvider {
647647
if (matchedFiles && matchedFiles.length) {
648648
matchedFile = matchedFiles[0];
649649

650-
let contentDiff: string;
651-
if (document.isDirty) {
652-
const documentText = document.getText();
653-
const idAtLastCommit = await this._repository.getFileObjectId(this._lastCommitSha, matchedFile.fileName);
654-
const idOfCurrentText = await this._repository.hashObject(documentText);
655-
656-
// git diff <blobid> <blobid>
657-
contentDiff = await this._repository.diffHashed(idAtLastCommit, idOfCurrentText);
658-
} else {
659-
// git diff sha -- fileName
660-
contentDiff = await this._repository.diff(matchedFile.fileName, this._lastCommitSha);
661-
}
650+
const contentDiff = await this._repository.getFileContentDiff(document, matchedFile.fileName, this._lastCommitSha);
662651

663652
matchingComments = this._comments.filter(comment => path.resolve(this._repository.path, comment.path) === fileName);
664653
matchingComments = mapCommentsToHead(matchedFile.diffHunks, contentDiff, matchingComments);

0 commit comments

Comments
 (0)