123module cli45import json6import src.machine7import src.remote8import src.storage9import src.sync1011pub fn cmd_offer(raw []string) int {12 args := parse('offer', raw, Options{13 flags: ['json']14 }) or { return usage_error(err.msg()) }15 store := open_store() or { return refuse(args.json(), err.msg()) }16 defer {17 store.close()18 }19 mut backend := this_machine_backend() or { return refuse(args.json(), err.msg()) }20 report := sync.offer(store, mut backend) or { return refuse(args.json(), err.msg()) }21 if args.json() {22 emit_json(json.encode(OfferedJson{23 repo: report.repo24 saves: report.saves25 objects: report.objects26 events: report.events27 head: report.head28 }))29 return 030 }31 if report.saves + report.objects + report.events == 0 {32 ok('the remote already has everything from [${report.head}]')33 return 034 }35 ok('offered ${report.saves} saves · ${report.objects} objects · ${report.events} events to "${report.repo}"')36 note('remote head is now [${report.head}]')37 return 038}394041pub fn this_machine_backend() !remote.Backend {42 settings := machine.load_remote()!43 if settings.kind == machine.kind_folder {44 return remote.new_folder(settings.path)!45 }46 credentials := machine.load_credentials()!47 return remote.new_s3(settings.endpoint, settings.bucket, settings.region,48 credentials.access_key, credentials.secret_key)!49}5051525354pub fn auto_offer(store &storage.Store, quiet bool) {55 if !machine.has_remote() {56 return57 }58 mut backend := this_machine_backend() or {59 if !quiet {60 note('not offered: ${err.msg()}')61 }62 return63 }64 report := sync.offer(store, mut backend) or {65 if !quiet {66 note('not offered: ${err.msg()}')67 }68 return69 }70 if !quiet && report.saves + report.objects + report.events > 0 {71 note('offered to "${report.repo}" — ${report.saves} saves · ${report.objects} objects')72 }73}7475struct OfferedJson {76 repo string77 saves int78 objects int79 events int80 head string81}