From dde0efc8aa6d149ddb5deb14a9c0209998087de3 Mon Sep 17 00:00:00 2001 From: John Alanbrook Date: Fri, 5 Dec 2025 14:57:50 -0600 Subject: [PATCH] better list; add why --- scripts/list.ce | 83 ++++++++++++++++++++++++++++-------------- scripts/shop.cm | 2 +- scripts/why.ce | 96 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+), 28 deletions(-) create mode 100644 scripts/why.ce diff --git a/scripts/list.ce b/scripts/list.ce index 147f055e..1ce1ca67 100644 --- a/scripts/list.ce +++ b/scripts/list.ce @@ -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 -> list the packages for the package 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 ") + $_.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 : list dependencies of ") $_.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() diff --git a/scripts/shop.cm b/scripts/shop.cm index 9af30bde..724bdbf1 100644 --- a/scripts/shop.cm +++ b/scripts/shop.cm @@ -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") + $_.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()