better list; add why

This commit is contained in:
2025-12-05 14:57:50 -06:00
parent d6daa97ac7
commit dde0efc8aa
3 changed files with 153 additions and 28 deletions

View File

@@ -1,44 +1,73 @@
// list installed packages
// if args[0] is a package, list its dependencies
// cell list -> list packages installed in this package
// cell list all -> list all packages (including those that are there due to installed packages)
// cell list package <name> -> list the packages for the package <name>
var shop = use('shop')
var ctx = null
var pkg_name = "Local"
var target_alias = null
var mode = 'local'
var target_pkg = null
if (args && args.length > 0) {
target_alias = args[0]
// Resolve alias from local config
ctx = shop.get_normalized_module(target_alias, null)
if (!ctx) {
log.console("Package '" + target_alias + "' not found in dependencies.")
if (args[0] == 'all') {
mode = 'all'
} else if (args[0] == 'package') {
if (args.length < 2) {
log.console("Usage: cell list package <name>")
$_.stop()
return
}
mode = 'package'
target_pkg = args[1]
} else {
log.console("Usage:")
log.console(" cell list : list local packages")
log.console(" cell list all : list all recursive packages")
log.console(" cell list package <name>: list dependencies of <name>")
$_.stop()
return
}
pkg_name = target_alias + " (" + ctx + ")"
}
var deps = shop.dependencies(ctx)
log.console(json.encode(deps))
if (target_alias) {
log.console("Dependencies for " + pkg_name + ":")
} else {
log.console("Installed Packages (Local):")
if (mode == 'local') {
log.console("Installed Packages (Local):")
print_deps(null)
} else if (mode == 'package') {
// Resolve alias to canonical package path
var canon = shop.get_canonical_package(target_pkg, null)
if (!canon) {
log.console("Package '" + target_pkg + "' not found in local dependencies.")
} else {
log.console("Dependencies for " + target_pkg + " (" + canon + "):")
print_deps(canon)
}
} else if (mode == 'all') {
log.console("All Packages:")
var all = shop.list_packages(null)
// list_packages returns an array of package strings (locators)
// We want to perhaps sort them
all.sort()
for (var i = 0; i < all.length; i++) {
log.console(" " + all[i])
}
if (all.length == 0) log.console(" (none)")
}
var aliases = []
for (var k in deps) aliases.push(k)
aliases.sort()
function print_deps(ctx) {
var deps = shop.dependencies(ctx)
var aliases = []
for (var k in deps) aliases.push(k)
aliases.sort()
if (aliases.length == 0) {
log.console(" (none)")
} else {
for (var i = 0; i < aliases.length; i++) {
var alias = aliases[i]
var locator = deps[alias]
log.console(" " + alias + " -> " + locator)
}
if (aliases.length == 0) {
log.console(" (none)")
} else {
for (var i = 0; i < aliases.length; i++) {
var alias = aliases[i]
var locator = deps[alias]
log.console(" " + alias + " -> " + locator)
}
}
}
$_.stop()

View File

@@ -1233,7 +1233,7 @@ Shop.build_package = function(package)
var ldflags = get_flags(config, platform, 'LDFLAGS')
if (ldflags != '') link_flags += ' ' + ldflags
var temp_lib = 'cellmod_temp' + dylib_ext
var temp_lib = 'cellmod' + dylib_ext
var objs_str = ''
for (var i=0; i<c_objects.length; i++) {
objs_str += '"$HERE/' + c_objects[i] + '" '

96
scripts/why.ce Normal file
View File

@@ -0,0 +1,96 @@
var shop = use('shop')
if (!args || args.length < 1) {
log.console("Usage: cell why <package>")
$_.stop()
return
}
var target = args[0]
log.console("Searching for '" + target + "'...")
var found = false
// DFS to find paths
// current_pkg: canonical path of current package (null for root)
// stack: array of {alias, pkg} leading to current_pkg
function search(current_pkg, stack) {
var deps = shop.dependencies(current_pkg)
// Sort for consistent output
var aliases = []
for (var k in deps) aliases.push(k)
aliases.sort()
for (var i = 0; i < aliases.length; i++) {
var alias = aliases[i]
var locator = deps[alias]
var parsed = shop.parse_package(locator)
if (!parsed) continue
var canon = parsed.path
// Check if match
// 1. Alias matches
// 2. Canonical path ends with target
// 3. Canonical path is target
var match = (alias == target) || (parsed.name == target) || (canon == target)
var node = { alias: alias, pkg: canon, locator: locator }
var new_stack = stack.concat([node])
if (match) {
found = true
print_stack(new_stack)
// Don't recurse if we found the target in this branch
continue
}
// Recurse if not seen in current stack (cycle detection)
var cycle = false
for (var j = 0; j < stack.length; j++) {
if (stack[j].pkg == canon) {
cycle = true
break
}
}
if (!cycle) {
search(canon, new_stack)
}
}
}
function print_stack(stack) {
// Calculate max width for alignment if needed, but simple tree is fine
var output = "project"
log.console(output)
for (var i = 0; i < stack.length; i++) {
var node = stack[i]
var indent = ""
for (var j = 0; j <= i; j++) indent += " "
var info = node.locator
if (node.alias != parsed_name(node.locator)) {
// info += " (aliased as " + node.alias + ")"
}
log.console(indent + "-> " + node.alias + " (" + info + ")")
}
log.console("")
}
function parsed_name(locator) {
var parsed = shop.parse_package(locator)
return parsed ? parsed.name : ""
}
search(null, [])
if (!found) {
log.console("Package '" + target + "' not found in dependency tree.")
}
$_.stop()