From 48daad51fa580f9c1a59549cd3302683ddcbbac9 Mon Sep 17 00:00:00 2001 From: isidor Date: Tue, 20 Feb 2018 12:22:40 +0100 Subject: [PATCH] pfs, extfs: add statLink --- src/vs/base/node/extfs.ts | 22 ++++++++++++++++++- src/vs/base/node/pfs.ts | 10 +++++++++ src/vs/platform/files/common/files.ts | 2 +- .../views/explorerDecorationsProvider.ts | 4 ++-- .../services/files/node/fileService.ts | 12 ++++------ 5 files changed, 38 insertions(+), 12 deletions(-) diff --git a/src/vs/base/node/extfs.ts b/src/vs/base/node/extfs.ts index d3e56f8555b..d12eb3922a9 100644 --- a/src/vs/base/node/extfs.ts +++ b/src/vs/base/node/extfs.ts @@ -43,6 +43,26 @@ export function readdir(path: string, callback: (error: Error, files: string[]) return fs.readdir(path, callback); } +export function statLink(path: string, callback: (error: Error, statAndIsLink: { stat: fs.Stats, isSymbolicLink: boolean }) => void): void { + fs.lstat(path, (error, stat) => { + if (error) { + return callback(error, null); + } + + if (stat.isSymbolicLink()) { + fs.stat(path, (error, stat) => { + if (error) { + return callback(error, null); + } + + callback(null, { stat, isSymbolicLink: true }); + }); + } else { + callback(null, { stat, isSymbolicLink: false }); + } + }); +} + export function copy(source: string, target: string, callback: (error: Error) => void, copiedSources?: { [path: string]: boolean }): void { if (!copiedSources) { copiedSources = Object.create(null); @@ -628,4 +648,4 @@ export function watch(path: string, onChange: (type: string, path: string) => vo } return void 0; -} \ No newline at end of file +} diff --git a/src/vs/base/node/pfs.ts b/src/vs/base/node/pfs.ts index c16be6ca58d..d44b20debe8 100644 --- a/src/vs/base/node/pfs.ts +++ b/src/vs/base/node/pfs.ts @@ -54,6 +54,16 @@ export function stat(path: string): TPromise { return nfcall(fs.stat, path); } +export function statLink(path: string): TPromise<{ stat: fs.Stats, isSymbolicLink: boolean }> { + return nfcall(fs.lstat, path).then((stat: fs.Stats) => { + if (stat.isSymbolicLink()) { + return nfcall(fs.stat, path).then(stat => ({ stat, isSymbolicLink: true })); + } + + return { stat, isSymbolicLink: false }; + }); +} + export function lstat(path: string): TPromise { return nfcall(fs.lstat, path); } diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 401a6a13152..5ffee751d2d 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -411,7 +411,7 @@ export interface IFileStat extends IBaseStat { isDirectory: boolean; /** - * The resource is a simbolic link. + * The resource is a symbolic link. */ isSymbolicLink?: boolean; diff --git a/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.ts b/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.ts index 4fe167d36b6..c60da660e48 100644 --- a/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.ts +++ b/src/vs/workbench/parts/files/electron-browser/views/explorerDecorationsProvider.ts @@ -41,8 +41,8 @@ export class ExplorerDecorationsProvider implements IDecorationsProvider { } if (fileStat && fileStat.isSymbolicLink) { return { - tooltip: localize('symbolicLlink', "Symbolic link"), - letter: '\u21f2' + tooltip: localize('symbolicLlink', "Symbolic Link"), + letter: '\u2937' }; } diff --git a/src/vs/workbench/services/files/node/fileService.ts b/src/vs/workbench/services/files/node/fileService.ts index 2df67c4e4c4..134610f0a45 100644 --- a/src/vs/workbench/services/files/node/fileService.ts +++ b/src/vs/workbench/services/files/node/fileService.ts @@ -1233,13 +1233,9 @@ export class StatResolver { }, function stat(this: any): void { - fs.lstat(fileResource.fsPath, (error, stat) => { - isSymbolicLink = stat.isSymbolicLink(); - if (isSymbolicLink) { - fs.stat(fileResource.fsPath, this); - } else { - this(null, stat); - } + extfs.statLink(fileResource.fsPath, (error: Error, statAndIsLink) => { + isSymbolicLink = statAndIsLink.isSymbolicLink; + this(null, statAndIsLink.stat); }); }, @@ -1259,7 +1255,7 @@ export class StatResolver { const childStat: IFileStat = { resource: fileResource, isDirectory: fileStat.isDirectory(), - isSymbolicLink: isSymbolicLink, + isSymbolicLink, name: file, mtime: fileStat.mtime.getTime(), etag: etag(fileStat), -- GitLab