Skip to content

Commit bfe7f99

Browse files
Use the new API for copyFile().
1 parent e682798 commit bfe7f99

File tree

4 files changed

+66
-110
lines changed

4 files changed

+66
-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 tmpMod 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,
@@ -97,7 +96,7 @@ export class TempFileSystem {
9796

9897
// This is the parts of the vscode.workspace.fs API that we use here.
9998
interface INewAPI {
100-
//copy(source: vscode.Uri, target: vscode.Uri, options?: {overwrite: boolean}): Thenable<void>;
99+
copy(source: vscode.Uri, target: vscode.Uri, options?: {overwrite: boolean}): Thenable<void>;
101100
//createDirectory(uri: vscode.Uri): Thenable<void>;
102101
delete(uri: vscode.Uri, options?: {recursive: boolean; useTrash: boolean}): Thenable<void>;
103102
readDirectory(uri: vscode.Uri): Thenable<[string, FileType][]>;
@@ -125,8 +124,6 @@ interface IRawFSExtra {
125124
// non-async
126125
statSync(filename: string): fsextra.Stats;
127126
readFileSync(path: string, encoding: string): string;
128-
createReadStream(src: string): fsextra.ReadStream;
129-
createWriteStream(dest: string): fsextra.WriteStream;
130127
}
131128

132129
//interface IRawPath {
@@ -186,6 +183,14 @@ export class RawFileSystem implements IRawFileSystem {
186183
return this.newapi.readDirectory(uri);
187184
}
188185

186+
public async copyFile(src: string, dest: string): Promise<void> {
187+
const srcURI = vscode.Uri.file(src);
188+
const destURI = vscode.Uri.file(dest);
189+
await this.newapi.copy(srcURI, destURI, {
190+
overwrite: true
191+
});
192+
}
193+
189194
//****************************
190195
// fs-extra
191196

@@ -203,22 +208,6 @@ export class RawFileSystem implements IRawFileSystem {
203208
return convertFileStat(stat);
204209
}
205210

206-
public async copyFile(src: string, dest: string): Promise<void> {
207-
const deferred = createDeferred<void>();
208-
const rs = this.fsExtra.createReadStream(src)
209-
.on('error', (err) => {
210-
deferred.reject(err);
211-
});
212-
const ws = this.fsExtra.createWriteStream(dest)
213-
.on('error', (err) => {
214-
deferred.reject(err);
215-
}).on('close', () => {
216-
deferred.resolve();
217-
});
218-
rs.pipe(ws);
219-
return deferred.promise;
220-
}
221-
222211
//****************************
223212
// non-async (fs-extra)
224213

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

Lines changed: 0 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -311,58 +311,6 @@ suite('Raw FileSystem', () => {
311311
});
312312
});
313313

314-
suite('copyFile', () => {
315-
test('the source file gets copied (same directory)', async () => {
316-
const data = '<content>';
317-
const src = await fix.createFile('x/y/z/spam.py', data);
318-
const dest = await fix.resolve('x/y/z/spam.py.bak');
319-
await ensureDoesNotExist(dest);
320-
321-
await filesystem.copyFile(src, dest);
322-
323-
const actual = await fsextra.readFile(dest)
324-
.then(buffer => buffer.toString());
325-
expect(actual).to.equal(data);
326-
const original = await fsextra.readFile(src)
327-
.then(buffer => buffer.toString());
328-
expect(original).to.equal(data);
329-
});
330-
331-
test('the source file gets copied (different directory)', async () => {
332-
const data = '<content>';
333-
const src = await fix.createFile('x/y/z/spam.py', data);
334-
const dest = await fix.resolve('x/y/eggs.py');
335-
await ensureDoesNotExist(dest);
336-
337-
await filesystem.copyFile(src, dest);
338-
339-
const actual = await fsextra.readFile(dest)
340-
.then(buffer => buffer.toString());
341-
expect(actual).to.equal(data);
342-
const original = await fsextra.readFile(src)
343-
.then(buffer => buffer.toString());
344-
expect(original).to.equal(data);
345-
});
346-
347-
test('fails if the source does not exist', async () => {
348-
const dest = await fix.resolve('x/spam.py');
349-
350-
const promise = filesystem.copyFile(DOES_NOT_EXIST, dest);
351-
352-
await expect(promise).to.eventually.be.rejected;
353-
});
354-
355-
test('fails if the target parent directory does not exist', async () => {
356-
const src = await fix.createFile('x/spam.py', '...');
357-
const dest = await fix.resolve('y/eggs.py', false);
358-
await ensureDoesNotExist(path.dirname(dest));
359-
360-
const promise = filesystem.copyFile(src, dest);
361-
362-
await expect(promise).to.eventually.be.rejected;
363-
});
364-
});
365-
366314
suite('statSync', () => {
367315
test('gets the info for an existing file', async () => {
368316
const filename = await fix.createFile('x/y/z/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: 5 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
import { expect } from 'chai';
5+
import * as fs from 'fs';
56
import * as fsextra from 'fs-extra';
67
import * as TypeMoq from 'typemoq';
78
import { Disposable, Uri } from 'vscode';
@@ -20,6 +21,7 @@ import {
2021
type TempCallback = (err: any, path: string, fd: number, cleanupCallback: () => void) => void;
2122
interface IRawFS {
2223
// VS Code
24+
copy(source: Uri, target: Uri, options?: {overwrite: boolean}): Thenable<void>;
2325
delete(uri: Uri, options?: {recursive: boolean; useTrash: boolean}): Thenable<void>;
2426
readDirectory(uri: Uri): Thenable<[string, FileType][]>;
2527
readFile(uri: Uri): Thenable<Uint8Array>;
@@ -31,15 +33,14 @@ interface IRawFS {
3133
open(filename: string, flags: number, callback: any): void;
3234
//tslint:disable-next-line:no-any
3335
close(fd: number, callback: any): void;
36+
createWriteStream(dest: string): fs.WriteStream;
3437

3538
// "fs-extra"
3639
chmod(filePath: string, mode: string): Promise<void>;
3740
lstat(filename: string): Promise<fsextra.Stats>;
3841
mkdirp(dirname: string): Promise<void>;
3942
statSync(filename: string): fsextra.Stats;
4043
readFileSync(path: string, encoding: string): string;
41-
createReadStream(src: string): fsextra.ReadStream;
42-
createWriteStream(dest: string): fsextra.WriteStream;
4344

4445
// node "path"
4546
join(...filenames: string[]): string;
@@ -501,48 +502,14 @@ suite('Raw FileSystem', () => {
501502
});
502503

503504
suite('copyFile', () => {
504-
let rs: TypeMoq.IMock<fsextra.ReadStream>;
505-
let ws: TypeMoq.IMock<fsextra.WriteStream>;
506-
let done: () => void;
507-
let finished: boolean;
508-
setup(() => {
509-
rs = TypeMoq.Mock.ofType<fsextra.ReadStream>(undefined, TypeMoq.MockBehavior.Strict);
510-
ws = TypeMoq.Mock.ofType<fsextra.WriteStream>(undefined, TypeMoq.MockBehavior.Strict);
511-
512-
rs.setup(s => s.on('error', TypeMoq.It.isAny()))
513-
.returns(() => rs.object);
514-
finished = false;
515-
done = () => {
516-
throw Error();
517-
};
518-
rs.setup(s => s.pipe(TypeMoq.It.isAny()))
519-
.callback(_r => {
520-
done();
521-
finished = true;
522-
});
523-
524-
ws.setup(s => s.on('error', TypeMoq.It.isAny()))
525-
.returns(() => ws.object);
526-
ws.setup(s => s.on('close', TypeMoq.It.isAny()))
527-
.callback((_e, cb) => {
528-
done = cb;
529-
})
530-
.returns(() => ws.object);
531-
});
532-
533505
test('read/write streams are used properly', async () => {
534506
const src = 'x/y/z/spam.py';
535507
const dest = 'x/y/z/spam.py.bak';
536-
raw.setup(r => r.createReadStream(src))
537-
.returns(() => rs.object);
538-
raw.setup(r => r.createWriteStream(dest))
539-
.returns(() => ws.object);
508+
raw.setup(r => r.copy(Uri.file(src), Uri.file(dest), { overwrite: true }))
509+
.returns(() => Promise.resolve());
540510

541511
await filesystem.copyFile(src, dest);
542512

543-
expect(finished).to.equal(true);
544-
rs.verifyAll();
545-
ws.verifyAll();
546513
verifyAll();
547514
});
548515
});

0 commit comments

Comments
 (0)