1234567module cli89import json210import src.build11import src.update1213pub fn cmd_update(raw []string) int {14 args := parse('update', raw, Options{15 flags: ['check', 'json', 'yes']16 }) or { return usage_error(err.msg()) }17 if args.positional.len > 0 {18 return usage_error('update takes no arguments, not "${args.positional_at(0)}"')19 }20 if args.json() && !args.flag('yes') && !args.flag('check') {21 22 23 24 return usage_error('--json needs --yes when it would install')25 }26 current := version27 platform := build.this_machine() or { return refuse(args.json(), err.msg()) }28 checked := update.check(current, platform) or { return refuse(args.json(), err.msg()) }29 latest := if checked.update {30 checked.available31 } else {32 if args.json() {33 emit_json(json2.encode(UpdateJson{34 current: current35 latest: current36 available: false37 }))38 } else {39 ok('koh ${current} is the newest — nothing to do')40 }41 return 042 }43 if args.flag('check') {44 if args.json() {45 emit_json(json2.encode(UpdateJson{46 current: current47 latest: latest.version48 available: true49 notes: latest.notes50 }))51 } else {52 ok('koh ${latest.version} is available — you have ${current}')53 if latest.notes != '' {54 note(latest.notes)55 }56 note('run "koh update" to install it')57 }58 59 return 160 }61 if !args.json() {62 note('${current} → ${latest.version}')63 if latest.notes != '' {64 note(latest.notes)65 }66 }67 68 approved := confirm(args.flag('yes')) or { return refuse(args.json(), err.msg()) }69 if !approved {70 return refuse(args.json(), 'not updating, then')71 }72 working('downloading koh ${latest.version}')73 target := update.install(latest) or { return refuse(args.json(), err.msg()) }74 if args.json() {75 emit_json(json2.encode(UpdateJson{76 current: current77 latest: latest.version78 available: true79 installed: target80 }))81 return 082 }83 ok('installed koh ${latest.version} as ${target}')84 return 085}8687struct UpdateJson {88 current string89 latest string90 available bool91 installed string92 notes string93}