Skip to content

Commit 7c0886c

Browse files
authored
fix: Fixed set changelist context menu (#404)
1 parent d5423e9 commit 7c0886c

File tree

4 files changed

+121
-64
lines changed

4 files changed

+121
-64
lines changed

src/commands/changeList.ts

Lines changed: 90 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,111 @@
1-
import { SourceControlResourceState, window } from "vscode";
1+
import { commands, SourceControlResourceState, Uri, window } from "vscode";
22
import { inputSwitchChangelist } from "../changelistItems";
3+
import { Model } from "../model";
4+
import { Resource } from "../resource";
5+
import { normalizePath } from "../util";
36
import { Command } from "./command";
47

58
export class ChangeList extends Command {
69
constructor() {
710
super("svn.changelist");
811
}
912

10-
public async execute(...resourceStates: SourceControlResourceState[]) {
11-
const selection = await this.getResourceStates(resourceStates);
13+
public async execute(...args: any[]) {
14+
let uris: Uri[];
1215

13-
if (selection.length === 0) {
16+
if (args[0] instanceof Resource) {
17+
uris = (args as Resource[]).map(resource => resource.resourceUri);
18+
} else if (args[0] instanceof Uri) {
19+
uris = args[1] as Uri[];
20+
} else {
21+
console.error("Unhandled type for changelist command");
22+
return;
23+
}
24+
25+
const model = (await commands.executeCommand("svn.getModel", "")) as Model;
26+
27+
const promiseArray = uris.map(
28+
async uri => await model.getRepositoryFromUri(uri)
29+
);
30+
let repositories = await Promise.all(promiseArray);
31+
repositories = repositories.filter(repository => repository);
32+
33+
if (repositories.length === 0) {
1434
window.showErrorMessage(
15-
`Unable to add file to changelist. File is not under version control`
35+
"Files are not under version control and cannot be added to a change list"
1636
);
1737
return;
1838
}
1939

20-
const uris = selection.map(resource => resource.resourceUri);
40+
const uniqueRepositories = Array.from(new Set(repositories));
2141

22-
await this.runByRepository(uris, async (repository, resources) => {
23-
if (!repository) {
24-
return;
25-
}
42+
if (uniqueRepositories.length !== 1) {
43+
window.showErrorMessage(
44+
"Unable to add files from different repositories to change list"
45+
);
46+
return;
47+
}
2648

27-
let canRemove = false;
28-
29-
repository.changelists.forEach((group, changelist) => {
30-
if (
31-
group.resourceStates.some(state => {
32-
return resources.some(resource => {
33-
return resource.path === state.resourceUri.path;
34-
});
35-
})
36-
) {
37-
canRemove = true;
38-
return false;
39-
}
40-
});
41-
42-
const changelistName = await inputSwitchChangelist(repository, canRemove);
43-
44-
if (!changelistName && changelistName !== false) {
45-
return;
46-
}
49+
if (repositories.length !== uris.length) {
50+
window.showErrorMessage(
51+
"Some Files are not under version control and cannot be added to a change list"
52+
);
53+
return;
54+
}
55+
56+
const repository = repositories[0];
4757

48-
const paths = resources.map(resource => resource.fsPath);
49-
50-
if (changelistName === false) {
51-
try {
52-
await repository.removeChangelist(paths);
53-
} catch (error) {
54-
console.log(error);
55-
window.showErrorMessage(
56-
`Unable to remove file "${paths.join(",")}" from changelist`
57-
);
58-
}
59-
} else {
60-
try {
61-
await repository.addChangelist(paths, changelistName);
62-
} catch (error) {
63-
console.log(error);
64-
window.showErrorMessage(
65-
`Unable to add file "${paths.join(
66-
","
67-
)}" to changelist "${changelistName}"`
68-
);
69-
}
58+
if (!repository) {
59+
return;
60+
}
61+
62+
const paths = uris.map(uri => uri.fsPath);
63+
let canRemove = false;
64+
65+
repository.changelists.forEach((group, changelist) => {
66+
if (
67+
group.resourceStates.some(state => {
68+
return paths.some(path => {
69+
return (
70+
normalizePath(path) === normalizePath(state.resourceUri.path)
71+
);
72+
});
73+
})
74+
) {
75+
canRemove = true;
76+
return false;
7077
}
7178
});
79+
80+
const changelistName = await inputSwitchChangelist(repository, canRemove);
81+
82+
if (!changelistName && changelistName !== false) {
83+
return;
84+
}
85+
86+
if (changelistName === false) {
87+
try {
88+
await repository.removeChangelist(paths);
89+
} catch (error) {
90+
console.log(error);
91+
window.showErrorMessage(
92+
`Unable to remove file "${paths.join(",")}" from changelist`
93+
);
94+
}
95+
} else {
96+
try {
97+
await repository.addChangelist(paths, changelistName);
98+
window.showInformationMessage(
99+
`Added files "${paths.join(",")}" to changelist "${changelistName}"`
100+
);
101+
} catch (error) {
102+
console.log(error);
103+
window.showErrorMessage(
104+
`Unable to add file "${paths.join(
105+
","
106+
)}" to changelist "${changelistName}"`
107+
);
108+
}
109+
}
72110
}
73111
}

src/common/types.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ export enum Operation {
102102
Status = "Status",
103103
StatusRemote = "StatusRemote",
104104
SwitchBranch = "SwitchBranch",
105-
Update = "Update"
105+
Update = "Update",
106+
Info = "Info"
106107
}
107108

108109
export interface ISvnResourceGroup extends SourceControlResourceGroup {

src/model.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,21 @@ export class Model implements IDisposable {
395395
return undefined;
396396
}
397397

398+
public async getRepositoryFromUri(uri: Uri) {
399+
for (const liveRepository of this.openRepositories) {
400+
const repository = liveRepository.repository;
401+
402+
try {
403+
const path = normalizePath(uri.fsPath);
404+
const info = await repository.info(path);
405+
406+
return repository;
407+
} catch (error) {
408+
console.error();
409+
}
410+
}
411+
}
412+
398413
private open(repository: Repository): void {
399414
const onDidDisappearRepository = filterEvent(
400415
repository.onDidChangeState,

src/repository.ts

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,8 @@ export class Repository {
545545

546546
if (
547547
(status.status === Status.NORMAL || status.status === Status.NONE) &&
548-
(status.props === Status.NORMAL || status.props === Status.NONE)
548+
(status.props === Status.NORMAL || status.props === Status.NONE) &&
549+
!status.changelist
549550
) {
550551
// Ignore non changed itens
551552
continue;
@@ -572,17 +573,15 @@ export class Repository {
572573
} else {
573574
unversioned.push(resource);
574575
}
575-
} else {
576-
if (!status.changelist) {
577-
changes.push(resource);
578-
} else {
579-
let changelist = changelists.get(status.changelist);
580-
if (!changelist) {
581-
changelist = [];
582-
}
583-
changelist.push(resource);
584-
changelists.set(status.changelist, changelist);
576+
} else if (status.changelist) {
577+
let changelist = changelists.get(status.changelist);
578+
if (!changelist) {
579+
changelist = [];
585580
}
581+
changelist.push(resource);
582+
changelists.set(status.changelist, changelist);
583+
} else {
584+
changes.push(resource);
586585
}
587586
}
588587

@@ -820,6 +819,10 @@ export class Repository {
820819
return this.run(Operation.Revert, () => this.repository.revert(files));
821820
}
822821

822+
public async info(path: string) {
823+
return this.run(Operation.Info, () => this.repository.getInfo(path));
824+
}
825+
823826
public async patch(files: string[]) {
824827
return this.run(Operation.Patch, () => this.repository.patch(files));
825828
}

0 commit comments

Comments
 (0)