Merge branch 'improve_fetch' into audit_dups

This commit is contained in:
2026-02-20 15:03:30 -06:00
14 changed files with 504 additions and 461 deletions

34
add.ce
View File

@@ -21,9 +21,11 @@ var added = 0
var failed = 0
var _add_dep = null
var _install = null
var i = 0
array(args, function(arg) {
if (arg == '--help' || arg == '-h') {
var run = function() {
for (i = 0; i < length(args); i++) {
if (args[i] == '--help' || args[i] == '-h') {
log.console("Usage: cell add <locator> [alias]")
log.console("")
log.console("Add a dependency to the current package.")
@@ -33,21 +35,21 @@ array(args, function(arg) {
log.console(" cell add gitea.pockle.world/john/cell-image image")
log.console(" cell add ../local-package")
log.console(" cell add -r ../packages")
$stop()
} else if (arg == '-r') {
return
} else if (args[i] == '-r') {
recursive = true
} else if (!starts_with(arg, '-')) {
} else if (!starts_with(args[i], '-')) {
if (!locator) {
locator = arg
locator = args[i]
} else if (!alias) {
alias = arg
alias = args[i]
}
}
}
})
if (!locator && !recursive) {
log.console("Usage: cell add <locator> [alias]")
$stop()
return
}
if (locator)
@@ -64,7 +66,7 @@ if (!alias && locator) {
// Check we're in a package directory
if (!fd.is_file(cwd + '/cell.toml')) {
log.error("Not in a package directory (no cell.toml found)")
$stop()
return
}
// Recursive mode
@@ -73,14 +75,14 @@ if (recursive) {
locator = shop.resolve_locator(locator)
if (!fd.is_dir(locator)) {
log.error(`${locator} is not a directory`)
$stop()
return
}
locators = filter(pkg.find_packages(locator), function(p) {
return p != cwd
})
if (length(locators) == 0) {
log.console("No packages found in " + locator)
$stop()
return
}
log.console(`Found ${text(length(locators))} package(s) in ${locator}`)
@@ -102,7 +104,7 @@ if (recursive) {
})
log.console("Added " + text(added) + " package(s)." + (failed > 0 ? " Failed: " + text(failed) + "." : ""))
$stop()
return
}
// Single package add
@@ -113,7 +115,7 @@ _add_dep = function() {
log.console(" Added to cell.toml")
} disruption {
log.error("Failed to update cell.toml")
$stop()
return
}
_add_dep()
@@ -122,10 +124,12 @@ _install = function() {
log.console(" Installed to shop")
} disruption {
log.error("Failed to install")
$stop()
return
}
_install()
log.console("Added " + alias + " (" + locator + ")")
}
run()
$stop()

View File

@@ -14,13 +14,14 @@ var pkg = use('package')
var target_package = null
var i = 0
var run = function() {
for (i = 0; i < length(args); i++) {
if (args[i] == '--help' || args[i] == '-h') {
log.console("Usage: cell audit [<locator>]")
log.console("")
log.console("Test-compile all .ce and .cm scripts in package(s).")
log.console("Reports all errors without stopping at the first failure.")
$stop()
return
} else if (!starts_with(args[i], '-')) {
target_package = args[i]
}
@@ -68,5 +69,7 @@ if (length(all_failures) > 0) {
}
log.console("Audit complete: " + text(total_ok) + "/" + text(total_scripts) + " scripts compiled" + (total_errors > 0 ? ", " + text(total_errors) + " failed" : ""))
}
run()
$stop()

View File

@@ -27,13 +27,14 @@ var results = null
var success = 0
var failed = 0
var run = function() {
for (i = 0; i < length(args); i++) {
if (args[i] == '-t' || args[i] == '--target') {
if (i + 1 < length(args)) {
target = args[++i]
} else {
log.error('-t requires a target')
$stop()
return
}
} else if (args[i] == '-p' || args[i] == '--package') {
// Legacy support for -p flag
@@ -41,18 +42,18 @@ for (i = 0; i < length(args); i++) {
target_package = args[++i]
} else {
log.error('-p requires a package name')
$stop()
return
}
} else if (args[i] == '-b' || args[i] == '--buildtype') {
if (i + 1 < length(args)) {
buildtype = args[++i]
if (buildtype != 'release' && buildtype != 'debug' && buildtype != 'minsize') {
log.error('Invalid buildtype: ' + buildtype + '. Must be release, debug, or minsize')
$stop()
return
}
} else {
log.error('-b requires a buildtype (release, debug, minsize)')
$stop()
return
}
} else if (args[i] == '--force') {
force_rebuild = true
@@ -66,7 +67,7 @@ for (i = 0; i < length(args); i++) {
for (t = 0; t < length(targets); t++) {
log.console(' ' + targets[t])
}
$stop()
return
} else if (!starts_with(args[i], '-') && !target_package) {
// Positional argument - treat as package locator
target_package = args[i]
@@ -85,7 +86,7 @@ if (!target) {
if (target && !build.has_target(target)) {
log.error('Invalid target: ' + target)
log.console('Available targets: ' + text(build.list_targets(), ', '))
$stop()
return
}
var packages = shop.list_packages()
@@ -123,5 +124,7 @@ if (target_package) {
log.console(`Build complete: ${success} libraries built${failed > 0 ? `, ${failed} failed` : ''}`)
}
}
run()
$stop()

View File

@@ -26,6 +26,7 @@ var dry_run = false
var i = 0
var deps = null
var run = function() {
for (i = 0; i < length(args); i++) {
if (args[i] == '--build') {
clean_build = true
@@ -54,7 +55,7 @@ for (i = 0; i < length(args); i++) {
log.console(" --all Remove both build outputs and fetched sources")
log.console(" --deep Apply to full dependency closure")
log.console(" --dry-run Show what would be deleted")
$stop()
return
} else if (!starts_with(args[i], '-')) {
scope = args[i]
}
@@ -190,5 +191,7 @@ if (dry_run) {
log.console("Clean complete: " + text(deleted_count) + " item(s) deleted.")
}
}
}
run()
$stop()

View File

@@ -6,10 +6,11 @@ var link = use('link')
var fd = use('fd')
var http = use('http')
var run = function() {
if (length(args) < 2) {
log.console("Usage: cell clone <origin> <path>")
log.console("Clones a cell package to a local path and links it.")
$stop()
return
}
var origin = args[0]
@@ -21,7 +22,7 @@ target_path = shop.resolve_locator(target_path)
// Check if target already exists
if (fd.is_dir(target_path)) {
log.console("Error: " + target_path + " already exists")
$stop()
return
}
log.console("Cloning " + origin + " to " + target_path + "...")
@@ -30,14 +31,14 @@ log.console("Cloning " + origin + " to " + target_path + "...")
var info = shop.resolve_package_info(origin)
if (!info || info == 'local') {
log.console("Error: " + origin + " is not a remote package")
$stop()
return
}
// Update to get the commit hash
var update_result = shop.update(origin)
if (!update_result) {
log.console("Error: Could not fetch " + origin)
$stop()
return
}
// Fetch and extract to the target path
@@ -45,7 +46,7 @@ var lock = shop.load_lock()
var entry = lock[origin]
if (!entry || !entry.commit) {
log.console("Error: No commit found for " + origin)
$stop()
return
}
var download_url = shop.get_download_url(origin, entry.commit)
@@ -54,6 +55,7 @@ log.console("Downloading from " + download_url)
var _clone = function() {
var zip_blob = http.fetch(download_url)
shop.install_zip(zip_blob, target_path)
log.console("Extracted to " + target_path)
// Link the origin to the cloned path
@@ -63,5 +65,7 @@ var _clone = function() {
log.console("Error during clone")
}
_clone()
}
run()
$stop()

View File

@@ -14,6 +14,7 @@ var i = 0
var packages = null
var count = 0
var run = function() {
for (i = 0; i < length(args); i++) {
if (args[i] == '--help' || args[i] == '-h') {
log.console("Usage: cell fetch [package]")
@@ -21,7 +22,7 @@ for (i = 0; i < length(args); i++) {
log.console("")
log.console("Arguments:")
log.console(" package Optional package to sync. If omitted, syncs all.")
$stop()
return
} else if (!starts_with(args[i], '-')) {
target_pkg = args[i]
}
@@ -42,5 +43,7 @@ if (target_pkg) {
})
log.console("Synced " + text(count) + " package(s).")
}
}
run()
$stop()

View File

@@ -23,17 +23,18 @@ var show_locked = false
var show_world = false
var i = 0
var run = function() {
for (i = 0; i < length(args); i++) {
if (args[i] == '--format' || args[i] == '-f') {
if (i + 1 < length(args)) {
format = args[++i]
if (format != 'tree' && format != 'dot' && format != 'json') {
log.error('Invalid format: ' + format + '. Must be tree, dot, or json')
$stop()
return
}
} else {
log.error('--format requires a format type')
$stop()
return
}
} else if (args[i] == '--resolved') {
show_locked = false
@@ -51,7 +52,7 @@ for (i = 0; i < length(args); i++) {
log.console(" --resolved Show resolved view with links applied (default)")
log.console(" --locked Show lock view without links")
log.console(" --world Graph all packages in shop")
$stop()
return
} else if (!starts_with(args[i], '-')) {
target_locator = args[i]
}
@@ -236,5 +237,7 @@ if (format == 'tree') {
log.console(json.encode(output))
}
}
run()
$stop()

View File

@@ -24,13 +24,14 @@ var lock = null
var installed = 0
var failed = 0
var run = function() {
for (i = 0; i < length(args); i++) {
if (args[i] == '--target' || args[i] == '-t') {
if (i + 1 < length(args)) {
target_triple = args[++i]
} else {
log.error('--target requires a triple')
$stop()
return
}
} else if (args[i] == '--dry-run') {
dry_run = true
@@ -45,7 +46,7 @@ for (i = 0; i < length(args); i++) {
log.console(" --target <triple> Build for target platform")
log.console(" --dry-run Show what would be installed")
log.console(" -r Recursively find and install all packages in directory")
$stop()
return
} else if (!starts_with(args[i], '-')) {
locator = args[i]
}
@@ -53,7 +54,7 @@ for (i = 0; i < length(args); i++) {
if (!locator && !recursive) {
log.console("Usage: cell install <locator> [options]")
$stop()
return
}
if (locator)
@@ -65,14 +66,14 @@ if (recursive) {
locator = shop.resolve_locator(locator)
if (!fd.is_dir(locator)) {
log.error(`${locator} is not a directory`)
$stop()
return
}
locators = filter(pkg.find_packages(locator), function(p) {
return p != cwd
})
if (length(locators) == 0) {
log.console("No packages found in " + locator)
$stop()
return
}
log.console(`Found ${text(length(locators))} package(s) in ${locator}`)
@@ -82,9 +83,7 @@ if (recursive) {
lock = shop.load_lock()
log.console(" " + loc + (lock[loc] ? " (already installed)" : ""))
})
$stop()
}
} else {
installed = 0
failed = 0
arrfor(locators, function(loc) {
@@ -100,17 +99,20 @@ if (recursive) {
})
log.console("Installed " + text(installed) + " package(s)." + (failed > 0 ? " Failed: " + text(failed) + "." : ""))
$stop()
}
return
}
// Single package install with dependencies
if (dry_run) {
log.console("Would install: " + locator + " (and dependencies)")
$stop()
return
}
log.console("Installing " + locator + "...")
shop.sync_with_deps(locator, {refresh: true, target: target_triple})
log.console("Done.")
}
run()
$stop()

13
link.ce
View File

@@ -34,6 +34,7 @@ var _restore = null
var _read_toml = null
var _add_link = null
var run = function() {
if (length(args) < 1) {
log.console("Usage: link <command> [args] or link [package] <target>")
log.console("Commands:")
@@ -43,7 +44,7 @@ if (length(args) < 1) {
log.console(" clear Remove all links")
log.console(" <path> Link the package in <path> to that path")
log.console(" <package> <target> Link <package> to <target> (path or package)")
$stop()
return
}
cmd = args[0]
@@ -71,7 +72,7 @@ if (cmd == 'list') {
} else if (cmd == 'delete' || cmd == 'rm') {
if (length(args) < 2) {
log.console("Usage: link delete <package>")
$stop()
return
}
pkg = args[1]
@@ -113,7 +114,7 @@ if (cmd == 'list') {
if (!arg1) {
log.console("Error: target or package required")
$stop()
return
}
if (arg2) {
@@ -136,7 +137,7 @@ if (cmd == 'list') {
if (!fd.is_file(toml_path)) {
log.console("Error: No cell.toml found at " + target)
log.console("For linking to another package, use: link <package> <target>")
$stop()
return
}
// Read package name from cell.toml
@@ -159,7 +160,7 @@ if (cmd == 'list') {
if (starts_with(target, '/')) {
if (!fd.is_file(target + '/cell.toml')) {
log.console("Error: " + target + " is not a valid package (no cell.toml)")
$stop()
return
}
}
@@ -172,5 +173,7 @@ if (cmd == 'list') {
}
_add_link()
}
}
run()
$stop()

View File

@@ -18,6 +18,7 @@ var local_pkgs = null
var linked_pkgs = null
var remote_pkgs = null
var run = function() {
if (args && length(args) > 0) {
if (args[0] == 'shop') {
mode = 'shop'
@@ -30,7 +31,7 @@ if (args && length(args) > 0) {
log.console(" (none) List dependencies of current package")
log.console(" shop List all packages in shop with status")
log.console(" <locator> List dependency tree for a package")
$stop()
return
} else {
mode = 'package'
target_pkg = args[0]
@@ -173,5 +174,7 @@ if (mode == 'local') {
log.console("Total: " + text(length(packages)) + " package(s)")
}
}
}
run()
$stop()

View File

@@ -18,6 +18,7 @@ var prune = false
var dry_run = false
var i = 0
var run = function() {
for (i = 0; i < length(args); i++) {
if (args[i] == '--prune') {
prune = true
@@ -31,7 +32,7 @@ for (i = 0; i < length(args); i++) {
log.console("Options:")
log.console(" --prune Also remove packages no longer needed by any root")
log.console(" --dry-run Show what would be removed")
$stop()
return
} else if (!starts_with(args[i], '-')) {
target_pkg = args[i]
}
@@ -39,7 +40,7 @@ for (i = 0; i < length(args); i++) {
if (!target_pkg) {
log.console("Usage: cell remove <locator> [options]")
$stop()
return
}
target_pkg = shop.resolve_locator(target_pkg)
@@ -100,5 +101,7 @@ if (dry_run) {
log.console("Removed " + text(length(packages_to_remove)) + " package(s).")
}
}
run()
$stop()

View File

@@ -22,13 +22,14 @@ var show_locked = false
var refresh_first = false
var i = 0
var run = function() {
for (i = 0; i < length(args); i++) {
if (args[i] == '--target' || args[i] == '-t') {
if (i + 1 < length(args)) {
target_triple = args[++i]
} else {
log.error('--target requires a triple')
$stop()
return
}
} else if (args[i] == '--locked') {
show_locked = true
@@ -43,7 +44,7 @@ for (i = 0; i < length(args); i++) {
log.console(" --target <triple> Annotate builds for target platform")
log.console(" --locked Show lock state without applying links")
log.console(" --refresh Refresh floating refs before printing")
$stop()
return
} else if (!starts_with(args[i], '-')) {
target_locator = args[i]
}
@@ -64,7 +65,7 @@ if (!fd.is_file(target_locator + '/cell.toml')) {
pkg_dir = shop.get_package_dir(target_locator)
if (!fd.is_file(pkg_dir + '/cell.toml')) {
log.error("Not a valid package: " + target_locator)
$stop()
return
}
}
@@ -212,5 +213,7 @@ for (i = 0; i < length(sorted); i++) {
log.console("")
log.console("Total: " + text(length(sorted)) + " package(s)")
}
run()
$stop()

View File

@@ -23,6 +23,7 @@ var i = 0
var updated = 0
var packages = null
var run = function() {
for (i = 0; i < length(args); i++) {
if (args[i] == '--help' || args[i] == '-h') {
log.console("Usage: cell update [<locator>] [options]")
@@ -33,13 +34,13 @@ for (i = 0; i < length(args); i++) {
log.console(" --target <triple> Target platform for build")
log.console(" --follow-links Update link targets instead of origins")
log.console(" --git Run git pull on local packages")
$stop()
return
} else if (args[i] == '--target' || args[i] == '-t') {
if (i + 1 < length(args)) {
target_triple = args[++i]
} else {
log.error('--target requires a triple')
$stop()
return
}
} else if (args[i] == '--follow-links') {
follow_links = true
@@ -113,5 +114,7 @@ if (target_pkg) {
log.console("All packages are up to date.")
}
}
}
run()
$stop()

View File

@@ -22,6 +22,7 @@ var deep = false
var target_triple = null
var i = 0
var run = function() {
for (i = 0; i < length(args); i++) {
if (args[i] == '--deep') {
deep = true
@@ -30,7 +31,7 @@ for (i = 0; i < length(args); i++) {
target_triple = args[++i]
} else {
log.error('--target requires a triple')
$stop()
return
}
} else if (args[i] == '--help' || args[i] == '-h') {
log.console("Usage: cell verify [<scope>] [options]")
@@ -45,7 +46,7 @@ for (i = 0; i < length(args); i++) {
log.console("Options:")
log.console(" --deep Traverse full dependency closure")
log.console(" --target <triple> Verify builds for specific target")
$stop()
return
} else if (!starts_with(args[i], '-')) {
scope = args[i]
}
@@ -250,5 +251,7 @@ if (length(errors) > 0) {
} else {
log.console("Verification PASSED: " + text(checked) + " package(s) checked, " + text(length(warnings)) + " warning(s)")
}
}
run()
$stop()