Skip to content

Commit

Permalink
feat: return a basic deep tree of dependecies
Browse files Browse the repository at this point in the history
  • Loading branch information
michael-go committed Jul 31, 2017
1 parent 6064a26 commit a854e18
Show file tree
Hide file tree
Showing 10 changed files with 163 additions and 79 deletions.
71 changes: 58 additions & 13 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ var fs = require('fs');
var path = require('path');
var toml = require('toml');

var subProcess = require('./sub-process');

module.exports = {
inspect: inspect,
};
Expand All @@ -13,11 +15,60 @@ module.exports = {
function inspect(root, targetFile, options) {
if (!options) { options = { dev: false }; }

return new Promise(function (resolve, reject) {
resolve(parseDepLock(root, targetFile, options));
//TODO: handle if missing
var depLocks = parseDepLock(root, targetFile, options);

var goTreeTool = path.join(__dirname, '..', 'gosrc', 'deps-tree.go')

return subProcess.execute(
'go',
['run', goTreeTool],
{cwd: root}
).then(function (tree) {
tree = JSON.parse(tree);

var pkgsTree = buildPkgsTree(tree, depLocks);

return {
plugin: {
name: 'snyk-go-plugin',
},
package: pkgsTree,
}
});
}

function buildPkgsTree(goDepsTree, depLocks) {
// TODO: what version to use for root? 0.0.0?
var root = {
name: goDepsTree.FullImportPath,
dependencies: {},
}

goDepsTree.Deps && goDepsTree.Deps.forEach(function (dep) {
var pkg = recursivelyBuildPkgs(dep, depLocks, root.from)
root.dependencies[pkg.name] = pkg;
})

return root;
}

function recursivelyBuildPkgs(goDepsTree, depLocks) {
var pkg = {
name: goDepsTree.Name,
dependencies: {},
}
//TODO: handle case when pkg not missing in locks
pkg.version = depLocks[pkg.name].version;

goDepsTree.Deps && goDepsTree.Deps.forEach(function (dep) {
var child = recursivelyBuildPkgs(dep, depLocks)
pkg.dependencies[child.name] = child;
})

return pkg;
}

function parseDepLock(root, targetFile, options) {
// TODO: check file exists
var lock = fs.readFileSync(path.join(root, targetFile));
Expand All @@ -29,11 +80,12 @@ function parseDepLock(root, targetFile, options) {
var deps = {};

lockJson.projects.forEach(function (proj) {
// TODO: I guess git-hash "version" should be treated differently
var version = (proj.version ? proj.version.slice(1) : '#' + proj.revision);
var version =
(proj.version ? proj.version.slice(1) : '#' + proj.revision);

proj.packages.forEach(function (subpackageName) {
var name = (subpackageName == '.' ? proj.name : proj.name + '/' + subpackageName);
var name =
(subpackageName == '.' ? proj.name : proj.name + '/' + subpackageName);

var dep = {
name: name,
Expand All @@ -44,12 +96,5 @@ function parseDepLock(root, targetFile, options) {
});
});

return {
plugin: {
name: 'snyk-go-plugin',
},
package: {
dependencies: deps,
},
}
return deps;
}
25 changes: 25 additions & 0 deletions lib/sub-process.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
var childProcess = require('child_process');

module.exports.execute = function (command, args, options) {

var spawnOptions = { shell: true };
if (options && options.cwd) {
spawnOptions.cwd = options.cwd;
}

return new Promise(function (resolve, reject) {
var stdout = '';
var stderr = '';

var proc = childProcess.spawn(command, args, spawnOptions);
proc.stdout.on('data', function (data) { stdout = stdout + data; });
proc.stderr.on('data', function (data) { stderr = stderr + data; });

proc.on('close', function (code) {
if (code !== 0) {
return reject(stdout || stderr);
}
resolve(stdout || stderr);
});
});
};
2 changes: 1 addition & 1 deletion test/cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ function main() {
var targetFile = process.argv[2];

console.log('Inspecting ', './' + targetFile);
plugin.inspect('.', targetFile).then(function(result) {
plugin.inspect('.', targetFile).then(function (result) {
console.log('\ninspect results:\n\n', JSON.stringify(result, null, 2));
});

Expand Down
39 changes: 0 additions & 39 deletions test/fixtures/Gopkg.lock

This file was deleted.

13 changes: 13 additions & 0 deletions test/fixtures/gopath/src/path/to/pkg/Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 11 additions & 0 deletions test/fixtures/gopath/src/path/to/pkg/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package main

import (
"fmt"

_ "gitpub.com/food/salad"
)

func main() {
fmt.Println("main")
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

55 changes: 29 additions & 26 deletions test/inspect.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ var test = require('tap').test;
var path = require('path');

var plugin = require('../lib');
var subProcess = require('../lib/sub-process')

test('inspect', function (t) {
return plugin.inspect(path.join(__dirname, 'fixtures'), 'Gopkg.lock')
chdirToPkg(['path', 'to', 'pkg']);

return plugin.inspect('.', 'Gopkg.lock')
.then(function (result) {
var plugin = result.plugin;
var pkg = result.package;
Expand All @@ -15,35 +18,35 @@ test('inspect', function (t) {
t.end();
});

t.test('root pkg', function (t) {
t.match(pkg, {
name: 'path/to/pkg',
}, 'root pkg')
t.end();
});

t.test('dependencies', function (t) {
var deps = pkg.dependencies;

t.same(deps['github.com/dgrijalva/jwt-go'], {
name: 'github.com/dgrijalva/jwt-go',
version: '3.0.0',
}, 'simple pkg');

t.same(deps['github.com/davecgh/go-spew/spew'], {
name: 'github.com/davecgh/go-spew/spew',
version: '1.1.0' ,
}, 'subpackage')

t.same(deps['github.com/valyala/bytebufferpool'], {
name: 'github.com/valyala/bytebufferpool',
version: '#e746df99fe4a3986f4d4f79e13c1e0117ce9c2f7',
}, 'no version')

t.same(deps['golang.org/x/crypto/acme'], {
name: 'golang.org/x/crypto/acme',
version: '#e1a4589e7d3ea14a3352255d04b6f1a418845e5e',
}, 'golang.org multiple subpaackages 1')

t.same(deps['golang.org/x/crypto/acme/autocert'], {
name: 'golang.org/x/crypto/acme/autocert',
version: '#e1a4589e7d3ea14a3352255d04b6f1a418845e5e',
}, 'golang.org multiple subpaackages 2')
t.match(deps['gitpub.com/food/salad'], {
name: 'gitpub.com/food/salad',
version: '1.3.7',
dependencies: {
'gitpub.com/nature/vegetables/tomato': {
version: '#b6ffb7d62206806b573348160795ea16a00940a6',
},
'gitpub.com/nature/vegetables/cucamba': {
version: '#b6ffb7d62206806b573348160795ea16a00940a6',
},
},
});

t.end();
});
});
});
});

function chdirToPkg(pkgPathArray) {
process.env['GOPATH'] = path.resolve(__dirname, 'fixtures', 'gopath');
process.chdir(path.resolve(__dirname, 'fixtures', 'gopath', 'src', ...pkgPathArray));
}

0 comments on commit a854e18

Please sign in to comment.