urbit/pkg/arvo/lib/hood/kiln.hoon

754 lines
25 KiB
Plaintext
Raw Normal View History

:: :: ::
2017-11-29 23:40:44 +03:00
:::: /hoon/kiln/hood/lib :: ::
2015-05-12 03:31:37 +03:00
:: :: ::
/? 310 :: version
:: :: ::
:::: :: ::
:: :: ::
=, clay
2016-12-02 02:59:17 +03:00
=, space:userlib
=, format
2015-05-12 03:31:37 +03:00
|% :: ::
2017-11-30 00:29:35 +03:00
++ part {$kiln $0 pith} :: kiln state
++ pith :: ::
$: rem=(map desk per-desk) ::
syn=(map kiln-sync let/@ud) ::
ota=(unit [=ship =desk =aeon]) ::
commit-timer=[way=wire nex=@da tim=@dr mon=term]
2015-05-26 04:20:45 +03:00
== ::
2017-11-30 00:29:35 +03:00
++ per-desk :: per-desk state
2015-12-20 23:50:45 +03:00
$: auto/? :: escalate on failure
gem/germ :: strategy
her/@p :: from ship
sud/@tas :: from desk
cas/case :: at case
2015-05-12 03:31:37 +03:00
== ::
:: :: ::
:::: :: ::
:: :: ::
2017-01-12 18:50:35 +03:00
++ kiln-commit term ::
++ kiln-mount ::
2015-12-20 23:50:45 +03:00
$: pax/path ::
pot/term ::
2015-05-12 03:31:37 +03:00
== ::
++ kiln-unmount $@(term {knot path}) ::
++ kiln-sync ::
2015-12-20 23:50:45 +03:00
$: syd/desk ::
her/ship ::
sud/desk ::
2015-05-12 03:31:37 +03:00
== ::
++ kiln-unsync ::
2015-12-20 23:50:45 +03:00
$: syd/desk ::
her/ship ::
sud/desk ::
2015-06-04 00:18:13 +03:00
== ::
++ kiln-merge ::
2015-12-20 23:50:45 +03:00
$: syd/desk ::
ali/ship ::
sud/desk ::
cas/case ::
2015-12-20 23:50:45 +03:00
gim/?($auto germ) ::
2015-05-12 03:31:37 +03:00
== ::
-- ::
:: :: ::
:::: :: ::
2016-11-17 04:42:58 +03:00
:: :: ::
2019-11-19 07:36:21 +03:00
|= {bowl:gall part} :: main kiln work
2015-09-02 01:20:17 +03:00
?> =(src our)
2019-11-19 07:36:21 +03:00
|_ moz/(list card:agent:gall)
2015-12-09 04:54:26 +03:00
++ abet :: resolve
2017-11-30 00:29:35 +03:00
[(flop moz) `part`+<+.$]
2015-09-02 01:20:17 +03:00
::
2019-11-14 21:39:50 +03:00
++ emit
2019-11-19 07:36:21 +03:00
|= card:agent:gall
2019-11-14 21:39:50 +03:00
%_(+> moz [+< moz])
::
++ emil :: return cards
2019-11-19 07:36:21 +03:00
|= (list card:agent:gall)
2015-09-02 01:20:17 +03:00
^+ +>
?~(+< +> $(+< t.+<, +> (emit i.+<)))
::
++ render
2015-12-20 23:50:45 +03:00
|= {mez/tape sud/desk who/ship syd/desk}
:^ %palm [" " ~ ~ ~] leaf+(weld "kiln: " mez)
2015-12-21 00:16:39 +03:00
~[leaf+"from {<sud>}" leaf+"on {<who>}" leaf+"to {<syd>}"]
2015-09-02 01:20:17 +03:00
::
2017-01-12 18:50:35 +03:00
++ poke-commit
2020-01-29 21:42:52 +03:00
|= [mon/kiln-commit auto=?]
=< abet
=. +>.$ (emit %pass /commit %arvo %c [%dirk mon])
?. auto
+>.$
=/ recur ~s1
=. commit-timer
[/kiln/autocommit (add now recur) recur mon]
(emit %pass way.commit-timer %arvo %b [%wait nex.commit-timer])
::
++ poke-autocommit
2019-08-25 12:00:26 +03:00
|= [mon/kiln-commit auto=?]
=< abet
2019-11-14 21:39:50 +03:00
=. +>.$ (emit %pass /commit %arvo %c [%dirk mon])
2019-08-25 12:00:26 +03:00
?. auto
+>.$
=/ recur ~s1
=. commit-timer
[/kiln/autocommit (add now recur) recur mon]
2019-11-14 21:39:50 +03:00
(emit %pass way.commit-timer %arvo %b [%wait nex.commit-timer])
2019-08-25 12:00:26 +03:00
::
++ poke-cancel-autocommit
|= ~
2019-11-14 21:39:50 +03:00
abet:(emit %pass way.commit-timer %arvo %b [%rest nex.commit-timer])
2017-01-12 18:50:35 +03:00
::
2015-09-02 01:20:17 +03:00
++ poke-mount
|= kiln-mount
2016-12-02 02:59:17 +03:00
=+ bem=(de-beam pax)
2015-09-02 01:20:17 +03:00
?~ bem
=+ "can't mount bad path: {<pax>}"
2015-12-21 00:16:39 +03:00
abet:(spam leaf+- ~)
2019-11-14 21:39:50 +03:00
abet:(emit %pass /mount %arvo %c [%mont pot u.bem])
2015-09-02 01:20:17 +03:00
::
++ poke-unmount
2015-12-20 23:50:45 +03:00
|= mon/kiln-unmount
2015-09-02 01:20:17 +03:00
?^ mon
2016-12-02 02:59:17 +03:00
=+ bem=(de-beam mon)
2015-06-12 06:52:42 +03:00
?~ bem
2015-09-02 01:20:17 +03:00
=+ "can't unmount bad path: {<mon>}"
2015-12-21 00:16:39 +03:00
abet:(spam leaf+- ~)
2019-11-14 21:39:50 +03:00
abet:(emit %pass /unmount-beam %arvo %c [%ogre [[p q r] s]:u.bem])
abet:(emit %pass /unmount-point %arvo %c [%ogre mon])
2015-09-02 01:20:17 +03:00
::
2016-01-07 01:08:46 +03:00
++ poke-track ::
2016-02-01 09:16:26 +03:00
|= hos/kiln-sync
2016-01-07 01:08:46 +03:00
?: (~(has by syn) hos)
abet:(spam (render "already tracking" [sud her syd]:hos) ~)
2016-01-07 01:08:46 +03:00
abet:abet:start-track:(auto hos)
::
++ update
|%
++ make-wire
|= =path
?> ?=(^ ota)
%- welp
:_ path
/kiln/ota/(scot %p ship.u.ota)/[desk.u.ota]/(scot %ud aeon.u.ota)
::
++ check-ota
|= =wire
?~ ota
|
~! ota=ota
?& ?=([@ @ @ *] wire)
=(i.wire (scot %p ship.u.ota))
=(i.t.wire desk.u.ota)
=(i.t.t.wire (scot %ud aeon.u.ota))
==
::
++ render
|= [mez=tape error=(unit (pair term tang))]
%+ spam
?~ ota
leaf+mez
:^ %palm [" " ~ ~ ~] leaf+(weld "kiln: " mez)
~[leaf+"from {<desk.u.ota>}" leaf+"on {<ship.u.ota>}"]
?~ error
~
[>p.u.error< q.u.error]
::
++ render-ket
|= [mez=tape error=(unit (pair term tang))]
?> ?=(^ ota)
=< ?>(?=(^ ota) .)
%+ spam
:^ %palm [" " ~ ~ ~] leaf+(weld "kiln: " mez)
~[leaf+"from {<desk.u.ota>}" leaf+"on {<ship.u.ota>}"]
?~ error
~
[>p.u.error< q.u.error]
::
++ poke
|= arg=(unit [=ship =desk])
abet:(poke-internal arg)
::
++ poke-internal
|= arg=(unit [=ship =desk])
^+ ..abet
=? ..abet =(arg (bind ota |=([=ship =desk =aeon] [ship desk])))
(render "restarting OTA sync" ~)
=? ..abet ?=(^ ota)
=. ..abet (render-ket "cancelling OTA sync" ~)
..abet(ota ~)
?~ arg
..abet
=. ota `[ship.u.arg desk.u.arg *aeon]
=. ..abet (render "starting OTA sync" ~)
%: emit
%pass (make-wire /find) %arvo %c
%warp ship.u.arg desk.u.arg `[%sing %y ud+1 /]
==
::
++ take
|= [=wire =sign-arvo]
^+ ..abet
?> ?=(^ ota)
?. (check-ota wire)
..abet
?. ?=([@ @ @ @ *] wire)
..abet
?+ i.t.t.t.wire ~&([%strange-ota-take t.t.t.wire] ..abet)
%find (take-find sign-arvo)
%sync (take-sync sign-arvo)
%merge-home (take-merge-home sign-arvo)
%merge-kids (take-merge-kids sign-arvo)
==
::
++ take-find
|= =sign-arvo
?> ?=(%writ +<.sign-arvo)
?> ?=(^ ota)
=. ..abet (render-ket "activated OTA" ~)
%: emit
%pass (make-wire /sync) %arvo %c
%warp ship.u.ota desk.u.ota `[%sing %w da+now /]
==
::
++ take-sync
|= =sign-arvo
^+ ..abet
?> ?=(%writ +<.sign-arvo)
?> ?=(^ ota)
?~ p.sign-arvo
=. ..abet (render-ket "OTA cancelled, retrying" ~)
(poke-internal `[ship desk]:u.ota)
=? aeon.u.ota ?=($w p.p.u.p.sign-arvo)
ud:;;(cass:clay q.q.r.u.p.sign-arvo)
=/ =germ
=+ .^(=cass:clay %cw /(scot %p our)/home/(scot %da now))
?: =(0 ud.cass)
%init
?:((gth 2 ud.cass) %that %mate)
=. ..abet (render-ket "beginning OTA to %home" ~)
%: emit
%pass (make-wire /merge-home) %arvo %c
%merg %home ship.u.ota desk.u.ota ud+aeon.u.ota germ
==
::
++ take-merge-home
|= =sign-arvo
?> ?=(%mere +<.sign-arvo)
?> ?=(^ ota)
?: ?=([%| %ali-unavailable *] p.sign-arvo)
=. ..abet
=/ =tape "OTA to %home failed, maybe because sunk; restarting"
(render-ket tape `p.p.sign-arvo)
(poke-internal `[ship desk]:u.ota)
::
?: ?=(%| -.p.sign-arvo)
=. ..abet
=/ =tape "OTA to %home failed, waiting for next revision"
(render-ket tape `p.p.sign-arvo)
=. aeon.u.ota +(aeon.u.ota)
%: emit
%pass (make-wire /sync) %arvo %c
%warp ship.u.ota desk.u.ota `[%sing %y ud+aeon.u.ota /]
==
=. ..abet (render-ket "OTA to %home succeeded" ~)
=. ..abet (render-ket "beginning OTA to %kids" ~)
=/ =germ
=+ .^(=cass:clay %cw /(scot %p our)/kids/(scot %da now))
?: =(0 ud.cass)
%init
?:((gth 2 ud.cass) %that %mate)
%: emit
%pass (make-wire /merge-kids) %arvo %c
%merg %kids ship.u.ota desk.u.ota ud+aeon.u.ota germ
==
::
++ take-merge-kids
|= =sign-arvo
?> ?=(%mere +<.sign-arvo)
?> ?=(^ ota)
?: ?=([%| %ali-unavailable *] p.sign-arvo)
=. ..abet
=/ =tape "OTA to %kids failed, maybe because sunk; restarting"
(render-ket tape `p.p.sign-arvo)
(poke-internal `[ship desk]:u.ota)
::
=. ..abet
?- -.p.sign-arvo
%& (render-ket "OTA to %kids succeeded" ~)
%| (render-ket "OTA to %kids failed" `p.p.sign-arvo)
==
=. aeon.u.ota +(aeon.u.ota)
%: emit
%pass (make-wire /sync) %arvo %c
%warp ship.u.ota desk.u.ota `[%sing %y ud+aeon.u.ota /]
==
--
::
2015-09-02 01:20:17 +03:00
++ poke-sync ::
2015-12-20 23:50:45 +03:00
|= hos/kiln-sync
2015-09-02 01:20:17 +03:00
?: (~(has by syn) hos)
abet:(spam (render "already syncing" [sud her syd]:hos) ~)
2018-12-04 09:59:41 +03:00
abet:abet:start-sync:(auto hos)
2016-02-26 02:19:44 +03:00
::
2016-09-08 20:07:55 +03:00
++ poke-syncs :: print sync config
2018-03-19 07:18:20 +03:00
|= ~
=< abet %- spam
:- [%leaf "OTAs from {<ota>}"]
2016-09-08 20:07:55 +03:00
?: =(0 ~(wyt by syn))
[%leaf "no syncs configured"]~
%+ turn ~(tap in ~(key by syn))
2016-09-08 20:07:55 +03:00
|=(a/kiln-sync (render "sync configured" [sud her syd]:a))
::
2015-09-02 01:20:17 +03:00
++ poke-unsync ::
2015-12-20 23:50:45 +03:00
|= hus/kiln-unsync
2015-09-02 01:20:17 +03:00
?. (~(has by syn) hus)
abet:(spam (render "not syncing" [sud her syd]:hus) ~)
%* . abet:abet:stop:(auto hus)
syn (~(del by syn) hus)
==
::
++ poke-merge ::
|= kiln-merge
2016-01-07 01:08:46 +03:00
abet:abet:(merge:(work syd) ali sud cas gim)
2015-09-02 01:20:17 +03:00
::
2015-09-16 03:24:44 +03:00
++ poke-cancel
|= ~
abet:(emit %pass /cancel %arvo %c [%drop %foo])
2015-09-16 03:24:44 +03:00
::
2016-05-07 02:21:29 +03:00
++ poke-info
|= {mez/tape tor/(unit toro)}
?~ tor
abet:(spam leaf+mez ~)
2019-11-14 21:39:50 +03:00
abet:(emit:(spam leaf+mez ~) %pass /kiln %arvo %c [%info u.tor])
2015-09-02 01:20:17 +03:00
::
++ poke-rm
|= a/path
=+ b=.^(arch %cy a)
?~ fil.b
=+ ~[leaf+"No such file:" leaf+"{<a>}"]
abet:(spam -)
(poke-info "removed" `(fray a))
::
2015-09-02 01:20:17 +03:00
++ poke-label
2015-12-20 23:50:45 +03:00
|= {syd/desk lab/@tas}
2015-09-02 01:20:17 +03:00
=+ pax=/(scot %p our)/[syd]/[lab]
(poke-info "labeled {(spud pax)}" `[syd %| lab])
2015-09-02 01:20:17 +03:00
::
++ poke-schedule
2015-12-20 23:50:45 +03:00
|= {where/path tym/@da eve/@t}
2015-09-02 01:20:17 +03:00
=. where (welp where /sched)
2016-05-07 02:21:29 +03:00
%+ poke-info "scheduled"
2015-12-09 04:54:26 +03:00
=+ old=;;((map @da cord) (fall (file where) ~))
`(foal where %sched !>((~(put by old) tym eve)))
2015-09-02 01:20:17 +03:00
::
++ poke-permission
|= {syd/desk pax/path pub/?}
=< abet
2018-12-13 20:56:56 +03:00
%- emit
2019-11-14 21:39:50 +03:00
=/ =rite [%r ~ ?:(pub %black %white) ~]
[%pass /kiln/permission %arvo %c [%perm syd pax rite]]
::
2019-11-14 21:39:50 +03:00
++ poke
|= [=mark =vase]
?+ mark ~|([%poke-kiln-bad-mark mark] !!)
%kiln-commit =;(f (f !<(_+<.f vase)) poke-commit)
2020-01-29 21:42:52 +03:00
%kiln-autocommit =;(f (f !<(_+<.f vase)) poke-autocommit)
2019-11-14 21:39:50 +03:00
%kiln-info =;(f (f !<(_+<.f vase)) poke-info)
%kiln-label =;(f (f !<(_+<.f vase)) poke-label)
%kiln-cancel =;(f (f !<(_+<.f vase)) poke-cancel)
%kiln-mount =;(f (f !<(_+<.f vase)) poke-mount)
%kiln-rm =;(f (f !<(_+<.f vase)) poke-rm)
%kiln-schedule =;(f (f !<(_+<.f vase)) poke-schedule)
%kiln-track =;(f (f !<(_+<.f vase)) poke-track)
%kiln-sync =;(f (f !<(_+<.f vase)) poke-sync)
%kiln-ota =;(f (f !<(_+<.f vase)) poke:update)
2019-11-14 21:39:50 +03:00
%kiln-syncs =;(f (f !<(_+<.f vase)) poke-syncs)
2020-04-21 05:55:40 +03:00
%kiln-goad-gall =;(f (f !<(_+<.f vase)) poke-goad-gall)
2019-11-14 21:39:50 +03:00
%kiln-unmount =;(f (f !<(_+<.f vase)) poke-unmount)
%kiln-unsync =;(f (f !<(_+<.f vase)) poke-unsync)
%kiln-permission =;(f (f !<(_+<.f vase)) poke-permission)
%kiln-cancel-autocommit =;(f (f !<(_+<.f vase)) poke-cancel-autocommit)
%kiln-merge =;(f (f !<(_+<.f vase)) poke-merge)
==
2015-09-17 02:40:53 +03:00
::
2019-11-05 10:37:58 +03:00
++ poke-goad-gall
|= [force=? agent=(unit dude:gall)]
2019-11-19 07:36:21 +03:00
abet:(emit %pass /kiln %arvo %g %goad force agent)
2019-11-05 10:37:58 +03:00
::
++ done
|= {way/wire saw/(unit error:ames)}
~? ?=(^ saw) [%kiln-nack u.saw]
abet
::
2019-11-14 21:39:50 +03:00
++ take-agent
2019-11-19 07:36:21 +03:00
|= [=wire =sign:agent:gall]
2019-11-14 21:39:50 +03:00
?+ wire ~|([%kiln-bad-take-agent wire -.sign] !!)
2020-01-04 00:06:42 +03:00
[%kiln %fancy *] ?> ?=(%poke-ack -.sign)
2019-11-14 21:39:50 +03:00
(take-coup-fancy t.t.wire p.sign)
2020-01-04 00:06:42 +03:00
[%kiln %spam *] ?> ?=(%poke-ack -.sign)
2019-11-14 21:39:50 +03:00
(take-coup-spam t.t.wire p.sign)
==
::
++ take-general
|= [=wire =sign-arvo]
?- wire
[%sync %merg *] %+ take-mere-sync t.t.wire
?>(?=(%mere +<.sign-arvo) +>.sign-arvo)
[%find-ship *] %+ take-writ-find-ship t.wire
?>(?=(%writ +<.sign-arvo) +>.sign-arvo)
[%sync *] %+ take-writ-sync t.wire
?>(?=(%writ +<.sign-arvo) +>.sign-arvo)
[%autocommit *] %+ take-wake-autocommit t.wire
?>(?=(%wake +<.sign-arvo) +>.sign-arvo)
[%ota *] abet:(take:update t.wire sign-arvo)
2019-11-14 21:39:50 +03:00
*
?+ +<.sign-arvo ~|([%kiln-bad-take-card +<.sign-arvo] !!)
%done %+ done wire
?>(?=(%done +<.sign-arvo) +>.sign-arvo)
2019-11-14 21:39:50 +03:00
%mere %+ take-mere wire
?>(?=(%mere +<.sign-arvo) +>.sign-arvo)
==
==
2018-03-19 07:18:20 +03:00
++ take |=(way/wire ?>(?=({@ ~} way) (work i.way))) :: general handler
2015-09-02 01:20:17 +03:00
++ take-mere ::
2015-12-20 23:50:45 +03:00
|= {way/wire are/(each (set path) (pair term tang))}
2015-09-02 01:20:17 +03:00
abet:abet:(mere:(take way) are)
::
++ take-coup-fancy ::
2015-12-20 23:50:45 +03:00
|= {way/wire saw/(unit tang)}
2015-09-02 01:20:17 +03:00
abet:abet:(coup-fancy:(take way) saw)
::
2017-11-30 07:31:13 +03:00
++ take-coup-spam ::
|= {way/wire saw/(unit tang)}
~? ?=(^ saw) [%kiln-spam-lame u.saw]
abet
::
2015-09-02 01:20:17 +03:00
++ take-mere-sync ::
2015-12-20 23:50:45 +03:00
|= {way/wire mes/(each (set path) (pair term tang))}
2016-02-26 02:19:44 +03:00
?> ?=({@ @ @ *} way)
=/ hos/kiln-sync
2015-09-02 01:20:17 +03:00
:* syd=(slav %tas i.way)
her=(slav %p i.t.way)
sud=(slav %tas i.t.t.way)
==
2018-12-04 09:59:41 +03:00
abet:abet:(mere:(auto hos) mes)
2015-09-02 01:20:17 +03:00
::
2019-04-30 20:40:38 +03:00
++ take-writ-find-ship ::
|= {way/wire rot/riot}
?> ?=({@ @ @ *} way)
=/ hos/kiln-sync
2019-04-30 20:40:38 +03:00
:* syd=(slav %tas i.way)
her=(slav %p i.t.way)
sud=(slav %tas i.t.t.way)
==
abet:abet:(take-find-ship:(auto hos) rot)
::
2015-09-17 01:39:11 +03:00
++ take-writ-sync ::
2015-12-20 23:50:45 +03:00
|= {way/wire rot/riot}
2016-02-26 02:19:44 +03:00
?> ?=({@ @ @ *} way)
=/ hos/kiln-sync
2015-09-02 01:20:17 +03:00
:* syd=(slav %tas i.way)
her=(slav %p i.t.way)
sud=(slav %tas i.t.t.way)
==
2018-12-04 09:59:41 +03:00
abet:abet:(writ:(auto hos) rot)
2015-09-02 01:20:17 +03:00
::
2019-08-25 12:00:26 +03:00
++ take-wake-autocommit
|= [way=wire error=(unit tang)]
?^ error
%- (slog u.error)
~& %kiln-wake-autocommit-fail
abet
=. nex.commit-timer (add now tim.commit-timer)
=< abet
%- emil
2019-11-14 21:39:50 +03:00
:~ [%pass /commit %arvo %c [%dirk mon.commit-timer]]
[%pass way.commit-timer %arvo %b [%wait nex.commit-timer]]
2019-08-25 12:00:26 +03:00
==
::
::
2015-09-02 01:20:17 +03:00
++ spam
2015-12-20 23:50:45 +03:00
|= mes/(list tank)
2015-09-02 01:20:17 +03:00
((slog mes) ..spam)
::
++ auto
|= kiln-sync
2019-11-14 21:39:50 +03:00
=+ (~(gut by syn) [syd her sud] let=*@ud)
2015-09-02 01:20:17 +03:00
|%
++ abet
2019-11-14 21:39:50 +03:00
..auto(syn (~(put by syn) [syd her sud] let))
2015-06-18 02:44:00 +03:00
::
2015-09-02 01:20:17 +03:00
++ blab
2019-11-19 07:36:21 +03:00
|= new/(list card:agent:gall)
2015-09-02 01:20:17 +03:00
^+ +>
+>.$(moz (welp new moz))
2015-05-12 03:31:37 +03:00
::
2019-11-14 21:39:50 +03:00
++ warp
|= [=wire =ship =riff]
(blab [%pass wire %arvo %c [%warp ship riff]] ~)
::
2015-09-02 01:20:17 +03:00
++ spam |*(* %_(+> ..auto (^spam +<)))
++ stop
=> (spam (render "ended autosync" sud her syd) ~)
=/ =wire /kiln/sync/[syd]/(scot %p her)/[sud]
2019-11-14 21:39:50 +03:00
(warp wire her sud ~)
2018-12-04 09:59:41 +03:00
:: XX duplicate of start-sync? see |track
2015-06-04 00:18:13 +03:00
::
2016-01-07 01:08:46 +03:00
++ start-track
=> (spam (render "activated track" sud her syd) ~)
=. let 1
=/ =wire /kiln/sync/[syd]/(scot %p her)/[sud]
2019-11-14 21:39:50 +03:00
(warp wire her sud `[%sing %y ud+let /])
2016-01-07 01:08:46 +03:00
::
++ start-sync
2019-04-30 20:40:38 +03:00
=> (spam (render "finding ship and desk" sud her syd) ~)
=/ =wire /kiln/find-ship/[syd]/(scot %p her)/[sud]
2019-11-14 21:39:50 +03:00
(warp wire her sud `[%sing %y ud+1 /])
2019-04-30 20:40:38 +03:00
::
++ take-find-ship
|= rot=riot
2019-05-14 00:45:53 +03:00
=> (spam (render "activated sync" sud her syd) ~)
2018-12-04 09:59:41 +03:00
=/ =wire /kiln/sync/[syd]/(scot %p her)/[sud]
2019-11-14 21:39:50 +03:00
(warp wire her sud `[%sing %w [%da now] /])
2015-05-12 03:31:37 +03:00
::
2015-09-02 01:20:17 +03:00
++ writ
2018-12-04 09:59:41 +03:00
|= rot=riot
2015-09-02 01:20:17 +03:00
?~ rot
=. +>.$
%^ spam
leaf+"sync cancelled, retrying"
(render "on sync" sud her syd)
~
start-sync
2019-05-09 22:46:19 +03:00
=. let ?. ?=($w p.p.u.rot) let ud:;;(cass:clay q.q.r.u.rot)
2019-11-14 21:39:50 +03:00
=/ =wire /kiln/sync/merg/[syd]/(scot %p her)/[sud]
:: germ: merge mode for sync merges
::
:: Initial merges from any source must use the %init germ.
:: Subsequent merges may use any germ, but if the source is
:: a remote ship with which we have not yet merged, we won't
:: share a merge-base commit and all germs but %that will fail.
::
:: We want to always use %that for the first remote merge.
:: But we also want local syncs (%base to %home or %kids)
:: to succeed after that first remote sync. To accomplish both
:: we simply use %that for the first three sync merges.
:: (The first two are from the pill.)
::
=/ =germ
=/ =cass
.^(cass:clay %cw /(scot %p our)/[syd]/(scot %da now))
?: =(0 ud.cass)
%init
?:((gth 2 ud.cass) %that %mate)
=< %- spam
?: =(our her) ~
[(render "beginning sync" sud her syd) ~]
2019-11-14 21:39:50 +03:00
(blab [%pass wire %arvo %c [%merg syd her sud ud+let germ]] ~)
2015-06-04 00:18:13 +03:00
::
2015-09-02 01:20:17 +03:00
++ mere
2018-12-04 09:59:41 +03:00
|= mes=(each (set path) (pair term tang))
?: ?=([%| %ali-unavailable *] mes)
2019-02-02 00:46:09 +03:00
=. +>.$
%^ spam
2019-05-03 04:06:31 +03:00
leaf+"merge cancelled, maybe because sunk; restarting"
2019-02-02 00:46:09 +03:00
(render "on sync" sud her syd)
~
start-sync:stop
2015-09-02 01:20:17 +03:00
=. let +(let)
=. +>.$
%- spam
2018-03-19 06:54:47 +03:00
?: ?=(%& -.mes)
2015-09-02 01:20:17 +03:00
[(render "sync succeeded" sud her syd) ~]
?+ p.p.mes
:* (render "sync failed" sud her syd)
2015-12-21 00:16:39 +03:00
leaf+"please manually merge the desks with"
leaf+"|merge %{(trip syd)} {(scow %p her)} %{(trip sud)}"
leaf+""
leaf+"error code: {<p.p.mes>}"
2015-09-02 01:20:17 +03:00
q.p.mes
==
::
2019-05-23 08:35:09 +03:00
$no-ali-disc
:~ (render "sync activated" sud her syd)
2015-12-21 00:16:39 +03:00
leaf+"note: blank desk {<sud>} on {<her>}"
2015-09-02 01:20:17 +03:00
==
==
2018-12-04 09:59:41 +03:00
=/ =wire /kiln/sync/[syd]/(scot %p her)/[sud]
2019-11-14 21:39:50 +03:00
(warp wire her sud `[%sing %y ud+let /])
2015-09-02 01:20:17 +03:00
--
::
++ work :: state machine
2015-12-20 23:50:45 +03:00
|= syd/desk
=/ ,per-desk
%+ ~(gut by rem) syd
2017-11-30 00:29:35 +03:00
=+ *per-desk
2015-09-02 01:20:17 +03:00
%_(- cas [%da now])
|%
++ abet :: resolve
..work(rem (~(put by rem) syd auto gem her sud cas))
2015-05-28 05:46:58 +03:00
::
2015-09-02 01:20:17 +03:00
++ blab
2019-11-19 07:36:21 +03:00
|= new/(list card:agent:gall)
2015-09-02 01:20:17 +03:00
^+ +>
+>.$(moz (welp new moz))
2015-05-28 05:46:58 +03:00
::
2015-09-02 01:20:17 +03:00
++ win . :: successful poke
++ lose
^+ .
~| %kiln-work-fail
.
::
++ perform ::
2015-09-02 01:20:17 +03:00
^+ .
2019-11-14 21:39:50 +03:00
(blab [%pass /kiln/[syd] %arvo %c [%merg syd her sud cas gem]] ~)
2015-05-26 04:20:45 +03:00
::
2015-09-02 01:20:17 +03:00
++ fancy-merge :: send to self
2015-12-20 23:50:45 +03:00
|= {syd/desk her/@p sud/desk gem/?($auto germ)}
2015-09-02 01:20:17 +03:00
^+ +>
2019-11-14 21:39:50 +03:00
=/ =cage [%kiln-merge !>([syd her sud cas gem])]
2015-09-02 01:20:17 +03:00
%- blab :_ ~
2019-11-14 21:39:50 +03:00
[%pass /kiln/fancy/[^syd] %agent [our %hood] %poke cage]
2015-05-26 04:20:45 +03:00
::
2015-09-02 01:20:17 +03:00
++ spam ::|=(tang ((slog +<) ..spam))
|*(* +>(..work (^spam +<)))
++ merge
|= {her/@p sud/@tas cas/case gim/?($auto germ)}
2015-09-02 01:20:17 +03:00
^+ +>
2015-12-09 04:54:26 +03:00
?. ?=($auto gim)
2016-01-07 01:08:46 +03:00
perform(auto |, gem gim, her her, cas cas, sud sud)
?: =(0 ud:.^(cass:clay %cw /(scot %p our)/[syd]/(scot %da now)))
2015-09-02 01:20:17 +03:00
=> $(gim %init)
.(auto &)
=> $(gim %fine)
.(auto &)
2015-05-26 04:20:45 +03:00
::
2015-09-02 01:20:17 +03:00
++ coup-fancy
|= saw/(unit tang)
2015-09-02 01:20:17 +03:00
?~ saw
2020-05-14 05:28:04 +03:00
+>
2015-09-02 01:20:17 +03:00
=+ :- "failed to set up conflict resolution scratch space"
"I'm out of ideas"
2015-12-21 00:16:39 +03:00
lose:(spam leaf+-< leaf+-> u.saw)
2015-05-26 04:20:45 +03:00
::
2015-09-02 01:20:17 +03:00
++ mere
|= are/(each (set path) (pair term tang))
2015-09-02 01:20:17 +03:00
^+ +>
?: =(%meld gem)
2018-03-19 06:54:47 +03:00
?: ?=(%& -.are)
2015-09-02 01:20:17 +03:00
?. auto
=+ "merged with strategy {<gem>}"
2015-12-21 00:16:39 +03:00
win:(spam leaf+- ?~(p.are ~ [>`(set path)`p.are< ~]))
2015-09-02 01:20:17 +03:00
:: ~? > =(~ p.are) [%mere-no-conflict syd]
2020-05-14 05:28:04 +03:00
=> .(+>.$ (spam leaf+"mashing conflicts" ~))
2015-09-02 01:20:17 +03:00
=+ tic=(cat 3 syd '-scratch')
2020-05-14 05:28:04 +03:00
=/ notations=(list [path (unit [mark vase])])
%+ turn ~(tap in p.are)
|= =path
=/ =mark -:(flop path)
=/ =dais .^(dais %cb /(scot %p our)/[syd]/(scot cas)/[mark])
=/ base .^(vase %cr (weld /(scot %p our)/[tic]/(scot cas) path))
=/ ali .^(vase %cr (weld /(scot %p her)/[sud]/(scot cas) path))
=/ bob .^(vase %cr (weld /(scot %p our)/[syd]/(scot cas) path))
=/ ali-dif (~(diff dais base) ali)
=/ bob-dif (~(diff dais base) bob)
=/ mash (~(mash dais base) [her sud ali-dif] [our syd bob-dif])
:- path
?~ mash
~
`[mark (~(pact dais base) u.mash)]
=/ [annotated=(list [path *]) unnotated=(list [path *])]
(skid notations |=([* v=*] ?=(^ v)))
=/ tic=desk (cat 3 syd '-scratch')
=/ tan=(list tank)
%- zing
^- (list (list tank))
:~ %- tape-to-tanks
"""
done setting up scratch space in {<[tic]>}
please resolve the following conflicts and run
|merge {<syd>} our {<[tic]>}
"""
%^ tanks-if-any
"annotated conflicts in:" (turn annotated head)
""
%^ tanks-if-any
"unannotated conflicts in:" (turn unnotated head)
"""
some conflicts could not be annotated.
for these, the scratch space contains
the most recent common ancestor of the
conflicting content.
"""
==
=< win
%- blab:(spam tan)
:_ ~
:* %pass /kiln/[syd] %arvo %c
%info
tic %&
%+ murn notations
|= [=path dif=(unit [=mark =vase])]
^- (unit [^path miso])
?~ dif
~
`[path %mut mark.u.dif vase.u.dif]
==
2015-09-02 01:20:17 +03:00
=+ "failed to merge with strategy meld"
2015-12-21 00:16:39 +03:00
lose:(spam leaf+- >p.p.are< q.p.are)
2018-03-19 06:54:47 +03:00
?: ?=(%& -.are)
2015-09-02 01:20:17 +03:00
=+ "merged with strategy {<gem>}"
2015-12-21 00:16:39 +03:00
win:(spam leaf+- ?~(p.are ~ [>`(set path)`p.are< ~]))
2015-09-02 01:20:17 +03:00
?. auto
=+ "failed to merge with strategy {<gem>}"
2015-12-21 00:16:39 +03:00
lose:(spam leaf+- >p.p.are< q.p.are)
2015-09-02 01:20:17 +03:00
?+ gem
2015-12-21 00:16:39 +03:00
(spam leaf+"strange auto" >gem< ~)
2015-09-02 01:20:17 +03:00
::
2015-12-09 04:54:26 +03:00
$init
2015-09-02 01:20:17 +03:00
=+ :- "auto merge failed on strategy %init"
2015-05-12 03:31:37 +03:00
"I'm out of ideas"
2015-12-21 00:16:39 +03:00
lose:(spam leaf+-< leaf+-> [>p.p.are< q.p.are])
2015-05-12 03:31:37 +03:00
::
2015-12-09 04:54:26 +03:00
$fine
?. ?=($bad-fine-merge p.p.are)
2015-09-02 01:20:17 +03:00
=+ "auto merge failed on strategy %fine"
2015-12-21 00:16:39 +03:00
lose:(spam leaf+- >p.p.are< q.p.are)
=> (spam leaf+"%fine merge failed, trying %meet" ~)
2015-09-02 01:20:17 +03:00
perform(gem %meet)
2015-07-28 01:39:36 +03:00
::
2015-12-09 04:54:26 +03:00
$meet
?. ?=($meet-conflict p.p.are)
2015-09-02 01:20:17 +03:00
=+ "auto merge failed on strategy %meet"
2015-12-21 00:16:39 +03:00
lose:(spam leaf+- >p.p.are< q.p.are)
=> (spam leaf+"%meet merge failed, trying %mate" ~)
2015-09-02 01:20:17 +03:00
perform(gem %mate)
2015-07-28 01:39:36 +03:00
::
2015-12-09 04:54:26 +03:00
$mate
?. ?=($mate-conflict p.p.are)
2015-09-02 01:20:17 +03:00
=+ "auto merge failed on strategy %mate"
2015-12-21 00:16:39 +03:00
lose:(spam leaf+- >p.p.are< q.p.are)
2015-09-02 01:20:17 +03:00
=> .(gem %meld)
=+ tic=(cat 3 syd '-scratch')
=> =+ :- "%mate merge failed with conflicts,"
"setting up scratch space at %{(trip tic)}"
2015-12-21 00:16:39 +03:00
[tic=tic (spam leaf+-< leaf+-> q.p.are)]
2020-05-14 05:28:04 +03:00
=. ..mere (fancy-merge tic our syd %init)
=> (spam leaf+"%melding %{(trip sud)} into scratch space" ~)
%- blab :_ ~
=/ note [%merg (cat 3 syd '-scratch') her sud cas gem]
[%pass /kiln/[syd] %arvo %c note]
2015-09-02 01:20:17 +03:00
==
::
++ tape-to-tanks
2015-12-20 23:50:45 +03:00
|= a/tape ^- (list tank)
2015-12-21 00:16:39 +03:00
(scan a (more (just '\0a') (cook |=(a/tape leaf+a) (star prn))))
2015-09-02 01:20:17 +03:00
::
++ tanks-if-any
2015-12-20 23:50:45 +03:00
|= {a/tape b/(list path) c/tape} ^- (list tank)
2015-09-02 01:20:17 +03:00
?: =(~ b) ~
(welp (tape-to-tanks "\0a{c}{a}") >b< ~)
2015-05-12 03:31:37 +03:00
--
--