Skip to content

Commit

Permalink
fix(which): match only executable files (shelljs#657)
Browse files Browse the repository at this point in the history
  • Loading branch information
termosa committed Jul 12, 2018
1 parent 6d66a1a commit 79b8feb
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 2 deletions.
11 changes: 10 additions & 1 deletion src/which.js
Expand Up @@ -18,8 +18,17 @@ function splitPath(p) {
return p ? p.split(path.delimiter) : [];
}

function isExecutable(pathName) {
try {
fs.accessSync(pathName, fs.constants.X_OK);
} catch (err) {
return false;
}
return true;
}

function checkPath(pathName) {
return fs.existsSync(pathName) && !common.statFollowLinks(pathName).isDirectory();
return fs.existsSync(pathName) && !common.statFollowLinks(pathName).isDirectory() && isExecutable(pathName);
}

//@
Expand Down
1 change: 1 addition & 0 deletions test/resources/which/node
@@ -0,0 +1 @@
text file, not an executable
23 changes: 22 additions & 1 deletion test/which.js
@@ -1,4 +1,5 @@
import fs from 'fs';
import path from 'path';

import test from 'ava';

Expand Down Expand Up @@ -69,5 +70,25 @@ test('Searching with -a flag returns an array with first item equals to the regu
t.falsy(shell.error());
t.truthy(resultForWhich);
t.truthy(resultForWhichA);
t.is(resultForWhich.toString(), resultForWhichA[0].toString());
t.is(resultForWhich.toString(), resultForWhichA[0]);
});

test('None executable files does not appear in the result list', t => {
const commandName = 'node'; // Should be an existing command
const pathEnv = process.env.path || process.env.Path || process.env.PATH;
const extraPath = path.resolve(__dirname, 'resources', 'which');
const matchingFile = path.resolve(extraPath, commandName);

// make sure that file is exists (will throw error otherwise)
fs.statSync(matchingFile);

process.env.path = process.env.Path = process.env.PATH = extraPath + path.delimiter + pathEnv;
const resultForWhich = shell.which(commandName);
const resultForWhichA = shell.which('-a', commandName);
t.falsy(shell.error());
t.truthy(resultForWhich);
t.truthy(resultForWhichA);
t.truthy(resultForWhichA.length);
t.not(resultForWhich.toString(), matchingFile);
t.not(resultForWhichA[0], matchingFile);
});

0 comments on commit 79b8feb

Please sign in to comment.