cmd_offer.v

2.6 KB · raw

1//! `koh offer` — send the local saves to this machine's remote.23module 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}4041// this_machine_backend builds the backend from the machine's saved remote.42pub fn this_machine_backend() !remote.Backend {43	settings := machine.load_remote()!44	if settings.kind == machine.kind_folder {45		// Only `koh remote` creates the folder. Missing later, it is usually a46		// disk or share that is not mounted, and a stand-in folder would take47		// saves the other machine never sees.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}5758// auto_offer runs after every save and checkpoint. A remote that is not set up,59// or not reachable, must never fail the save: it prints one line and stops.60// `quiet` is for `--json`, where that line would land inside the document.61pub 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}