From 1c2ef49f8ebcaffc37ee3a8f01a76259b727adb8 Mon Sep 17 00:00:00 2001 From: Ari Porad Date: Sat, 20 Feb 2016 15:13:46 -0800 Subject: [PATCH 1/2] perf(cd): only run `stat` once --- src/cd.js | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/src/cd.js b/src/cd.js index b7b9931..e70e37d 100644 --- a/src/cd.js +++ b/src/cd.js @@ -16,13 +16,19 @@ function _cd(options, dir) { dir = common.state.previousDir; } - if (!fs.existsSync(dir)) - common.error('no such file or directory: ' + dir); - - if (!fs.statSync(dir).isDirectory()) - common.error('not a directory: ' + dir); - - common.state.previousDir = process.cwd(); - process.chdir(dir); + // This complexity is so that we only stat once. + var error = null; + try { + var stat = fs.statSync(dir); + if(stat.isDirectory()) { + common.state.previousDir = process.cwd(); + process.chdir(dir); + } else { + error = 'not a directory: ' + dir; + } + } catch (e) { + error = 'no such file or directory: ' + dir; + } + if (error) common.error(error); } module.exports = _cd; From 48a3aade2e64f1b1f2cf0e4d3613ce52dca45c19 Mon Sep 17 00:00:00 2001 From: Nate Fischer Date: Sun, 28 Feb 2016 22:00:22 -0800 Subject: [PATCH 2/2] Improved cd performance and fix error messages --- src/cd.js | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/src/cd.js b/src/cd.js index e70e37d..51bc057 100644 --- a/src/cd.js +++ b/src/cd.js @@ -16,19 +16,20 @@ function _cd(options, dir) { dir = common.state.previousDir; } - // This complexity is so that we only stat once. - var error = null; try { - var stat = fs.statSync(dir); - if(stat.isDirectory()) { - common.state.previousDir = process.cwd(); - process.chdir(dir); - } else { - error = 'not a directory: ' + dir; - } + var curDir = process.cwd(); + process.chdir(dir); + common.state.previousDir = curDir; } catch (e) { - error = 'no such file or directory: ' + dir; + // something went wrong, let's figure out the error + var err; + try { + fs.statSync(dir); // if this succeeds, it must be some sort of file + err = 'not a directory: ' + dir; + } catch (e) { + err = 'no such file or directory: ' + dir; + } + if (err) common.error(err); } - if (error) common.error(error); } module.exports = _cd;