123module cli45import json26import os7import src.machine8import src.remote9import src.storage10import src.exchange1112pub fn cmd_offer(raw []string) int {13 args := parse('offer', raw, Options{14 flags: ['json']15 }) or { return usage_error(err.msg()) }16 store := open_store() or { return refuse(args.json(), err.msg()) }17 defer {18 store.close()19 }20 mut backend := this_machine_backend() or { return refuse(args.json(), err.msg()) }21 report := exchange.offer(store, mut backend) or { return refuse(args.json(), err.msg()) }22 if args.json() {23 emit_json(json2.encode(OfferedJson{24 repo: report.repo25 saves: report.saves26 objects: report.objects27 events: report.events28 head: report.head29 }))30 return 031 }32 if report.saves + report.objects + report.events == 0 {33 ok('the remote already has everything from [${report.head}]')34 return 035 }36 ok('offered ${report.saves} saves · ${report.objects} objects · ${report.events} events to "${report.repo}"')37 note('remote head is now [${report.head}]')38 return 039}404142pub fn this_machine_backend() !remote.Backend {43 settings := machine.load_remote()!44 if settings.kind == machine.kind_folder {45 46 47 48 if !os.is_dir(settings.path) {49 return error('the remote folder ${settings.path} is not there — is its disk mounted? ("koh remote" changes it)')50 }51 return remote.new_folder(settings.path)!52 }53 credentials := machine.load_credentials()!54 return remote.new_s3(settings.endpoint, settings.bucket, settings.region,55 credentials.access_key, credentials.secret_key)!56}5758596061pub fn auto_offer(store &storage.Store, quiet bool) {62 if !machine.has_remote() {63 return64 }65 mut backend := this_machine_backend() or {66 if !quiet {67 note('not offered: ${err.msg()}')68 }69 return70 }71 report := exchange.offer(store, mut backend) or {72 if !quiet {73 note('not offered: ${err.msg()}')74 }75 return76 }77 if !quiet && report.saves + report.objects + report.events > 0 {78 note('offered to "${report.repo}" — ${report.saves} saves · ${report.objects} objects')79 }80}8182struct OfferedJson {83 repo string84 saves int85 objects int86 events int87 head string88}