//! `koh offer` — send the local saves to this machine's remote. module cli import json import src.machine import src.remote import src.storage import src.sync pub fn cmd_offer(raw []string) int { args := parse('offer', raw, Options{ flags: ['json'] }) or { return usage_error(err.msg()) } store := open_store() or { return refuse(args.json(), err.msg()) } defer { store.close() } mut backend := this_machine_backend() or { return refuse(args.json(), err.msg()) } report := sync.offer(store, mut backend) or { return refuse(args.json(), err.msg()) } if args.json() { emit_json(json.encode(OfferedJson{ repo: report.repo saves: report.saves objects: report.objects events: report.events head: report.head })) return 0 } if report.saves + report.objects + report.events == 0 { ok('the remote already has everything from [${report.head}]') return 0 } ok('offered ${report.saves} saves · ${report.objects} objects · ${report.events} events to "${report.repo}"') note('remote head is now [${report.head}]') return 0 } // this_machine_backend builds the backend from the machine's saved remote. pub fn this_machine_backend() !remote.Backend { settings := machine.load_remote()! if settings.kind == machine.kind_folder { return remote.new_folder(settings.path)! } credentials := machine.load_credentials()! return remote.new_s3(settings.endpoint, settings.bucket, settings.region, credentials.access_key, credentials.secret_key)! } // auto_offer runs after every save and checkpoint. A remote that is not set up, // or not reachable, must never fail the save: it prints one line and stops. // `quiet` is for `--json`, where that line would land inside the document. pub fn auto_offer(store &storage.Store, quiet bool) { if !machine.has_remote() { return } mut backend := this_machine_backend() or { if !quiet { note('not offered: ${err.msg()}') } return } report := sync.offer(store, mut backend) or { if !quiet { note('not offered: ${err.msg()}') } return } if !quiet && report.saves + report.objects + report.events > 0 { note('offered to "${report.repo}" — ${report.saves} saves · ${report.objects} objects') } } struct OfferedJson { repo string saves int objects int events int head string }