Always compare change with context.
This commit is contained in:
parent
bbeeefd713
commit
9cd81dcb5b
|
@ -81,12 +81,6 @@
|
||||||
"title": "%command.compare%",
|
"title": "%command.compare%",
|
||||||
"original": "Compare Current Conflict",
|
"original": "Compare Current Conflict",
|
||||||
"command": "merge-conflict.compare"
|
"command": "merge-conflict.compare"
|
||||||
},
|
|
||||||
{
|
|
||||||
"category": "%command.category%",
|
|
||||||
"title": "%command.compareAll%",
|
|
||||||
"original": "Compare All Conflict in Current Editor",
|
|
||||||
"command": "merge-conflict.compareAll"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"menus": {
|
"menus": {
|
||||||
|
@ -121,11 +115,6 @@
|
||||||
"description": "%config.autoNavigateNextConflictEnabled%",
|
"description": "%config.autoNavigateNextConflictEnabled%",
|
||||||
"default": false
|
"default": false
|
||||||
},
|
},
|
||||||
"merge-conflict.diffViewContext": {
|
|
||||||
"type": "number",
|
|
||||||
"description": "%config.diffViewContext%",
|
|
||||||
"default": 0
|
|
||||||
},
|
|
||||||
"merge-conflict.openDiffInNewEditor": {
|
"merge-conflict.openDiffInNewEditor": {
|
||||||
"type": "boolean",
|
"type": "boolean",
|
||||||
"description": "%config.openDiffInNewEditor%",
|
"description": "%config.openDiffInNewEditor%",
|
||||||
|
|
|
@ -12,11 +12,9 @@
|
||||||
"command.next": "Next Conflict",
|
"command.next": "Next Conflict",
|
||||||
"command.previous": "Previous Conflict",
|
"command.previous": "Previous Conflict",
|
||||||
"command.compare": "Compare Current Conflict",
|
"command.compare": "Compare Current Conflict",
|
||||||
"command.compareAll": "Compare All Conflict in Current Editor",
|
|
||||||
"config.title": "Merge Conflict",
|
"config.title": "Merge Conflict",
|
||||||
"config.autoNavigateNextConflictEnabled": "Whether to automatically navigate to the next merge conflict after resolving a merge conflict.",
|
"config.autoNavigateNextConflictEnabled": "Whether to automatically navigate to the next merge conflict after resolving a merge conflict.",
|
||||||
"config.codeLensEnabled": "Create a Code Lens for merge conflict blocks within editor.",
|
"config.codeLensEnabled": "Create a Code Lens for merge conflict blocks within editor.",
|
||||||
"config.decoratorsEnabled": "Create decorators for merge conflict blocks within editor.",
|
"config.decoratorsEnabled": "Create decorators for merge conflict blocks within editor.",
|
||||||
"config.diffViewContext": "Controls how many unchanged lines around the merge conflict should be displayed in the diff view.",
|
|
||||||
"config.openDiffInNewEditor": "Controls if the diff view should be opened in a new editor group when comparing changes in merge conflicts."
|
"config.openDiffInNewEditor": "Controls if the diff view should be opened in a new editor group when comparing changes in merge conflicts."
|
||||||
}
|
}
|
|
@ -85,17 +85,11 @@ export default class MergeConflictCodeLensProvider implements vscode.CodeLensPro
|
||||||
arguments: [conflict]
|
arguments: [conflict]
|
||||||
};
|
};
|
||||||
|
|
||||||
let diffAllCommand: vscode.Command = {
|
|
||||||
command: 'merge-conflict.compareAll',
|
|
||||||
title: localize('compareAllChanges', 'Compare All Changes')
|
|
||||||
};
|
|
||||||
|
|
||||||
items.push(
|
items.push(
|
||||||
new vscode.CodeLens(conflict.range, acceptCurrentCommand),
|
new vscode.CodeLens(conflict.range, acceptCurrentCommand),
|
||||||
new vscode.CodeLens(conflict.range.with(conflict.range.start.with({ character: conflict.range.start.character + 1 })), acceptIncomingCommand),
|
new vscode.CodeLens(conflict.range.with(conflict.range.start.with({ character: conflict.range.start.character + 1 })), acceptIncomingCommand),
|
||||||
new vscode.CodeLens(conflict.range.with(conflict.range.start.with({ character: conflict.range.start.character + 2 })), acceptBothCommand),
|
new vscode.CodeLens(conflict.range.with(conflict.range.start.with({ character: conflict.range.start.character + 2 })), acceptBothCommand),
|
||||||
new vscode.CodeLens(conflict.range.with(conflict.range.start.with({ character: conflict.range.start.character + 3 })), diffCommand),
|
new vscode.CodeLens(conflict.range.with(conflict.range.start.with({ character: conflict.range.start.character + 3 })), diffCommand)
|
||||||
new vscode.CodeLens(conflict.range.with(conflict.range.start.with({ character: conflict.range.start.character + 4 })), diffAllCommand)
|
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -39,8 +39,7 @@ export default class CommandHandler implements vscode.Disposable {
|
||||||
this.registerTextEditorCommand('merge-conflict.accept.all-both', this.acceptAllBoth),
|
this.registerTextEditorCommand('merge-conflict.accept.all-both', this.acceptAllBoth),
|
||||||
this.registerTextEditorCommand('merge-conflict.next', this.navigateNext),
|
this.registerTextEditorCommand('merge-conflict.next', this.navigateNext),
|
||||||
this.registerTextEditorCommand('merge-conflict.previous', this.navigatePrevious),
|
this.registerTextEditorCommand('merge-conflict.previous', this.navigatePrevious),
|
||||||
this.registerTextEditorCommand('merge-conflict.compare', this.compare),
|
this.registerTextEditorCommand('merge-conflict.compare', this.compare)
|
||||||
this.registerTextEditorCommand('merge-conflict.compareAll', this.compareAll)
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,27 +88,6 @@ export default class CommandHandler implements vscode.Disposable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const scheme = editor.document.uri.scheme;
|
|
||||||
let range = conflict.current.content;
|
|
||||||
const leftUri = editor.document.uri.with({
|
|
||||||
scheme: ContentProvider.scheme,
|
|
||||||
query: JSON.stringify({ scheme, range, fullRange: conflict.range })
|
|
||||||
});
|
|
||||||
|
|
||||||
range = conflict.incoming.content;
|
|
||||||
const rightUri = leftUri.with({ query: JSON.stringify({ scheme, range, fullRange: conflict.range }) });
|
|
||||||
|
|
||||||
const title = localize('compareChangesTitle', '{0}: Current Changes ⟷ Incoming Changes', fileName);
|
|
||||||
const mergeConflictConfig = vscode.workspace.getConfiguration('merge-conflict');
|
|
||||||
const openToTheside = mergeConflictConfig.get<boolean>('openDiffInNewEditor');
|
|
||||||
const opts: vscode.TextDocumentShowOptions = {
|
|
||||||
viewColumn: openToTheside ? vscode.ViewColumn.Beside : vscode.ViewColumn.Active
|
|
||||||
};
|
|
||||||
vscode.commands.executeCommand('vscode.diff', leftUri, rightUri, title, opts);
|
|
||||||
}
|
|
||||||
|
|
||||||
async compareAll(editor: vscode.TextEditor) {
|
|
||||||
const fileName = path.basename(editor.document.uri.fsPath);
|
|
||||||
const conflicts = await this.tracker.getConflicts(editor.document);
|
const conflicts = await this.tracker.getConflicts(editor.document);
|
||||||
|
|
||||||
// Still failed to find conflict, warn the user and exit
|
// Still failed to find conflict, warn the user and exit
|
||||||
|
@ -119,21 +97,38 @@ export default class CommandHandler implements vscode.Disposable {
|
||||||
}
|
}
|
||||||
|
|
||||||
const scheme = editor.document.uri.scheme;
|
const scheme = editor.document.uri.scheme;
|
||||||
|
let range = conflict.current.content;
|
||||||
let leftRanges = conflicts.map(conflict => [conflict.current.content, conflict.range]);
|
let leftRanges = conflicts.map(conflict => [conflict.current.content, conflict.range]);
|
||||||
let rightRanges = conflicts.map(conflict => [conflict.incoming.content, conflict.range]);
|
let rightRanges = conflicts.map(conflict => [conflict.incoming.content, conflict.range]);
|
||||||
|
|
||||||
const leftUri = editor.document.uri.with({
|
const leftUri = editor.document.uri.with({
|
||||||
scheme: ContentProvider.scheme,
|
scheme: ContentProvider.scheme,
|
||||||
query: JSON.stringify({ type: 'full', scheme, ranges: leftRanges })
|
query: JSON.stringify({ scheme, range: range, ranges: leftRanges })
|
||||||
});
|
});
|
||||||
|
|
||||||
const rightUri = leftUri.with({ query: JSON.stringify({ type: 'full', scheme, ranges: rightRanges }) });
|
|
||||||
|
range = conflict.incoming.content;
|
||||||
|
const rightUri = leftUri.with({ query: JSON.stringify({ scheme, ranges: rightRanges }) });
|
||||||
|
|
||||||
|
let mergeConflictLineOffsets = 0;
|
||||||
|
for (let nextconflict of conflicts) {
|
||||||
|
if (nextconflict.range.isEqual(conflict.range)) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
mergeConflictLineOffsets += (nextconflict.range.end.line - nextconflict.range.start.line) - (nextconflict.incoming.content.end.line - nextconflict.incoming.content.start.line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const selection = new vscode.Range(
|
||||||
|
conflict.range.start.line - mergeConflictLineOffsets, conflict.range.start.character,
|
||||||
|
conflict.range.start.line - mergeConflictLineOffsets, conflict.range.start.character
|
||||||
|
);
|
||||||
|
|
||||||
const title = localize('compareChangesTitle', '{0}: Current Changes ⟷ Incoming Changes', fileName);
|
const title = localize('compareChangesTitle', '{0}: Current Changes ⟷ Incoming Changes', fileName);
|
||||||
const mergeConflictConfig = vscode.workspace.getConfiguration('merge-conflict');
|
const mergeConflictConfig = vscode.workspace.getConfiguration('merge-conflict');
|
||||||
const openToTheside = mergeConflictConfig.get<boolean>('openDiffInNewEditor');
|
const openToTheSide = mergeConflictConfig.get<boolean>('openDiffInNewEditor');
|
||||||
const opts: vscode.TextDocumentShowOptions = {
|
const opts: vscode.TextDocumentShowOptions = {
|
||||||
viewColumn: openToTheside ? vscode.ViewColumn.Beside : vscode.ViewColumn.Active
|
viewColumn: openToTheSide ? vscode.ViewColumn.Beside : vscode.ViewColumn.Active,
|
||||||
|
selection
|
||||||
};
|
};
|
||||||
|
|
||||||
vscode.commands.executeCommand('vscode.diff', leftUri, rightUri, title, opts);
|
vscode.commands.executeCommand('vscode.diff', leftUri, rightUri, title, opts);
|
||||||
|
|
|
@ -23,40 +23,28 @@ export default class MergeConflictContentProvider implements vscode.TextDocument
|
||||||
|
|
||||||
async provideTextDocumentContent(uri: vscode.Uri): Promise<string | null> {
|
async provideTextDocumentContent(uri: vscode.Uri): Promise<string | null> {
|
||||||
try {
|
try {
|
||||||
const { type, scheme, range, fullRange, ranges } = JSON.parse(uri.query) as { type: string, scheme: string; range: { line: number, character: number }[], fullRange: { line: number, character: number }[], ranges: [{ line: number, character: number }[], { line: number, character: number }[]][] };
|
const { scheme, ranges } = JSON.parse(uri.query) as { scheme: string, ranges: [{ line: number, character: number }[], { line: number, character: number }[]][] };
|
||||||
|
|
||||||
if (type === 'full') {
|
// complete diff
|
||||||
// complete diff
|
const document = await vscode.workspace.openTextDocument(uri.with({ scheme, query: '' }));
|
||||||
const document = await vscode.workspace.openTextDocument(uri.with({ scheme, query: '' }));
|
|
||||||
|
|
||||||
let text = '';
|
let text = '';
|
||||||
let lastPosition = new vscode.Position(0, 0);
|
let lastPosition = new vscode.Position(0, 0);
|
||||||
ranges.forEach(rangeObj => {
|
|
||||||
let [range, fullRange] = rangeObj;
|
|
||||||
const [start, end] = range;
|
|
||||||
const [fullStart, fullEnd] = fullRange;
|
|
||||||
|
|
||||||
text += document.getText(new vscode.Range(lastPosition.line, lastPosition.character, fullStart.line, fullStart.character));
|
ranges.forEach(rangeObj => {
|
||||||
text += document.getText(new vscode.Range(start.line, start.character, end.line, end.character));
|
let [conflictRange, fullRange] = rangeObj;
|
||||||
lastPosition = new vscode.Position(fullEnd.line, fullEnd.character);
|
const [start, end] = conflictRange;
|
||||||
});
|
|
||||||
|
|
||||||
let documentEnd = document.lineAt(document.lineCount - 1).range.end;
|
|
||||||
text += document.getText(new vscode.Range(lastPosition.line, lastPosition.character, documentEnd.line, documentEnd.character));
|
|
||||||
|
|
||||||
return text;
|
|
||||||
} else {
|
|
||||||
const [start, end] = range;
|
|
||||||
const [fullStart, fullEnd] = fullRange;
|
const [fullStart, fullEnd] = fullRange;
|
||||||
const mergeConflictConfig = vscode.workspace.getConfiguration('merge-conflict');
|
|
||||||
const context = Math.max(0, mergeConflictConfig.get<number>('diffViewContext') || 0);
|
text += document.getText(new vscode.Range(lastPosition.line, lastPosition.character, fullStart.line, fullStart.character));
|
||||||
const document = await vscode.workspace.openTextDocument(uri.with({ scheme, query: '' }));
|
text += document.getText(new vscode.Range(start.line, start.character, end.line, end.character));
|
||||||
const text =
|
lastPosition = new vscode.Position(fullEnd.line, fullEnd.character);
|
||||||
document.getText(new vscode.Range(Math.max(0, fullStart.line - context), 0, fullStart.line, fullStart.character))
|
});
|
||||||
+ document.getText(new vscode.Range(start.line, start.character, end.line, end.character))
|
|
||||||
+ document.getText(new vscode.Range(fullEnd.line, fullEnd.character, Math.min(document.lineCount, fullEnd.line + context + 1), 0));
|
let documentEnd = document.lineAt(document.lineCount - 1).range.end;
|
||||||
return text;
|
text += document.getText(new vscode.Range(lastPosition.line, lastPosition.character, documentEnd.line, documentEnd.character));
|
||||||
}
|
|
||||||
|
return text;
|
||||||
}
|
}
|
||||||
catch (ex) {
|
catch (ex) {
|
||||||
await vscode.window.showErrorMessage('Unable to show comparison');
|
await vscode.window.showErrorMessage('Unable to show comparison');
|
||||||
|
|
Loading…
Reference in a new issue