Skip to content

Commit

Permalink
Merge pull request #935 from MarshallOfSound/fix-deep-sym-link-resolu…
Browse files Browse the repository at this point in the history
…tion

fix: resolve symbolic links completely when hunting for subcommands
  • Loading branch information
abetomo committed Apr 1, 2019
2 parents 291fc04 + 994d24d commit 50922d8
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 7 deletions.
11 changes: 4 additions & 7 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -527,14 +527,11 @@ Command.prototype.executeSubCommand = function(argv, args, unknown) {

// In case of globally installed, get the base dir where executable
// subcommand file should be located at
var baseDir,
link = fs.lstatSync(f).isSymbolicLink() ? fs.readlinkSync(f) : f;
var baseDir;

// when symbolink is relative path
if (link !== f && link.charAt(0) !== '/') {
link = path.join(dirname(f), link);
}
baseDir = dirname(link);
var resolvedLink = fs.realpathSync(f);

baseDir = dirname(resolvedLink);

// prefer local `./<bin>` to bin in the $PATH
var localBin = path.join(baseDir, bin);
Expand Down
1 change: 1 addition & 0 deletions test/fixtures/another-dir/pm
1 change: 1 addition & 0 deletions test/fixtures/other-dir/pm
7 changes: 7 additions & 0 deletions test/test.command.executableSubcommand.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,10 @@ var bin = path.join(__dirname, './fixtures/pmlink')
exec(bin + ' install', function (error, stdout, stderr) {
stdout.should.equal('install\n');
});

// when `bin` is a symbol link pointing at a symbolic for mocking global install
var bin = path.join(__dirname, './fixtures/another-dir/pm')
// success case
exec(bin + ' install', function (error, stdout, stderr) {
stdout.should.equal('install\n');
});
7 changes: 7 additions & 0 deletions test/test.command.executableSubcommandAlias.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,10 @@ var bin = path.join(__dirname, './fixtures/pmlink')
exec(bin + ' i', function (error, stdout, stderr) {
stdout.should.equal('install\n');
});

// when `bin` is a symbol link pointing at a symbolic for mocking global install
var bin = path.join(__dirname, './fixtures/another-dir/pm')
// success case
exec(bin + ' install', function (error, stdout, stderr) {
stdout.should.equal('install\n');
});
7 changes: 7 additions & 0 deletions test/test.command.executableSubcommandDefault.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,10 @@ var bin = path.join(__dirname, './fixtures/pmlink')
exec(bin + ' install', function (error, stdout, stderr) {
stdout.should.equal('install\n');
});

// when `bin` is a symbol link pointing at a symbolic for mocking global install
var bin = path.join(__dirname, './fixtures/another-dir/pm')
// success case
exec(bin + ' install', function (error, stdout, stderr) {
stdout.should.equal('install\n');
});

0 comments on commit 50922d8

Please sign in to comment.