Šķîþ ţö ḿàîñ çöñţéñţ

É-09: Ţĥé çĥàñĝé çöñţŕàçţ

Šüḿḿàŕý​

Çöñţéñţ çĥàñĝéš îñ öñé ŵàý. À çàļļéŕ đéšçŕîƃéš ţĥé çĥàñĝé àš à çĥàñĝé šéţ (kapi.change/v1): àñ éñṽéļöþé öƒ öŕđéŕéđ öþéŕàţîöñš, éàçĥ àđđŕéššéđ ţö öñé éđîţîöñ öƒ öñé ƃļöçķ öƒ öñé đöçüḿéñţ àñđ éàçĥ ñàḿîñĝ ţĥé ŕéṽîšîöñ öƒ ţĥàţ éđîţîöñ îţš šéñđéŕ ŕéàđ. Öñé šéŕṽîçé îñ ţĥé ƒŕàḿéŵöŕķ, core/change, àþþļîéš îţ. Ţĥé šéŕṽîçé ŕéàđš éàçĥ đöçüḿéñţ ţĥŕöüĝĥ ţĥé ĥöḿé ţĥàţ ĥöļđš îţš ţéẋţ, àþþļîéš ţĥé öþéŕàţîöñš îñ ḿéḿöŕý ŵîţĥ change.ApplyBlock, çĥéçķš ŵĥàţ çĥàñĝéđ, àñđ çöḿḿîţš éṽéŕý đöçüḿéñţ öŕ ñöñé. À ƒîļé îñ à ŵöŕķîñĝ ţŕéé îš öñé ĥöḿé; ţĥé ƒîļé ĥöḿé çöḿḿîţš ƃý ŕéñàḿîñĝ à šţàĝéđ ƒîļé öñţö ţĥé đöçüḿéñţ üñđéŕ àñ àđṽîšöŕý ļöçķ, àñđ àþþļîéš ţĥé çĥàñĝé àĝàîñ ŵĥéñ ţĥé ƒîļé ḿöṽéđ šîñçé îţ ŵàš ŕéàđ. À ƒļöŵ çöḿḿîţš éàçĥ đöçüḿéñţ îţ ŵŕîţéš ţĥŕöüĝĥ ţĥé šàḿé ĥöḿé àñđ ŕéçöŕđš îţ àš ţĥé ƒļöŵ'š éđîţ.

Ţĥé šéŕṽîçé ļîṽéš ƃéļöŵ éṽéŕý šüŕƒàçé. Îţ îḿþöŕţš core/model, core/format àñđ core/safeio, àñđ ñöţĥîñĝ ƒŕöḿ ţĥé ĥöšţ, ţĥé ÇĻÎ öŕ à šüŕƒàçé, šö ţĥé ÇĻÎ, ţĥé àĝéñţ ţööļš, Ķàþî Đéšķţöþ àñđ àñ àþþļîçàţîöñ ţĥàţ éḿƃéđš ţĥé éñĝîñé àļļ ƃüîļđ ţĥé šàḿé šéŕṽîçé àñđ đéŕ öñļý îñ ţĥé ĥöḿé àñđ ţĥé ĥööķš ţĥéý ĝîṽé îţ.

Çöñţéẋţ​

À çĥàñĝé ţö çöñţéñţ ĥàš ţö àñšŵéŕ ţĥé šàḿé ǫüéšţîöñš ŵĥéŕéṽéŕ îţ çöḿéš ƒŕöḿ: ŵĥîçĥ ƃļöçķ îţ ḿéàñš, ŵĥéţĥéŕ ţĥàţ ƃļöçķ šţîļļ šàýš ŵĥàţ ţĥé šéñđéŕ ŕéàđ, ŵĥéţĥéŕ ţĥé ŕéšüļţ ķééþš ţĥé îñļîñé çöđéš àñđ šţŕüçţüŕé ţĥé ƒöŕḿàţ ñééđš, ŵĥàţ ţĥé çĥàñĝé đöéš ţö ţĥé éđîţîöñ'š šţàţüš, àñđ ŵĥéţĥéŕ ĝöṽéŕñàñçé àļļöŵš îţ. À đöçüḿéñţ ţĥàţ çĥàñĝéš îñ ţŵö þļàçéš àţ öñçé ĥàš ţö éñđ ŵîţĥ ƃöţĥ çĥàñĝéš öŕ ŵîţĥ à çļéàŕ ŕéƒüšàļ, àñđ ñéṽéŕ ŵîţĥ öñé çĥàñĝé šîļéñţļý ŕéþļàçéđ ƃý ţĥé öţĥéŕ.

Ţĥé éñĝîñé ŕéàđš đöçüḿéñţš îñţö ƃļöçķš ŵĥöšé éđîţîöñš ĥöļđ ŕüñš (Ƒ-02) àñđ ŵŕîţéš ţĥéḿ ƃàçķ ţĥŕöüĝĥ ƒöŕḿàţ ŵŕîţéŕš ţĥàţ ŕéþļàý à šķéļéţöñ (É-02). Ţööļš îñ ƒļöŵš çĥàñĝé ƃļöçķš ţĥŕöüĝĥ ţĥéîŕ ṽîéŵš (É-03). Ţĥé çĥàñĝé çöñţŕàçţ þüţš ƃöţĥ öñ öñé ƒööţîñĝ: à ţööļ'š ŵŕîţé àñđ à þéŕšöñ'š éđîţ àŕé ţĥé šàḿé öþéŕàţîöñš, àþþļîéđ ƃý ţĥé šàḿé ƒüñçţîöñ, üñđéŕ ţĥé šàḿé ŕüļéš.

Đéçîšîöñ​

Ţĥé çĥàñĝé šéţ​

À çĥàñĝé šéţ ĥàš àñ éñṽéļöþé àñđ öþéŕàţîöñš.

ƑîéļđḾéàñîñĝ
schemakapi.change/v1
modeapply (ţĥé đéƒàüļţ) öŕ preview, ŵĥîçĥ çöḿþüţéš àñđ çĥéçķš éṽéŕýţĥîñĝ, ŵŕîţéš ñöţĥîñĝ, àñđ ŕéţüŕñš à đ þéŕ đöçüḿéñţ
gateenforce (ţĥé đéƒàüļţ) öŕ report: ŵĥàţ à ƒàîļîñĝ ĝöṽéŕñàñçé ƒîñđîñĝ ţĥé çĥàñĝé îñţŕöđüçéš đöéš
require_basisŕéƒüšé à ŵŕîţé ţö à đéŕîṽéđ éđîţîöñ ŵĥöšé àüţĥöŕîţàţîṽé éđîţîöñ ḿöṽéđ šîñçé ţĥé šéñđéŕ ŕéàđ îţ
note, evidenceŵĥàţ à þéŕšöñ ŕéàđš îñ ĥîšţöŕý, àñđ ŵĥéŕé ţĥé ŵöŕđîñĝ ƃéĥîñđ ţĥé çĥàñĝé ŵàš šééñ: à ƒîļé'š path, ţĥé block ķéý à ŕéàđ ŕéþöŕţš, à quote öŕ à url
opsţĥé öþéŕàţîöñš, àþþļîéđ îñ öŕđéŕ; à çĥàñĝé šéţ ŵîţĥ ñöñé çĥàñĝéš ñöţĥîñĝ

Ţĥé çöñţéñţ öþéŕàţîöñš àŕé set_content, replace_text, set_attribute, mark, remove_edition, annotate, unannotate, insert_block, delete_block àñđ native. decide ŕéçöŕđš à ŕéṽîéŵ đéçîšîöñ, àñđ term, memory àñđ recipe çĥàñĝé ţĥé þŕöĵéçţ'š ţéŕḿš šţöŕé, çöñţéñţ ḿéḿöŕý àñđ ŕéçîþé. Ţĥé éñṽéļöþé çàŕŕîéš ñö àçţöŕ: ţĥé ţŕàñšþöŕţ ţĥàţ đéļîṽéŕš à çĥàñĝé šéţ šàýš ŵĥö šéñţ îţ. À set_content öŕ replace_text ḿàý šţàţé ĥöŵ à ţööļ þŕöđüçéđ îţš çöñţéñţ (origin: ţĥé ţööļ, àñđ ţĥé ķîñđ àñđ éñĝîñé îţ đŕéŵ öñ), àš à ŕüñ þŕîñţéđ ŵîţĥ --print-ops šţàţéš éàçĥ ţŕàñšļàţîöñ îţ ŵŕöţé. Ţĥé šéŕṽîçé ŕéçöŕđš ñö šţàţéđ öŕîĝîñ: àñ éđîţ ţàķéš ţĥé öŕîĝîñ îţš šéñđéŕ'š éđîţ ĝîṽéš îţ, à þéŕšöñ'š öŕ àñ àĝéñţ'š ţĥéîŕ öŵñ, àñđ à ţööļ îñ à ƒļöŵ ŕéçöŕđš ĥöŵ îţ þŕöđüçéđ à ţŕàñšļàţîöñ ŵîţĥ ţĥé îñ-þŕöçéšš þŕöṽéñàñçé öþéŕàţîöñ.

change.Decode ŕéàđš à çĥàñĝé šéţ šţŕîçţļý: àñ üñķñöŵñ ƒîéļđ öŕ öþéŕàţîöñ îš ŕéƒüšéđ ŵîţĥ ţĥé ĴŠÖÑ þöîñţéŕ öƒ ŵĥàţ ŵàš ŵŕöñĝ. changeschema.Schema îš ţĥé ĴŠÖÑ Šçĥéḿà ĝéñéŕàţéđ ƒŕöḿ ţĥé šàḿé Ĝö ţýþéš. ŢýþéŠçŕîþţ çļîéñţš üšé @neokapi/contract-types, ŵĥöšé çĥàñĝé šéţ àñđ öþéŕàţîöñš àŕé ĝéñéŕàţéđ ƒŕöḿ ţĥàţ šçĥéḿà àñđ ŵĥöšé ŕéšüļţ, ŕéàđ àñđ đéšçŕîþţîöñ ţýþéš àŕé ĝéñéŕàţéđ ƒŕöḿ ţĥé šţŕüçţš ţĥé šéŕṽîçé ḿàŕšĥàļš; à đŕîƒţ ĝàţé ŕéĝéñéŕàţéš ţĥéḿ öñ éṽéŕý çĥàñĝé. Ţĥé ñöţé Ţĥé çĥàñĝé àþþļîéŕ çöṽéŕš ţĥé ţýþéš, ţĥé đéçöđéŕ, ţĥé šçĥéḿà àñđ ţĥé ŢýþéŠçŕîþţ ţýþéš.

kapi.change/v1 îš ƒŕöžéñ ƒöŕ ŕéļéàšé 1.3.0 àñđ îš öñļý éẋţéñđéđ. À ƒŕöžéñ ƒîļé ƃéšîđé éàçĥ ĝöļđéñ ĥöļđš ţĥé çöñţŕàçţ àš îţ ŵàš þüƃļîšĥéđ: ţĥé çĥàñĝé šéţ'š šçĥéḿà, ţĥé ŕéšüļţ'š (kapi.change-result/v1, changeschema.ResultSchema) àñđ ţĥé ŕéàđ'š (changeschema.ReadSchema), àñđ ţĥé ḾÇÞ ţööļ šüŕƒàçé, ŵĥöšé ţööļ ñàḿéš ḿàý öñļý ĝŕöŵ àñđ ŵĥöšé îñþüţ šçĥéḿàš àŕé ĥéļđ ţö ţĥé ŕéǫüéšţ ŕüļé ƃéļöŵ. À ţéšţ ŵàļķš éàçĥ ƒŕöžéñ šçĥéḿà ƃéšîđé ţĥé öñé ţĥé Ĝö ţýþéš ĝéñéŕàţé àñđ ŕéƒüšéš à çĥàñĝé ţĥàţ ƃŕéàķš ţĥé šîđé ţĥàţ đéþéñđš öñ îţ: ƒöŕ à ŕéǫüéšţ, à þŕöþéŕţý, $defs éñţŕý öŕ öþéŕàţîöñ ŕéḿöṽéđ öŕ ŕéñàḿéđ, à ţýþé, const, $ref, þàţţéŕñ, ƒöŕḿàţ öŕ ƃöüñđ çĥàñĝéđ, à þŕöþéŕţý ñéŵļý ŕéǫüîŕéđ, àñ éñüḿ ṽàļüé ŕéḿöṽéđ, öŕ additionalProperties çĥàñĝéđ; ƒöŕ à ŕéšüļţ öŕ à ŕéàđ, ţĥé šàḿé, ŵîţĥ à þŕöþéŕţý đŕöþþéđ ƒŕöḿ required îñ þļàçé öƒ à ñéŵļý ŕéǫüîŕéđ öñé. Àñ öþţîöñàļ þŕöþéŕţý, àñ öþéŕàţîöñ, àñ éñüḿ ṽàļüé, à $defs éñţŕý àñđ àñý đéšçŕîþţîöñ éẋţéñđ à šçĥéḿà. À ƃŕéàķîñĝ çĥàñĝé ñééđš kapi.change/v2 àñđ à ñéŵ ƒŕöžéñ ƒîļé. Đéçöđîñĝ šţàýš šţŕîçţ, šö àñ öļđéŕ ƃîñàŕý ŕéƒüšéš à ƒîéļđ à ñéŵéŕ šéñđéŕ àđđš àš invalid, ŵĥîçĥ ţĥé ŕüļé àççéþţš: à šéñđéŕ ļéàŕñš ţĥé ƒîéļđ îš ñöţ üñđéŕšţööđ ŕàţĥéŕ ţĥàñ ĥàṽîñĝ îţ îĝñöŕéđ.

Àđđŕéššîñĝ àñđ ŕéṽîšîöñš​

Àñ öþéŕàţîöñ àđđŕéššéš {doc, block, edition}. doc îš à þŕöĵéçţ-ŕéļàţîṽé þàţĥ, container!entry ƒöŕ àñ àŕçĥîṽé ḿéḿƃéŕ, öŕ àñöţĥéŕ ĥöḿé'š đöçüḿéñţ ķéý. block îš ţĥé ķéý à ŕéàđ ŕéþöŕţš: ţĥé đüŕàƃļé ķéý ŵĥéŕé ŕéçöñçîļîàţîöñ àššîĝñéđ öñé, éļšé ţĥé ñàḿé ţĥé ƒöŕḿàţ ĝîṽéš ţĥé ƃļöçķ, éļšé ţĥé ŕéàđéŕ'š îđ (change.BlockKey). edition îš àñ éđîţîöñ ķéý šüçĥ àš fr öŕ en;channel=short; éḿþţý ḿéàñš ţĥé đöçüḿéñţ'š öŵñ éđîţîöñ.

Àñ öþéŕàţîöñ ţĥàţ çĥàñĝéš éẋîšţîñĝ çöñţéñţ çàŕŕîéš if_match, ţĥé ŕéṽîšîöñ öƒ ţĥé éđîţîöñ îţš šéñđéŕ ŕéàđ. model.EditionRevision ĥàšĥéš ţĥé éđîţîöñ ķéý àñđ îţš ŕüñš, çöđéš àñđ ţĥéîŕ àţţŕîƃüţéš îñçļüđéđ, àñđ ñöţĥîñĝ éļšé, šö ţĥé šàḿé ţöķéñ ĥöļđš îñ éṽéŕý ĥöḿé. absent çŕéàţéš àñ éđîţîöñ, àñđ * ŵŕîţéš ŵĥàţéṽéŕ îš ţĥéŕé, à ƃļîñđ ŵŕîţé öñļý à þéŕšöñ ḿàý šéñđ. Éṽéŕý if_match îš çĥéçķéđ àĝàîñšţ ţĥé çöñţéñţ àš îţ šţööđ ŵĥéñ ţĥé çĥàñĝé šéţ ƃéĝàñ, šö à šéñđéŕ ñéṽéŕ çöḿþüţéš àñ îñţéŕḿéđîàţé ŕéṽîšîöñ, àñđ šéṽéŕàļ öþéŕàţîöñš öñ öñé ƃļöçķ éàçĥ šéñđ ţĥé ŕéṽîšîöñ ţĥéîŕ šéñđéŕ ŕéàđ.

À set_content öñ à đéŕîṽéđ éđîţîöñ ŕéçöŕđš îţš ƃàšîš öñ ţĥé éđîţîöñ îţšéļƒ, àš îţš đéŕîṽàţîöñ (Edition.Derived): ţĥé àüţĥöŕîţàţîṽé éđîţîöñ àñđ ţĥé ŕéṽîšîöñ ţĥé öþéŕàţîöñ ñàḿéš àš basis, éļšé ţĥé ŕéṽîšîöñ ţĥé öþéŕàţîöñš ƃéƒöŕé îţ ļéƒţ. Àñ éđîţ ţĥàţ ñàḿéš ñö ƃàšîš ķééþš ţĥé đéŕîṽàţîöñ ţĥé éđîţîöñ ĥàš. À ŕéàđ ţàķéš à đéŕîṽéđ éđîţîöñ'š ƃàšîš, àñđ ŵĥéţĥéŕ ţĥé àüţĥöŕîţàţîṽé éđîţîöñ ĥàš ḿöṽéđ šîñçé, ƒŕöḿ ţĥàţ đéŕîṽàţîöñ ŵĥéŕé ţĥé éđîţîöñ çàŕŕîéš öñé, àñđ ƒŕöḿ ţĥé ĥöšţ öţĥéŕŵîšé. À ĶƂƑ ƃüñđļé çàŕŕîéš éàçĥ éđîţîöñ'š đéŕîṽàţîöñ, šö à ƃüñđļé ŕéàđ ƃàçķ ĥöļđš ţĥé ƃàšîš îţ ŵàš ŵŕîţţéñ ŵîţĥ.

À þöšîţîöñ ñàḿéš ţĥàţ çöñţéñţ ţöö. Àñ éđîţ'š start àñđ end, à ŕüñ range, àñđ ţĥé ŕüñ îñđéẋ à path ŵàļķš ţĥŕöüĝĥ àļļ ŕéƒéŕ ţö ţĥé éđîţîöñ àţ ţĥé ŕéṽîšîöñ ţĥé šéñđéŕ ŕéàđ, àñđ ţĥé àþþļîéŕ ḿöṽéš éàçĥ ţĥŕöüĝĥ ţĥé ţéẋţ ţĥé öþéŕàţîöñš ƃéƒöŕé îţ çĥàñĝéđ îñ ţĥé šàḿé éđîţîöñ, îñ ţĥé öŕđéŕ ţĥéý ŵéŕé šéñţ: ţŵö ƒîẋéš kapi check þŕîñţš ƒöŕ đéŕéñţ ŵöŕđš öƒ öñé ƃļöçķ, éàçĥ ĝüàŕđéđ ƃý ţĥé ŕéṽîšîöñ ţĥé çĥéçķ ŕéàđ, ƃöţĥ ļàñđ ŵĥéŕé ţĥéîŕ šéñđéŕ ḿéàñţ. À þöšîţîöñ îñšîđé ţéẋţ àñ éàŕļîéŕ öþéŕàţîöñ ŕéþļàçéđ, öŕ àƒţéŕ à set_content öƒ ţĥé šéǫüéñçé îţ ļîéš îñ, ĥàš ñö þļàçé îñ ţĥé éđîţîöñ àš îţ šţàñđš, àñđ ţĥé öþéŕàţîöñ îš ŕéƒüšéđ àš guard (overlap) ŵîţĥ à ḿéššàĝé ñàḿîñĝ ƃöţĥ öþéŕàţîöñš ƃý ţĥéîŕ þļàçé îñ ţĥé çĥàñĝé šéţ. À find ḿàţçĥéš ţĥé ţéẋţ àš ţĥé éàŕļîéŕ öþéŕàţîöñš ļéƒţ îţ, àñđ àñ àññöţàţîöñ'š àñçĥöŕ ḿàŕķš ţĥàţ ţéẋţ. À find îš þļàçéĥöļđéŕ ţéẋţ, šö ţĥé ţéẋţ à ŕéàđ šĥöŵš çàñ ƃé šéñţ ƃàçķ àš îţ ŕéàđš: àñ îñļîñé çöđé ĥàš žéŕö ŵîđţĥ üñļéšš à <x id="…"/> ţöķéñ ñàḿéš îţ, àñđ à ţöķéñ ḿàţçĥéš öñļý ţĥé çöđé îţ ñàḿéš. À replace_text ţàķéš à path ţö ţĥé þļüŕàļ ƒöŕḿ öŕ šéļéçţ çàšé îţš éđîţš àŕé îñ, öñ ţĥé öþéŕàţîöñ ƒöŕ éṽéŕý éđîţ öŕ öñ àñ éđîţ, ŵĥöšé öŵñ path öṽéŕŕîđéš îţ. Àñ îñ-þŕöçéšš çàļļéŕ ţĥàţ ƃüîļđš éàçĥ öþéŕàţîöñ öñ ţĥé ŕéšüļţ öƒ ţĥé öñé ƃéƒöŕé îţ, àš à ţŕàñšƒöŕḿ'š þàššéš đö, àþþļîéš ţĥéḿ ŵîţĥ BlockEnv.Chained, üñđéŕ ŵĥîçĥ éṽéŕý þöšîţîöñ ŕéàđš ţĥé éđîţîöñ àš ţĥé öþéŕàţîöñš ƃéƒöŕé îţ ļéƒţ îţ.

Ţĥé àþþļîéŕ​

change.ApplyBlock àþþļîéš çöñţéñţ öþéŕàţîöñš ţö öñé ƃļöçķ îñ ḿéḿöŕý àñđ ŕéţüŕñš öñé ŕéšüļţ þéŕ öþéŕàţîöñ. Îţ éñƒöŕçéš ţĥé ŕüļéš éṽéŕý çöñţéñţ öþéŕàţîöñ öƃéýš: þļàçéĥöļđéŕ ţéẋţ îš þàŕšéđ àĝàîñšţ à ŕéƒéŕéñçé çöđé šéţ, îñļîñé çöđéš ķééþ ţĥéîŕ éđîţîñĝ çöñšţŕàîñţš, þļüŕàļ àñđ šéļéçţ šţŕüçţüŕé îš ķéþţ, ŕüñ ƒļàĝš šüŕṽîṽé, àñđ öṽéŕļàýš ƒöļļöŵ ţĥé éđîţ öñ éṽéŕý éđîţîöñ. change.Consequences šàýš ŵĥàţ àñ àþþļîéđ éđîţ đöéš ţö àñ éđîţîöñ'š šţàţüš àñđ öŕîĝîñ, àñđ change.Diff ţüŕñš ţŵö ƃļöçķš îñţö ţĥé öþéŕàţîöñš ƃéţŵééñ ţĥéḿ. Ţĥé àþþļîéŕ ñöţé đéšçŕîƃéš éàçĥ ŕüļé.

Ţĥé šéŕṽîçé​

change.NewService(formats, homes, options…) ƃüîļđš ţĥé šéŕṽîçé.

  • Read ŕéàđš à þàĝé öƒ à đöçüḿéñţ'š ƃļöçķš. Éàçĥ ƃļöçķ çàŕŕîéš ţĥé ŕéƒéŕéñçé ţö çöþý îñţö àñ öþéŕàţîöñ, ţĥé ŕéṽîšîöñ ţö šéñđ àš if_match, ţĥé çöñţéñţ àš þļàçéĥöļđéŕ ţéẋţ, îţš îñļîñé çöđéš ŵîţĥ ţĥéîŕ àţţŕîƃüţéš àñđ ţĥé àţţŕîƃüţéš set_attribute çàñ ŵŕîţé, îţš þļüŕàļš àñđ šéļéçţš ŵîţĥ ţĥé þàţĥ ţö éàçĥ ƃŕàñçĥ, îţš öţĥéŕ éđîţîöñš ŵîţĥ ţĥéîŕ šţàţüš àñđ šţàļéñéšš, éàçĥ öñé'š öŵñ þļüŕàļš àñđ šéļéçţš àñđ îţš çöđéš ŵĥéŕé ţĥéý đéŕ ƒŕöḿ ţĥé ƃļöçķ'š, àñđ ţĥé öþéŕàţîöñš îţ àççéþţš. À ŕéàđ öƒ ţĥé ƒîļé öñé éđîţîöñ ļîṽéš îñ, šüçĥ àš ţĥé Ĝéŕḿàñ ƒîļé öƒ àñ Éñĝļîšĥ þàĝé, šĥöŵš ţĥàţ éđîţîöñ àš éàçĥ ƃļöçķ'š öŵñ, ŵîţĥ ţĥé đöçüḿéñţ'š öŵñ éđîţîöñ àḿöñĝ ţĥé öţĥéŕš, šö à ŕéƒéŕéñçé çöþîéđ ƒŕöḿ îţ éđîţš ţĥé Ĝéŕḿàñ. À þàĝé éñđš ŵîţĥ à çüŕšöŕ; à çüŕšöŕ îñţö à đöçüḿéñţ ţĥàţ çĥàñĝéđ šîñçé îš ŕéƒüšéđ àš stale. À þàĝé öƒ à đöçüḿéñţ à ĥöḿé ķééþš ŵĥöļé àļšö ļîšţš ţĥé ŵŕîţéš ţö îţ ţĥàţ đîđ ñöţ ļàñđ (Page.Divergent, ƒŕöḿ à change.DivergentSession), éàçĥ ŵîţĥ ţĥé ƃļöçķš à ŕéƃàšé ļéƒţ çöñţéšţéđ. ReadEach ŕéàđš éṽéŕý ƃļöçķ öƒ à đöçüḿéñţ îñ öñé þàšš àñđ ĥàñđš éàçĥ ţö à çàļļƃàçķ ƃéšîđé ţĥé ƃļöçķ îţ ŵàš ŕéàđ ƒŕöḿ, ƒöŕ à çöḿḿàñđ ļîñé ţĥàţ šţŕéàḿš à ŵĥöļé đöçüḿéñţ.
  • Apply àþþļîéš à çĥàñĝé šéţ îñ ţŵö þĥàšéš. Îţ çĥéçķš éàçĥ öþéŕàţîöñ'š ƃöđý àš Decode đöéš, šîñçé à šéñđéŕ îñ ţĥé þŕöçéšš ñéṽéŕ þàššéđ ţĥé đéçöđéŕ, àšķš ţĥé þöļîçý àƃöüţ éṽéŕý öþéŕàţîöñ, ĝŕöüþš ţĥé öþéŕàţîöñš ƃý đöçüḿéñţ, àñđ öþéñš éàçĥ đöçüḿéñţ îñ îţš ĥöḿé. Îţ ţĥéñ þŕéþàŕéš éṽéŕý đöçüḿéñţ: ţĥé ĥöḿé ŕéàđš îţ, ţĥé šéŕṽîçé'š éđîţöŕ àþþļîéš ţĥé öþéŕàţîöñš àđđŕéššéđ ţö éàçĥ ƃļöçķ, àñđ ţĥé ĥöḿé šţàĝéš ţĥé ŕéšüļţ. Ţĥé šéŕṽîçé ŕéƒüšéš àñ éđîţîöñ ţĥé šţàĝéđ ƒîļé đöéš ñöţ çĥàñĝé, ƃéçàüšé ţĥé ƒöŕḿàţ ĥàš ñö þļàçé ƒöŕ îţ ţĥéŕé, àñđ ŕüñš ţĥé çöḿḿîţ çĥéçķ öṽéŕ éṽéŕý çĥàñĝéđ éđîţîöñ. ΃ àñý öþéŕàţîöñ öƒ àñý đöçüḿéñţ îš ŕéƒüšéđ, ñöţĥîñĝ îš ŵŕîţţéñ: ţĥé ŕéƒüšéđ öþéŕàţîöñš šàý ŵĥý àñđ éṽéŕý öţĥéŕ öñé îš not_applied. Öţĥéŕŵîšé ţĥé šéŕṽîçé ţàķéš ţĥé çöḿḿîţ ļöçķš, šéţţļéš éàçĥ đöçüḿéñţ, àñđ çĥéçķš àĝàîñ àñý đöçüḿéñţ îţš ĥöḿé àþþļîéđ à šéçöñđ ţîḿé, šîñçé ţĥàţ þàšš îš ţĥé öñé ţĥàţ ļàñđš. Îţ ţĥéñ çöḿḿîţš éàçĥ đöçüḿéñţ àñđ, ŵîţĥ ţĥé ļöçķš šţîļļ ĥéļđ, àþþļîéš ţĥé đéçîšîöñš àñđ àššéţ öþéŕàţîöñš, ŵĥîçĥ ƃîñđ ţö ţĥé çöñţéñţ ţĥàţ ļàñđéđ, àñđ ŕéçöŕđš ţĥé çĥàñĝé.
  • Describe šàýš ŵĥàţ à ƒöŕḿàţ šüþþöŕţš. DescribeFormat ĥàñđš FormatOps ţĥé öþéŕàţîöñš ţĥé ƒöŕḿàţ'š ŕöüñđ ţŕîþ çàŕŕîéš (set_content îñ éîţĥéŕ ƒöŕḿ, replace_text, àñđ remove_edition ŵĥéŕé ţĥé ƒöŕḿàţ ĥöļđš îţš éđîţîöñš îñ öñé ƒîļé, öŕ ķééþš éàçĥ îñ à ƒîļé öƒ îţš öŵñ àñđ îţš ŵŕîţéŕ ŕéḿöṽéš à ƃļöçķ ţĥéŕé) àñđ ŵĥàţ îţš ŵŕîţéŕ đéçļàŕéš (É-02), insert_block àñđ delete_block àḿöñĝ îţ ŵĥéŕé ţĥé ŵŕîţéŕ çàñ àđđ àñđ ŕéḿöṽé ƃļöçķš. Ƒöŕ à đöçüḿéñţ ţĥé đéçļàŕàţîöñ îš ţĥé öñé îţš ĥöḿé ŕéþöŕţš ƒöŕ ţĥé đöçüḿéñţ'š ŵŕîţéŕ (DocInfo.Capabilities), ŵĥîçĥ ApplyBlock àþþļîéš éṽéŕý öþéŕàţîöñ ŵîţĥ, ļéšš ţĥé šţŕüçţüŕàļ öþéŕàţîöñš îţš ĥöḿé çàññöţ ŵŕîţé ţĥéŕé. WithDescriber ŕéþļàçéš DescribeFormat, àñđ ţĥàţ öñé ƒüñçţîöñ îš ŵĥàţ Describe ŕéþöŕţš, ŵĥàţ à ŕéàđ ļîšţš þéŕ ƃļöçķ, àñđ ŵĥàţ Apply ŕéƒüšéš öüţšîđé öƒ.
  • History ļîšţš ţĥé ŕéçöŕđéđ çĥàñĝéš ţö öñé éđîţîöñ, ḿöšţ ŕéçéñţ ƒîŕšţ, ƃéšîđé ţĥé ŕéṽîšîöñ ţĥé éđîţîöñ ĥöļđš ñöŵ. Îţ ŕéàđš ţĥé ƃļöçķ ƒŕöḿ îţš ĥöḿé, šö à ŕéƒéŕéñçé ŕéšöļṽéš àš à ŕéàđ ŕéšöļṽéš îţ, àñđ àšķš ţĥé EditionHistories ĥööķ ƒöŕ ţĥé çĥàñĝéš: éàçĥ ŵîţĥ îţš ŕéçöŕđ, ţĥé ŕéṽîšîöñš àŕöüñđ îţ, ţĥé ƃàšîš à đéŕîṽéđ éđîţîöñ ŵàš ḿàđé ƒŕöḿ, ŵĥö ḿàđé îţ (ñüļļ ŵĥéñ ñöƃöđý ķñöŵš, àš ƒöŕ àñ éđîţ ḿàđé öüţšîđé ķàþî), ţĥŕöüĝĥ ŵĥîçĥ šüŕƒàçé, àñđ ŵĥéñ.

À đöçüḿéñţ'š éđîţîöñ ļîṽéš îñ ţĥé đöçüḿéñţ (îţš öŵñ éđîţîöñ, öŕ öñé à ƃîļîñĝüàļ ƒîļé ĥöļđš), îñ à ƒîļé öƒ îţš öŵñ (à þŕöĵéçţ'š ţàŕĝéţ ƒîļé), öŕ ñöŵĥéŕé (à ḿöñöļîñĝüàļ đöçüḿéñţ öüţšîđé à þŕöĵéçţ, öŕ àñ éđîţîöñ ŵîţĥ à ţöñé öŕ à çĥàññéļ îñ à ƃîļîñĝüàļ ƒîļé, ŵĥîçĥ ķééþš öñé ţŕàñšļàţîöñ þéŕ ļàñĝüàĝé). Àñ öþéŕàţîöñ öñ àñ éđîţîöñ ŵîţĥ ñö ĥöḿé îš ŕéƒüšéđ àš unsupported.

Àđđîñĝ àñđ ŕéḿöṽîñĝ ƃļöçķš​

insert_block àñđ delete_block çĥàñĝé ŵĥîçĥ ƃļöçķš à đöçüḿéñţ ĥöļđš. À ŵŕîţéŕ ŕéþļàýš à šķéļéţöñ ŵîţĥ à šļöţ ƒöŕ éṽéŕý ƃļöçķ îţš ŕéàđéŕ ŕéàđ àñđ ñöñé ƒöŕ à ñéŵ öñé, šö ţĥéšé ţŵö àŕé ŵŕîţţéñ ƃý ţĥé ƒöŕḿàţ: ţĥé šéŕṽîçé ĥàñđš ţĥéḿ ţö ţĥé ĥöḿé, àñđ ţĥé ƒöŕḿàţ'š ŵŕîţéŕ ŵŕîţéš ţĥé šĥéļļ öƒ éàçĥ ƃļöçķ àđđéđ öŕ ŕéḿöṽéđ. À ŵŕîţéŕ đéçļàŕéš ţĥé öþéŕàţîöñš îţ ŵŕîţéš àñđ ŵŕîţéš ţĥéḿ ţĥŕöüĝĥ format.StructureEditor. Describe ŕéþöŕţš ţĥéḿ ŵĥéŕé à ŵŕîţéŕ đéçļàŕéš ţĥéḿ, àñđ éṽéŕý öţĥéŕ ƒöŕḿàţ ŕéƒüšéš ţĥéḿ àš unsupported. Ţĥé ĴŠÖÑ, ÝÀḾĻ àñđ ÀŔƂ ŵŕîţéŕš đéçļàŕé ƃöţĥ: îñ à ķéý-ṽàļüé çàţàļöĝ à ƃļöçķ'š šĥéļļ îš îţš ķéý àñđ ţĥé ṽàļüé ƃéšîđé îţ. À ŵŕîţéŕ'š đéçļàŕàţîöñ çàñ đéþéñđ öñ îţš çöñƒîĝüŕàţîöñ, šö đéšçŕîƃîñĝ à đöçüḿéñţ ŕéþöŕţš ţĥé öþéŕàţîöñš îţš ĥöḿé çàñ ŵŕîţé îñ ţĥàţ đöçüḿéñţ (StructuralSession), àñđ à ŕéàđ'š þéŕ-ƃļöçķ öþéŕàţîöñš àñđ Apply ƒöļļöŵ ţĥé šàḿé ļîšţ.

  • delete_block àđđŕéššéš à ƃļöçķ àñđ çàŕŕîéš if_match àš à ḿàþ ƒŕöḿ éđîţîöñ ţö ŕéṽîšîöñ. Ţĥé ḿàþ ñàḿéš ţĥé ƃļöçķ'š öŵñ éđîţîöñ, àñđ ḿàý ñàḿé àñý öţĥéŕ éđîţîöñ îţš šéñđéŕ ŕéàđ. À ḿàþ ŵîţĥöüţ ţĥé öŵñ éđîţîöñ îš invalid; àñ éđîţîöñ ñàḿéđ àţ àñöţĥéŕ ŕéṽîšîöñ îš stale, ŵîţĥ ţĥé éđîţîöñ àš îţ šţàñđš, àñđ šö îš àñ éđîţîöñ ţĥé ḿàþ ñàḿéš àñđ ţĥé ƃļöçķ ļàçķš. Ţĥé ƃļöçķ ĝöéš ŵîţĥ éṽéŕý éđîţîöñ îţ ĥöļđš, îţš öŵñ àñđ éàçĥ ţŕàñšļàţîöñ îñ à ƒîļé öƒ îţš öŵñ, ŵĥéţĥéŕ ţĥé ḿàþ ñàḿéš îţ öŕ ñöţ.
  • insert_block ñàḿéš ţĥé đöçüḿéñţ, ţĥé ñéŵ ƃļöçķ'š ķéý (name), ţĥé ķéý îţ ĝöéš after öŕ before, àñđ ţĥé çöñţéñţ öƒ éàçĥ éđîţîöñ. Ţĥé ñéŵ ƃļöçķ ĝöéš îñ ţĥé öƃĵéçţ öŕ ḿàþþîñĝ îţš ķéý þàţĥ ñàḿéš, ƃéšîđé îţš àñçĥöŕ öŕ, ŵîţĥ ñéîţĥéŕ, ļàšţ ţĥéŕé. Ţĥé đöçüḿéñţ'š öŵñ éđîţîöñ îš ŕéǫüîŕéđ, àñđ àñý öţĥéŕ ḿüšţ ļîṽé îñ à ƒîļé öƒ îţš öŵñ. À ķéý à ƃļöçķ àļŕéàđý àñšŵéŕš ţö îš stale, à ñéîĝĥƃöüŕ ñö ƃļöçķ àñšŵéŕš ţö îš not_found, àñđ ţĥé çöñţéñţ öƃéýš ţĥé ŕüļéš öƒ éṽéŕý çöñţéñţ öþéŕàţîöñ: à ñéŵ ƃļöçķ ĥàš ñö îñļîñé çöđéš ţö ñàḿé, šö ţéẋţ ŵîţĥ à çöđé þļàçéĥöļđéŕ îš à guard ŕéƒüšàļ.

Öþéŕàţîöñš àþþļý îñ öŕđéŕ, àñđ éàçĥ šééš ŵĥàţ ţĥé öñéš ƃéƒöŕé îţ ļéƒţ: à ƃļöçķ çàñ ĝö ƃéšîđé öñé àñ éàŕļîéŕ öþéŕàţîöñ àđđéđ, àñđ à ƃļöçķ îš ŕéþļàçéđ îñ îţš þļàçé ƃý àđđîñĝ ţĥé ñéŵ öñé ƃéšîđé îţ àñđ ţĥéñ ŕéḿöṽîñĝ ţĥé öļđ. Àñ öþéŕàţîöñ ţĥàţ çĥàñĝéš ţĥé çöñţéñţ öƒ à ƃļöçķ ţĥé çĥàñĝé šéţ àđđš öŕ ŕéḿöṽéš îš ŕéƒüšéđ àš invalid; à ñéŵ ƃļöçķ'š çöñţéñţ ţŕàṽéļš îñ îţš editions.

À ĥöḿé ŵŕîţéš ţĥé šţŕüçţüŕàļ éđîţš ƒîŕšţ àñđ ţĥéñ àþþļîéš ţĥé ŕéšţ öƒ ţĥé çĥàñĝé šéţ ţö ŵĥàţ ţĥé ŵŕîţéŕ ŵŕöţé. À ñéŵ ƃļöçķ'š çöñţéñţ îš ţĥéŕéƒöŕé ŵĥàţ ţĥé ƒöŕḿàţ ŕéàđš ƃàçķ (àñ ÎÇÜ àŕĝüḿéñţ îñ àñ ÀŔƂ ḿéššàĝé ŕéàđš àš ţĥé þŕöţéçţéđ çöđé îţ îš), àñđ ţĥé ŕéšüļţ'š after îš ţĥé ŕéṽîšîöñ à ļàţéŕ ŕéàđ ŕéþöŕţš. À ñéŵ ƃļöçķ ţĥé ƒöŕḿàţ ŕéàđš đéŕéñţļý ƒŕöḿ îţš çöñţéñţ, öŕ đöéš ñöţ ŕéàđ àţ àļļ, àñđ à ŕéḿöṽéđ ƃļöçķ îţ šţîļļ ŕéàđš, àŕé ŕéƒüšéđ àš unsupported. Ţĥé çöḿḿîţ çĥéçķ šééš éàçĥ ñéŵ éđîţîöñ àš çŕéàţéđ, àñđ ţĥé ŕéçöŕđ ĥöļđš éṽéŕý éđîţîöñ àđđéđ öŕ ŕéḿöṽéđ.

Ĥöḿéš​

À ĥöḿé ĥöļđš ţĥé ţéẋţ öƒ đöçüḿéñţš àñđ đéçîđéš ŵĥéñ ţŵö ŵŕîţéŕš çöñƒļîçţ.

type Home interface {
Name() string
Open(ctx context.Context, doc string) (Session, error)
}

Name îš ţĥé ĥöḿé àš à ŕéšüļţ ŕéþöŕţš îţ: file, workspace öŕ stream:<id>. À šéššîöñ ŕéàđš ţĥé đöçüḿéñţ àţ îţš ĥéàđ, šţàĝéš à çĥàñĝé ƃý ŕüññîñĝ ţĥé šéŕṽîçé'š éđîţöŕ öṽéŕ îţš ƃļöçķš, àñđ ĥàñđš ƃàçķ à šţàĝéđ çĥàñĝé ţĥàţ ñàḿéš ţĥé çöḿḿîţ ļöçķš îţ ñééđš, šéţţļéš (ḿàķéš šüŕé ţĥé çĥàñĝé šţîļļ àþþļîéš ŵîţĥ ţĥöšé ļöçķš ĥéļđ), çöḿḿîţš àñđ ŕéļéàšéš. À ĥöḿé ţĥàţ ŕéàđš à đöçüḿéñţ ŵĥöļé šţŕéàḿš éṽéŕý ƃļöçķ þàšţ ţĥé éđîţöŕ; öñé ţĥàţ ķééþš ŕöŵš ļööķš üþ öñļý ţĥé ƃļöçķš ţĥé çĥàñĝé ñàḿéš. Ţĥé šéŕṽîçé ţàķéš ţĥé ļöçķš öƒ éṽéŕý đöçüḿéñţ öƒ à çĥàñĝé šéţ îñ öñé öŕđéŕ, ƃý ţĥéîŕ ķéýš, šö ţŵö çĥàñĝé šéţš ţàķé ţĥé ļöçķš ţĥéý šĥàŕé îñ ţĥàţ öŕđéŕ àñđ ŵàîţ ƒöŕ éàçĥ öţĥéŕ ŵîţĥöüţ đéàđļöçķ. À çĥàñĝé šéţ ţĥàţ ñàḿéš öñé ƒîļé ţĥŕöüĝĥ ţŵö đöçüḿéñţš, šüçĥ àš ţŵö ḿéḿƃéŕš öƒ öñé àŕçĥîṽé öŕ à ƒîļé àñđ à ļîñķ ţö îţ, îš ŕéƒüšéđ àš invalid, ƃéçàüšé éàçĥ đöçüḿéñţ ŵöüļđ šţàĝé ţĥé ŵĥöļé ƒîļé ƒŕöḿ ŵĥàţ îţ ŕéàđ.

changetest.Run îš ţĥé çöñƒöŕḿàñçé šüîţé éṽéŕý ĥöḿé þàššéš: àñ éđîţ ļàñđš àñđ ŕéàđš ƃàçķ, à ŕéþļàýéđ çĥàñĝé šéţ îš šţàļé àñđ çàŕŕîéš ţĥé çüŕŕéñţ çöñţéñţ ŵĥîļé ŵŕîţîñĝ ñöţĥîñĝ, éđîţš ţö đéŕéñţ ƃļöçķš çöḿḿüţé, àļšö ŵĥéñ öñé ļàñđš ƃéţŵééñ ţĥé öţĥéŕ'š šţàĝé àñđ çöḿḿîţ, à ŕéƒüšàļ îñ öñé đöçüḿéñţ ļéàṽéš éṽéŕý đöçüḿéñţ àš îţ ŵàš, ŵĥéţĥéŕ îţ îš ƒöüñđ àţ ţĥé šţàĝé öŕ àţ ţĥé çöḿḿîţ, à þŕéṽîéŵ ŵŕîţéš ñöţĥîñĝ, à ḿîššîñĝ ƃļöçķ îš ñöţ ƒöüñđ, ţĥé šàḿé çöñţéñţ šàîđ àĝàîñ îš üñçĥàñĝéđ, à ƒîļé ķééþš îţš ḿöđé, à ŕéḿöṽéđ ţŕàñšļàţîöñ ŕéàđš ƃàçķ àƃšéñţ ŵĥîļé à ŕéþļàý öƒ îţš ŕéḿöṽàļ îš šţàļé àñđ ŵŕîţéš ñöţĥîñĝ àñđ à set_content çŕéàţéš îţ àĝàîñ, àñđ à çĥàñĝé šéţ ŵîţĥ ñö öþéŕàţîöñ àþþļîéš àñđ ŵŕîţéš ñöţĥîñĝ. Éàçĥ ĥöḿé ŕüñš ţĥé ŕéḿöṽàļ öñ éàçĥ ķîñđ öƒ ţŕàñšļàţîöñ îţ ĥöļđš: ţĥé šţŕéàḿ'š öŵñ ŕöŵš; ƒöŕ ţĥé ƒîļé ĥöḿé à ÞÖ çàţàļöĝ àñđ à ĴŠÖÑ ƒîļé'š ţŕàñšļàţîöñ îñ à ƒîļé öƒ îţš öŵñ; ƒöŕ ţĥé þŕöĵéçţ ĥöḿéš ţĥé çàţàļöĝ à ÞÖ šöüŕçé'š ţàŕĝéţ ţéḿþļàţé ñàḿéš (po/fr.po ƃéšîđé po/en.po) àñđ ţĥé ĴŠÖÑ ƒîļé à ĴŠÖÑ šöüŕçé'š ñàḿéš; àñđ ƒöŕ ţĥé ŵöŕķšþàçé ĥöḿé ţĥé Ƒŕéñçĥ öƒ à ÞÖ çàţàļöĝ àñđ öƒ à ĴŠÖÑ ƒîļé, ŵĥîçĥ îţ ķééþš ŵĥîļé ţĥéîŕ ƒîļéš đö ñöţ éẋîšţ. Ŵĥéŕé ţĥé ţŕàñšļàţîöñ ļîṽéš àþàŕţ ƒŕöḿ îţš šöüŕçé, ţĥé šüîţé àļšö çĥéçķš ţĥàţ ţĥé ŕéḿöṽàļ îš ŵŕîţţéñ ţĥéŕé àñđ ţĥé šöüŕçé ķééþš îţš ƃýţéš.

Ţĥé ƒîļé ĥöḿé (core/change/filehome) ķééþš éàçĥ đöçüḿéñţ àš à ƒîļé. À šţàĝé ŕéàđš ţĥé đöçüḿéñţ ţĥŕöüĝĥ îţš ƒöŕḿàţ'š ŕéàđéŕ ŵîţĥ ţĥé ŵŕîţéŕ'š šķéļéţöñ šţöŕé ŵîŕéđ, àñđ ŵŕîţéš ţĥé ŕéšüļţ ţĥŕöüĝĥ ţĥé šàḿé ƒöŕḿàţ'š ŵŕîţéŕ îñţö à ţéḿþöŕàŕý ƒîļé ƃéšîđé ţĥé đöçüḿéñţ ŵîţĥ ţĥé đöçüḿéñţ'š ḿöđé. Éṽéŕý ƒîļé à šţàĝé ŕéàđš îš ĥàšĥéđ ƃéƒöŕé îţ îš ŕéàđ. À çöḿḿîţ ţàķéš ţĥé àđṽîšöŕý ļöçķ (core/storage/filelock) öƒ éàçĥ ƒîļé, ĥàšĥéš ţĥé ƒîļéš àĝàîñ, àñđ ŕéñàḿéš ţĥé šţàĝéđ ƒîļéš öñţö ţĥéḿ ŵĥéñ éàçĥ îš šţîļļ ŵĥàţ ţĥé šţàĝé ŕéàđ. Ŵĥéñ öñé ḿöṽéđ, ţĥé ĥöḿé ŕéàđš ţĥéḿ àĝàîñ üñđéŕ ţĥé ļöçķš, àþþļîéš ţĥé çĥàñĝé öñçé ḿöŕé àñđ ŕéñàḿéš ţĥàţ ŕéšüļţ; àñ öþéŕàţîöñ ŵĥöšé if_match ţĥé ñéŵ çöñţéñţ ƃŕéàķš îš ŕéƒüšéđ àš stale, àñđ à ƒîļé ţĥàţ ḿöṽéš đüŕîñĝ ţĥàţ šéçöñđ þàšš àš ŵéļļ îš doc_changed. Ţŵö þŕöçéššéš ţĥàţ éđîţ đéŕéñţ ƃļöçķš öƒ öñé ƒîļé ƃöţĥ ļàñđ. Àñ éđîţîöñ ķéþţ îñ à ƒîļé öƒ îţš öŵñ îš ŵŕîţţéñ ţĥŕöüĝĥ ţĥàţ ƒîļé'š šķéļéţöñ, šö ţĥé ƒîļé îš ñéṽéŕ ŕéŵŕîţţéñ ƒŕöḿ ţĥé đöçüḿéñţ; à ƒîļé ţĥàţ đöéš ñöţ éẋîšţ ýéţ îš ŵŕîţţéñ ƒŕöḿ ţĥé đöçüḿéñţ'š šķéļéţöñ. À ţŕàñšļàţîöñ çŕéàţéđ ƒöŕ à ƃļöçķ ţĥé ƒîļé đöéš ñöţ ĥöļđ àŕŕîṽéš, îñ à ƒîļé îñ îţš öŵñ ļàñĝüàĝé, ŵîţĥ à ƃļöçķ öƒ îţš öŵñ ţĥàţ ţĥé ƒöŕḿàţ'š ŵŕîţéŕ àđđš ƃéšîđé ţĥé ƃļöçķ îţ šîţš ƃý îñ ţĥé đöçüḿéñţ, üñđéŕ ţĥé ķéý ţĥé ƒîļé ĝîṽéš îţš ķéýš; îñ à ƃîļîñĝüàļ ƒîļé, öŕ ŵĥéŕé ţĥé ŵŕîţéŕ àđđš ñö ƃļöçķ, ţĥé éđîţ îš ŕéƒüšéđ. À çĥàñĝé šéţ ţĥàţ àđđš öŕ ŕéḿöṽéš ƃļöçķš ĥàš ţĥé ƒöŕḿàţ'š ŵŕîţéŕ ŵŕîţé ţĥöšé éđîţš îñţö ţĥé đöçüḿéñţ'š ƒîļé àñđ îñţö ţĥé ƒîļé öƒ éàçĥ éđîţîöñ ţĥé ƃļöçķš ĥöļđ öŕ ñàḿé, ķééþîñĝ ţĥéḿ îñ ḿéḿöŕý üñţîļ ţĥé çöḿḿîţ, àñđ ţĥé šţàĝé'š þàšš ŕéàđš ţĥé ŕéšüļţ. À šţàĝé ţĥàţ ŕéḿöṽéš à ţŕàñšļàţîöñ à ƃîļîñĝüàļ ƒîļé ĥöļđš, ţĥé đöçüḿéñţ'š öŵñ öŕ ţĥé ţŕàñšļàţîöñ'š ƒîļé ţĥé ţàŕĝéţ ţéḿþļàţé ñàḿéš, ŕéàđš îţš ŵŕîţé ƃàçķ, àñđ ŕéƒüšéš ţĥé ŕéḿöṽàļ àš unsupported ŵĥéñ ţĥé ţŕàñšļàţîöñ îš šţîļļ ţĥéŕé: ţĥé ẊĻÎƑƑ àñđ ŢḾẊ ŵŕîţéŕš ŵŕîţé à ţŕàñšļàţîöñ öƒ éṽéŕý üñîţ, ƒŕöḿ ţĥé šöüŕçé ŵĥéŕé à ƃļöçķ ĥöļđš ñöñé, šö à ŕéḿöṽàļ ţĥéŕé ŵöüļđ þüţ ţĥé šöüŕçé îñ ţĥé ţŕàñšļàţîöñ'š þļàçé. Ţĥéîŕ đéšçŕîþţîöñ ļîšţš remove_edition, ŵĥîçĥ ţĥé šţàĝé ţĥéñ ŕéƒüšéš. Ţĥé ŕéàđ-ƃàçķ ƃéļöñĝš ţö à çĥàñĝé šéţ'š šţàĝé: à ƒļöŵ ţĥàţ ŵŕîţéš à ţŕàñšļàţîöñ'š ƒîļé ţĥŕöüĝĥ ţĥé ŵŕîţéŕ, šüçĥ àš kapi exec remove-target ŵŕîţîñĝ fr/a.xlf, ĝéţš ŵĥàţ ţĥé ŵŕîţéŕ ŵŕîţéš, ţĥé šöüŕçé îñ ţĥé ŕéḿöṽéđ ţŕàñšļàţîöñ'š þļàçé. À ţŕàñšļàţîöñ ķéþţ îñ à ƒîļé îñ îţš öŵñ ļàñĝüàĝé îš à ƃļöçķ öƒ ţĥàţ ƒîļé, šö à ŕéḿöṽàļ ţàķéš ţĥé ƃļöçķ öüţ öƒ ţĥé ƒîļé ţĥŕöüĝĥ ţĥé ƒöŕḿàţ'š ŵŕîţéŕ (format.StructureEditor), àš delete_block ţàķéš à ƃļöçķ öüţ öƒ àñ éđîţîöñ'š ƒîļé: ţĥé ĴŠÖÑ, ÝÀḾĻ àñđ ÀŔƂ ŵŕîţéŕš ŕéḿöṽé à ķéý ŵîţĥ ţĥé çöḿḿéñţ öŕ ḿéţàđàţà ƃéšîđé îţ. À ƒöŕḿàţ ŵĥöšé ŵŕîţéŕ ŕéḿöṽéš ñö ƃļöçķ, šüçĥ àš Ḿàŕķđöŵñ öŕ ĤŢḾĻ, đöéš ñöţ ļîšţ remove_edition, àñđ à ŕéḿöṽàļ ţĥéŕé îš ŕéƒüšéđ àš unsupported. À ĥöḿé ñéṽéŕ đéļéţéš à ƒîļé: à ţŕàñšļàţîöñ'š ƒîļé ŵĥöšé ļàšţ ƃļöçķ îš ŕéḿöṽéđ ķééþš ŵĥàţ ţĥé ƒöŕḿàţ ŵŕîţéš ƒöŕ ñö ƃļöçķ ({} ƒöŕ ĴŠÖÑ). À ŕéḿöṽàļ öŕ à çŕéàţîöñ ţĥé ŵŕîţéŕ çàññöţ ḿàķé îñ à ţŕàñšļàţîöñ'š ƒîļé, šüçĥ àš à ÝÀḾĻ šéǫüéñçé îţéḿ'š, ŕéƒüšéš ţĥàţ öþéŕàţîöñ àļöñé, àñđ ţĥé öţĥéŕ öþéŕàţîöñš öƒ ţĥé çĥàñĝé šéţ àŕé not_applied, ƃļöçķéđ ƃý îţ. Ŵĥéŕé ţĥé ŕéàđéŕ àñđ ţĥé ŵŕîţéŕ ƃöţĥ šţŕéàḿ àñđ ñö ƃļöçķ îš àđđéđ öŕ ŕéḿöṽéđ, ţĥé đöçüḿéñţ îš ñéṽéŕ ĥéļđ ŵĥöļé. Ţĥé ĥöḿé ŕéþöŕţš ŵĥàţ ţĥé đöçüḿéñţ'š ŵŕîţéŕ đéçļàŕéš: àñ îñ-þŕöçéšš ŵŕîţéŕ'š đéçļàŕàţîöñ, ŵîţĥ ţĥé ŵŕîţéŕ šþéļļîñĝ à çĥàñĝéđ àţţŕîƃüţé öŕ à ñéŵ çöđé îţšéļƒ (change.WriterCapabilities), öŕ à þļüĝîñ ƒöŕḿàţ'š ḿàñîƒéšţ đéçļàŕàţîöñ, ŵĥöšé ŵŕîţéŕ šþéļļš ţĥéḿ ŵĥéñ îţ ŵŕîţéš (change.DeclaredCapabilities). À ĥöḿé ĝîṽéñ à ƃàçķüþ šüƒƒîẋ çöþîéš éàçĥ ƒîļé à çöḿḿîţ ŕéþļàçéš ƃéšîđé îţ, üñđéŕ ţĥé ļöçķ, ƒŕöḿ ţĥé ƃýţéš ţĥé çĥàñĝé ŵàš àþþļîéđ ţö. Ţĥé îḿþļéḿéñţàţîöñ ñöţé Ţĥé ƒîļé ĥöḿé ĥàš ţĥé đéţàîļš.

Ţĥé ŵöŕķšþàçé ĥöḿé (core/workhome) ķééþš ţĥé éđîţîöñš ţĥàţ ĥàṽé ñö ƒîļé ýéţ: à ĥéļđ-ƃàçķ ļöçàļé'š đŕàƒţš àñđ ţĥé éđîţš ḿàđé ţö ţĥéḿ (Ç-03). Šüçĥ àñ éđîţîöñ ƃéļöñĝš ţö à đöçüḿéñţ ŵĥöšé öŵñ éđîţîöñ îš à ƒîļé, šö ţĥé ƒîļé ĥöḿé ŕéàçĥéš îţ: ţĥé ļàýöüţ ñàḿéš ţĥé ƒîļé ţĥé éđîţîöñ ŵîļļ ƃé đéļîṽéŕéđ ţö, àñđ à ķééþéŕ (filehome.Keeper) ţĥàţ ĥöļđš îţ üñţîļ ţĥéñ. À ŕéàđ ĵöîñš ţĥé ķéþţ éđîţîöñ ţö ţĥé đöçüḿéñţ'š ƃļöçķš ƃý ƃļöçķ ķéý, ŵîţĥ ţĥé šţàţüš àñđ öŕîĝîñ ţĥé ŵöŕķšþàçé ĥöḿé ķééþš ƃéšîđé îţš ŕüñš, àñđ ŕéþöŕţš ţĥé ŵöŕķšþàçé ĥöḿé àš îţš ĥöḿé (change.Place.Home, Page.Home). À šţàĝé ĥàñđš ţĥé éđîţîöñš ţĥé éđîţöŕ çĥàñĝéđ ţö ţĥé ķééþéŕ, ţĥé çöḿḿîţ ļöçķ îš ţĥé ļöçķ öƒ ţĥé ƒîļé ţĥé éđîţîöñ ŵîļļ ƃé đéļîṽéŕéđ ţö, àñđ ţĥé çöḿḿîţ àþþéñđš ţĥé çĥàñĝé'š ŕéçöŕđ öñļý ŵĥîļé ţĥé éđîţîöñ'š ĥéàđ îñ ţĥé ļöĝ îš šţîļļ ţĥé öñé ţĥé šţàĝé ŕéàđ (workspace.Backend.RecordIf); à ĥéàđ ţĥàţ ḿöṽéđ îñ ƃéţŵééñ ḿàķéš ţĥé šţàĝé ŕéàđ àñđ àþþļý àĝàîñ, àš à ḿöṽéđ ƒîļé đöéš, àñđ à ĥéàđ ţĥàţ ḿöṽéš àƒţéŕ ţĥé šţàĝé šéţţļéđ ŕéƒüšéš ţĥé çĥàñĝé šéţ doc_changed ŵîţĥ ñöţĥîñĝ ļàñđéđ. Ţĥé ŕéçöŕđ îš ţĥé çöḿḿîţ: change.RecordingStaged ĥàñđš ţĥé šţàĝéđ çĥàñĝé ţĥé ŕéçöŕđ öƒ îţš đöçüḿéñţ ƃéƒöŕé Commit, ţĥé ŕéšüļţ ñàḿéš ţĥé ŵöŕķšþàçé ĥöḿé ƒöŕ ţĥàţ éđîţîöñ (StagedFile.Home), àñđ ţĥé šéŕṽîçé'š ŕéçöŕđéŕ ŕéçöŕđš ñöţĥîñĝ ḿöŕé ƒöŕ îţ (StagedFile.Recorded). Ţĥé çöñƒöŕḿàñçé šüîţé ŕüñš öñ ţĥé ŵöŕķšþàçé ĥöḿé ŵîţĥ ţĥé éđîţîöñ ƒîļéš öƒ à ĥéļđ-ƃàçķ ļöçàļé àš îţš đöçüḿéñţš, àñđ ŕéḿöṽéš ţĥé Ƒŕéñçĥ îţ ķééþš öƒ à ÞÖ çàţàļöĝ àñđ öƒ à ĴŠÖÑ ƒîļé. À ŕéḿöṽàļ đŕöþš ţĥé ķéþţ ƃļöçķ, ƒöŕ ţĥé ƒöŕḿàţš ŵĥöšé đéšçŕîþţîöñ ļîšţš remove_edition, àš îţ ŵöüļđ ļéàṽé ţĥé ƒîļé ţĥé ţŕàñšļàţîöñ ŵîļļ ƃé đéļîṽéŕéđ ţö. Ţĥé ŕéçîþé þîçķš ţĥé ĥöḿé öƒ à ţŕàñšļàţîöñ ŵĥöšé ƒîļé đöéš ñöţ éẋîšţ: üñđéŕ materialize: on-converge îţ îš ţĥé ŵöŕķšþàçé ĥöḿé, ŵĥéţĥéŕ öŕ ñöţ ţĥé ŵöŕķšþàçé ĥöļđš àñýţĥîñĝ öƒ îţ ýéţ, àñđ üñđéŕ manual îţ îš ţĥé ƒîļé, üñļéšš ţĥé ŵöŕķšþàçé šţîļļ ķééþš à đŕàƒţ öƒ îţ. À þŕöĵéçţ ţĥàţ đéçļàŕéš ŕéđàçţîöñ ŕéçöŕđš à ķéþţ éđîţîöñ ŕéđàçţéđ àñđ ŕéàđš îţ ƃàçķ ƒŕöḿ ţĥé ṽàüļţ (Ç-03).

À šţŕéàḿ ĥöḿé ķééþš ţĥé đöçüḿéñţš öƒ öñé šţŕéàḿ öƒ à šéŕṽéŕ'š þŕöĵéçţ àš ŕöŵš, öñé þéŕ ƃļöçķ, éàçĥ ĥöļđîñĝ éṽéŕý éđîţîöñ öƒ îţš ƃļöçķ. Îţš çöḿḿîţ ļöçķ îš ţĥé ŕöŵš à šţàĝé ŕéàđ, ĥéļđ öñ öñé đàţàƃàšé ţŕàñšàçţîöñ ƒöŕ éṽéŕý đöçüḿéñţ öƒ ţĥé çĥàñĝé šéţ; à šéţţļé àþþļîéš ţĥé öþéŕàţîöñš àĝàîñ ţö ŕöŵš ţĥàţ ḿöṽéđ, àñđ ţĥé çöḿḿîţ šţöŕéš ţĥéḿ ŵîţĥ ţĥéîŕ ĥîšţöŕý àñđ çöḿḿîţš ţĥé ţŕàñšàçţîöñ, šö ţĥé çĥàñĝé šéţ ļàñđš ŵĥöļé öŕ ñöţ àţ àļļ. À ŕéšüļţ ñàḿéš îţ stream:<id>.

Ŵĥîļé à ŵŕîţé ţĥàţ đîđ ñöţ ļàñđ šţîļļ ñàḿéš à ķéþţ ƃļöçķ (à çöñƒļîçţ ţŵö ḿàçĥîñéš' ļöĝš ļéƒţ), ţĥé ƒîļé ĥöḿé'š šéššîöñ àñšŵéŕš Contested ƒöŕ îţ (change.ContestedSession). À þéŕšöñ'š öŕ àñ àĝéñţ'š öþéŕàţîöñ ţĥàţ ļéàṽéš ţĥàţ ƃļöçķ àš îţ šţàñđš îš ţĥéñ ŕéþöŕţéđ unchanged àñđ šţîļļ ŕéçöŕđéđ, àš ţĥé đéçîšîöñ ţö ķééþ ţĥé ŵöŕđîñĝ ţĥé ĥéàđ ĥöļđš, šö éṽéŕý ŵàý öƒ đéçîđîñĝ à çöñƒļîçţ îš à çĥàñĝé šéţ ŵîţĥ if_match ļîķé àñý öţĥéŕ.

Ţĥé ŵöŕķšþàçé ĥöḿé àļšö šéŕṽéš ŵĥöļé đöçüḿéñţš (workhome.Documents): à ñàţîṽé đöçüḿéñţ öþéñéđ ƒöŕ éđîţîñĝ ţĥàţ ĥàš ñö ƒîļé, ķéþţ àš à ƃļöƃ îñ ţĥé ļöĝ ŵîţĥ îţš ĥéàđ îñ document_head. À ĶÞŽ'š šöüŕçéš àŕé îţš đöçüḿéñţš, ñàḿéđ work.kpz!guide.md; ţĥé ķàþî ĥöšţ ŕöüţéš šüçĥ à ŕéƒéŕéñçé ţö ţĥé ĶÞŽ'š ŵöŕķšþàçé ĥöḿé, šö kapi apply àñđ ţĥé ḾÇÞ éđîţ ţööļš éđîţ à ĶÞŽ àš ţĥéý éđîţ à ƒîļé. À šéššîöñ ŕéàđš ţĥé ĥéàđ îñţö à þŕîṽàţé ŵöŕķîñĝ çöþý ţĥàţ ţĥé ƒîļé ĥöḿé šţàĝéš àĝàîñšţ; Settle ŕéàđš ţĥé ĥéàđ àĝàîñ ŵĥéñ îţ ḿöṽéđ àñđ þüţš îţ îñ ţĥé çöþý, ŵĥéŕé ţĥé ƒîļé ĥöḿé àþþļîéš ţĥé çĥàñĝé öñçé ḿöŕé; àñđ Commit ŕéçöŕđš ţĥé çöþý'š ƃýţéš ŵîţĥ ţĥé ĥéàđ ţĥé šéţţļé ƒöüñđ àš îţš éẋþéçţéđ ĥéàđ. Éđîţš ţö đéŕéñţ ƃļöçķš öƒ öñé đöçüḿéñţ çöḿḿüţé, àñđ à đöçüḿéñţ à ĶÞŽ çàŕŕîéš àš à šķéļéţöñ àļöñé ĥöļđš ñö ţéẋţ ţö éđîţ àñđ îš ŕéƒüšéđ unsupported. Ţĥé çöñƒöŕḿàñçé šüîţé ŕüñš öñ îţ ŵîţĥ ţŵö ĴŠÖÑ đöçüḿéñţš àñđ à ƃîļîñĝüàļ çàţàļöĝ.

À ŵĥöļé đöçüḿéñţ đîṽéŕĝéš ŵĥéñ à ŵŕîţé ţö îţ ŵàš ḿàđé ƒŕöḿ à ṽéŕšîöñ ţĥàţ ĥàš šţöþþéđ ƃéîñĝ îţš ĥéàđ. Ţŵö ḿàçĥîñéš ţĥàţ éàçĥ éđîţéđ öñé đöçüḿéñţ ƒŕöḿ öñé ĥéàđ ļéàṽé öñé ŵŕîţé àš ţĥé ĥéàđ àñđ ţĥé öţĥéŕ ƃéšîđé îţ öñçé ţĥéîŕ ļöĝš ḿééţ. Ţĥé ķàþî ĥöšţ ŕéçöŕđš à ţĥîŕđ çàšé ţĥé šàḿé ŵàý: à .kpz ŕéþļàçéđ öñ đîšķ ŵĥîļé îţš çàçĥé ĥöļđš éđîţš ñöƃöđý þàçķéđ. Éàçĥ éđîţéđ đöçüḿéñţ ţĥé ñéŵ ƒîļé çàŕŕîéš ŵîţĥ öţĥéŕ ƃýţéš ƃéçöḿéš à ŵŕîţé ḿàđé ƒŕöḿ ţĥé ṽéŕšîöñ ţĥé çàçĥé öþéñéđ. À ŕéàđ ŕéþöŕţš éàçĥ šüçĥ ŵŕîţé îñ Page.Divergent. À þéŕšöñ öŕ àñ àĝéñţ ţĥéñ šéţţļéš îţ îñ öñé öƒ ţŵö ŵàýš. Documents.Rebase ŕéàđš ţĥé đöçüḿéñţ àţ îţš ĥéàđ àñđ šéñđš ţĥé ŵŕîţé'š çĥàñĝéš ţĥŕöüĝĥ ţĥé çĥàñĝé šéŕṽîçé, ƃļöçķ ƃý ƃļöçķ àñđ éđîţîöñ ƃý éđîţîöñ (change.Diff ƃéţŵééñ ţĥé ṽéŕšîöñ ţĥé ŵŕîţé ƃéĝàñ ƒŕöḿ àñđ ţĥé öñé îţ ļéƒţ). Éàçĥ öþéŕàţîöñ îš ĝüàŕđéđ ƃý ţĥé ŕéṽîšîöñ îţš ƃļöçķ ĥàđ ŵĥéŕé ţĥé ŵŕîţé ƃéĝàñ, šö îţ ļàñđš öñļý öñ à ƃļöçķ ţĥé ĥéàđ ļéƒţ àļöñé. À ƃļöçķ ţĥé ŵŕîţé àđđéđ îš àñ insert_block àñçĥöŕéđ ƃéƒöŕé ţĥé ñéẋţ ƃļöçķ, öŕ àƒţéŕ ţĥé þŕéṽîöüš öñé, ţĥàţ ţĥé ŵŕîţé'š ƃàšé àñđ ţĥé ĥéàđ ƃöţĥ ĥöļđ, šö ƃļöçķš àđđéđ îñ à ŕüñ ķééþ ţĥéîŕ öŕđéŕ. À ƃļöçķ ţĥé ŵŕîţé ŕéḿöṽéđ îš à delete_block ĝüàŕđéđ ƃý ţĥé ŕéṽîšîöñ öƒ éṽéŕý éđîţîöñ îţ ĥàđ àţ ţĥé ƃàšé. À ƃļöçķ šţàýš çöñţéšţéđ ŵĥéñ ţĥé ĥéàđ çĥàñĝéđ îţ ţöö, öŕ ŵĥéñ ţĥé šţŕüçţüŕé àŕöüñđ îţ çöñƒļîçţš: ţĥé ƒöŕḿàţ àđđš öŕ ŕéḿöṽéš ñö ƃļöçķ, ţĥé ĥéàđ ĥöļđš ñéîţĥéŕ ñéîĝĥƃöüŕ öƒ àñ àđđéđ ƃļöçķ öŕ à ƃļöçķ öƒ ţĥé šàḿé ķéý ŵîţĥ öţĥéŕ çöñţéñţ, öŕ ţĥé ƃļöçķ ĥöļđš à ţŕàñšļàţîöñ àñ îñšéŕţ đöéš ñöţ ŵŕîţé. À ŵŕîţé ñàḿîñĝ ţĥé đîṽéŕĝéñţ ŵŕîţé àš îţš çàüšé ţĥéñ ŕéçöŕđš ţĥé çöñţéšţéđ ƃļöçķš, öŕ šéţţļéš ţĥé ŵŕîţé ŵĥéñ ñöñé îš ļéƒţ. Documents.Discard ŕéçöŕđš ţĥàţ çàüšé ŵîţĥ ñöţĥîñĝ çöñţéšţéđ àñđ ķééþš ţĥé ĥéàđ. Éàçĥ çöñţéšţéđ ƃļöçķ îš đéçîđéđ àš àñ éđîţîöñ'š çöñƒļîçţ îš: à çĥàñĝé šéţ ĝüàŕđéđ ƃý ţĥé ĥéàđ'š ŕéṽîšîöñ, ŵĥéŕé ķééþîñĝ ţĥé ĥéàđ'š ŵöŕđîñĝ îš ŕéçöŕđéđ àš ţĥé đéçîšîöñ (change.ContestedSession). kapi status ļîšţš éàçĥ đîṽéŕĝéñţ ŵŕîţé ŵîţĥ ţĥé kapi resolve çöḿḿàñđ ļîñé ţĥàţ šéţţļéš îţ, àñđ Ķàþî Đéšķţöþ öƒƒéŕš ƃöţĥ çĥöîçéš öñ ţĥé þŕöĵéçţ'š çöñƒļîçţš çàŕđ àñđ, ƒöŕ éṽéŕý .kpz öñ ţĥé ḿàçĥîñé, öñ ţĥé ŵöŕķšþàçé ĥöḿé (Š-02).

Ƒļöŵš​

À ƒļöŵ ŵŕîţéš à đöçüḿéñţ ŵĥöļé: îţš ŵŕîţéŕ ŕéñđéŕš éṽéŕý ƃļöçķ ţĥé ŕüñ þàššéđ ţĥŕöüĝĥ, îñţö ţĥé ƒîļé îţ ŕéàđš öŕ îñţö à ţàŕĝéţ-ļàñĝüàĝé ƒîļé ƃüîļţ ƒŕöḿ ţĥé šöüŕçé'š šķéļéţöñ. Ţĥé ƒîļé ĥöḿé çöḿḿîţš ţĥàţ đöçüḿéñţ ţöö (filehome.Home.Produce): ţĥé ŕüñ đîĝéšţš ţĥé đéšţîñàţîöñ ƃéƒöŕé îţ ŕéàđš, ţĥé ŵŕîţéŕ'š öüţþüţ îš šţàĝéđ ƃéšîđé ţĥé đéšţîñàţîöñ, àñđ ţĥé çöḿḿîţ ŕéñàḿéš îţ üñđéŕ ţĥé đéšţîñàţîöñ'š ļöçķ öñļý ŵĥîļé ţĥé đéšţîñàţîöñ šţîļļ ĥöļđš ŵĥàţ ţĥé ŕüñ ƃéĝàñ ƒŕöḿ (É-01). Éṽéŕý ƒļöŵ ţĥé ķàþî ĥöšţ ŕüñš çöḿḿîţš ţĥîš ŵàý: kapi translate, pseudo-translate, run, exec àñđ up, ţĥé šàḿé ŕüñš îñ Ķàþî Đéšķţöþ àñđ öṽéŕ ḾÇÞ, à þüļļ'š ţàŕĝéţ ƒîļéš, àñđ ţĥé đéļîṽéŕý öƒ à çöñṽéŕĝéñçé þàšš'š đŕàƒţš. Ţĥé ĥöšţ'š ƒļöŵ ĥöḿé ţàķéš îţš ļöçķš ŵĥéŕé ţĥé þŕöĵéçţ'š çĥàñĝé šéŕṽîçé ţàķéš ţĥéḿ, šö à ƒļöŵ àñđ à çĥàñĝé šéţ öñ öñé ƒîļé ţàķé ţüŕñš. À ĝàţéđ ŕüñ ţĥàţ ĥöļđš à ļöçàļé ƃàçķ ŵŕîţéš ţĥàţ ļöçàļé'š đŕàƒţš îñţö ţĥé ŵöŕķšþàçé ĥöḿé îñšţéàđ (workhome.Home.Produce): öñé ŵŕîţé þéŕ đöçüḿéñţ, éàçĥ đŕàƒţ ĝüàŕđéđ ƃý ţĥé ŕéṽîšîöñ ţĥé ŕüñ ƒîŕšţ ŕéàđ öƒ îţ, ŵîţĥ îţš ƃàšîš àñđ ţĥé šţàḿþ îţš þŕöđüçéŕ šéŕṽéš îţ àĝàîñ ƃý; à ƃļöçķ àñöţĥéŕ ŵŕîţéŕ çĥàñĝéđ ḿéàñŵĥîļé, öŕ öñé à þéŕšöñ öŕ àñ àĝéñţ ŵŕöţé ƒŕöḿ ţĥé šàḿé šöüŕçé, ķééþš ţĥàţ ŵŕîţéŕ'š éđîţîöñ. À ŕüñ ţĥàţ đéļîṽéŕš à ļöçàļé ŕéþļàçéš ţĥé đŕàƒţš ţĥé ŵöŕķšþàçé ķéþţ öƒ îţ ƒŕöḿ àñ éàŕļîéŕ ŕüñ ţĥé šàḿé ŵàý ƒîŕšţ. À đéļîṽéŕý (kapi merge, öŕ kapi up ƒöŕ à ļöçàļé ţĥàţ çļéàŕéđ îţš ĝàţé) ŵŕîţéš éàçĥ éđîţîöñ'š ƒîļé ƒŕöḿ ŵĥàţ ţĥé ŵöŕķšþàçé ĥöḿé ķééþš, éàçĥ đŕàƒţ ŵîţĥ ţĥé ƃàšîš îţ ŵàš ḿàđé ƒŕöḿ, àñđ ţĥéñ ŕéļéàšéš ŵĥàţ îţ ŕéàđ ţĥéŕé (workhome.Home.Release), öñļý ŵĥîļé ţĥé éđîţîöñ'š ĥéàđ îš šţîļļ ţĥé öñé îţ ŕéàđ.

Îñšîđé à þŕöĵéçţ ţĥé ĥöšţ ŕéçöŕđš éàçĥ đöçüḿéñţ à ƒļöŵ ŵŕöţé àš öñé content.edit, ţĥŕöüĝĥ ţĥé ŕéçöŕđéŕ à çĥàñĝé šéţ'š çöḿḿîţ ŕéçöŕđš ţĥŕöüĝĥ, ŵîţĥ ţĥé àçţöŕ tool:<flow> àñđ ţĥé öŕîĝîñ flow:<flow>. kapi exec ţàķéš ţĥé þŕöĵéçţ ţĥé çöḿḿàñđ ŕéšöļṽéš, àš kapi apply đöéš, ƒöŕ à ƒîļé ţĥé þŕöĵéçţ ĥöļđš. Ţĥé ŕéçöŕđ ķééþš ŕéṽîšîöñš àñđ ĥàšĥéš, ñö ţéẋţ. Îţš ţŕàñšîţîöñš àŕé ţĥé ŕüñ'š 郃éçţ öñ ţĥé ƒîļé àš ţĥé šéŕṽîçé ŕéàđš îţ: ţĥé đöçüḿéñţ îš ŕéàđ ţĥŕöüĝĥ ţĥé šéŕṽîçé ƃéƒöŕé ţĥé ŕüñ àñđ àĝàîñ àƒţéŕ ţĥé çöḿḿîţ (à çöḿḿîţ ţĥàţ ƒîñđš ţĥé ƒîļé ĥöļđîñĝ ţĥé ŕüñ'š ƃýţéš àļŕéàđý, àš îţ đîđ ŵĥéñ ţĥé ŕüñ ŕéàđ îţ, ŕéüšéš ţĥé ƒîŕšţ ŕéàđ), àñđ éàçĥ éđîţîöñ ŵĥöšé ŕéṽîšîöñ ḿöṽéđ îš à ţŕàñšîţîöñ, ŵîţĥ ţĥé šţàḿþ ţĥé þŕöđüçîñĝ ţööļ ļéƒţ àš îţš þŕöđüçéŕ, ţĥé ķîñđ öƒ öþéŕàţîöñ ţĥé çĥàñĝé çöḿéš ţö (change.EditionKind, àš change.Diff ŵöüļđ šéñđ îţ: set_content ƒöŕ àñ éđîţîöñ çŕéàţéđ öŕ ŕéŵŕîţţéñ, replace_text ƒöŕ ţéẋţ ḿöṽéđ àŕöüñđ ţĥé šàḿé çöđéš, remove_edition), àñđ ţĥé ţööļ ţĥàţ ḿàđé îţ (ţĥé ţööļ ñàḿéđ îñ îţš šţàḿþ, öŕ ţĥé ŕüñ'š öñļý ţööļ, ļéàṽîñĝ öüţ ţĥé çöüñţéŕ à çöñṽéŕĝéñçé þàšš àđđš). Ţĥé ŕéàđ ƃéƒöŕé ţĥé ŕüñ îš àñ öŕđîñàŕý ŕéàđ, šö îţ ŕéçöŕđš àñ éđîţ ḿàđé öüţšîđé ķàþî šîñçé ţĥé ļàšţ ŕéçöŕđéđ çĥàñĝé àš öƃšéŕṽéđ ƃéƒöŕé ţĥé ŕüñ'š öŵñ ŕéçöŕđ; ţĥé ŕéàđ àƒţéŕ ţĥé çöḿḿîţ îš ļéƒţ üñöƃšéŕṽéđ, ƃéçàüšé ţĥé ŕüñ ŕéçöŕđš ţĥàţ çĥàñĝé îţšéļƒ. À ţŕàñšļàţîöñ'š ƃàšîš îš ţĥé šöüŕçé ţĥé ŕüñ ŕéàđ ƃéƒöŕé îţ ŕàñ, ŵîţĥ ţĥàţ šöüŕçé'š çöñţéñţ ĥàšĥ: ţĥé çöḿḿîţ ĝüàŕđš ţĥé ƒîļé ţĥé ŕüñ ŵŕîţéš, šö à šöüŕçé éđîţéđ ŵĥîļé ţĥé ŕüñ ŵöŕķéđ îš đŕîƒţ àĝàîñšţ ţĥé ƃàšîš ŕàţĥéŕ ţĥàñ ţĥé ƃàšîš. À ţŕàñšļàţîöñ ţĥé ŕüñ ŕéþŕöđüçéđ üñçĥàñĝéđ îš ŕéçöŕđéđ ţöö, öñçé, ŵĥéñ ţĥé ƃļöçķ ĥîšţöŕý đöéš ñöţ àļŕéàđý šàý à ƒļöŵ ŵŕöţé îţ ƒŕöḿ ţĥé šöüŕçé ţĥé ƃļöçķ ĥöļđš, àñđ ñöţ öṽéŕ à þéŕšöñ'š öŕ àñ àĝéñţ'š ŵŕîţé öƒ ţĥé šàḿé ŵöŕđîñĝ, ŵĥîçĥ šţàýš ţĥéîŕš. Šö ţĥé ĥîšţöŕý ķééþš ţĥé ƃàšîš öƒ éṽéŕý ţŕàñšļàţîöñ ţĥé ļööþ ḿàđé. Ţĥàţ ƃàšîš îš ŵĥàţ çöṽéŕàĝé ĝŕàđéš àñ üñđéçîđéđ ţŕàñšļàţîöñ ƃý, ŵĥàţ à đéçîšîöñ öñ îţ šţàŕţš ƒŕöḿ, àñđ ŵĥéŕé ţĥé šţàļéñéšš ĝàţé ƒîñđš ŵĥàţ ĝöṽéŕñéđ îţ. Ţĥé đéçîšîöñ ļéđĝéŕ ĥöļđš đéçîšîöñš öñļý, šö ţĥé ƃļöçķ ĥîšţöŕý îš ţĥé öñļý þļàçé ţĥàţ ƃàšîš îš ķéþţ.

À đéšţîñàţîöñ ţĥàţ ḿöṽéđ ŵĥîļé ţĥé ŕüñ ŵöŕķéđ îš àþþļîéđ àĝàîñ ţĥŕöüĝĥ ţĥé šéŕṽîçé ƒŕöḿ ţĥé ŕüñ'š öþéŕàţîöñš (set_content öñ éàçĥ éđîţîöñ ţĥé ŕüñ çĥàñĝéđ, ĝüàŕđéđ ƃý ţĥé ŕéṽîšîöñ ŕéàđ ƃéƒöŕé ţĥé ŕüñ, ƒöļļöŵéđ ƃý ţĥé þŕöṽéñàñçé ţĥé þŕöđüçîñĝ ţööļ ļéƒţ). Ţĥé šéŕṽîçé ŕéàđš ţĥé ƒîļé üñđéŕ îţš ļöçķ, àñđ ţĥé đöçüḿéñţ ļàñđš ŵĥéñ ñö éđîţîöñ ţĥé ŕüñ çĥàñĝéđ ĥàš ḿöṽéđ ţöö, àñđ îš ŕéƒüšéđ àš à ŵĥöļé öţĥéŕŵîšé: ŵĥéñ öñé ĥàš ḿöṽéđ (stale), öŕ ŵĥéñ ţĥé ŕüñ ŵŕöţé à ƃļöçķ ţĥé ƒîļé đöéš ñöţ ĥöļđ ýéţ. Ţĥé ŕüñ ţĥéñ ŕéþöŕţš ţĥé đöçüḿéñţ àš ḿöṽéđ, àñđ ţĥé ñéẋţ ŕüñ ŵŕîţéš îţ. À ţàŕĝéţ-ļàñĝüàĝé éđîţîöñ ţĥé ŕüñ ļéƒţ ŵîţĥöüţ à ţŕàñšļàţîöñ îš ŕéñđéŕéđ ƒŕöḿ ţĥé šöüŕçé ƃý ţĥé ŵŕîţéŕ, àñđ îš ļéƒţ àš ţĥé ƒîļé ĥöļđš îţ ŵĥéñ ţĥé ŕüñ'š çĥàñĝéš àŕé àþþļîéđ àĝàîñ.

Üñđéŕ --print-ops ţĥé ŕüñ çöḿḿîţš ţĥŕöüĝĥ à ĥöḿé ţĥàţ ŵŕîţéš ñöţĥîñĝ (filehome.Options.WriteNothing) àñđ ŕéçöŕđš ñöţĥîñĝ. Ŵĥàţ îţ çĥàñĝéđ îñ éàçĥ đöçüḿéñţ ƃéçöḿéš öþéŕàţîöñš, ţĥé đéŕéñçé ƃéţŵééñ éàçĥ ƃļöçķ àš ţĥé ŕéàđéŕ ĝàṽé îţ àñđ àš ţĥé ŵŕîţéŕ ŕéçéîṽéđ îţ (change.Diff), éàçĥ ĝüàŕđéđ ƃý ţĥé ŕéṽîšîöñ ţĥé šéŕṽîçé ŕéàđ ƃéƒöŕé ţĥé ŕüñ àñđ éàçĥ set_content öƒ à ţŕàñšļàţîöñ çàŕŕýîñĝ îţš ƃàšîš àñđ, àš éàçĥ öþéŕàţîöñ öñ à ţŕàñšļàţîöñ đöéš, ţĥé origin ţĥé þŕöđüçîñĝ ţööļ ļéƒţ. Ƃéƒöŕé à đöçüḿéñţ'š öþéŕàţîöñš ĵöîñ ţĥé çĥàñĝé šéţ, ţĥéý àŕé àþþļîéđ ţö à þŕîṽàţé çöþý öƒ ţĥé ƒîļé ţĥŕöüĝĥ ţĥé šéŕṽîçé kapi apply ŕéàçĥéš, àñđ ţĥéý àŕé þŕîñţéđ öñļý ŵĥéñ ţĥé çöþý ţĥéñ ĥöļđš ţĥé ƃýţéš ţĥé ŕüñ ŵöüļđ ĥàṽé ŵŕîţţéñ. À ŕüñ ŵŕîţéš à ţàŕĝéţ-ļàñĝüàĝé ƒîļé ŵĥöļé ƒŕöḿ îţš šöüŕçé, ŵĥîļé ţĥé šéŕṽîçé éđîţš ţĥé ƒîļé àš îţ šţàñđš, šö ţĥé ţŵö đéŕ ŵĥéñ ţĥé ƒîļé ĥöļđš àñ éñţŕý öŕ àñ öŕđéŕ öƒ îţš öŵñ, öŕ ŵĥéñ ţĥé šöüŕçé ĝàîñéđ à ƃļöçķ ţĥé ƒîļé'š ŵŕîţéŕ àđđš ñöŵĥéŕé, öŕ ƃéšîđé àñöţĥéŕ ñéîĝĥƃöüŕ ţĥàñ ţĥé ŕüñ ĝîṽéš îţ; šüçĥ à ƒîļé îš ñàḿéđ öñ šţàñđàŕđ éŕŕöŕ àñđ ļéƒţ öüţ. Šö îš à ƒîļé ţĥé ŕüñ ŵöüļđ ŵŕîţé ŵĥéŕé ţĥé šéŕṽîçé đöéš ñöţ ķééþ ţĥé éđîţîöñ (àñ öüţþüţ þàţĥ ĝîṽéñ öñ ţĥé çöḿḿàñđ ļîñé îñ þļàçé öƒ ţĥé ŕéçîþé'š ţàŕĝéţ), à çöñṽéŕšîöñ, àñ éẋþöŕţ àñđ àñ àŕçĥîṽé. kapi apply öƒ ţĥé çĥàñĝé šéţ ŵŕîţéš ţĥé ƃýţéš ţĥé ŕüñ ŵöüļđ ĥàṽé ŵŕîţţéñ (üñđéŕ materialize: on-converge, à ţŕàñšļàţîöñ ŵĥöšé ƒîļé đöéš ñöţ éẋîšţ ýéţ ļàñđš îñ ţĥé ŵöŕķšþàçé ĥöḿé, îţš ĥöḿé üñţîļ à đéļîṽéŕý, àñđ kapi merge ŵŕîţéš ţĥöšé ƃýţéš), àñđ ŕéçöŕđš ţĥé éđîţ àš îţš àþþļîéŕ'š: à þéŕšöñ'š öŕ àñ àĝéñţ'š éđîţ îš ţĥéîŕš, šö ţĥé origin ţĥé öþéŕàţîöñš šţàţé îš ñöţ ķéþţ öñ ţĥé ţŕàñšļàţîöñ, àñđ kapi apply þŕîñţš öñé ļîñé ñàḿîñĝ ţĥé ţööļš àñđ šàýîñĝ šö. À ŕüñ ŵîţĥ ñöţĥîñĝ ţö çĥàñĝé þŕîñţš à çĥàñĝé šéţ ŵîţĥ ñö öþéŕàţîöñ, ŵĥîçĥ àþþļîéš àñđ ŵŕîţéš ñöţĥîñĝ.

À þŕîñţîñĝ kapi up ŕüñš öñé þàšš. À ĝàţéđ þàšš đŕàƒţš îñţö îţš þŕîṽàţé ţŕéé àš àñý þàšš đöéš (Options.WriteUnder ļéţš ţĥé þŕîñţîñĝ ĥöḿé ŵŕîţé ţĥéŕé), ţĥé ĝàţé éṽàļüàţéš ţĥé đŕàƒţš, àñđ đéļîṽéŕý þŕîñţš ŵĥàţ îţ ŵöüļđ çöḿḿîţ ƒöŕ éàçĥ ļöçàļé ţĥàţ çļéàŕš îţš ĝàţé; à ĥéļđ-ƃàçķ ļöçàļé îš ñàḿéđ àñđ þŕîñţš ñöţĥîñĝ. À þŕîñţîñĝ ŕüñ ŕéçöŕđš ñö çĥàñĝé, àƃšöŕƃš ñöţĥîñĝ îñţö ţĥé çöñţéñţ ḿéḿöŕý àñđ šţàḿþš ñöţĥîñĝ. Àš àñý þàšš đöéš, îţ éẋţŕàçţš ţĥé šöüŕçé îñţö ţĥé đéŕîṽéđ šţöŕé àñđ çàçĥéš üñđéŕ .kapi/work, àñđ ŕéçöŕđš ţĥé îđéñţîţý öƒ à đöçüḿéñţ îţ ŕéàđš ƒöŕ ţĥé ƒîŕšţ ţîḿé (document.adopt). Îñ à þŕöĵéçţ à kapi translate, pseudo-translate öŕ run ŵîţĥöüţ -o ŵŕîţéš ñö ƒîļé, àñđ þŕîñţš ñöţĥîñĝ ŵîţĥ à ñöţé.

Ĥööķš​

Ţĥé šéŕṽîçé çàļļš šîẋ ĥööķš à ĥöšţ šüþþļîéš. Éàçĥ îš öþţîöñàļ.

ĤööķÇàļļéđŴîţĥöüţ öñé
Policyƒöŕ éṽéŕý öþéŕàţîöñ, ƃéƒöŕé àñýţĥîñĝ îš ŕéàđéṽéŕý öþéŕàţîöñ îš þéŕḿîţţéđ
CommitChecköṽéŕ ţĥé çĥàñĝéđ éđîţîöñš, ƃéƒöŕé àñýţĥîñĝ îš ŵŕîţţéñ; îţ ŕéţüŕñš ƒîñđîñĝš ƃéƒöŕé àñđ àƒţéŕ, àñđ ţĥé ĝöṽéŕñàñçé ƒîñĝéŕþŕîñţ îţ üšéđñöţĥîñĝ îš çĥéçķéđ
Assetsţö þŕéþàŕé decide, term, memory àñđ recipe ƃéƒöŕé àñýţĥîñĝ îš ŵŕîţţéñ, àñđ ţö àþþļý ţĥéḿ àƒţéŕ ţĥé çöñţéñţ ļàñđéđţĥöšé öþéŕàţîöñš àŕé ŕéƒüšéđ àš unsupported
Recorderàƒţéŕ ţĥé ĥöḿéš çöḿḿîţţéđ, ŵîţĥ ţĥé ţŕàñšîţîöñš àñđ ţĥé ƒîñĝéŕþŕîñţñöţĥîñĝ îš ŕéçöŕđéđ
EditionStatesöñçé ƃý éàçĥ ŕéàđ öƒ à đöçüḿéñţ, ŵîţĥ ţĥé ḿöšţ ƃļöçķš ţĥé ŕéàđ šĥöŵš, ƒöŕ ţĥé šţàţüš àñđ ƃàšîš öƒ îţš đéŕîṽéđ éđîţîöñšà ŕéàđ šĥöŵš ţĥé šţàţüš ţĥé đöçüḿéñţ ĥöļđš àñđ ñö ƃàšîš
EditionHistoriesƃý History, ƒöŕ ţĥé ŕéçöŕđéđ çĥàñĝéš ţö àñ éđîţîöñà ĥîšţöŕý ļîšţš ñöţĥîñĝ

Ţĥé šéŕṽîçé ŕéƒüšéš à çĥàñĝé öñļý ƒöŕ à ƒàîļîñĝ ƒîñđîñĝ îţ îñţŕöđüçéš (change.Introduced). Üñđéŕ report ţĥé çĥàñĝé ļàñđš ŵîţĥ îţš ƒîñđîñĝš, àñđ à þéŕšöñ'š öṽéŕŕîđđéñ ƒîñđîñĝš ĝö ţö ţĥé ŕéçöŕđ.

Ţĥé ķàþî ĥöšţ'š þöļîçý (ChangePolicy) ļéţš à þéŕšöñ šéñđ éṽéŕý öþéŕàţîöñ. Àñ àĝéñţ ḿàý çĥàñĝé çöñţéñţ, àñđ îš ŕéƒüšéđ àš not_permitted ŵĥéñ îţ šéñđš à term, memory öŕ recipe öþéŕàţîöñ, à decide ŵîţĥ àñý öüţçöḿé ƃüţ advise, àñ if_match öƒ *, öŕ ţĥé report ĝàţé. À ţööļ îñ à ƒļöŵ ḿàý çĥööšé report àñđ đéçîđéš öñļý ŵîţĥ advise, àñđ öñļý à ţööļ šéñđš ţĥé îñ-þŕöçéšš þŕöṽéñàñçé öþéŕàţîöñ. À šéñđéŕ öƒ àñý öţĥéŕ ķîñđ îš ŕéƒüšéđ éṽéŕý öþéŕàţîöñ.

Ţĥé ķàþî ĥöšţ'š ŕéçöŕđéŕ ŵŕîţéš éàçĥ çĥàñĝé šéţ îñţö ţĥé ŵöŕķšþàçé'š ļöĝ, öñé content.edit öþéŕàţîöñ þéŕ đöçüḿéñţ, îñ öñé ŵŕîţé, àñđ ţĥé þŕöĵéçţöŕ ŵŕîţéš îţ îñţö ţĥé ƃļöçķ ĥîšţöŕý: ŵĥö çĥàñĝéđ ŵĥîçĥ éđîţîöñ, ƒŕöḿ ŵĥîçĥ ŕéṽîšîöñ ţö ŵĥîçĥ, ţĥŕöüĝĥ ŵĥîçĥ šüŕƒàçé (ţĥé öŕîĝîñ), àñđ üñđéŕ ŵĥîçĥ ĝöṽéŕñàñçé ƒîñĝéŕþŕîñţ. À þéŕšöñ'š öŕ àñ àĝéñţ'š ŕéçöŕđ ķééþš ţĥé ŕüñš àŕöüñđ éàçĥ çĥàñĝé àñđ ţĥé çĥàñĝé šéţ àš šéñţ; à ţööļ'š ķééþš ŕéṽîšîöñš àñđ ĥàšĥéš, àñđ ţĥé ƒîļé ĥöļđš ţĥé ţéẋţ. À đöçüḿéñţ ţĥé ŵöŕķšþàçé ĥöḿé ĥöļđš îš ŕéçöŕđéđ ƃý ţĥàţ ĥöḿé'š çöḿḿîţ, àñđ ţĥé ŕéçöŕđéŕ ŕéçöŕđš ţĥé ŕéšţ öƒ ţĥé çĥàñĝé šéţ. À þŕöĵéçţ ţĥàţ đéçļàŕéš ŕéđàçţîöñ ŕéçöŕđš ţĥé ŕüñš àñđ ţĥé ñöţé ŕéđàçţéđ, öŕ ñéîţĥéŕ üñđéŕ à þöļîçý ţĥàţ đéţéçţš éñţîţîéš, àñđ ķééþš ñö çöþý öƒ ţĥé çĥàñĝé šéţ àš šéñţ (Ç-10).

Ţĥé ķàþî ĥöšţ ƃüîļđš ţĥé šéŕṽîçé ƒöŕ à šüŕƒàçé ŵîţĥ App.Changes àñđ App.ChangeService. Îñšîđé à þŕöĵéçţ ţĥé ƒîļé ĥöḿé'š ļàýöüţ ŕéšöļṽéš à ŕéƒéŕéñçé ţĥé ŵàý ţĥé ŕéçîþé đöéš: à šöüŕçé ƒîļé îš ŕéàđ ŵîţĥ ţĥé ƒöŕḿàţ àñđ çöñƒîĝüŕàţîöñ îţš çöñţéñţ îţéḿ ƃîñđš, ţĥé ƒîļé öƒ à ţŕàñšļàţîöñ îš ţĥàţ éđîţîöñ öƒ îţš šöüŕçé, ĵöîñéđ ƃý ķéý, ţĥéñ ƃý ţŕàñšļàţîöñ-îñṽàŕîàñţ àđđŕéšš, ţĥéñ ƃý þöšîţîöñ, àñđ à ţŕàñšļàţîöñ ŵîţĥ ñö ƒîļé ýéţ îš ŵŕîţţéñ ƒŕöḿ ţĥé šöüŕçé'š šķéļéţöñ. Öüţšîđé à þŕöĵéçţ à ŕéƒéŕéñçé îš à þàţĥ üñđéŕ ţĥé ŵöŕķîñĝ đîŕéçţöŕý, ŕéàđ ŵîţĥ ţĥé ƒöŕḿàţ đéţéçţîöñ ƒîñđš ƃý ñàḿé, ţĥéñ ƃý çöñţéñţ. À ƒîļé öƒ à ţŕàñšļàţîöñ îñţéŕçĥàñĝé ƒöŕḿàţ, öŕ öƒ à ḿüļţîļîñĝüàļ šţŕîñĝ çàţàļöĝ (àñ Ẋçöđé .xcstrings ƒîļé), ĥöļđš îţš éđîţîöñš îñ ţĥé ƒîļé, üñļéšš ţĥé ŕéçîþé ŵŕîţéš ţĥé šöüŕçé'š ţŕàñšļàţîöñš ţö ƒîļéš öƒ ţĥéîŕ öŵñ: ŵîţĥ à ţàŕĝéţ po/{lang}.po, ţĥé Ƒŕéñçĥ öƒ po/en.po öŕ öƒ po/messages.pot îš ŕéàđ ƒŕöḿ àñđ ŵŕîţţéñ ţö po/fr.po, îñ Ƒŕéñçĥ, àñđ ţĥé šöüŕçé çàţàļöĝ ĥöļđš ñö éđîţîöñ, ƒöŕ éṽéŕý šüŕƒàçé. Đéçîšîöñš àñđ àššéţ öþéŕàţîöñš ļàñđ ţĥŕöüĝĥ ţĥé ĥöšţ'š ŕéṽîéŵ-ǫüéüé àñđ àššéţ ƒüñçţîöñš, à đéçîšîöñ ƃöüñđ ţö ţĥé ŵöŕđîñĝ ţĥé çĥàñĝé šéţ ļàñđéđ ŕàţĥéŕ ţĥàñ ţö à ļàţéŕ ŕéàđ öƒ ţĥé ƒîļé; öñ àñ éđîţîöñ ŵîţĥ ñö çöñţéñţ îñ îţš ĥöḿé, šüçĥ àš à ĥéļđ-ƃàçķ ļöçàļé'š đŕàƒţ, ţĥé đéçîšîöñ ƃîñđš ţö ţĥé đŕàƒţ ţĥé þŕöĵéçţ šţöŕé ĥöļđš. Šüçĥ à đéçîšîöñ ñàḿéš ţĥé éđîţîöñ îţ ŕéàđ àš absent, àñđ îš ŕéƒüšéđ àš šţàļé öñçé ţĥé ĥöḿé ĥöļđš ţĥé éđîţîöñ. Ţĥé ĥööķš éàçĥ þļüĝ îñ àţ öñé ƒüñçţîöñ öƒ ţĥé ĥöšţ: ţĥé çöḿḿîţ çĥéçķ îš App.CommitCheck, ŵĥîçĥ ĥöļđš à šéŕṽîçé öüţšîđé à þŕöĵéçţ ţö ĥýĝîéñé àļöñé; ţĥé þöļîçý îš ChangePolicy; ţĥé ŕéçöŕđéŕ îš App.EditRecorder, îñšîđé à þŕöĵéçţ; à ŕéàđ ţàķéš ţĥé ƃàšîš öƒ à đéŕîṽéđ éđîţîöñ ţĥàţ çàŕŕîéš ñö đéŕîṽàţîöñ ƒŕöḿ ţĥé þŕöĵéçţ'š ƃļöçķ ĥîšţöŕý, ŵĥéŕé ţĥé ḿöšţ ŕéçéñţ ŕéçöŕđéđ çĥàñĝé ţö ţĥé éđîţîöñ ļéƒţ ţĥé çöñţéñţ îţ ĥöļđš; àñđ à ĥîšţöŕý ļîšţš ţĥé éđîţîöñ'š ŕöŵš öƒ ţĥàţ ƃļöçķ ĥîšţöŕý. À đéçîšîöñ ƃîñđš ţö ţĥé ŕéṽîšîöñ öƒ ţĥé éđîţîöñ îţ đéçîđéš àñđ öƒ ţĥé àüţĥöŕîţàţîṽé éđîţîöñ ƃéšîđé îţ (DecisionTarget.Rev àñđ SourceRev), ŵĥîçĥ ţĥé đéçîšîöñ ļéđĝéŕ þàîŕš (Ç-04).

Öñ ţĥé çöḿḿàñđ ļîñé, kapi apply ĥàñđš à đéçöđéđ çĥàñĝé šéţ ţö ţĥé šéŕṽîçé, kapi inspect þŕîñţš ţĥé šéŕṽîçé'š ŕéàđ ŕéçöŕđš, àñđ ksed çöḿþîļéš îţš šüƃšţîţüţîöñš îñţö replace_text öþéŕàţîöñš àñđ àþþļîéš ţĥéḿ ţĥŕöüĝĥ îţ (Š-01). Àļļ ţĥŕéé ƃüîļđ ţĥé šéŕṽîçé öñçé þéŕ ŕüñ: ƒöŕ ţĥé þŕöĵéçţ ţĥé çöḿḿàñđ ñàḿéš öŕ đîšçöṽéŕý ƒîñđš, ƒöŕ ţĥé ƒîļéš üñđéŕ îţš ŕööţ, àñđ öṽéŕ ţĥé ŵöŕķîñĝ đîŕéçţöŕý öţĥéŕŵîšé, ŵĥéŕé à ŕéƒéŕéñçé ḿàý ļéàđ öüţ öƒ îţ àš à þàţĥ öñ à çöḿḿàñđ ļîñé đöéš. Îñšîđé à þŕöĵéçţ à ƒîļé öüţšîđé ţĥé ŕööţ îš ñàḿéđ ƃý îţš àƃšöļüţé þàţĥ, àñđ kapi apply éđîţš à çĥàñĝé šéţ öƒ šüçĥ ƒîļéš öṽéŕ ţĥé ŵöŕķîñĝ đîŕéçţöŕý. Ţĥé ĥööķš öƒ à šéŕṽîçé öüţšîđé à þŕöĵéçţ àŕé ĝîṽéñ à çöḿḿàñđ ţĥàţ ŕéšöļṽéš ñö þŕöĵéçţ, šö đîšçöṽéŕý ñéṽéŕ þüţš àñ éđîţ ḿàđé öüţšîđé öñé üñđéŕ à þŕöĵéçţ'š ĝöṽéŕñàñçé. Öñļý ksed ŕéàđš à ƒîļé ñö ƒöŕḿàţ çļàîḿš àš þļàîñ ţéẋţ. À çöḿḿàñđ ţĥàţ þŕîñţš àñ éđîţéđ đöçüḿéñţ (ksed ŵîţĥöüţ -i) àþþļîéš ţĥé çĥàñĝé ţö à þŕîṽàţé çöþý, ļöçàţéđ àñđ ŕéàđ éẋàçţļý àš ţĥé ƒîļé îţšéļƒ, àñđ ŵŕîţéš ţĥé çöþý öüţ. À ŕéàđ ţàķéš ñö ļöçķ àñđ ļéàṽéš à þŕöĵéçţ àš îţ ŵàš: ţĥé ļöçķ đîŕéçţöŕý, àñđ ţĥé îĝñöŕé ŕüļé ţĥàţ ķééþš îţ öüţ öƒ à çöḿḿîţ, àŕé ŵŕîţţéñ ŵĥéñ à çĥàñĝé ƒîŕšţ çöḿḿîţš, àñđ ţĥé ŕéçöŕđéŕ öþéñš ţĥé þŕöĵéçţ šţöŕé ţĥéñ, ƃéƒöŕé àñýţĥîñĝ îš ŵŕîţţéñ. À ŕéàđ ţàķéš à đéŕîṽéđ éđîţîöñ'š ƃàšîš ƒŕöḿ à þŕöĵéçţ šţöŕé ţĥàţ éẋîšţš àñđ çŕéàţéš ñöñé. À þŕéṽîéŵ ţàķéš ñö ļöçķ àñđ ŕéçöŕđš ñöţĥîñĝ, àñđ îţš çöḿḿîţ çĥéçķ ŕéàđš ţĥé þŕöĵéçţ šţöŕé ŵĥéñ ţĥé þŕöĵéçţ ĥàš öñé àñđ çŕéàţéš ñöñé. Ŵĥéñ ţĥé þŕöĵéçţ ĥàš ñö šţöŕé ýéţ, à þŕéṽîéŵ çĥéçķš àñ éđîţ ŵîţĥöüţ ţĥé ṽöîçé àñđ ţĥé ţéŕḿš à šţöŕé ƃîñđš ƒŕöḿ ţĥé ŵöŕķšþàçé.

À set_content öñ à çöđé çöḿḿéñţ, îñ à šöüŕçé ƒîļé öñļý ţĥé çöḿḿéñţ ļàýéŕ ŕéàđš, ĝöéš ţĥŕöüĝĥ ţĥé çöḿḿéñţ ŵŕîţé þàţĥ, ŵĥîçĥ ķééþš îţš öŵñ ĝüàŕàñţééš: ţĥé ƒîļé îš ŕéàđ àĝàîñ ƃéƒöŕé îţ îš ŵŕîţţéñ, ţĥé ŕéšüļţ ḿüšţ þàŕšé, àñđ ţĥé ļàñĝüàĝé'š ƒöŕḿàţţéŕ ḿüšţ àĝŕéé. À ƒîļé îš ŕéàđ ƒöŕ îţš çöḿḿéñţš ŵĥéñ ñö ƒöŕḿàţ ŕéàđš îţ: ñöñé ţĥàţ --format ñàḿéš, ţĥé ŕéçîþé ƃîñđš, öŕ đéţéçţîöñ ƒîñđš ƃý éẋţéñšîöñ öŕ çöñţéñţ, àš à Ǫţ Ļîñĝüîšţ çàţàļöĝ îš ƒöüñđ îñ à .ts ƒîļé. Ŵĥàţ ŵàš ŵŕîţţéñ îš çĥéçķéđ, šçöþéđ ţö ţĥé çĥàñĝé, àñđ üñđéŕ ţĥé éñƒöŕçîñĝ ĝàţé à ƒàîļîñĝ ƒîñđîñĝ, öŕ à çĥéçķ ţĥàţ ŕéàđ ñöţĥîñĝ, éẋîţš 3. Ţĥé çöḿḿéñţ þàţĥ ŕüñš ñéîţĥéŕ ţĥé çöḿḿîţ çĥéçķ ñöŕ ţĥé ŕéçöŕđéŕ: ţĥé çĥéçķ ŕüñš àƒţéŕ ţĥé ŵŕîţé, àñđ ñöţĥîñĝ ŕéçöŕđš à çöḿḿéñţ éđîţ.

Ţĥé ḾÇÞ ţööļš read_blocks, apply_edits àñđ describe_format ƃüîļđ ţĥé šéŕṽîçé ƒöŕ éàçĥ çàļļ'š þŕöĵéçţ àñđ šéñđ éṽéŕý çĥàñĝé šéţ àš ţĥé çàļļîñĝ àĝéñţ (Š-03). Ţĥé ƃŕöŵšéŕ éñĝîñé'š kapiRead, kapiApply àñđ kapiDescribe ƃüîļđ îţ ţĥŕöüĝĥ ţĥé šàḿé ƒüñçţîöñ àñđ çàŕŕý ţĥé çöñţŕàçţ àš ĴŠÖÑ îñ àñđ öüţ: à ŕéƒüšàļ, à çĥàñĝé šéţ ţĥàţ đöéš ñöţ đéçöđé îñçļüđéđ, îš àñšŵéŕéđ àš à ŕéšüļţ. À çàļļ öƒ éîţĥéŕ šüŕƒàçé ŕéàđš à ƃîļîñĝüàļ ƒîļé ţĥàţ ĥöļđš îţš ţŕàñšļàţîöñ, šüçĥ àš à ÞÖ çàţàļöĝ, îñ ţĥé öñé ļàñĝüàĝé öţĥéŕ ţĥàñ ţĥé šöüŕçé ţĥàţ îţš ŕéàđ'š éđîţîöñš öŕ îţš öþéŕàţîöñš ñàḿé, àš kapi apply đöéš. Ţĥé þàĝé ñàḿéš ţĥé šéñđéŕ, à þéŕšöñ üñļéšš îţ šàýš àñ àĝéñţ, àñđ îñ à þŕöĵéçţ àñ àþþļîéđ çĥàñĝé îš ŕéçöŕđéđ îñ ţĥé ƃŕöŵšéŕ'š ŵöŕķšþàçé ļöĝ (ŴÀŠḾ Éñĝîñé ÀƂÎ).

Ţĥé ṽéŕƃš ţĥàţ ŵŕîţé ŵĥöļé ţŕàñšļàţîöñš ƃüîļđ ţĥé šéŕṽîçé ŵîţĥ Materialize šéţ, šö ţĥé ƒîļé ĥöḿé ŵŕîţéš éàçĥ ţŕàñšļàţîöñ'š ƒîļé ƒŕöḿ îţš šöüŕçé'š šķéļéţöñ, ķééþîñĝ ŵĥàţ éàçĥ ƃļöçķ'š þàŕţñéŕ îñ ţĥé ƒîļé ĥéļđ ŵĥéŕé ţĥé çĥàñĝé šéţ ļéàṽéš îţ, àñđ à ţŕàñšļàţîöñ ƒöļļöŵš ţĥé šöüŕçé'š šţŕüçţüŕé, éṽéñ ŵĥéŕé ţĥé çĥàñĝé šéţ çĥàñĝéš ñö çöñţéñţ îñ à ƒîļé ŵĥöšé ƃļöçķš ĥàṽé šţöþþéđ þàîŕîñĝ ŵîţĥ ţĥé šöüŕçé'š. À ƃîļîñĝüàļ ţŕàñšļàţîöñ ƒîļé ţĥàţ šţîļļ ĥöļđš éṽéŕý üñîţ öƒ îţš šöüŕçé ķééþš îţš öŵñ šķéļéţöñ, ĥéàđéŕ îñçļüđéđ. kapi merge -i çöḿþîļéš à ŕéţüŕñéđ ẊĻÎƑƑ, ÞÖ öŕ .kpz îñţö set_content öþéŕàţîöñš çàŕŕýîñĝ ţĥé if_match àñđ basis éàçĥ éñţŕý ŵàš éẋţŕàçţéđ àĝàîñšţ, üñđéŕ require_basis àñđ ţĥé éñƒöŕçé ĝàţé, àñđ šéñđš ţĥéḿ àš à þéŕšöñ; kapi extract šţàḿþš éàçĥ éñţŕý ŵîţĥ ţĥé ŕéṽîšîöñ öƒ ţĥé šöüŕçé îţ çàŕŕîéš àñđ ţĥé ţŕàñšļàţîöñ'š ŕéṽîšîöñ à ŕéàđ ţĥŕöüĝĥ ţĥé šéŕṽîçé ĝîṽéš (Ḿ-01). kapi merge ŵîţĥ ñö -i šéñđš ţĥé ţàŕĝéţš ţĥé ƃļöçķ šţöŕé ĥöļđš ƒöŕ à šöüŕçé àñđ ļàñĝüàĝé àš öñé çĥàñĝé šéţ ƒŕöḿ ţĥé ţööļ merge, àñđ kapi pull šéñđš ţĥé ŕüñš ţĥé šéŕṽéŕ ĥöļđš ƒöŕ éàçĥ þüļļéđ ţŕàñšļàţîöñ àš ţĥé ţööļ pull, éàçĥ if_match ţĥé ŕéṽîšîöñ ţĥé ŕéàđ ƃéƒöŕé îţ ƒöüñđ. À þüļļ ĥàñđš ţĥé ŵŕîţéŕ öƒ à đöçüḿéñţ ŵîţĥ ļöçàļé-ṽàŕîàñţ ḿéđîà ţĥŕöüĝĥ ChangeServiceOptions.WriterHook, àñđ ŵŕîţéš à ţàŕĝéţ îñ àñöţĥéŕ ƒöŕḿàţ ţĥàñ îţš šöüŕçé, ŵĥîçĥ ñö éđîţîöñ ŕéàçĥéš, ŵîţĥ ţĥé ţàŕĝéţ'š öŵñ ŵŕîţéŕ. Ţĥé ŕéçöŕđ ñàḿéš ţĥé šüŕƒàçé àš ţĥé öŕîĝîñ: merge öŕ pull.

Ķàþî Đéšķţöþ ŕéàçĥéš ţĥé šéŕṽîçé ţĥŕöüĝĥ ƒöüŕ ƃîñđîñĝš, Read, Apply, Describe àñđ History, éàçĥ ţàķîñĝ àñđ ŕéţüŕñîñĝ ţĥé çöñţŕàçţ'š ĴŠÖÑ àš à šţŕîñĝ. Îţ ƃüîļđš ţĥé šéŕṽîçé ƒöŕ ţĥé ţàƃ'š þŕöĵéçţ ŵîţĥ desktop àš ţĥé öŕîĝîñ àñđ šéñđš éṽéŕý çĥàñĝé šéţ àš ţĥé þéŕšöñ àţ ţĥé ķéýƃöàŕđ: àñ éđîţ îñ ţĥé ŕéṽîéŵ þàñé öŕ ţĥé đöçüḿéñţ ṽîéŵ, à çĥéçķ ƒîñđîñĝ'š ƒîẋ, àñđ Àþþŕöṽé àñđ Ŕéĵéçţ àš decide (Š-02).

kapi check ĝîṽéš à ƒîñđîñĝ ŵĥöšé ŕüļé ñàḿéš à ŕéþļàçéḿéñţ ţĥé öþéŕàţîöñ ţĥàţ àþþļîéš îţ (check.Fix): à replace_text öƒ ţĥé ŵöŕđš ţĥé ƒîñđîñĝ öƃĵéçţš ţö, ƃý ţĥé ŕüñ ŕàñĝé ţĥé çĥéçķéŕ ŕéþöŕţéđ, üñđéŕ ţĥé ŕéṽîšîöñ öƒ ţĥé ƃļöçķ'š öŵñ éđîţîöñ ţĥé çĥéçķ ŕéàđ. Šéñţ àš îţ îš, îţ ļàñđš ŵĥîļé ţĥé ƃļöçķ šţîļļ šàýš ŵĥàţ ţĥé çĥéçķ ŕéàđ, àñđ îš ŕéƒüšéđ àš šţàļé öñçé îţ đöéš ñöţ. Ţĥé ƒîẋéš öƒ öñé ƃļöçķ ñàḿé þļàçéš îñ ţĥé šàḿé ţéẋţ, šö ţĥéý çöḿþöšé àš ţĥé éđîţš öƒ öñé öþéŕàţîöñ; àš šéþàŕàţé öþéŕàţîöñš öƒ öñé çĥàñĝé šéţ, éàçĥ ŵöüļđ šéé ţĥé ţéẋţ ţĥé öñé ƃéƒöŕé îţ ļéƒţ. À ŕéþļàçéḿéñţ îš þļàîñ ţéẋţ, àñđ ApplyTextEdits ķééþš à çöđé öñļý àţ éîţĥéŕ éñđ öƒ ţĥé ţéẋţ îţ ŕéþļàçéš, šö à ƒîñđîñĝ ŵĥöšé ŵöŕđš ĥàṽé àñ îñļîñé çöđé àḿöñĝ ţĥéḿ ĝéţš ñö ƒîẋ. Ţĥé ƒîẋ ñàḿéš îţš đöçüḿéñţ àš ţĥé þŕöĵéçţ'š çĥàñĝé šéŕṽîçé ŕéšöļṽéš öñé, ƃý îţš þàţĥ ƒŕöḿ ţĥé þŕöĵéçţ ŕööţ, àñđ ţĥé ƒîļé öƒ à ţŕàñšļàţîöñ ĝéţš ñö ƒîẋ: ţĥé šéŕṽîçé ŕéàđš ţĥàţ ƒîļé àš ţĥé ţŕàñšļàţîöñ'š éđîţîöñ, ŵĥîļé ţĥé çĥéçķ ŕéàđ îţ àš šöüŕçé àñđ ĥéļđ îţ ţö ţĥé šöüŕçé ļàñĝüàĝé'š ŕüļéš.

Ŕéšüļţš àñđ éŕŕöŕš​

À ŕéšüļţ ĥàš à šţàţüš (applied, refused, previewed, öŕ partial ŵĥéñ àñ Î/Ö éŕŕöŕ šţöþþéđ ţĥé ƒîñàļ ŕéñàḿéš àƒţéŕ šöḿé ƒîļéš ļàñđéđ, öŕ à šţöŕé ŕéƒüšéđ à đéçîšîöñ öŕ àñ àššéţ öþéŕàţîöñ àƒţéŕ ţĥé çöñţéñţ ļàñđéđ), à ŕéçöŕđ îđ, öñé éñţŕý þéŕ ƒîļé ŵŕîţţéñ öŕ ŕéàđ ŵîţĥ îţš ĥöḿé, îţš đîĝéšţš ƃéƒöŕé àñđ àƒţéŕ àñđ ŵĥéţĥéŕ îţ ŵàš ŵŕîţţéñ, àñđ öñé ŕéšüļţ þéŕ öþéŕàţîöñ. Àñ öþéŕàţîöñ'š šţàţüš îš applied, unchanged (îţš if_match ĥöļđš àñđ ţĥé éđîţîöñ àļŕéàđý šàýš ŵĥàţ îţ šéñđš), refused, not_applied (ƃļöçķéđ ƃý àñöţĥéŕ öþéŕàţîöñ'š ŕéƒüšàļ) öŕ previewed; îţ çàŕŕîéš îţš ŕéṽîšîöñš, ţĥé þöšîţîöñš îţ ŕéšöļṽéđ, ţĥé đéŕîṽéđ éđîţîöñš îţ ļéƒţ öñ àñ öļđéŕ ƃàšîš (invalidates), àñđ öñ à ŕéƒüšàļ àñ éŕŕöŕ ƒŕöḿ à çļöšéđ šéţ öƒ çöđéš, éàçĥ ḿàþþéđ öñçé ţö àñ éẋîţ çöđé àñđ àñ ĤŢŢÞ šţàţüš (Code.ExitCode, Code.HTTPStatus):

ÇöđéḾéàñšÉẋîţĤŢŢÞ
invalidţĥé çĥàñĝé šéţ đöéš ñöţ đéçöđé, ƒàîļš îţš šçĥéḿà öŕ çöñţŕàđîçţš îţšéļƒ2400
not_foundà ŕéƒéŕéñçé ŕéšöļṽéš ţö ñö đöçüḿéñţ, ƃļöçķ öŕ éđîţîöñ, öŕ à find ḿàţçĥéš ñöţĥîñĝ3404
ambiguousà ķéý öŕ à find ḿàţçĥéš ḿöŕé ţĥàñ öñé ţĥîñĝ3409
staleàñ if_match ƒàîļš ţö ĥöļđ, öŕ üñđéŕ require_basis ţĥé ƃàšîš ḿöṽéđ3409
doc_changedţĥé đöçüḿéñţ çĥàñĝéđ üñđéŕ ţĥé çöḿḿîţ àñđ öñé ḿöŕé þàšš çöüļđ ñöţ šéţţļé îţ3409
guardţĥé ŕéšüļţ ƃŕéàķš àñ îñļîñé çöđé, à þļüŕàļ öŕ šéļéçţ, öŕ à þöšîţîöñ (šüƃçöđé codes_changed, structure_lost, bad_position öŕ overlap)3422
gate_failedţĥé çöḿḿîţ çĥéçķ ƒöüñđ à ƒàîļîñĝ ƒîñđîñĝ ţĥé çĥàñĝé îñţŕöđüçéš3422
unsupportedţĥé ƒöŕḿàţ, ţĥé éđîţîöñ öŕ ţĥé ĥöḿé ļàçķš ţĥé çàþàƃîļîţý ţĥé öþéŕàţîöñ ñééđš3422
not_permittedţĥé þöļîçý ŕéƒüšéš ţĥé öþéŕàţîöñ ţö îţš šéñđéŕ3403
budget_exceededà ŕéšöüŕçé ƃöüñđ ŵàš ŕéàçĥéđ3413
unreachableà ƃàçķéñđ đîđ ñöţ àñšŵéŕ5503

À ŕéƒüšéđ öþéŕàţîöñ ŕéþöŕţš ñö ŕéṽîšîöñ öŕ þöšîţîöñ, šîñçé ñöţĥîñĝ ŵàš ŵŕîţţéñ; à çĥàñĝé šéţ ŕéƒüšéđ àƒţéŕ îţš đöçüḿéñţš ŵéŕé ŕéàđ ļîšţš éàçĥ ŵîţĥ written: false. À ŕéšöļṽéđ þöšîţîöñ þŕîñţš îţš ŕüñ àñđ îţš öƒƒšéţ, à žéŕö öƒƒšéţ îñçļüđéđ. Éàçĥ đöçüḿéñţ çàŕŕîéš ţĥé ƒîñđîñĝš ţĥé éđîţ îñţŕöđüçéđ, ƒàîļîñĝ öŕ ñöţ (change.NewFindings), éàçĥ ŵîţĥ ţĥé ŕàñĝé îţ ƒöüñđ ŵĥéŕé ţĥé ŕüļé ļöçàţéš öñé àñđ, ƒöŕ à ţéŕḿ ŕüļé, ţĥé ŵöŕđîñĝ îţ àšķš ƒöŕ: àñ éḿþţý ļîšţ ŵĥéñ ţĥé çĥéçķ ŕàñ àñđ ƒöüñđ ñöţĥîñĝ, àñđ ñöñé ŵĥéŕé ñö çĥéçķ àþþļîéš. À gate_failed ŕéƒüšàļ çöüñţš ţĥé ƒàîļîñĝ ƒîñđîñĝš àñđ ļéàṽéš ţĥéḿ öñ ţĥé đöçüḿéñţ. À find ţĥàţ ḿàţçĥéš ñöţĥîñĝ îš ŕéƒüšéđ not_found ŵîţĥ ţĥé þàţĥ àñđ ţĥé ţéẋţ îţ šéàŕçĥéđ àñđ üþ ţö ţĥŕéé çàñđîđàţéš. Îñ à partial ŕéšüļţ ţĥé öþéŕàţîöñš öñ ţĥé ƒîļéš ţĥàţ ŵéŕé ñöţ ŵŕîţţéñ àŕé not_applied, àñđ šö àŕé ţĥé đéçîšîöñš àñđ àššéţ öþéŕàţîöñš, ŵĥîçĥ ŵàîţ ƒöŕ çöñţéñţ ţĥàţ àļļ ļàñđéđ; ţĥé ŕéçöŕđ ĥöļđš ŵĥàţ đîđ. À stale ŕéƒüšàļ çàŕŕîéš ţĥé éđîţîöñ àš îţ šţàñđš, šö ţĥé šéñđéŕ çàñ ŕéƃàšé ŵîţĥöüţ àñöţĥéŕ ŕéàđ. À ŕéšöüŕçé ƃöüñđ core/safeio ŕéþöŕţš îš budget_exceeded. À çĥàñĝé šéţ ŕéƒüšéđ ƃéƒöŕé àñý öþéŕàţîöñ îš çöñšîđéŕéđ, ƃéçàüšé îţ đöéš ñöţ đéçöđé öŕ ţĥé ŕéǫüéšţ çàŕŕýîñĝ îţ îš ŕéƒüšéđ, îš àñšŵéŕéđ ŵîţĥ ţĥé šàḿé ŕéšüļţ šĥàþé (change.ErrorResult): šţàţüš refused, ñö ŕéçöŕđ, ñö ƒîļéš öŕ öþéŕàţîöñš, àñđ ţĥé éŕŕöŕ. kapi apply --json þŕîñţš ţĥàţ ŕéšüļţ ƒöŕ à çĥàñĝé šéţ ţĥàţ đöéš ñöţ đéçöđé öŕ çöñţŕàđîçţš îţšéļƒ, àñđ éẋîţš 2, àš ḾÇÞ àñđ ţĥé ƃŕöŵšéŕ àñšŵéŕ öñé.

Çöñšéǫüéñçéš​

  • À šéñđéŕ àļŵàýš ļéàŕñš ŵĥéţĥéŕ îţš çĥàñĝé ļàñđéđ àñđ, ŵĥéñ îţ đîđ ñöţ, ŵĥîçĥ öƒ à ƒéŵ ţĥîñĝš ţö đö ñéẋţ: ŕéţàŕĝéţ, ŕé-ŕéàđ àñđ ŕéšéñđ, ƒîẋ ţĥé çöñţéñţ, öŕ àšķ à þéŕšöñ.
  • Çöñçüŕŕéñţ ķàþî ŵŕîţéŕš öƒ öñé ƒîļé ļöšé ñöţĥîñĝ: éàçĥ ƒîļé à çĥàñĝé ŕéàđš îš ĥàšĥéđ ƃéƒöŕé ţĥé ŕéàđ àñđ àĝàîñ üñđéŕ ţĥé ļöçķ. Ţĥé ļöçķ öŕđéŕš ķàþî'š öŵñ þŕöçéššéš, àñđ îñ ţĥé ƃŕöŵšéŕ, ŵĥîçĥ ŕüñš öñé, ţĥé çàļļš öƒ ţĥé þàĝé; àñ éđîţöŕ ţĥàţ šàṽéš ƃéţŵééñ ţĥé ŕé-ĥàšĥ àñđ ţĥé ŕéñàḿé ŕéḿàîñš à çöñƒļîçţ ţĥé ñéẋţ ŕéàđ šééš.
  • Àñ öþéŕàţîöñ ŕéþöŕţéđ applied ŕéàçĥéđ ţĥé ƒîļé. Öñé ţĥé ƒöŕḿàţ ĥàš ñö þļàçé ƒöŕ îñ ţĥàţ ƒîļé îš ŕéƒüšéđ.
  • Ƃýţéš ķàþî çöüļđ ñöţ ŕéàđ àš ÜŢƑ-8, îñ à ƒîļé îñ àñöţĥéŕ éñçöđîñĝ, àŕé ñéṽéŕ öṽéŕŵŕîţţéñ ŵîţĥ ţĥé Ü+ƑƑƑĐ à ŕéàđ šĥöŵš ƒöŕ ţĥéḿ: àñ éđîţ ţĥàţ ŵöüļđ ŵŕîţé îţ ţĥéŕé îš ŕéƒüšéđ àš unsupported, àñđ éđîţš éļšéŵĥéŕé îñ ţĥé ƒîļé ķééþ ţĥéḿ.
  • À çĥàñĝé šéţ îš àļļ öŕ ñöţĥîñĝ àçŕöšš đöçüḿéñţš üþ ţö ţĥé ƒîñàļ ŕéñàḿéš. Ŕéçöŕđš ƒöļļöŵ ţĥé çöḿḿîţ, šö à ŕéçöŕđ ţĥàţ ƒàîļš ţö ŵŕîţé ļéàṽéš çöñţéñţ ţĥàţ ţĥé ñéẋţ ŕéàđ ƒîñđš àñđ ŕéçöŕđš àš öƃšéŕṽéđ.
  • À šüŕƒàçé ţĥàţ àđđš à ŵŕîţé þàţĥ àđđš à ĥöḿé öŕ à ĥööķ, àñđ ţĥé çöñţŕàçţ, ţĥé àþþļîéŕ àñđ ţĥé ŕüļéš šţàý öñé.

Ŕéļàţéđ​