Skip to content

Commit 18c7f91

Browse files
author
Benjamin Pasero
committed
files2 - implement moveFile()
1 parent 5faf7c3 commit 18c7f91

10 files changed

Lines changed: 338 additions & 317 deletions

File tree

src/vs/base/node/pfs.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ export function lstat(path: string): Promise<fs.Stats> {
5959
return nfcall(fs.lstat, path);
6060
}
6161

62+
export function move(oldPath: string, newPath: string): Promise<void> {
63+
return nfcall(extfs.mv, oldPath, newPath);
64+
}
65+
6266
export function rename(oldPath: string, newPath: string): Promise<void> {
6367
return nfcall(fs.rename, oldPath, newPath);
6468
}

src/vs/platform/files/common/files.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,14 @@ export interface IFileService {
127127
*
128128
* The optional parameter overwrite can be set to replace an existing file at the location.
129129
*/
130-
moveFile(source: URI, target: URI, overwrite?: boolean): Promise<IFileStat>;
130+
moveFile(source: URI, target: URI, overwrite?: boolean): Promise<IFileStatWithMetadata>;
131131

132132
/**
133133
* Copies the file to a path identified by the resource.
134134
*
135135
* The optional parameter overwrite can be set to replace an existing file at the location.
136136
*/
137-
copyFile(source: URI, target: URI, overwrite?: boolean): Promise<IFileStat>;
137+
copyFile(source: URI, target: URI, overwrite?: boolean): Promise<IFileStatWithMetadata>;
138138

139139
/**
140140
* Creates a new file with the given path. The returned promise
@@ -334,7 +334,7 @@ export const enum FileOperation {
334334

335335
export class FileOperationEvent {
336336

337-
constructor(private _resource: URI, private _operation: FileOperation, private _target?: IFileStat) {
337+
constructor(private _resource: URI, private _operation: FileOperation, private _target?: IFileStatWithMetadata) {
338338
}
339339

340340
get resource(): URI {
@@ -1100,8 +1100,6 @@ export interface ILegacyFileService {
11001100

11011101
updateContent(resource: URI, value: string | ITextSnapshot, options?: IUpdateContentOptions): Promise<IFileStat>;
11021102

1103-
moveFile(source: URI, target: URI, overwrite?: boolean): Promise<IFileStat>;
1104-
11051103
copyFile(source: URI, target: URI, overwrite?: boolean): Promise<IFileStat>;
11061104

11071105
createFile(resource: URI, content?: string, options?: ICreateFileOptions): Promise<IFileStat>;

src/vs/workbench/browser/nodeless.simpleservices.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ export class SimpleRemoteFileService implements IFileService {
763763
});
764764
}
765765

766-
moveFile(_source: URI, _target: URI, _overwrite?: boolean): Promise<IFileStat> { return Promise.resolve(null!); }
766+
moveFile(_source: URI, _target: URI, _overwrite?: boolean): Promise<IFileStatWithMetadata> { return Promise.resolve(null!); }
767767

768768
copyFile(_source: URI, _target: URI, _overwrite?: boolean): Promise<any> {
769769
const parent = fileMap.get(dirname(_target));

src/vs/workbench/services/files/node/fileService.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -805,23 +805,23 @@ export class FileService extends Disposable implements ILegacyFileService, IFile
805805
));
806806
}
807807

808-
moveFile(source: uri, target: uri, overwrite?: boolean): Promise<IFileStat> {
808+
moveFile(source: uri, target: uri, overwrite?: boolean): Promise<IFileStatWithMetadata> {
809809
return this.moveOrCopyFile(source, target, false, !!overwrite);
810810
}
811811

812-
copyFile(source: uri, target: uri, overwrite?: boolean): Promise<IFileStat> {
812+
copyFile(source: uri, target: uri, overwrite?: boolean): Promise<IFileStatWithMetadata> {
813813
return this.moveOrCopyFile(source, target, true, !!overwrite);
814814
}
815815

816-
private moveOrCopyFile(source: uri, target: uri, keepCopy: boolean, overwrite: boolean): Promise<IFileStat> {
816+
private moveOrCopyFile(source: uri, target: uri, keepCopy: boolean, overwrite: boolean): Promise<IFileStatWithMetadata> {
817817
const sourcePath = this.toAbsolutePath(source);
818818
const targetPath = this.toAbsolutePath(target);
819819

820820
// 1.) move / copy
821821
return this.doMoveOrCopyFile(sourcePath, targetPath, keepCopy, overwrite).then(() => {
822822

823823
// 2.) resolve
824-
return this.resolve(target).then(result => {
824+
return this.resolve(target, { resolveMetadata: true }).then(result => {
825825

826826
// Events (unless it was a no-op because paths are identical)
827827
if (sourcePath !== targetPath) {

src/vs/workbench/services/files/node/remoteFileService.ts

Lines changed: 4 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { flatten, isNonEmptyArray } from 'vs/base/common/arrays';
6+
import { isNonEmptyArray } from 'vs/base/common/arrays';
77
import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle';
88
import { TernarySearchTree } from 'vs/base/common/map';
99
import { Schemas } from 'vs/base/common/network';
@@ -223,8 +223,8 @@ export class RemoteFileService extends FileService {
223223
});
224224
}
225225

226-
resolveFile(resource: URI, options?: IResolveFileOptions): Promise<IFileStat>;
227226
resolveFile(resource: URI, options: IResolveMetadataFileOptions): Promise<IFileStatWithMetadata>;
227+
resolveFile(resource: URI, options?: IResolveFileOptions): Promise<IFileStat>;
228228
resolveFile(resource: URI, options?: IResolveFileOptions): Promise<IFileStat> {
229229
if (resource.scheme === Schemas.file) {
230230
return super.resolveFile(resource, options);
@@ -242,30 +242,6 @@ export class RemoteFileService extends FileService {
242242
}
243243
}
244244

245-
resolveFiles(toResolve: { resource: URI; options?: IResolveFileOptions; }[]): Promise<IResolveFileResult[]> {
246-
247-
// soft-groupBy, keep order, don't rearrange/merge groups
248-
let groups: Array<typeof toResolve> = [];
249-
let group: typeof toResolve | undefined;
250-
for (const request of toResolve) {
251-
if (!group || group[0].resource.scheme !== request.resource.scheme) {
252-
group = [];
253-
groups.push(group);
254-
}
255-
group.push(request);
256-
}
257-
258-
const promises: Promise<IResolveFileResult[]>[] = [];
259-
for (const group of groups) {
260-
if (group[0].resource.scheme === Schemas.file) {
261-
promises.push(super.resolveFiles(group));
262-
} else {
263-
promises.push(this._doResolveFiles(group));
264-
}
265-
}
266-
return Promise.all(promises).then(data => flatten(data));
267-
}
268-
269245
private _doResolveFiles(toResolve: { resource: URI; options?: IResolveFileOptions; }[]): Promise<IResolveFileResult[]> {
270246
return this._withProvider(toResolve[0].resource).then(provider => {
271247
let result: IResolveFileResult[] = [];
@@ -467,52 +443,7 @@ export class RemoteFileService extends FileService {
467443
}
468444
}
469445

470-
moveFile(source: URI, target: URI, overwrite?: boolean): Promise<IFileStat> {
471-
if (source.scheme !== target.scheme) {
472-
return this._doMoveAcrossScheme(source, target);
473-
} else if (source.scheme === Schemas.file) {
474-
return super.moveFile(source, target, overwrite);
475-
} else {
476-
return this._doMoveWithInScheme(source, target, overwrite);
477-
}
478-
}
479-
480-
private _doMoveWithInScheme(source: URI, target: URI, overwrite: boolean = false): Promise<IFileStat> {
481-
482-
const prepare = overwrite
483-
? Promise.resolve(this.del(target, { recursive: true }).catch(_err => { /*ignore*/ }))
484-
: Promise.resolve();
485-
486-
return prepare.then(() => this._withProvider(source)).then(RemoteFileService._throwIfFileSystemIsReadonly).then(provider => {
487-
return RemoteFileService._mkdirp(provider, resources.dirname(target)).then(() => {
488-
return provider.rename(source, target, { overwrite }).then(() => {
489-
return this.resolveFile(target);
490-
}).then(fileStat => {
491-
this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.MOVE, fileStat));
492-
return fileStat;
493-
}, err => {
494-
const result = toFileOperationResult(err);
495-
if (result === FileOperationResult.FILE_MOVE_CONFLICT) {
496-
throw new FileOperationError(localize('fileMoveConflict', "Unable to move/copy. File already exists at destination."), result);
497-
}
498-
throw err;
499-
});
500-
});
501-
});
502-
}
503-
504-
private _doMoveAcrossScheme(source: URI, target: URI, overwrite?: boolean): Promise<IFileStat> {
505-
return this.copyFile(source, target, overwrite).then(() => {
506-
return this.del(source, { recursive: true });
507-
}).then(() => {
508-
return this.resolveFile(target);
509-
}).then(fileStat => {
510-
this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.MOVE, fileStat));
511-
return fileStat;
512-
});
513-
}
514-
515-
copyFile(source: URI, target: URI, overwrite?: boolean): Promise<IFileStat> {
446+
copyFile(source: URI, target: URI, overwrite?: boolean): Promise<IFileStatWithMetadata> {
516447
if (source.scheme === target.scheme && source.scheme === Schemas.file) {
517448
return super.copyFile(source, target, overwrite);
518449
}
@@ -522,7 +453,7 @@ export class RemoteFileService extends FileService {
522453
if (source.scheme === target.scheme && (provider.capabilities & FileSystemProviderCapabilities.FileFolderCopy)) {
523454
// good: provider supports copy withing scheme
524455
return provider.copy!(source, target, { overwrite: !!overwrite }).then(() => {
525-
return this.resolveFile(target);
456+
return this.resolveFile(target, { resolveMetadata: true });
526457
}).then(fileStat => {
527458
this._onAfterOperation.fire(new FileOperationEvent(source, FileOperation.COPY, fileStat));
528459
return fileStat;

0 commit comments

Comments
 (0)