diff --git a/lib/commands/status.js b/lib/commands/status.js index a222523..fd99c47 100755 --- a/lib/commands/status.js +++ b/lib/commands/status.js @@ -1,5 +1,6 @@ var PATH = require("path"); +var FS = require("fs"); var TERM = require("sourcemint-util-js/lib/term"); var UTIL = require("sourcemint-util-js/lib/util"); var Q = require("sourcemint-util-js/lib/q"); @@ -91,119 +92,127 @@ command.action(function (options) { ok = false; notInstalled = true; summary.push("\0red([\0bold(defined in 'devMappings' but not installed in 'node_modules/' nor 'mapped_packages/'\0)]\0)"); - } - else if (parentPkg) { + } - if (parentPkg.descriptor.json.mappings && parentPkg.descriptor.json.mappings[pkgInfo[2][0]]) { - mappingsUriInfo = URI_PARSER.parse(parentPkg.descriptor.json.mappings[pkgInfo[2][0]][1]); - } else - if (parentPkg.descriptor.json.devMappings && parentPkg.descriptor.json.devMappings[pkgInfo[2][0]]) { - mappingsUriInfo = URI_PARSER.parse(parentPkg.descriptor.json.devMappings[pkgInfo[2][0]][1]); - } - - function formatProperty() { - if (pkgInfo[1].indexOf("dependencies") >= 0) { - return "d"; - } - else if (pkgInfo[1].indexOf("devDependencies") >= 0) { - return "dd"; - } - else if (pkgInfo[1].indexOf("mappings") >= 0) { - return "m"; - } - else if (pkgInfo[1].indexOf("devMappings") >= 0) { - return "dm"; - } + var opts = { + name: pkgInfo[0].descriptor.json.name || names[0], + private: pkgInfo[0].descriptor.json.private, + versionSelector: ((parentPkg)?parentPkg.descriptor.versionSelectorForDependencyName(pkgInfo[0].descriptor.json.name || ""):false), + latest: options.latest + }; + + return gitStatus(pkgInfo[0].path, opts).then(function(gitInfo) { + + var packageSourceStatus = {}; + var sourceUriInfo = false; + if (PATH.existsSync(PATH.join(pkgInfo[0].path, ".sourcemint", "source.json"))) { + packageSourceStatus = JSON.parse(FS.readFileSync(PATH.join(pkgInfo[0].path, ".sourcemint", "source.json"))); + sourceUriInfo = URI_PARSER.parse(packageSourceStatus.url); } - if (pkgInfo[1].indexOf("node_modules/") >= 0) { - if (pkgInfo[1].indexOf("dependencies") >= 0) { - summary.push("\0green([" + formatProperty() + ": node_modules/]\0)"); + + if (ok && parentPkg) { + + if (parentPkg.descriptor.json.mappings && parentPkg.descriptor.json.mappings[pkgInfo[2][0]]) { + mappingsUriInfo = URI_PARSER.parse(parentPkg.descriptor.json.mappings[pkgInfo[2][0]][1]); } else - if (pkgInfo[1].indexOf("devDependencies")) { - summary.push("\0green([" + formatProperty() + ": node_modules/]\0)"); - } else { - ok = false; - summary.push("\0red([\0bold(found in 'node_modules/' but not defined in 'dependencies' nor 'devDependencies'\0)]\0)"); + if (parentPkg.descriptor.json.devMappings && parentPkg.descriptor.json.devMappings[pkgInfo[2][0]]) { + mappingsUriInfo = URI_PARSER.parse(parentPkg.descriptor.json.devMappings[pkgInfo[2][0]][1]); } - } else - if (pkgInfo[1].indexOf("dependencies") >= 0 || pkgInfo[1].indexOf("devDependencies") >= 0) { - function findInParent(pkg, level) { - if (pkg.children["node_modules/"][pkgInfo[2][0]] === pkgInfo[0].path) { - foundInParent = true; - var dirs = ""; - for (var i=0 ; i<=level ; i++) dirs += "../../"; - summary.push("\0green([" + formatProperty() + ": " + dirs + "node_modules/]\0)"); - } else - if (pkg.parent) { - findInParent(pkg.parent, level + 1); + + function formatProperty() { + if (pkgInfo[1].indexOf("dependencies") >= 0) { + return "d"; + } + else if (pkgInfo[1].indexOf("devDependencies") >= 0) { + return "dd"; + } + else if (pkgInfo[1].indexOf("mappings") >= 0) { + return "m"; + } + else if (pkgInfo[1].indexOf("devMappings") >= 0) { + return "dm"; } } - findInParent(pkgInfo[0].parent, 0); - if (!foundInParent) { + if (pkgInfo[1].indexOf("node_modules/") >= 0) { if (pkgInfo[1].indexOf("dependencies") >= 0) { + summary.push("\0green([" + formatProperty() + ": node_modules/]\0)"); + } else + if (pkgInfo[1].indexOf("devDependencies")) { + summary.push("\0green([" + formatProperty() + ": node_modules/]\0)"); + } else { ok = false; - notInstalled = true; - summary.push("\0red([\0bold(defined in 'dependencies' but not installed in 'node_modules/'\0)]\0)"); + summary.push("\0red([\0bold(found in 'node_modules/' but not defined in 'dependencies' nor 'devDependencies'\0)]\0)"); } - else if (pkgInfo[1].indexOf("devDependencies") >= 0) { - ok = false; - notInstalled = true; - summary.push("\0red([\0bold(defined in 'devDependencies' but not installed in 'node_modules/'\0)]\0)"); + } else + if (pkgInfo[1].indexOf("dependencies") >= 0 || pkgInfo[1].indexOf("devDependencies") >= 0) { + function findInParent(pkg, level) { + if (pkg.children["node_modules/"][pkgInfo[2][0]] === pkgInfo[0].path) { + foundInParent = true; + var dirs = ""; + for (var i=0 ; i<=level ; i++) dirs += "../../"; + summary.push("\0green([" + formatProperty() + ": " + dirs + "node_modules/]\0)"); + } else + if (pkg.parent) { + findInParent(pkg.parent, level + 1); + } + } + findInParent(pkgInfo[0].parent, 0); + if (!foundInParent) { + if (pkgInfo[1].indexOf("dependencies") >= 0) { + ok = false; + notInstalled = true; + summary.push("\0red([\0bold(defined in 'dependencies' but not installed in 'node_modules/'\0)]\0)"); + } + else if (pkgInfo[1].indexOf("devDependencies") >= 0) { + ok = false; + notInstalled = true; + summary.push("\0red([\0bold(defined in 'devDependencies' but not installed in 'node_modules/'\0)]\0)"); + } } } - } - if (pkgInfo[1].indexOf("mapped_packages/") >= 0) { - if (pkgInfo[1].indexOf("mappings") >= 0) { - summary.push("\0green([" + formatProperty() + ": mapped_packages/]\0)"); - } - if (pkgInfo[1].indexOf("devMappings") >= 0) { - summary.push("\0green([" + formatProperty() + ": mapped_packages/]\0)"); + if (pkgInfo[1].indexOf("mapped_packages/") >= 0) { + if (pkgInfo[1].indexOf("mappings") >= 0 || pkgInfo[1].indexOf("devMappings") >= 0) { + summary.push("\0green([" + formatProperty() + ": mapped_packages/]\0)"); + } + else if (pkgInfo[1].indexOf("mappings") === -1 && pkgInfo[1].indexOf("devMappings") === -1) { + ok = false; + summary.push("\0red([\0bold(found in 'mapped_packages/' but not defined in 'mappings' nor 'devMappings'\0)]\0)"); + } } - if (pkgInfo[1].indexOf("mappings") === -1 && pkgInfo[1].indexOf("devMappings") === -1) { - ok = false; - summary.push("\0red([\0bold(found in 'mapped_packages/' but not defined in 'mappings' nor 'devMappings'\0)]\0)"); + if (mappingsUriInfo && mappingsUriInfo.vendor) { + if (gitInfo.type !== false && gitInfo.rev != mappingsUriInfo.vendor.rev) { + summary.push("\0red([mapping: " + mappingsUriInfo.vendor.rev + " != " + gitInfo.rev + "(git)]\0)"); + } else + if (sourceUriInfo && sourceUriInfo.vendor && sourceUriInfo.vendor.rev !== mappingsUriInfo.vendor.rev) { + summary.push("\0red([mapping: " + mappingsUriInfo.vendor.rev + " != " + sourceUriInfo.vendor.rev + "(installed)]\0)"); + } else { + summary.push("\0green([mapping: " + mappingsUriInfo.vendor.rev + "]\0)"); + } } - } - if (mappingsUriInfo) { - summary.push("\0green([mapping: " + mappingsUriInfo.vendor.rev + "]\0)"); - - } - } - - var opts = { - name: pkgInfo[0].descriptor.json.name || names[0], - private: pkgInfo[0].descriptor.json.private, - versionSelector: ((parentPkg)?parentPkg.descriptor.versionSelectorForDependencyName(pkgInfo[0].descriptor.json.name || ""):false), - latest: options.latest - }; - - return gitStatus(pkgInfo[0].path, opts).then(function(gitInfo) { + } if (gitInfo.type !== false) { function formatBranch() { - return ((gitInfo.branch !== "master" && (!mappingsUriInfo || !mappingsUriInfo.vendor || gitInfo.branch != mappingsUriInfo.vendor.rev))?("\0orange(" + gitInfo.branch + "\0)"):gitInfo.branch); + return ((gitInfo.branch !== "master" && (!mappingsUriInfo || !mappingsUriInfo.vendor || gitInfo.rev != mappingsUriInfo.vendor.rev))?("\0orange(" + gitInfo.branch + "\0)"):gitInfo.branch); } function formatTag() { return ((gitInfo.tagged)?" "+gitInfo.tagged:""); } - function formatWritable() { - return ((gitInfo.writable)?"(\0cyan(W\0))":""); - } if (gitInfo.dirty) { ok = false; - summary.push("\0red([git" + formatWritable() + ": " + formatBranch() + " \0bold(dirty\0)]\0)"); + summary.push("\0red([git: " + formatBranch() + " \0bold(dirty\0)]\0)"); } else if (gitInfo.remoteAhead) { if (context.level === 0) { unsynced = true; - summary.push("\0magenta([git" + formatWritable() + ": " + formatBranch() + " \0bold(unpushed\0)]\0)"); + summary.push("\0magenta([git: " + formatBranch() + " \0bold(unpushed\0)]\0)"); } else { ok = false; - summary.push("\0red([git" + formatWritable() + ": " + formatBranch() + " \0bold(unpushed\0)]\0)"); + summary.push("\0red([git: " + formatBranch() + " \0bold(unpushed\0)]\0)"); } } else if (gitInfo.branch) { - summary.push("\0green([git" + formatWritable() + ": " + formatBranch() + formatTag() + "]\0)"); + summary.push("\0green([git: " + formatBranch() + formatTag() + "]\0)"); } } @@ -332,6 +341,10 @@ command.action(function (options) { if (!url) return ""; return "( \0yellow(" + url + "\0) )"; } + function formatWritable() { + padding += " "; + return ((gitInfo.writable)?(" \0cyan(W\0) " + padding.substring(3)):padding); + } if (context.circular && !ok) { // Remove error info as it was already printed once (circular) so errors for a package only show up once. @@ -343,17 +356,17 @@ command.action(function (options) { if (foundInParent) { // In parent package. - TERM.stdout.writenl(padding + summary.join(" ") + " \0white(<- " + formatPath() + "\0)" + formatAge() + formatLink()); + TERM.stdout.writenl(formatWritable() + summary.join(" ") + " \0white(<- " + formatPath() + "\0)" + formatAge() + formatLink()); } else if (!parentPkg || pkgInfo[0].path.substring(0, parentPkg.path.length) === parentPkg.path) { // In package dependency tree. - TERM.stdout.writenl(padding + summary.join(" ") + " \0white(-> " + formatPath() + "\0)" + formatAge() + formatLink()); + TERM.stdout.writenl(formatWritable() + summary.join(" ") + " \0white(-> " + formatPath() + "\0)" + formatAge() + formatLink()); } else if (notInstalled) { - TERM.stdout.writenl(padding + summary.join(" ") + " \0red(-> " + formatPath() + "\0)" + formatAge() + formatLink()); + TERM.stdout.writenl(formatWritable() + summary.join(" ") + " \0red(-> " + formatPath() + "\0)" + formatAge() + formatLink()); } else { // Linked package. - TERM.stdout.writenl(padding + summary.join(" ") + " \0cyan(<- " + formatPath() + "\0)" + formatAge() + formatLink()); + TERM.stdout.writenl(formatWritable() + summary.join(" ") + " \0cyan(<- " + formatPath() + "\0)" + formatAge() + formatLink()); } if (!ok) {