Skip to content

Commit 500fb5e

Browse files
Use the new API for copyFile().
1 parent 45717d3 commit 500fb5e

File tree

4 files changed

+65
-110
lines changed

4 files changed

+65
-110
lines changed

src/client/common/platform/fileSystem.ts

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import { injectable } from 'inversify';
1111
import * as fspath from 'path';
1212
import * as tmp from 'tmp';
1313
import * as vscode from 'vscode';
14-
import { createDeferred } from '../utils/async';
1514
import { getOSType, OSType } from '../utils/platform';
1615
import {
1716
FileStat, FileType,
@@ -42,7 +41,7 @@ function convertFileStat(stat: fsextra.Stats): FileStat {
4241

4342
// This is the parts of the vscode.workspace.fs API that we use here.
4443
interface INewAPI {
45-
//copy(source: vscode.Uri, target: vscode.Uri, options?: {overwrite: boolean}): Thenable<void>;
44+
copy(source: vscode.Uri, target: vscode.Uri, options?: {overwrite: boolean}): Thenable<void>;
4645
//createDirectory(uri: vscode.Uri): Thenable<void>;
4746
delete(uri: vscode.Uri, options?: {recursive: boolean; useTrash: boolean}): Thenable<void>;
4847
readDirectory(uri: vscode.Uri): Thenable<[string, FileType][]>;
@@ -70,8 +69,6 @@ interface IRawFSExtra {
7069
// non-async
7170
statSync(filename: string): fsextra.Stats;
7271
readFileSync(path: string, encoding: string): string;
73-
createReadStream(src: string): fsextra.ReadStream;
74-
createWriteStream(dest: string): fsextra.WriteStream;
7572
}
7673

7774
// Later we will drop "FileSystem", switching usage to
@@ -126,6 +123,14 @@ export class RawFileSystem implements IRawFileSystem {
126123
return this.newapi.readDirectory(uri);
127124
}
128125

126+
public async copyFile(src: string, dest: string): Promise<void> {
127+
const srcURI = vscode.Uri.file(src);
128+
const destURI = vscode.Uri.file(dest);
129+
await this.newapi.copy(srcURI, destURI, {
130+
overwrite: true
131+
});
132+
}
133+
129134
//****************************
130135
// fs-extra
131136

@@ -143,22 +148,6 @@ export class RawFileSystem implements IRawFileSystem {
143148
return convertFileStat(stat);
144149
}
145150

146-
public async copyFile(src: string, dest: string): Promise<void> {
147-
const deferred = createDeferred<void>();
148-
const rs = this.fsExtra.createReadStream(src)
149-
.on('error', (err) => {
150-
deferred.reject(err);
151-
});
152-
const ws = this.fsExtra.createWriteStream(dest)
153-
.on('error', (err) => {
154-
deferred.reject(err);
155-
}).on('close', () => {
156-
deferred.resolve();
157-
});
158-
rs.pipe(ws);
159-
return deferred.promise;
160-
}
161-
162151
//****************************
163152
// fs
164153

src/test/common/platform/filesystem.functional.test.ts

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -221,58 +221,6 @@ suite('Raw FileSystem', () => {
221221
});
222222
});
223223

224-
suite('copyFile', () => {
225-
test('the source file gets copied (same directory)', async () => {
226-
const data = '<content>';
227-
const src = await fix.createFile('x/y/z/spam.py', data);
228-
const dest = await fix.resolve('x/y/z/spam.py.bak');
229-
await ensureDoesNotExist(dest);
230-
231-
await filesystem.copyFile(src, dest);
232-
233-
const actual = await fsextra.readFile(dest)
234-
.then(buffer => buffer.toString());
235-
expect(actual).to.equal(data);
236-
const original = await fsextra.readFile(src)
237-
.then(buffer => buffer.toString());
238-
expect(original).to.equal(data);
239-
});
240-
241-
test('the source file gets copied (different directory)', async () => {
242-
const data = '<content>';
243-
const src = await fix.createFile('x/y/z/spam.py', data);
244-
const dest = await fix.resolve('x/y/eggs.py');
245-
await ensureDoesNotExist(dest);
246-
247-
await filesystem.copyFile(src, dest);
248-
249-
const actual = await fsextra.readFile(dest)
250-
.then(buffer => buffer.toString());
251-
expect(actual).to.equal(data);
252-
const original = await fsextra.readFile(src)
253-
.then(buffer => buffer.toString());
254-
expect(original).to.equal(data);
255-
});
256-
257-
test('fails if the source does not exist', async () => {
258-
const dest = await fix.resolve('x/spam.py');
259-
260-
const promise = filesystem.copyFile(DOES_NOT_EXIST, dest);
261-
262-
await expect(promise).to.eventually.be.rejected;
263-
});
264-
265-
test('fails if the target parent directory does not exist', async () => {
266-
const src = await fix.createFile('x/spam.py', '...');
267-
const dest = await fix.resolve('y/eggs.py', false);
268-
await ensureDoesNotExist(path.dirname(dest));
269-
270-
const promise = filesystem.copyFile(src, dest);
271-
272-
await expect(promise).to.eventually.be.rejected;
273-
});
274-
});
275-
276224
suite('touch', () => {
277225
test('open() and closed() are used properly', async () => {
278226
const filename = await fix.resolve('spam.py');

src/test/common/platform/filesystem.test.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,58 @@ suite('Raw FileSystem', () => {
239239
await expect(promise).to.eventually.be.rejected;
240240
});
241241
});
242+
243+
suite('copyFile', () => {
244+
test('the source file gets copied (same directory)', async () => {
245+
const data = '<content>';
246+
const src = await fix.createFile('x/y/z/spam.py', data);
247+
const dest = await fix.resolve('x/y/z/spam.py.bak');
248+
await ensureDoesNotExist(dest);
249+
250+
await filesystem.copyFile(src, dest);
251+
252+
const actual = await fsextra.readFile(dest)
253+
.then(buffer => buffer.toString());
254+
expect(actual).to.equal(data);
255+
const original = await fsextra.readFile(src)
256+
.then(buffer => buffer.toString());
257+
expect(original).to.equal(data);
258+
});
259+
260+
test('the source file gets copied (different directory)', async () => {
261+
const data = '<content>';
262+
const src = await fix.createFile('x/y/z/spam.py', data);
263+
const dest = await fix.resolve('x/y/eggs.py');
264+
await ensureDoesNotExist(dest);
265+
266+
await filesystem.copyFile(src, dest);
267+
268+
const actual = await fsextra.readFile(dest)
269+
.then(buffer => buffer.toString());
270+
expect(actual).to.equal(data);
271+
const original = await fsextra.readFile(src)
272+
.then(buffer => buffer.toString());
273+
expect(original).to.equal(data);
274+
});
275+
276+
test('fails if the source does not exist', async () => {
277+
const dest = await fix.resolve('x/spam.py');
278+
279+
const promise = filesystem.copyFile(DOES_NOT_EXIST, dest);
280+
281+
await expect(promise).to.eventually.be.rejected;
282+
});
283+
284+
test('fails if the target parent directory does not exist', async () => {
285+
const src = await fix.createFile('x/spam.py', '...');
286+
const dest = await fix.resolve('y/eggs.py', false);
287+
await ensureDoesNotExist(path.dirname(dest));
288+
289+
const promise = filesystem.copyFile(src, dest);
290+
291+
await expect(promise).to.eventually.be.rejected;
292+
});
293+
});
242294
});
243295

244296
suite('FileSystem Utils', () => {

src/test/common/platform/filesystem.unit.test.ts

Lines changed: 4 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919

2020
interface IRawFS {
2121
// VS Code
22+
copy(source: vscode.Uri, target: vscode.Uri, options?: {overwrite: boolean}): Thenable<void>;
2223
delete(uri: vscode.Uri, options?: {recursive: boolean; useTrash: boolean}): Thenable<void>;
2324
readDirectory(uri: vscode.Uri): Thenable<[string, FileType][]>;
2425
readFile(uri: vscode.Uri): Thenable<Uint8Array>;
@@ -30,15 +31,14 @@ interface IRawFS {
3031
open(filename: string, flags: number, callback: any): void;
3132
//tslint:disable-next-line:no-any
3233
close(fd: number, callback: any): void;
34+
createWriteStream(dest: string): fs.WriteStream;
3335

3436
// "fs-extra"
3537
chmod(filePath: string, mode: string): Promise<void>;
3638
lstat(filename: string): Promise<fsextra.Stats>;
3739
mkdirp(dirname: string): Promise<void>;
3840
statSync(filename: string): fsextra.Stats;
3941
readFileSync(path: string, encoding: string): string;
40-
createReadStream(src: string): fsextra.ReadStream;
41-
createWriteStream(dest: string): fsextra.WriteStream;
4242

4343
// node "path"
4444
join(...filenames: string[]): string;
@@ -310,48 +310,14 @@ suite('Raw FileSystem', () => {
310310
});
311311

312312
suite('copyFile', () => {
313-
let rs: TypeMoq.IMock<fsextra.ReadStream>;
314-
let ws: TypeMoq.IMock<fsextra.WriteStream>;
315-
let done: () => void;
316-
let finished: boolean;
317-
setup(() => {
318-
rs = TypeMoq.Mock.ofType<fsextra.ReadStream>(undefined, TypeMoq.MockBehavior.Strict);
319-
ws = TypeMoq.Mock.ofType<fsextra.WriteStream>(undefined, TypeMoq.MockBehavior.Strict);
320-
321-
rs.setup(s => s.on('error', TypeMoq.It.isAny()))
322-
.returns(() => rs.object);
323-
finished = false;
324-
done = () => {
325-
throw Error();
326-
};
327-
rs.setup(s => s.pipe(TypeMoq.It.isAny()))
328-
.callback(_r => {
329-
done();
330-
finished = true;
331-
});
332-
333-
ws.setup(s => s.on('error', TypeMoq.It.isAny()))
334-
.returns(() => ws.object);
335-
ws.setup(s => s.on('close', TypeMoq.It.isAny()))
336-
.callback((_e, cb) => {
337-
done = cb;
338-
})
339-
.returns(() => ws.object);
340-
});
341-
342313
test('read/write streams are used properly', async () => {
343314
const src = 'x/y/z/spam.py';
344315
const dest = 'x/y/z/spam.py.bak';
345-
raw.setup(r => r.createReadStream(src))
346-
.returns(() => rs.object);
347-
raw.setup(r => r.createWriteStream(dest))
348-
.returns(() => ws.object);
316+
raw.setup(r => r.copy(vscode.Uri.file(src), vscode.Uri.file(dest), { overwrite: true }))
317+
.returns(() => Promise.resolve());
349318

350319
await filesystem.copyFile(src, dest);
351320

352-
expect(finished).to.equal(true);
353-
rs.verifyAll();
354-
ws.verifyAll();
355321
verifyAll();
356322
});
357323
});

0 commit comments

Comments
 (0)