cmd_offer.v

2.1 KB · raw

1//! `koh offer` — send the local saves to this machine's remote.23module 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}3940// this_machine_backend builds the backend from the machine's saved remote.41pub 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}5051// auto_offer runs after every save and checkpoint. A remote that is not set up,52// or not reachable, must never fail the save: it prints one line and stops.53pub fn auto_offer(store &storage.Store) {54	if !machine.has_remote() {55		return56	}57	mut backend := this_machine_backend() or {58		note('not offered: ${err.msg()}')59		return60	}61	report := sync.offer(store, mut backend) or {62		note('not offered: ${err.msg()}')63		return64	}65	if report.saves + report.objects + report.events > 0 {66		note('offered to "${report.repo}" — ${report.saves} saves · ${report.objects} objects')67	}68}6970struct OfferedJson {71	repo    string72	saves   int73	objects int74	events  int75	head    string76}