Показаны отличия от VS Code Source. - PullRequest
0 голосов
/ 01 марта 2019

Я думал, что установка quickDiffProvider по крайней мере предоставит точку входа, когда файл выбран в пользовательском интерфейсе для отображения различий.Но я даже не могу заставить код реагировать на щелчок по файлу на панели управления исходным кодом для моего настраиваемого поставщика управления исходным кодом.

extension.ts

export function activate(context: vscode.ExtensionContext) {

    // Use the console to output diagnostic information (console.log) and errors (console.error)
    // This line of code will only be executed once when your extension is activated
    console.log('Extension "AccuRev" is now active.');
    let folder: string = vscode.env.appRoot;
    let scm: vscode.SourceControl | undefined;
    if (vscode.workspace.workspaceFolders) {
        let rootUri = vscode.workspace.workspaceFolders[0].uri;
        scm = vscode.scm.createSourceControl("accurev", "AccuRev", rootUri);
        folder = rootUri.fsPath;
    }

    const repo = new AccuRevRepo(getOutputChannel(), folder);
    if (scm) {
        scm.quickDiffProvider = repo;
        let modified = scm.createResourceGroup("modified", "Modified");
        repo.getResourceStates().then((result) => {
            modified.resourceStates = result;
        });
        context.subscriptions.push(modified);
    }

    // The command has been defined in the package.json file
    // Now provide the implementation of the command with registerCommand
    // The commandId parameter must match the command field in package.json
    let disposable = vscode.commands.registerCommand('accurev.refresh', () => {
        // The code you place here will be executed every time your command is executed

        // Display a message box to the user
        getOutputChannel().appendLine('Hello World!');
        repo.getPending();
    });

repository.ts

export class AccuRevRepo {
[...]
    public provideOriginalResource?(uri: vscode.Uri, token: vscode.CancellationToken): vscode.ProviderResult<vscode.Uri> {
        return this.provideOriginalResourceAsync(uri);
    }

    public async provideOriginalResourceAsync(uri: vscode.Uri): Promise<vscode.Uri | null> {
        let originalText = await this.execute(`cat -v ${this.basisName} \"${uri.fsPath}\"`);
        let tempExists = await new Promise<boolean>((resolve) => {
[...]

Я получаю правильный список файлов в представлении управления исходным кодом, но когда я нажимаю на один, ничего не происходит.Я ожидал, что смогу поставить точку останова в provideOriginalResource и остановиться на этом, но ничего не происходит.Как реализовать возможность отображения различий с последними проверенными файлами - где я могу подключиться к API?

1 Ответ

0 голосов
/ 04 марта 2019

QuickDiff не использует панель управления источником, а применяется, когда в редакторе отображается любой файл с управлением источником.Поэтому вы не увидите никакого кода, соответствующего быстрой разнице, выполняющегося в результате выбора файлов в представлении управления исходным кодом, а скорее при активации другого файла в редакторе.Информация QuickDiff отображается в виде цветных полос на левой стороне исходного кода, указывающих, какой код изменился по сравнению с версией в системе контроля версий:

Source code with a bluish bar on the left

То же самое *Однако функцию 1008 *, используемую с QuickDiff, можно использовать для функций, упомянутых в вопросе (щелчок по файлу в представлении управления исходным кодом для отображения различий).Во-первых, вам нужно определить команду, на которую можно ссылаться, чтобы активировать это поведение в разделе package.json contributes в блоке commands:

{
    "command": "accurev.openDiffBasis",
    "category": "AccuRev",
    "title": "Open diff with basis",
    "icon": {
        "dark": "icons/dark/undo2.svg",
        "light": "icons/light/undo2.svg"
    }
},

Затем вам нужно зарегистрироватькоманда, часто выполняемая из extension.ts с кодом, подобным следующему:

let diff = vscode.commands.registerCommand('accurev.openDiffBasis', async (file: vscode.Uri) => {
    try {
        let original = await repo.provideOriginalResource(file);
        if (original !== null) {
            let filename = vscode.workspace.asRelativePath(file);
            vscode.commands.executeCommand('vscode.diff', original, file,  `${repo.basisName}\\${filename} ↔ ${filename}`);
        }
    }
    catch(err) {
        getOutputChannel().appendLine(err);
    }
});

Обратите внимание, что здесь используется provideOriginalResource, та же функция, которую QuickDiff неявно вызывает.Также обратите внимание, что вызов команды vscode.diff - это то, что фактически представляет средство просмотра diff, и может быть сделано в ответ на любое действие - это не просто неявная реакция.

Наконец, элементы, возвращаемые getResourceStates, нуждаютсяреализовать интерфейс SourceControlResourceState, который позволяет привязать команду к каждому из них.Здесь команда diff может быть связана с выбором каждого элемента:

export class AccuRevFile implements vscode.SourceControlResourceState {
    readonly resourceUri: vscode.Uri;
    readonly command?: vscode.Command | undefined;
    readonly decorations?: vscode.SourceControlResourceDecorations | undefined;
    public readonly elementId: number;

    constructor(uri: vscode.Uri, elementId: number, state: AccuRevState) {
        this.resourceUri = uri;
        this.decorations = state;
        this.command = { title: "diff", command: "accurev.openDiffBasis", tooltip: "Diff against basis version", arguments: [uri]};
        this.elementId = elementId;
    }
}
...