From aab05a86f5a959accce2fa388a36fb2cbc603f2b Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Fri, 21 Oct 2016 08:39:13 +0200 Subject: [PATCH] Hot Exit: avoid direct calls to fs.readdir()/fs.readdirSync() (fixes #14055) --- src/vs/base/node/extfs.ts | 29 ++++++++------------ src/vs/platform/backup/node/backupService.ts | 3 +- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/vs/base/node/extfs.ts b/src/vs/base/node/extfs.ts index 2158db2564f..9b1fa054214 100644 --- a/src/vs/base/node/extfs.ts +++ b/src/vs/base/node/extfs.ts @@ -16,11 +16,21 @@ import paths = require('path'); const loop = flow.loop; +export function readdirSync(path: string): string[] { + // Mac: uses NFD unicode form on disk, but we want NFC + // See also https://github.com/nodejs/node/issues/2165 + if (platform.isMacintosh) { + return fs.readdirSync(path).map(c => strings.normalizeNFC(c)); + } + + return fs.readdirSync(path); +} + export function readdir(path: string, callback: (error: Error, files: string[]) => void): void { // Mac: uses NFD unicode form on disk, but we want NFC // See also https://github.com/nodejs/node/issues/2165 if (platform.isMacintosh) { - return readdirNormalize(path, (error, children) => { + return fs.readdir(path, (error, children) => { if (error) { return callback(error, null); } @@ -29,22 +39,7 @@ export function readdir(path: string, callback: (error: Error, files: string[]) }); } - return readdirNormalize(path, callback); -} - -function readdirNormalize(path: string, callback: (error: Error, files: string[]) => void): void { - fs.readdir(path, (error, children) => { - if (error) { - return callback(error, null); - } - - // Bug in node: In some environments we get "." and ".." as entries from the call to readdir(). - // For example Sharepoint via WebDav on Windows includes them. We never want those - // entries in the result set though because they are not valid children of the folder - // for our concerns. - // See https://github.com/nodejs/node/issues/4002 - return callback(null, children.filter(c => c !== '.' && c !== '..')); - }); + return fs.readdir(path, callback); } export function mkdirp(path: string, mode: number, callback: (error: Error) => void): void { diff --git a/src/vs/platform/backup/node/backupService.ts b/src/vs/platform/backup/node/backupService.ts index 04f24df93f5..f43885ba6c5 100644 --- a/src/vs/platform/backup/node/backupService.ts +++ b/src/vs/platform/backup/node/backupService.ts @@ -10,6 +10,7 @@ import * as crypto from 'crypto'; import * as arrays from 'vs/base/common/arrays'; import fs = require('fs'); import pfs = require('vs/base/node/pfs'); +import { readdirSync } from 'vs/base/node/extfs'; import Uri from 'vs/base/common/uri'; import { IBackupService } from 'vs/platform/backup/common/backup'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -109,7 +110,7 @@ export class BackupService implements IBackupService { // Allow sync here as it's only used in workbench initialization's critical path try { - return fs.readdirSync(untitledDir).map(file => path.join(untitledDir, file)); + return readdirSync(untitledDir).map(file => path.join(untitledDir, file)); } catch (ex) { return []; } -- GitLab