Skip to content

Commit 0ff8666

Browse files
authored
fix: diff files now have unique paths (#694)
1 parent 1d2f922 commit 0ff8666

File tree

3 files changed

+72
-8
lines changed

3 files changed

+72
-8
lines changed

src/historyView/common.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { exists, lstat } from "../fs";
1313
import { configuration } from "../helpers/configuration";
1414
import { IRemoteRepository } from "../remoteRepository";
1515
import { SvnRI } from "../svnRI";
16-
import { dumpSvnFile } from "../tempFiles";
16+
import { createTempSvnRevisionFile } from "../tempFiles";
1717

1818
export enum LogTreeItemKind {
1919
Repo = 1,
@@ -263,7 +263,7 @@ async function downloadFile(
263263
window.showErrorMessage("Failed to open path");
264264
throw e;
265265
}
266-
return dumpSvnFile(arg, revision, out);
266+
return createTempSvnRevisionFile(arg, revision, out);
267267
}
268268

269269
export async function openDiff(
@@ -293,7 +293,7 @@ export async function openFileRemote(
293293
window.showErrorMessage("Failed to open path");
294294
return;
295295
}
296-
const localUri = await dumpSvnFile(arg, against, out);
296+
const localUri = await createTempSvnRevisionFile(arg, against, out);
297297
const opts: TextDocumentShowOptions = {
298298
preview: true
299299
};

src/tempFiles.ts

+15-5
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,29 @@ import * as os from "os";
22
import * as path from "path";
33
import { Uri } from "vscode";
44
import { exists, mkdir, writeFile } from "./fs";
5+
import * as crypto from "crypto";
56

67
export const tempdir = path.join(os.tmpdir(), "vscode-svn");
78

8-
export async function dumpSvnFile(
9-
snvUri: Uri,
9+
export async function createTempSvnRevisionFile(
10+
svnUri: Uri,
1011
revision: string,
1112
payload: string
1213
): Promise<Uri> {
13-
if (!await exists(tempdir)) {
14+
if (!(await exists(tempdir))) {
1415
await mkdir(tempdir);
1516
}
16-
const fname = `r${revision}_${path.basename(snvUri.fsPath)}`;
17-
const fpath = path.join(tempdir, fname);
17+
18+
const fname = `r${revision}_${path.basename(svnUri.fsPath)}`;
19+
const hash = crypto.createHash("md5");
20+
const data = hash.update(svnUri.path);
21+
const filePathHash = data.digest("hex");
22+
23+
if (!(await exists(path.join(tempdir, filePathHash)))) {
24+
await mkdir(path.join(tempdir, filePathHash));
25+
}
26+
27+
const fpath = path.join(tempdir, filePathHash, fname);
1828
await writeFile(fpath, payload);
1929
return Uri.file(fpath);
2030
}

src/test/tempFiles.test.ts

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import * as assert from "assert";
2+
import { Uri } from "vscode";
3+
import { exists } from "../fs/exists";
4+
import { readFile } from "../fs/read_file";
5+
import * as os from "os";
6+
import { join } from "path";
7+
import { createTempSvnRevisionFile } from "../tempFiles";
8+
9+
/*
10+
On windows node will return the temp fir in the C drive as 'C:\'
11+
where url.fspath will start with 'c:\'
12+
*/
13+
let osTmpDir = os.tmpdir();
14+
osTmpDir = osTmpDir[0].toLowerCase() + osTmpDir.substr(1);
15+
const tempRevisionPath = join(
16+
osTmpDir,
17+
"vscode-svn",
18+
"1181ae15a77d83ac0b077051dfed21ed",
19+
"r30_test.js"
20+
);
21+
22+
suite("Test temp file creation", () => {
23+
test("Temp files matches expected", async () => {
24+
const svnUri = Uri.parse("http://example.com/svn/test/trunk/test.js");
25+
26+
const revisionUri = await createTempSvnRevisionFile(
27+
svnUri,
28+
"30",
29+
"test content"
30+
);
31+
32+
assert.equal(revisionUri.fsPath, tempRevisionPath);
33+
});
34+
35+
test("Temp file is created", async () => {
36+
const svnUri = Uri.parse("http://example.com/svn/test/trunk/test.js");
37+
38+
await createTempSvnRevisionFile(svnUri, "30", "test content");
39+
40+
assert.ok(await exists(tempRevisionPath));
41+
});
42+
43+
test("Temp contents are correct", async () => {
44+
const svnUri = Uri.parse("http://example.com/svn/test/trunk/test.js");
45+
46+
const revisionUri = await createTempSvnRevisionFile(
47+
svnUri,
48+
"30",
49+
"test content"
50+
);
51+
52+
assert.equal(await readFile(revisionUri.fsPath), "test content");
53+
});
54+
});

0 commit comments

Comments
 (0)