Skip to content

Commit 20dc4d7

Browse files
authored
Git - add more tracing to stage/unstage/revert commands (microsoft#236409)
1 parent d70e0e2 commit 20dc4d7

File tree

3 files changed

+79
-10
lines changed

3 files changed

+79
-10
lines changed

Diff for: extensions/git/src/blame.ts

+5-8
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { DecorationOptions, l10n, Position, Range, TextEditor, TextEditorChange, TextEditorDecorationType, TextEditorChangeKind, ThemeColor, Uri, window, workspace, EventEmitter, ConfigurationChangeEvent, StatusBarItem, StatusBarAlignment, Command, MarkdownString, TextEditorDiffInformation } from 'vscode';
6+
import { DecorationOptions, l10n, Position, Range, TextEditor, TextEditorChange, TextEditorDecorationType, TextEditorChangeKind, ThemeColor, Uri, window, workspace, EventEmitter, ConfigurationChangeEvent, StatusBarItem, StatusBarAlignment, Command, MarkdownString } from 'vscode';
77
import { Model } from './model';
88
import { dispose, fromNow, IDisposable } from './util';
99
import { Repository } from './repository';
1010
import { throttle } from './decorators';
1111
import { BlameInformation } from './git';
1212
import { fromGitUri, isGitUri } from './uri';
1313
import { emojify, ensureEmojis } from './emoji';
14+
import { getWorkingTreeAndIndexDiffInformation, getWorkingTreeDiffInformation } from './staging';
1415

1516
function lineRangesContainLine(changes: readonly TextEditorChange[], lineNumber: number): boolean {
1617
return changes.some(c => c.modified.startLineNumber <= lineNumber && lineNumber < c.modified.endLineNumberExclusive);
@@ -277,10 +278,6 @@ export class GitBlameController {
277278
return blameInformation;
278279
}
279280

280-
private _findDiffInformation(textEditor: TextEditor, ref: string): TextEditorDiffInformation | undefined {
281-
return textEditor.diffInformation?.find(diff => diff.original && isGitUri(diff.original) && fromGitUri(diff.original).ref === ref);
282-
}
283-
284281
@throttle
285282
private async _updateTextEditorBlameInformation(textEditor: TextEditor | undefined, showBlameInformationForPositionZero = false): Promise<void> {
286283
if (!textEditor?.diffInformation || textEditor !== window.activeTextEditor) {
@@ -319,7 +316,7 @@ export class GitBlameController {
319316
workingTreeAndIndexChanges = undefined;
320317
} else if (ref === '') {
321318
// Resource on the right-hand side of the diff editor when viewing a resource from the index.
322-
const diffInformationWorkingTreeAndIndex = this._findDiffInformation(textEditor, 'HEAD');
319+
const diffInformationWorkingTreeAndIndex = getWorkingTreeAndIndexDiffInformation(textEditor);
323320

324321
// Working tree + index diff information is present and it is stale
325322
if (diffInformationWorkingTreeAndIndex && diffInformationWorkingTreeAndIndex.isStale) {
@@ -333,15 +330,15 @@ export class GitBlameController {
333330
}
334331
} else {
335332
// Working tree diff information. Diff Editor (Working Tree) -> Text Editor
336-
const diffInformationWorkingTree = this._findDiffInformation(textEditor, '~') ?? this._findDiffInformation(textEditor, '');
333+
const diffInformationWorkingTree = getWorkingTreeDiffInformation(textEditor);
337334

338335
// Working tree diff information is not present or it is stale
339336
if (!diffInformationWorkingTree || diffInformationWorkingTree.isStale) {
340337
return;
341338
}
342339

343340
// Working tree + index diff information
344-
const diffInformationWorkingTreeAndIndex = this._findDiffInformation(textEditor, 'HEAD');
341+
const diffInformationWorkingTreeAndIndex = getWorkingTreeAndIndexDiffInformation(textEditor);
345342

346343
// Working tree + index diff information is present and it is stale
347344
if (diffInformationWorkingTreeAndIndex && diffInformationWorkingTreeAndIndex.isStale) {

Diff for: extensions/git/src/commands.ts

+25-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { ForcePushMode, GitErrorCodes, Ref, RefType, Status, CommitOptions, Remo
1212
import { Git, Stash } from './git';
1313
import { Model } from './model';
1414
import { GitResourceGroup, Repository, Resource, ResourceGroupType } from './repository';
15-
import { DiffEditorSelectionHunkToolbarContext, applyLineChanges, getModifiedRange, intersectDiffWithRange, invertLineChange, toLineRanges } from './staging';
15+
import { DiffEditorSelectionHunkToolbarContext, applyLineChanges, getModifiedRange, getWorkingTreeAndIndexDiffInformation, getWorkingTreeDiffInformation, intersectDiffWithRange, invertLineChange, toLineChanges, toLineRanges } from './staging';
1616
import { fromGitUri, toGitUri, isGitUri, toMergeUris, toMultiFileDiffEditorUris } from './uri';
1717
import { dispose, grep, isDefined, isDescendant, pathEquals, relativePath, truncate } from './util';
1818
import { GitTimelineItem } from './timelineProvider';
@@ -1565,6 +1565,12 @@ export class CommandCenter {
15651565

15661566
this.logger.trace(`[CommandCenter][stageSelectedChanges] changes: ${JSON.stringify(changes)}`);
15671567

1568+
const workingTreeDiffInformation = getWorkingTreeDiffInformation(textEditor);
1569+
if (workingTreeDiffInformation) {
1570+
this.logger.trace(`[CommandCenter][stageSelectedChanges] diffInformation: ${JSON.stringify(workingTreeDiffInformation)}`);
1571+
this.logger.trace(`[CommandCenter][stageSelectedChanges] diffInformation changes: ${JSON.stringify(toLineChanges(workingTreeDiffInformation))}`);
1572+
}
1573+
15681574
const modifiedDocument = textEditor.document;
15691575
const selectedLines = toLineRanges(textEditor.selections, modifiedDocument);
15701576
const selectedChanges = changes
@@ -1751,6 +1757,12 @@ export class CommandCenter {
17511757

17521758
this.logger.trace(`[CommandCenter][revertSelectedRanges] changes: ${JSON.stringify(changes)}`);
17531759

1760+
const workingTreeDiffInformation = getWorkingTreeDiffInformation(textEditor);
1761+
if (workingTreeDiffInformation) {
1762+
this.logger.trace(`[CommandCenter][revertSelectedRanges] diffInformation: ${JSON.stringify(workingTreeDiffInformation)}`);
1763+
this.logger.trace(`[CommandCenter][revertSelectedRanges] diffInformation changes: ${JSON.stringify(toLineChanges(workingTreeDiffInformation))}`);
1764+
}
1765+
17541766
const modifiedDocument = textEditor.document;
17551767
const selections = textEditor.selections;
17561768
const selectedChanges = changes.filter(change => {
@@ -1845,6 +1857,18 @@ export class CommandCenter {
18451857

18461858
this.logger.trace(`[CommandCenter][unstageSelectedRanges] changes: ${JSON.stringify(changes)}`);
18471859

1860+
const workingTreeDiffInformation = getWorkingTreeDiffInformation(textEditor);
1861+
if (workingTreeDiffInformation) {
1862+
this.logger.trace(`[CommandCenter][unstageSelectedRanges] diffInformation (working tree): ${JSON.stringify(workingTreeDiffInformation)}`);
1863+
this.logger.trace(`[CommandCenter][unstageSelectedRanges] diffInformation changes (working tree): ${JSON.stringify(toLineChanges(workingTreeDiffInformation))}`);
1864+
}
1865+
1866+
const workingTreeAndIndexDiffInformation = getWorkingTreeAndIndexDiffInformation(textEditor);
1867+
if (workingTreeAndIndexDiffInformation) {
1868+
this.logger.trace(`[CommandCenter][unstageSelectedRanges] diffInformation (working tree + index): ${JSON.stringify(workingTreeAndIndexDiffInformation)}`);
1869+
this.logger.trace(`[CommandCenter][unstageSelectedRanges] diffInformation changes (working tree + index): ${JSON.stringify(toLineChanges(workingTreeAndIndexDiffInformation))}`);
1870+
}
1871+
18481872
const originalUri = toGitUri(modifiedUri, 'HEAD');
18491873
const originalDocument = await workspace.openTextDocument(originalUri);
18501874
const selectedLines = toLineRanges(textEditor.selections, modifiedDocument);

Diff for: extensions/git/src/staging.ts

+49-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { TextDocument, Range, LineChange, Selection, Uri } from 'vscode';
6+
import { TextDocument, Range, LineChange, Selection, Uri, TextEditor, TextEditorDiffInformation } from 'vscode';
7+
import { fromGitUri, isGitUri } from './uri';
78

89
export function applyLineChanges(original: TextDocument, modified: TextDocument, diffs: LineChange[]): string {
910
const result: string[] = [];
@@ -143,6 +144,53 @@ export function invertLineChange(diff: LineChange): LineChange {
143144
};
144145
}
145146

147+
export function toLineChanges(diffInformation: TextEditorDiffInformation): LineChange[] {
148+
return diffInformation.changes.map(x => {
149+
let originalStartLineNumber: number;
150+
let originalEndLineNumber: number;
151+
let modifiedStartLineNumber: number;
152+
let modifiedEndLineNumber: number;
153+
154+
if (x.original.startLineNumber === x.original.endLineNumberExclusive) {
155+
// Insertion
156+
originalStartLineNumber = x.original.startLineNumber - 1;
157+
originalEndLineNumber = 0;
158+
} else {
159+
originalStartLineNumber = x.original.startLineNumber;
160+
originalEndLineNumber = x.original.endLineNumberExclusive - 1;
161+
}
162+
163+
if (x.modified.startLineNumber === x.modified.endLineNumberExclusive) {
164+
// Deletion
165+
modifiedStartLineNumber = x.modified.startLineNumber - 1;
166+
modifiedEndLineNumber = 0;
167+
} else {
168+
modifiedStartLineNumber = x.modified.startLineNumber;
169+
modifiedEndLineNumber = x.modified.endLineNumberExclusive - 1;
170+
}
171+
172+
return {
173+
originalStartLineNumber,
174+
originalEndLineNumber,
175+
modifiedStartLineNumber,
176+
modifiedEndLineNumber
177+
};
178+
});
179+
}
180+
181+
export function getWorkingTreeDiffInformation(textEditor: TextEditor): TextEditorDiffInformation | undefined {
182+
// Working tree diff information. Diff Editor (Working Tree) -> Text Editor
183+
return getDiffInformation(textEditor, '~') ?? getDiffInformation(textEditor, '');
184+
}
185+
186+
export function getWorkingTreeAndIndexDiffInformation(textEditor: TextEditor): TextEditorDiffInformation | undefined {
187+
return getDiffInformation(textEditor, 'HEAD');
188+
}
189+
190+
function getDiffInformation(textEditor: TextEditor, ref: string): TextEditorDiffInformation | undefined {
191+
return textEditor.diffInformation?.find(diff => diff.original && isGitUri(diff.original) && fromGitUri(diff.original).ref === ref);
192+
}
193+
146194
export interface DiffEditorSelectionHunkToolbarContext {
147195
mapping: unknown;
148196
/**

0 commit comments

Comments
 (0)