From 0d4396531e25d9f8489be5b106c09c06f49647b3 Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 24 Nov 2015 12:09:59 +0100 Subject: [PATCH] Webdav network drive not work (fixes #218) --- src/vs/base/node/extfs.ts | 22 +++++++++++++++---- .../electron-browser/snippetsTracker.ts | 3 ++- .../common/configurationService.ts | 9 ++++---- .../services/files/node/fileService.ts | 2 +- 4 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/vs/base/node/extfs.ts b/src/vs/base/node/extfs.ts index 4fc46053e96b6..1c9ca2a1b1970 100644 --- a/src/vs/base/node/extfs.ts +++ b/src/vs/base/node/extfs.ts @@ -27,7 +27,7 @@ export function readdir(path: string, callback: (error: Error, files: 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.readdir(path, (error, children) => { + return readdirNormalize(path, (error, children) => { if (error) { return callback(error, null); } @@ -36,9 +36,23 @@ export function readdir(path: string, callback: (error: Error, files: string[]) }); } - return fs.readdir(path, callback); + 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); + } + + // 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. + return callback(null, children.filter((c) => c !== '.' && c !== '..')); + }) +} + export function mkdirp(path: string, mode: number, callback: (error: Error) => void): void { fs.exists(path, (exists) => { if (exists) { @@ -91,7 +105,7 @@ export function copy(source: string, target: string, callback: (error: Error) => } mkdirp(target, stat.mode & 511, (err) => { - fs.readdir(source, (err, files) => { + readdir(source, (err, files) => { loop(files, (file: string, clb: (error: Error) => void) => { copy(paths.join(source, file), paths.join(target, file), clb, copiedSources); }, callback); @@ -204,7 +218,7 @@ function rmRecursive(path: string, callback: (error: Error) => void): void { fs.unlink(path, callback); } } else { - fs.readdir(path, (err, children) => { + readdir(path, (err, children) => { if (err || !children) { callback(err); } else if (children.length === 0) { diff --git a/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.ts b/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.ts index 730a715b1f53d..61faf573bf3da 100644 --- a/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.ts +++ b/src/vs/workbench/parts/snippets/electron-browser/snippetsTracker.ts @@ -12,6 +12,7 @@ import async = require('vs/base/common/async'); import Errors = require('vs/base/common/errors'); import URI from 'vs/base/common/uri'; import winjs = require('vs/base/common/winjs.base'); +import extfs = require('vs/base/node/extfs'); import lifecycle = require('vs/base/common/lifecycle'); import tmsnippets = require('vs/editor/node/textMate/TMSnippets'); import {IFileService} from 'vs/platform/files/common/files'; @@ -100,7 +101,7 @@ export class SnippetsTracker implements workbenchExt.IWorkbenchContribution { function readDir(path: string): winjs.TPromise { return new winjs.TPromise((c, e, p) => { - fs.readdir(path,(err, files) => { + extfs.readdir(path,(err, files) => { if (err) { return e(err); } diff --git a/src/vs/workbench/services/configuration/common/configurationService.ts b/src/vs/workbench/services/configuration/common/configurationService.ts index d15ada7e88280..e30b091b83773 100644 --- a/src/vs/workbench/services/configuration/common/configurationService.ts +++ b/src/vs/workbench/services/configuration/common/configurationService.ts @@ -11,6 +11,7 @@ import uri from 'vs/base/common/uri'; import strings = require('vs/base/common/strings'); import platform = require('vs/base/common/platform'); import paths = require('vs/base/common/paths'); +import extfs = require('vs/base/node/extfs'); import {IConfigFile} from 'vs/platform/configuration/common/model'; import objects = require('vs/base/common/objects'); import {IStat, IContent, ConfigurationService as CommonConfigurationService} from 'vs/platform/configuration/common/configurationService'; @@ -62,9 +63,9 @@ export class ConfigurationService extends CommonConfigurationService { protected resolveStat(resource: uri): TPromise { return new TPromise((c, e) => { - fs.readdir(resource.fsPath, (error, childs) => { + extfs.readdir(resource.fsPath, (error, childs) => { if (error) { - if (error.code === 'ENOTDIR') { + if ((error).code === 'ENOTDIR') { c({ resource: resource, isDirectory: false @@ -158,7 +159,7 @@ export class MigrationConfigurationService extends ConfigurationService { return c(null); // we never migrate more than once } - return fs.readdir(oldSettingsFolder, (error, children) => { + return extfs.readdir(oldSettingsFolder, (error, children) => { if (error) { return c(null); // old .settings folder does not exist or is a file } @@ -187,7 +188,7 @@ export class MigrationConfigurationService extends ConfigurationService { }, () => { this.messageService.show(severity.Info, nls.localize('settingsMigrated', "VSCode is now using a top level '.vscode' folder to store settings. We moved your existing settings files from the '.settings' folder.")); - return fs.readdir(oldSettingsFolder, (error, children) => { + return extfs.readdir(oldSettingsFolder, (error, children) => { if (error || children.length > 0) { return c(null); // done } diff --git a/src/vs/workbench/services/files/node/fileService.ts b/src/vs/workbench/services/files/node/fileService.ts index ef3be5934bce9..8b04154682509 100644 --- a/src/vs/workbench/services/files/node/fileService.ts +++ b/src/vs/workbench/services/files/node/fileService.ts @@ -678,7 +678,7 @@ export class StatResolver { fileStat = fsstat; if (fileStat.isDirectory()) { - fs.readdir(fileResource.fsPath, (error, result) => { + extfs.readdir(fileResource.fsPath, (error, result) => { this(null, result ? result.length : 0); }); } else {