From 7c0886cd5e724db7c28893a7eef271e1f0325134 Mon Sep 17 00:00:00 2001 From: Christopher Date: Sat, 17 Nov 2018 09:32:07 +0000 Subject: [PATCH] fix: Fixed set changelist context menu (#404) --- src/commands/changeList.ts | 142 +++++++++++++++++++++++-------------- src/common/types.ts | 3 +- src/model.ts | 15 ++++ src/repository.ts | 25 ++++--- 4 files changed, 121 insertions(+), 64 deletions(-) diff --git a/src/commands/changeList.ts b/src/commands/changeList.ts index 7c46872d..1d4d8c00 100644 --- a/src/commands/changeList.ts +++ b/src/commands/changeList.ts @@ -1,5 +1,8 @@ -import { SourceControlResourceState, window } from "vscode"; +import { commands, SourceControlResourceState, Uri, window } from "vscode"; import { inputSwitchChangelist } from "../changelistItems"; +import { Model } from "../model"; +import { Resource } from "../resource"; +import { normalizePath } from "../util"; import { Command } from "./command"; export class ChangeList extends Command { @@ -7,67 +10,102 @@ export class ChangeList extends Command { super("svn.changelist"); } - public async execute(...resourceStates: SourceControlResourceState[]) { - const selection = await this.getResourceStates(resourceStates); + public async execute(...args: any[]) { + let uris: Uri[]; - if (selection.length === 0) { + if (args[0] instanceof Resource) { + uris = (args as Resource[]).map(resource => resource.resourceUri); + } else if (args[0] instanceof Uri) { + uris = args[1] as Uri[]; + } else { + console.error("Unhandled type for changelist command"); + return; + } + + const model = (await commands.executeCommand("svn.getModel", "")) as Model; + + const promiseArray = uris.map( + async uri => await model.getRepositoryFromUri(uri) + ); + let repositories = await Promise.all(promiseArray); + repositories = repositories.filter(repository => repository); + + if (repositories.length === 0) { window.showErrorMessage( - `Unable to add file to changelist. File is not under version control` + "Files are not under version control and cannot be added to a change list" ); return; } - const uris = selection.map(resource => resource.resourceUri); + const uniqueRepositories = Array.from(new Set(repositories)); - await this.runByRepository(uris, async (repository, resources) => { - if (!repository) { - return; - } + if (uniqueRepositories.length !== 1) { + window.showErrorMessage( + "Unable to add files from different repositories to change list" + ); + return; + } - let canRemove = false; - - repository.changelists.forEach((group, changelist) => { - if ( - group.resourceStates.some(state => { - return resources.some(resource => { - return resource.path === state.resourceUri.path; - }); - }) - ) { - canRemove = true; - return false; - } - }); - - const changelistName = await inputSwitchChangelist(repository, canRemove); - - if (!changelistName && changelistName !== false) { - return; - } + if (repositories.length !== uris.length) { + window.showErrorMessage( + "Some Files are not under version control and cannot be added to a change list" + ); + return; + } + + const repository = repositories[0]; - const paths = resources.map(resource => resource.fsPath); - - if (changelistName === false) { - try { - await repository.removeChangelist(paths); - } catch (error) { - console.log(error); - window.showErrorMessage( - `Unable to remove file "${paths.join(",")}" from changelist` - ); - } - } else { - try { - await repository.addChangelist(paths, changelistName); - } catch (error) { - console.log(error); - window.showErrorMessage( - `Unable to add file "${paths.join( - "," - )}" to changelist "${changelistName}"` - ); - } + if (!repository) { + return; + } + + const paths = uris.map(uri => uri.fsPath); + let canRemove = false; + + repository.changelists.forEach((group, changelist) => { + if ( + group.resourceStates.some(state => { + return paths.some(path => { + return ( + normalizePath(path) === normalizePath(state.resourceUri.path) + ); + }); + }) + ) { + canRemove = true; + return false; } }); + + const changelistName = await inputSwitchChangelist(repository, canRemove); + + if (!changelistName && changelistName !== false) { + return; + } + + if (changelistName === false) { + try { + await repository.removeChangelist(paths); + } catch (error) { + console.log(error); + window.showErrorMessage( + `Unable to remove file "${paths.join(",")}" from changelist` + ); + } + } else { + try { + await repository.addChangelist(paths, changelistName); + window.showInformationMessage( + `Added files "${paths.join(",")}" to changelist "${changelistName}"` + ); + } catch (error) { + console.log(error); + window.showErrorMessage( + `Unable to add file "${paths.join( + "," + )}" to changelist "${changelistName}"` + ); + } + } } } diff --git a/src/common/types.ts b/src/common/types.ts index ee869492..4ca6753f 100644 --- a/src/common/types.ts +++ b/src/common/types.ts @@ -102,7 +102,8 @@ export enum Operation { Status = "Status", StatusRemote = "StatusRemote", SwitchBranch = "SwitchBranch", - Update = "Update" + Update = "Update", + Info = "Info" } export interface ISvnResourceGroup extends SourceControlResourceGroup { diff --git a/src/model.ts b/src/model.ts index 7d5076a8..d04de5d9 100644 --- a/src/model.ts +++ b/src/model.ts @@ -395,6 +395,21 @@ export class Model implements IDisposable { return undefined; } + public async getRepositoryFromUri(uri: Uri) { + for (const liveRepository of this.openRepositories) { + const repository = liveRepository.repository; + + try { + const path = normalizePath(uri.fsPath); + const info = await repository.info(path); + + return repository; + } catch (error) { + console.error(); + } + } + } + private open(repository: Repository): void { const onDidDisappearRepository = filterEvent( repository.onDidChangeState, diff --git a/src/repository.ts b/src/repository.ts index c0f07454..dcfbf14e 100644 --- a/src/repository.ts +++ b/src/repository.ts @@ -545,7 +545,8 @@ export class Repository { if ( (status.status === Status.NORMAL || status.status === Status.NONE) && - (status.props === Status.NORMAL || status.props === Status.NONE) + (status.props === Status.NORMAL || status.props === Status.NONE) && + !status.changelist ) { // Ignore non changed itens continue; @@ -572,17 +573,15 @@ export class Repository { } else { unversioned.push(resource); } - } else { - if (!status.changelist) { - changes.push(resource); - } else { - let changelist = changelists.get(status.changelist); - if (!changelist) { - changelist = []; - } - changelist.push(resource); - changelists.set(status.changelist, changelist); + } else if (status.changelist) { + let changelist = changelists.get(status.changelist); + if (!changelist) { + changelist = []; } + changelist.push(resource); + changelists.set(status.changelist, changelist); + } else { + changes.push(resource); } } @@ -820,6 +819,10 @@ export class Repository { return this.run(Operation.Revert, () => this.repository.revert(files)); } + public async info(path: string) { + return this.run(Operation.Info, () => this.repository.getInfo(path)); + } + public async patch(files: string[]) { return this.run(Operation.Patch, () => this.repository.patch(files)); }