Skip to content

Commit 639f41d

Browse files
authored
Merge pull request #63 from edgardmessias/revert_multiple_folders
Fixed SVN revert for multiple svn folders
2 parents 226c0cf + 22fe223 commit 639f41d

File tree

4 files changed

+72
-14
lines changed

4 files changed

+72
-14
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
* @edgardmessias Fixed config option form svn path
3131
* @JohnstonCode Fixed conflicted files not having an icon
3232
* @edgardmessias Reduced calls to branch listings
33+
* @edgardmessias Fixed SVN revert for multiple svn folders
3334

3435
# **v1.3.2**
3536

src/commands.ts

Lines changed: 64 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ export class SvnCommands {
106106

107107
if (repository) {
108108
repositoryPromise = Promise.resolve(repository);
109-
} else if (this.model.openRepositories.length === 1) {
109+
} else if (this.model.repositories.length === 1) {
110110
repositoryPromise = Promise.resolve(this.model.repositories[0]);
111111
} else {
112112
repositoryPromise = this.model.pickRepository();
@@ -117,7 +117,7 @@ export class SvnCommands {
117117
return Promise.resolve();
118118
}
119119

120-
return Promise.resolve(method.apply(this, [repository, args]));
120+
return Promise.resolve(method.apply(this, [repository, ...args]));
121121
});
122122
}
123123

@@ -184,9 +184,12 @@ export class SvnCommands {
184184
}
185185

186186
@command("svn.commit", { repository: true })
187-
async commit(repository: Repository, ...args: any[][]): Promise<void> {
187+
async commit(
188+
repository: Repository,
189+
...resourceStates: Resource[]
190+
): Promise<void> {
188191
try {
189-
const paths = args[0].map(state => {
192+
const paths = resourceStates.map(state => {
190193
return state.resourceUri.fsPath;
191194
});
192195
const message = await inputCommitMessage();
@@ -205,8 +208,9 @@ export class SvnCommands {
205208
}
206209

207210
@command("svn.refresh", { repository: true })
208-
refresh(repository: Repository) {
211+
async refresh(repository: Repository) {
209212
repository.update();
213+
repository.updateBranches();
210214
}
211215

212216
async openDiff(resource: Resource, against: string) {
@@ -302,8 +306,12 @@ export class SvnCommands {
302306
await repository.branch(name);
303307
}
304308

305-
@command("svn.revert", { repository: true })
306-
async revert(repository: Repository, ...args: any[][]) {
309+
@command("svn.revert")
310+
async revert(...resourceStates: Resource[]) {
311+
if (resourceStates.length === 0) {
312+
return;
313+
}
314+
307315
const yes = "Yes I'm sure";
308316
const answer = await window.showWarningMessage(
309317
"Are you sure? This will wipe all local changes.",
@@ -315,12 +323,13 @@ export class SvnCommands {
315323
}
316324

317325
try {
318-
const paths = args[0].map(state => {
319-
return state.resourceUri.fsPath;
326+
const paths = resourceStates.map(state => {
327+
return state.resourceUri;
320328
});
321329

322-
await repository.repository.revert(paths);
323-
repository.update();
330+
await this.runByRepository(paths, async (repository, paths) =>
331+
repository.repository.revert(paths)
332+
);
324333
} catch (error) {
325334
console.error(error);
326335
window.showErrorMessage("Unable to revert");
@@ -337,4 +346,48 @@ export class SvnCommands {
337346
window.showErrorMessage("Unable to update");
338347
}
339348
}
349+
350+
private runByRepository<T>(
351+
resource: Uri,
352+
fn: (repository: Repository, resource: Uri) => Promise<T>
353+
): Promise<T[]>;
354+
private runByRepository<T>(
355+
resources: Uri[],
356+
fn: (repository: Repository, resources: Uri[]) => Promise<T>
357+
): Promise<T[]>;
358+
private async runByRepository<T>(
359+
arg: Uri | Uri[],
360+
fn: (repository: Repository, resources: any) => Promise<T>
361+
): Promise<T[]> {
362+
const resources = arg instanceof Uri ? [arg] : arg;
363+
const isSingleResource = arg instanceof Uri;
364+
365+
const groups = resources.reduce(
366+
(result, resource) => {
367+
const repository = this.model.getRepository(resource);
368+
369+
if (!repository) {
370+
console.warn("Could not find git repository for ", resource);
371+
return result;
372+
}
373+
374+
const tuple = result.filter(p => p.repository === repository)[0];
375+
376+
if (tuple) {
377+
tuple.resources.push(resource);
378+
} else {
379+
result.push({ repository, resources: [resource] });
380+
}
381+
382+
return result;
383+
},
384+
[] as { repository: Repository; resources: Uri[] }[]
385+
);
386+
387+
const promises = groups.map(({ repository, resources }) =>
388+
fn(repository as Repository, isSingleResource ? resources[0] : resources)
389+
);
390+
391+
return Promise.all(promises);
392+
}
340393
}

src/model.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ export class Model {
263263
const picks: any[] = this.openRepositories.map(repository => {
264264
return {
265265
label: path.basename(repository.repository.root),
266-
repository: repository
266+
repository: repository.repository
267267
};
268268
});
269269
const placeHolder = "Choose a repository";

src/svn.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { EventEmitter } from "events";
2-
import { window, workspace } from "vscode";
2+
import { window, workspace, Uri } from "vscode";
33
import * as cp from "child_process";
44
import * as iconv from "iconv-lite";
55
import * as jschardet from "jschardet";
@@ -231,7 +231,11 @@ export class Svn {
231231
let args = ["revert"];
232232

233233
for (let file of files) {
234-
args.push(file);
234+
if (file instanceof Uri){
235+
args.push(file.fsPath);
236+
} else {
237+
args.push(file);
238+
}
235239
}
236240

237241
return this.exec("", args);

0 commit comments

Comments
 (0)