Files
cell/scripts/update.ce

118 lines
3.0 KiB
Plaintext

// cell update [alias] - Check for updates and optionally install them
var io = use('io')
var shop = use('shop')
var http = use('http')
var toml = use('toml')
var json = use('json')
var os = use('os')
if (!io.exists('.cell/cell.toml')) {
log.error("No cell.toml found. Run 'cell init' first.")
$_.stop()
return
}
var config = shop.load_config()
if (!config || !config.dependencies) {
log.console("No dependencies to update")
$_.stop()
return
}
// Load lock file
var lock_path = '.cell/lock.toml'
var lock = {}
if (io.exists(lock_path)) {
var lock_content = io.slurp(lock_path)
lock = toml.decode(lock_content)
}
if (!lock.modules) lock.modules = {}
var updates_available = []
// Check specific dependency or all
var deps_to_check = {}
if (args.length > 0) {
var alias = args[0]
if (!config.dependencies[alias]) {
log.error("Dependency '" + alias + "' not found")
$_.stop()
return
}
deps_to_check[alias] = config.dependencies[alias]
} else {
deps_to_check = config.dependencies
}
// Check each dependency for updates
for (var alias in deps_to_check) {
var locator = deps_to_check[alias]
log.console("Checking " + alias + " (" + locator + ")...")
// Get API URL to check commits
var api_url = shop.get_api_url(locator)
if (!api_url) {
log.console(" Cannot check updates (no API support)")
continue
}
try {
log.console(api_url)
var api_response = http.fetch(api_url)
var remote_commit = shop.extract_commit_hash(locator, text(api_response))
if (!remote_commit) {
log.console(" Failed to get remote commit")
continue
}
var local_commit = lock.modules[alias] && lock.modules[alias].commit
if (!local_commit) {
log.console(" No local commit tracked")
updates_available.push({
alias: alias,
locator: locator,
local_commit: null,
remote_commit: remote_commit
})
} else if (local_commit != remote_commit) {
log.console(" Update available!")
log.console(" Local: " + local_commit.substring(0, 8))
log.console(" Remote: " + remote_commit.substring(0, 8))
updates_available.push({
alias: alias,
locator: locator,
local_commit: local_commit,
remote_commit: remote_commit
})
} else {
log.console(" Up to date (" + local_commit.substring(0, 8) + ")")
}
} catch (e) {
log.console(" Failed to check: " + e)
}
}
if (updates_available.length == 0) {
log.console("\nAll dependencies are up to date!")
$_.stop()
return
}
log.console("\n" + updates_available.length + " update(s) available:")
for (var i = 0; i < updates_available.length; i++) {
var update = updates_available[i]
log.console(" - " + update.alias)
}
// If specific dependency was requested, auto-install
if (args.length > 0 && updates_available.length > 0) {
log.console("\nDownloading update...")
os.system("cell mod download")
} else if (updates_available.length > 0) {
log.console("\nRun 'cell mod download' to install updates")
}
$_.stop()