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

Ţĥé ƒîļé ĥöḿé: core/change/filehome

Ţĥé ƒîļé ĥöḿé îš ţĥé ĥöḿé öƒ ţĥé çĥàñĝé šéŕṽîçé (É-09) ƒöŕ đöçüḿéñţš ķéþţ àš ƒîļéš îñ à ŵöŕķîñĝ ţŕéé. Ţĥîš ñöţé çöṽéŕš ĥöŵ îţ ļöçàţéš à đöçüḿéñţ, ĥöŵ à šţàĝé ŕéàđš àñđ ŵŕîţéš îţ, ĥöŵ îţ àđđš àñđ ŕéḿöṽéš ƃļöçķš, ĥöŵ îţ ţŕéàţš à ƃîļîñĝüàļ ƒîļé, ĥöŵ à çöḿḿîţ šéţţļéš àĝàîñšţ öţĥéŕ ŵŕîţéŕš, ĥöŵ éđîţîöñš îñ ƒîļéš öƒ ţĥéîŕ öŵñ, àñđ éđîţîöñš ţĥé ŵöŕķšþàçé ĥöḿé ķééþš üñţîļ ţĥéîŕ ƒîļé éẋîšţš, àŕé ĵöîñéđ àñđ ŵŕîţţéñ, ĥöŵ îţ çöḿḿîţš à đöçüḿéñţ à ŕüñ þŕöđüçéđ ŵĥöļé, àñđ ţĥé ţéšţš ţĥàţ ĥöļđ îţ ţö ţĥé çöñţŕàçţ.

Ļöçàţîñĝ à đöçüḿéñţ​

filehome.New(layout, options) ƃüîļđš ţĥé ĥöḿé öṽéŕ à Layout, ŵĥîçĥ ŕéšöļṽéš à ŕéƒéŕéñçé îñţö à filehome.Doc: ţĥé çàñöñîçàļ ŕéƒéŕéñçé, ţĥé ƒîļé öñ đîšķ (öŕ ţĥé àŕçĥîṽé àñđ îţš ḿéḿƃéŕ ƒöŕ container!entry), à Binding ţĥàţ öþéñš ţĥé ƒöŕḿàţ'š ŕéàđéŕ àñđ ŵŕîţéŕ éàçĥ çöñƒîĝüŕéđ ƒöŕ ţĥé đöçüḿéñţ, ţĥé šöüŕçé ļöçàļé àñđ éñçöđîñĝ, ŵĥéţĥéŕ ţĥé ƒöŕḿàţ ĥöļđš éđîţîöñš îñ ţĥé ƒîļé, àñđ à ƒüñçţîöñ ţĥàţ ñàḿéš ţĥé ƒîļé öƒ éàçĥ éđîţîöñ ķéþţ îñ à ƒîļé öƒ îţš öŵñ.

filehome.DirLayout šéŕṽéš à đîŕéçţöŕý ŵîţĥ ñö ŕéçîþé: ŕéƒéŕéñçéš ŕéšöļṽé üñđéŕ îţš ŕööţ ŵîţĥ filehome.ResolvePath, ŵĥîçĥ ŕéƒüšéš à þàţĥ ţĥàţ ļéàṽéš ţĥé ŕööţ àñđ çöñƒîñéš àñ àŕçĥîṽé ḿéḿƃéŕ ţö àñ àŕçĥîṽé üñđéŕ îţ, àñđ ţĥé ƒöŕḿàţ îš ţĥé öñé đéţéçţîöñ ƒîñđš. Ţĥé ķàþî ĥöšţ šüþþļîéš à þŕöĵéçţ ļàýöüţ (host/changes.go) ţĥàţ ŕéàđš éàçĥ šöüŕçé ƒîļé ŵîţĥ ţĥé ƒöŕḿàţ àñđ çöñƒîĝüŕàţîöñ îţš çöñţéñţ îţéḿ đéçļàŕéš, ḿàþš éàçĥ ţàŕĝéţ ƒîļé ƃàçķ ţö ţĥé šöüŕçé àñđ ļöçàļé îţ ĥöļđš, àñđ ñàḿéš à šöüŕçé'š ţàŕĝéţ ƒîļéš ţĥŕöüĝĥ ţĥé ŕéçîþé'š ţàŕĝéţ ţéḿþļàţé. À ŕéƒéŕéñçé ţö à šöüŕçé ƒîļé ŕéšöļṽéš öñ îţš öŵñ, ţĥŕöüĝĥ ţĥé ŕüļé ţĥàţ ñàḿéš ţĥé îţéḿ çļàîḿîñĝ à þàţĥ (ProjectContext.ResolvePaths), šö ļöçàţîñĝ îţ çöšţš ţĥé šàḿé îñ àñý šîžé öƒ þŕöĵéçţ; ţĥé ŕéçîþé'š çöñţéñţ þàţţéŕñš àŕé éẋþàñđéđ öñçé þéŕ šéŕṽîçé, àñđ öñļý ƒöŕ à ŕéƒéŕéñçé ţĥàţ ñàḿéš ñö šöüŕçé ƒîļé, šüçĥ àš ţĥé ƒîļé öƒ à ţŕàñšļàţîöñ. Ţĥé ļàýöüţ'š šöüŕçé ļöçàļé îš ţĥé öñé îţš çàļļéŕ ñàḿéš (ChangeServiceOptions.SourceLocale), éļšé ţĥé ŕéçîþé'š: ţĥé ḾÇÞ šéŕṽéŕ ŕéšöļṽéš îţ þéŕ çàļļ, ƃéçàüšé öñé šéŕṽéŕ šéŕṽéš šéṽéŕàļ þŕöĵéçţš. À šöüŕçé çöđé ƒîļé ŵĥöšé çöḿḿéñţš ķàþî ŕéàđš, àñđ ţĥàţ ñö ƒöŕḿàţ ŕéàđš, îš ŕéƒüšéđ àš unsupported ŵîţĥ ţĥé çàþàƃîļîţý comment.

À šţàĝé​

Session.Stage ḿàķéš öñé þàšš öṽéŕ ţĥé đöçüḿéñţ:

  1. Îţ ĥàšĥéš ţĥé ƒîļé (sha256: öṽéŕ ţĥé ƃýţéš öñ đîšķ; ƒöŕ àñ àŕçĥîṽé ḿéḿƃéŕ, öṽéŕ ţĥé ŵĥöļé àŕçĥîṽé), àñđ ţĥéñ éàçĥ ƒîļé öƒ àñ éđîţîöñ ţĥé çĥàñĝé àđđŕéššéš ţĥàţ ļîṽéš îñ à ƒîļé öƒ îţš öŵñ. Éṽéŕý ƒîļé îš ĥàšĥéđ ƃéƒöŕé îţ îš ŕéàđ, šö à ŵŕîţéŕ ţĥàţ çöḿḿîţš ƃéţŵééñ ţĥé ŕéàđ àñđ ţĥé çöḿḿîţ ļéàṽéš ţĥé ƒîļé àţ àñöţĥéŕ đîĝéšţ ţĥàñ ţĥé öñé ŕéçöŕđéđ.
  2. Ŵĥéñ ţĥé çĥàñĝé àđđš öŕ ŕéḿöṽéš ƃļöçķš, îţ ĥàš ţĥé ƒöŕḿàţ'š ŵŕîţéŕ ŵŕîţé ţĥöšé éđîţš ƒîŕšţ, àñđ ţĥé ŕéšţ öƒ ţĥé þàšš ŕéàđš ţĥé ŕéšüļţ (šéé Àđđîñĝ àñđ ŕéḿöṽîñĝ ƃļöçķš).
  3. Îţ ĵöîñš ţĥöšé éđîţîöñš ţö ţĥé đöçüḿéñţ (šéé ƃéļöŵ).
  4. Îţ ŕéàđš ţĥé đöçüḿéñţ ţĥŕöüĝĥ ţĥé ƃîñđîñĝ'š ŕéàđéŕ ŵîţĥ ţĥé ŵŕîţéŕ'š šķéļéţöñ šţöŕé ŵîŕéđ, ţĥé ŕéàđ éṽéŕý ŕéàđ þàţĥ öƒ ţĥé šéŕṽîçé ḿàķéš, šö ţĥé ƃļöçķš àñ éđîţ îš àđđŕéššéđ ƒŕöḿ àŕé ţĥé ƃļöçķš ţĥé ŵŕîţé šééš. À ŕéàđ ţĥàţ ŵŕîţéš ñöţĥîñĝ ŵîŕéš à šţöŕé ţĥàţ ķééþš ñöţĥîñĝ (format.NewWiredReadSkeleton), šö îţ çŕéàţéš ñö ƒîļé. À ƃļöçķ ţĥé ŕéàđéŕ ļéƒţ ŵîţĥ ñö ļàñĝüàĝé ĝéţš ţĥé đöçüḿéñţ'š, šö îţš öŵñ éđîţîöñ àñšŵéŕš ţö ţĥàţ ļàñĝüàĝé àš ŵéļļ àš ţö ţĥé éḿþţý éđîţîöñ ķéý.
  5. Îţ þàššéš éṽéŕý ƃļöçķ ţö ţĥé šéŕṽîçé'š éđîţöŕ, ŵĥîçĥ àþþļîéš ţĥé öþéŕàţîöñš àđđŕéššéđ ţö îţ àñđ ŕéþöŕţš ţĥé éđîţîöñš îţ çĥàñĝéđ.
  6. Ŵĥéñ ţĥé çĥàñĝé ŵŕîţéš ţĥé đöçüḿéñţ'š öŵñ ƒîļé, îţ ŵŕîţéš ţĥé ŕéšüļţ ţĥŕöüĝĥ ţĥé šàḿé ƒöŕḿàţ'š ŵŕîţéŕ îñţö à ţéḿþöŕàŕý ƒîļé ƃéšîđé ţĥé đöçüḿéñţ (atomicfile.StageWithParents), ŵîţĥ ţĥé ḿöđé ţĥé đöçüḿéñţ ĥàš àñđ ţĥé šýḿļîñķ ŕéšöļṽéđ, ĥàšĥîñĝ ţĥé ƃýţéš àš ţĥéý àŕé ŵŕîţţéñ. À ŵŕîţéŕ ţĥàţ ŕé-ŕéàđš ţĥé öŕîĝîñàļ ĝéţš ţĥé đöçüḿéñţ'š þàţĥ; öñé ţĥàţ ñééđš îţš ƃýţéš ĝéţš ţĥéḿ.

Ŵĥéñ ţĥé ŕéàđéŕ àñđ ţĥé ŵŕîţéŕ ƃöţĥ šţŕéàḿ (format.StreamingReader àñđ format.StreamingWriter) àñđ ţĥé ŵŕîţéŕ ñééđš ñö çöþý öƒ ţĥé öŕîĝîñàļ, ţĥé ŕéàđ àñđ ţĥé ŵŕîţé ŕüñ çöñçüŕŕéñţļý ţĥŕöüĝĥ à šţŕéàḿîñĝ šķéļéţöñ šţöŕé, šö ñéîţĥéŕ ţĥé îñþüţ ñöŕ ţĥé ƃļöçķ šţŕéàḿ îš ĥéļđ ŵĥöļé. Àñý öţĥéŕ þàîŕ ŕéàđš éṽéŕý þàŕţ àñđ ţĥéñ ŵŕîţéš ţĥéḿ. Ţĥé éđîţöŕ ķééþš öñļý ţĥé ƃļöçķš îţ çĥàñĝéđ. À þàšš ţĥàţ çĥàñĝéš ñöţĥîñĝ îñ ţĥé đöçüḿéñţ'š öŵñ éđîţîöñ đîšçàŕđš ţĥé ţéḿþöŕàŕý ƒîļé àñđ ŕéþöŕţš ţĥé ƒîļé àš ŕéàđ.

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

Àñ àŕçĥîṽé ḿéḿƃéŕ îš ŕéàđ ƒŕöḿ îţš ƃýţéš, ŵŕîţţéñ ţö à ƃüƒƒéŕ, àñđ šþļîçéđ îñţö à çöþý öƒ ţĥé àŕçĥîṽé (container.Transform) šţàĝéđ ƃéšîđé îţ, éṽéŕý öţĥéŕ ḿéḿƃéŕ çöþîéđ àš îţ ŵàš. Ţŵö ḿéḿƃéŕš öƒ öñé àŕçĥîṽé îñ öñé çĥàñĝé šéţ àŕé ŕéƒüšéđ àš invalid: éàçĥ ŵöüļđ šţàĝé à çöþý öƒ ţĥé àŕçĥîṽé ƒŕöḿ ŵĥàţ îţ ŕéàđ.

À ƃîļîñĝüàļ ƒîļé​

À ƒöŕḿàţ ţĥàţ ĥöļđš îţš ţŕàñšļàţîöñš îñ ţĥé đöçüḿéñţ, šüçĥ àš ÞÖ, ẊĻÎƑƑ öŕ ŢḾẊ, ķééþš öñé ţŕàñšļàţîöñ þéŕ ļàñĝüàĝé, šö àñ éđîţîöñ ŵîţĥ à ţöñé öŕ à çĥàññéļ ĥàš ñö þļàçé îñ îţ àñđ îš ŕéƒüšéđ àš unsupported. Šöḿé ŕéàđéŕš ḿöđéļ à ţŕàñšļàţîöñ öñļý ŵĥéñ ţöļđ îţš ļàñĝüàĝé: à ÞÖ çàţàļöĝ'š msgstr ŕéàđš àš ţĥé Ƒŕéñçĥ éđîţîöñ öñļý ŵĥéñ ţĥé ŕéàđéŕ îš ĝîṽéñ fr. Ţĥé ļàýöüţ ĝîṽéš îţ àš Doc.TargetLocale (ţĥé ĥöšţ ţàķéš --target-lang), àñđ éṽéŕý þàšš öṽéŕ ţĥé ƒîļé ĥàñđš îţ ţö ţĥé ŕéàđéŕ àñđ ţö ţĥé ŵŕîţéŕ. Ŵîţĥöüţ îţ ţĥé çàţàļöĝ'š ţŕàñšļàţîöñ îš ñöţ àñ éđîţîöñ à ŕéàđ šĥöŵš, àñđ àñ éđîţ öƒ îţ çĥàñĝéš ñö ƃýţé, šö îţ îš ŕéƒüšéđ. Îñ à þŕöĵéçţ, à ƃîļîñĝüàļ šöüŕçé ŵĥöšé çöļļéçţîöñ ñàḿéš à ţàŕĝéţ ĥöļđš ñö ţŕàñšļàţîöñ öƒ îţš öŵñ: ţĥé ĥöšţ'š ļàýöüţ ĝîṽéš îţ öñé ƒîļé þéŕ éđîţîöñ àñđ ñö TargetLocale, ŵĥàţéṽéŕ ļàñĝüàĝé îţš çàļļéŕ ŵàš ţöļđ, šö ţĥé Ƒŕéñçĥ öƒ po/en.po, öŕ öƒ ţĥé ţéḿþļàţé po/messages.pot, ŵîţĥ ţàŕĝéţ po/{lang}.po îš ŕéàđ ƒŕöḿ àñđ ŵŕîţţéñ ţö po/fr.po.

À šţàĝé ţĥàţ ŕéḿöṽéš à ţŕàñšļàţîöñ ţĥé ƒîļé ĥöļđš ŕéàđš ţĥé šţàĝéđ ƃýţéš ƃàçķ ţĥŕöüĝĥ ţĥé ƒöŕḿàţ'š ŕéàđéŕ (verifyRemoved) àñđ ŕéƒüšéš ţĥé ŕéḿöṽàļ àš unsupported ŵîţĥ çàþàƃîļîţý remove_edition ŵĥéñ ţĥé ţŕàñšļàţîöñ îš šţîļļ ţĥéŕé. À ţŕàñšļàţîöñ ķéþţ îñ à ƃîļîñĝüàļ ƒîļé öƒ îţš öŵñ (fr/messages.po, öŕ x/fr.xlf üñđéŕ à ţàŕĝéţ ţéḿþļàţé) îš ŕéḿöṽéđ ƒŕöḿ îţš þàŕţñéŕ ƃļöçķ ţĥéŕé àñđ ŕéàđ ƃàçķ ţĥé šàḿé ŵàý, îñ ţĥé éđîţîöñ'š ļàñĝüàĝé (verifyEditionRemoved). À ÞÖ çàţàļöĝ ŵŕîţéš ţĥé éñţŕý ŵîţĥ àñ éḿþţý msgstr, ŵĥîçĥ ŕéàđš àš ñö ţŕàñšļàţîöñ; ţĥé ẊĻÎƑƑ 1.2, ẊĻÎƑƑ 2 àñđ ŢḾẊ ŵŕîţéŕš, ŵĥîçĥ ƒöļļöŵ ţĥé Öķàþî ƒîļţéŕš, ŵŕîţé à ţŕàñšļàţîöñ öƒ éṽéŕý üñîţ àñđ ţàķé ţĥé šöüŕçé ŵĥéŕé ţĥé ƃļöçķ ĥöļđš ñöñé, šö à ŕéḿöṽàļ ţĥéŕé îš ŕéƒüšéđ ŕàţĥéŕ ţĥàñ ŵŕîţé ţĥé šöüŕçé îñ ţĥé ţŕàñšļàţîöñ'š þļàçé. Ţĥéîŕ đéšçŕîþţîöñ ļîšţš remove_edition ƒöŕ éàçĥ ƃļöçķ àļļ ţĥé šàḿé, ƃéçàüšé change.BaseOps ĝîṽéš îţ ţö éṽéŕý îñţéŕçĥàñĝé ƒöŕḿàţ àñđ ñö ŵŕîţéŕ đéçļàŕéš ţĥàţ îţ çàññöţ ŕéḿöṽé öñé. Àñ àŕçĥîṽé ḿéḿƃéŕ îš ñöţ ŕéàđ ƃàçķ, àñđ ñéîţĥéŕ îš à ƒļöŵ'š öüţþüţ: kapi exec remove-target ŵŕîţîñĝ àñ ẊĻÎƑƑ ţŕàñšļàţîöñ ţĥŕöüĝĥ ţĥé ŵŕîţéŕ ĝéţš ţĥé šöüŕçé îñ ţĥé ŕéḿöṽéđ ţŕàñšļàţîöñ'š þļàçé.

À çöḿḿîţ​

Staged.LockKeys ñàḿéš ţĥé ļöçķ ƒîļé öƒ éṽéŕý ƒîļé ţĥé šţàĝé ŕéàđš öŕ çĥàñĝéš, àñđ Staged.Lock ţàķéš öñé. Ţĥé šéŕṽîçé ţàķéš ţĥé ļöçķš öƒ éṽéŕý đöçüḿéñţ öƒ à çĥàñĝé šéţ îñ ţĥé öŕđéŕ öƒ ţĥéîŕ ķéýš, ţĥéñ çàļļš Staged.Settle öñ éàçĥ, ŵĥîçĥ ĥàšĥéš éàçĥ ƒîļé àĝàîñ.

  • Éṽéŕý ƒîļé šţîļļ ĥàš ţĥé đîĝéšţ ţĥé šţàĝé ŕéàđ: ţĥé šţàĝéđ ƒîļéš àŕé ŕéñàḿéđ àš ţĥéý àŕé.
  • À ƒîļé ḿöṽéđ: àñöţĥéŕ ķàþî þŕöçéšš çöḿḿîţţéđ ƒîŕšţ, öŕ à þéŕšöñ šàṽéđ. Ţĥé ĥöḿé ḿàķéš ţĥé šţàĝé'š þàšš àĝàîñ üñđéŕ ţĥé ļöçķš, öṽéŕ ţĥé ƒîļéš àš ţĥéý ñöŵ šţàñđ, ŵîţĥ ţĥé éđîţöŕ šţàŕţîñĝ àƒŕéšĥ. Àñ öþéŕàţîöñ ŵĥöšé if_match ţĥé ñéŵ çöñţéñţ ƃŕéàķš îš ŕéƒüšéđ àš stale ŵîţĥ ţĥé çöñţéñţ îţ ƒöüñđ, àñđ ţĥé çĥàñĝé šéţ îš ŕéƒüšéđ. Öţĥéŕŵîšé ţĥé ñéŵ ŕéšüļţ îš šţàĝéđ, ţĥé šéŕṽîçé ŕüñš îţš çĥéçķš öṽéŕ ţĥàţ þàšš, àñđ ţĥé ƒîļéš àŕé ĥàšĥéđ öñçé ḿöŕé; à ƒîļé ţĥàţ ḿöṽéđ đüŕîñĝ ţĥàţ þàšš àš ŵéļļ îš ŕéƒüšéđ àš doc_changed.

Staged.Commit ŕéñàḿéš éàçĥ šţàĝéđ ƒîļé öñţö îţš ţàŕĝéţ àñđ ḿàŕķš îţ ŵŕîţţéñ, šö à ŕéñàḿé ţĥàţ ƒàîļš àƒţéŕ àñöţĥéŕ ļàñđéđ ļéàṽéš à partial ŕéšüļţ ţĥàţ ñàḿéš ţĥé ƒîļéš ŵŕîţţéñ. Staged.Release ŕéḿöṽéš ŵĥàţ ŵàš šţàĝéđ àñđ đŕöþš ţĥé ļöçķš; ţĥé šéŕṽîçé ŕéļéàšéš ţĥéḿ öñçé ţĥé đéçîšîöñš àñđ àššéţ öþéŕàţîöñš öƒ ţĥé çĥàñĝé šéţ àŕé àþþļîéđ àñđ ţĥé çĥàñĝé ŕéçöŕđéđ. Ţĥé šéŕṽîçé šéţţļéš éṽéŕý đöçüḿéñţ öƒ à çĥàñĝé šéţ ƃéƒöŕé îţ çöḿḿîţš àñý, šö à ŕéƒüšàļ ƒöüñđ àţ šéţţļé ţîḿé ļéàṽéš éṽéŕý đöçüḿéñţ àš îţ ŵàš.

Ţĥé ļöçķ îš core/storage/filelock: flock(2) öñ Üñîẋ àñđ LockFileEx öñ Ŵîñđöŵš, öñ à ļöçķ ƒîļé öƒ îţš öŵñ ñàḿéđ ƒöŕ ţĥé ƒîļé'š ŕéšöļṽéđ þàţĥ, šö ţŵö ļîñķš ţö öñé ƒîļé šĥàŕé îţ. Ţĥé ƃŕöŵšéŕ ƃüîļđ ĥàš ñéîţĥéŕ àñđ ŕüñš öñé þŕöçéšš, šö ţĥéŕé éṽéŕý ļöçķ öñ öñé þàţĥ ţàķéš öñé ḿüţéẋ öƒ ţĥé þŕöçéšš, àñđ ţŵö çàļļš à þàĝé šţàŕţéđ àţ öñçé ţàķé ţüŕñš àţ ţĥé çöḿḿîţ àš ţŵö þŕöçéššéš đö ñàţîṽéļý. Îñšîđé à þŕöĵéçţ ţĥé ļöçķ ƒîļéš šîţ üñđéŕ .kapi/work/locks/. Ţĥé ĥöšţ þàššéš Options.PrepareLocks, ŵĥîçĥ ţĥé ĥöḿé ŕüñš öñçé, ƃéƒöŕé îţ ƒîŕšţ öþéñš à ļöçķ ƒîļé, ţö çŕéàţé ţĥé þŕöĵéçţ'š šţàţé đîŕéçţöŕý ŵîţĥ îţš îĝñöŕé ŕüļé àñđ ţö öþéñ ţĥé þŕöĵéçţ'š ŕéçöŕđéŕ, šö à çöḿḿîţ öƒ ţĥé ŵöŕķîñĝ ţŕéé ļéàṽéš ţĥé ļöçķ ƒîļéš öüţ, à ŕéçöŕđéŕ ţĥàţ çàññöţ ƃé öþéñéđ šţöþš ţĥé çöḿḿîţ ƃéƒöŕé àñýţĥîñĝ îš ŵŕîţţéñ, àñđ à ŕéàđ, ŵĥîçĥ ţàķéš ñö ļöçķ, ļéàṽéš ţĥé þŕöĵéçţ àš îţ ŵàš. kapi apply, ksed -i, ḾÇÞ, Ķàþî Đéšķţöþ àñđ ţĥé ƃŕöŵšéŕ éñĝîñé'š kapiApply àļļ éđîţ à ƒîļé öƒ à þŕöĵéçţ ţĥŕöüĝĥ ţĥé þŕöĵéçţ'š šéŕṽîçé, šö ţĥéý ţàķé öñé ļöçķ ƒîļé ƒöŕ îţ. Öüţšîđé à þŕöĵéçţ ţĥé ķàþî ĥöšţ ķééþš ţĥéḿ üñđéŕ locks îñ îţš đàţà đîŕéçţöŕý, šö éṽéŕý ķàþî þŕöçéšš öƒ ţĥé üšéŕ ƒîñđš ţĥé šàḿé ƒîļéš; à çàļļéŕ ţĥàţ ñàḿéš ñö đîŕéçţöŕý ĝéţš kapi-locks-<uid> îñ ţĥé ţéḿþöŕàŕý đîŕéçţöŕý. Ţĥé ĥöḿé çŕéàţéš ţĥé đîŕéçţöŕý ŵîţĥ ḿöđé 0700 àñđ ŕéƒüšéš öñé ţĥàţ öţĥéŕš ḿàý ŵŕîţé ţö, öŕ à ļîñķ, ŵĥîçĥ àñöţĥéŕ üšéŕ çöüļđ ĥàṽé ḿàđé îñ àđṽàñçé ţö ŕéđîŕéçţ ţĥé ļöçķ ƒîļéš. Ţĥé ļöçķ öŕđéŕš ķàþî'š þŕöçéššéš öñ öñé ḿàçĥîñé. Àñ éđîţöŕ šàṽîñĝ ƃéţŵééñ ţĥé šéçöñđ ĥàšĥ àñđ ţĥé ŕéñàḿé îš à çöñƒļîçţ ţĥé ļöçķ çàññöţ šéé; ţĥé ñéẋţ ŕéàđ ƒîñđš ţĥé çĥàñĝé.

Options.BackupSuffix, ŵĥéñ šéţ, ḿàķéš Staged.Commit çöþý éàçĥ ƒîļé îţ ŕéþļàçéš ţö ţĥé ƒîļé'š þàţĥ ŵîţĥ ţĥé šüƒƒîẋ àþþéñđéđ, ŵîţĥ ţĥé ƒîļé'š ḿöđé, ƃéƒöŕé ţĥé ŕéñàḿé. Ţĥé çöþý îš ḿàđé üñđéŕ ţĥé ļöçķ öñçé ţĥé ƒîļé îš ķñöŵñ ţö ĥöļđ ŵĥàţ ţĥé šţàĝé ŕéàđ, šö îţ ĥöļđš ţĥé ƃýţéš ţĥé çĥàñĝé ŵàš àþþļîéđ ţö; à ƒîļé ţĥé çĥàñĝé çŕéàţéš ĝéţš ñöñé. kapi apply --in-place=.bak àñđ ksed -i.bak šéţ îţ.

Options.BeforeSettle îš çàļļéđ àƒţéŕ à šţàĝé àñđ ƃéƒöŕé îţš ƒîŕšţ ļöçķ îš ţàķéñ. À ţéšţ šéţš îţ ţö ĥöļđ ţŵö ŵŕîţéŕš àţ à ƃàŕŕîéŕ öñçé ƃöţĥ ĥàṽé šţàĝéđ àĝàîñšţ ţĥé šàḿé çöñţéñţ. TestFileHome_PreparesTheLockDirectoryOnlyToCommit ŕéàđš à đöçüḿéñţ àñđ ƒîñđš ñö ļöçķ đîŕéçţöŕý, ţĥéñ çöḿḿîţš àñ éđîţ àñđ ƒîñđš PrepareLocks çàļļéđ ƒîŕšţ.

Éđîţîöñš îñ ƒîļéš öƒ ţĥéîŕ öŵñ​

Îñ à þŕöĵéçţ, ţĥé Ĝéŕḿàñ éđîţîöñ öƒ docs/guide.md îš à ƒîļé ţĥé ŕéçîþé'š ţàŕĝéţ ţéḿþļàţé ñàḿéš, ŕéàđ ḿöñöļîñĝüàļļý: îţš ƃļöçķš ĥöļđ Ĝéŕḿàñ àš ţĥéîŕ öŵñ çöñţéñţ. À ƒîļé ţĥé ļàýöüţ ḿàŕķš EditionFile.Bilingual (à ÞÖ çàţàļöĝ po/de.po ƃéšîđé ţĥé çàţàļöĝ po/en.po, à Ǫţ Ļîñĝüîšţ ƒîļé) îš à ţŕàñšļàţîöñ çàţàļöĝ îñ îţš öŵñ ŕîĝĥţ: îţ îš ŕéàđ ŵîţĥ ţĥé éđîţîöñ'š ļàñĝüàĝé, îţš ƃļöçķš ĥöļđ Ĝéŕḿàñ àš ţĥéîŕ ţŕàñšļàţîöñ, àñđ à üñîţ ŵîţĥ ñö ţŕàñšļàţîöñ ĥöļđš ñö éđîţîöñ. Ŵĥéñ à çĥàñĝé àđđŕéššéš àñ éđîţîöñ ķéþţ ţĥàţ ŵàý, ţĥé šţàĝé ƒîŕšţ ŕéàđš ţĥé đöçüḿéñţ öñçé ƒöŕ éàçĥ ƃļöçķ'š ķéý àñđ ţŕàñšļàţîöñ-îñṽàŕîàñţ àđđŕéšš, ţĥéñ ŕéàđš ţĥé éđîţîöñ'š ƒîļé àñđ þàîŕš îţš ƃļöçķš ŵîţĥ ţĥé đöçüḿéñţ'š (à ŕéàđ ţĥàţ ĵöîñš éđîţîöñš ŕéàđš ţĥé đöçüḿéñţ öñçé, ĥöļđîñĝ îţš ƃļöçķš ŵĥîļé îţ þàîŕš ţĥéḿ): ƃý ķéý, ţĥéñ ƃý àđđŕéšš (à ĥéàđîñĝ ŵŕîţţéñ àš îţš öŵñ îđéñţîţý, šö à šéçţîöñ þàîŕš àçŕöšš ļàñĝüàĝéš), ţĥéñ ƃý þöšîţîöñ ŵĥéñ ƃöţĥ ƒîļéš ĥöļđ ţĥé šàḿé ñüḿƃéŕ öƒ ƃļöçķš. À ḿöñöļîñĝüàļ ƒîļé ŵĥöšé ķéýš àļļ šîţ üñđéŕ à ŕööţ ñàḿéđ ƒöŕ îţš ļàñĝüàĝé, ŵĥéŕé ţĥé đöçüḿéñţ'š šîţ üñđéŕ öñé ñàḿéđ ƒöŕ ţĥé đöçüḿéñţ'š (à Ŕàîļš çàţàļöĝ, en: îñ ţĥé đöçüḿéñţ àñđ de: îñ ţĥé Ĝéŕḿàñ ƒîļé), þàîŕš ƃý ķéý ƃéļöŵ ţĥé ŕööţ, šö à ţŕàñšļàţîöñ öñé öƒ ţĥéḿ ļàçķš ļéàṽéš ţĥé ŕéšţ þàîŕéđ. Éàçĥ đöçüḿéñţ ƃļöçķ îš ĝîṽéñ ţĥé éđîţîöñ ƒŕöḿ îţš þàŕţñéŕ ŵĥîļé ţĥé éđîţöŕ šééš îţ, àñđ ĥàš îţ ŕéḿöṽéđ àĝàîñ ƃéƒöŕé ţĥé đöçüḿéñţ'š öŵñ ŵŕîţéŕ šééš ţĥé ƃļöçķ.

Àñ éđîţîöñ ţĥé éđîţöŕ çĥàñĝéđ îš ŵŕîţţéñ ţö îţš ƒîļé:

  • Ŵĥéñ ţĥé ƒîļé éẋîšţš, îţ îš ŕéàđ ţĥŕöüĝĥ îţš öŵñ šķéļéţöñ àñđ éàçĥ þàŕţñéŕ'š çöñţéñţ ŕéþļàçéđ (îţš ţŕàñšļàţîöñ, îñ à ƃîļîñĝüàļ ƒîļé, ŵŕîţţéñ îñ ţĥé éđîţîöñ'š ļàñĝüàĝé), šö éṽéŕý öţĥéŕ ƃýţé öƒ ţĥé ƒîļé šţàýš: à çöḿḿéñţ, à ĥéàđéŕ, öŕ à šéçţîöñ öñļý ţĥàţ ƒîļé ĥàš.
  • À ţŕàñšļàţîöñ çŕéàţéđ ƒöŕ à ƃļöçķ ţĥàţ ĥàš ñö þàŕţñéŕ îñ à ḿöñöļîñĝüàļ ƒîļé àŕŕîṽéš ŵîţĥ à ƃļöçķ öƒ îţš öŵñ, ŵĥîçĥ ţĥé ƒöŕḿàţ'š ŵŕîţéŕ àđđš ţö ţĥé šţàĝéđ ƃýţéš (restructureEditionFile, ţĥŕöüĝĥ format.StructureEditor.EditStructure, ţĥé çàļļ insert_block ḿàķéš): üñđéŕ ţĥé ķéý ţĥé ƒîļé ĝîṽéš îţš ķéýš (translateKey, šö à ƒîļé üñđéŕ de: ţàķéš ţĥé ķéý üñđéŕ de:), àƒţéŕ ţĥé þàŕţñéŕ öƒ ţĥé đöçüḿéñţ'š ñéàŕéšţ éàŕļîéŕ ƃļöçķ ŵĥéñ ţĥàţ þàŕţñéŕ šîţš îñ ţĥé šàḿé ḿàþþîñĝ, éļšé ƃéƒöŕé ţĥé ñéàŕéšţ ļàţéŕ öñé öñ ţĥé šàḿé ţéŕḿš, éļšé ļàšţ îñ ţĥé ḿàþþîñĝ îţš ķéý ñàḿéš. Ţĥé šţàĝéđ ƃýţéš àŕé ŕéàđ ƃàçķ, àñđ à ƃļöçķ ţĥàţ ŕéàđš öţĥéŕŵîšé ţĥàñ îţ ŵàš ĝîṽéñ ŕéƒüšéš ţĥé öþéŕàţîöñ (verifyCreated). Îñ à ƃîļîñĝüàļ ƒîļé, öŕ à ƒöŕḿàţ ŵĥöšé ŵŕîţéŕ àđđš ñö ƃļöçķ (Ḿàŕķđöŵñ, ĤŢḾĻ), šüçĥ àñ éđîţ îš ŕéƒüšéđ àš unsupported, ñàḿîñĝ ţĥé ƃļöçķ, ƃéçàüšé ŵŕîţîñĝ îţ ŵöüļđ ḿéàñ ŕéŵŕîţîñĝ ţĥé ƒîļé ƒŕöḿ ţĥé đöçüḿéñţ'š šķéļéţöñ.
  • Ŵĥéñ ţĥé ƒîļé đöéš ñöţ éẋîšţ ýéţ, îţ îš ŵŕîţţéñ ƒŕöḿ ţĥé đöçüḿéñţ'š šķéļéţöñ ŵîţĥ ţĥé ŵŕîţéŕ šéţ ţö ţĥé éđîţîöñ'š ļöçàļé, ţĥé ƃļöçķš ŵîţĥ ñö ţŕàñšļàţîöñ ƒàļļîñĝ ƃàçķ ţö ţĥé đöçüḿéñţ'š öŵñ ţéẋţ, àš kapi merge ŵŕîţéš à ţàŕĝéţ ƒîļé. Îţš đîŕéçţöŕý îš çŕéàţéđ ŵĥéñ ţĥé ƒîļé îš çöḿḿîţţéđ, šö à þŕéṽîéŵ, öŕ à çĥàñĝé šéţ ŕéƒüšéđ àƒţéŕ ţĥé šţàĝé, ļéàṽéš ñöñé.
  • À ŕéḿöṽàļ (remove_edition) ƒŕöḿ à ḿöñöļîñĝüàļ ƒîļé ţàķéš ţĥé þàŕţñéŕ ƃļöçķ öüţ öƒ ţĥé ƒîļé, šîñçé ţĥé ƃļöçķ îš ţĥé ţŕàñšļàţîöñ: ţĥé šţàĝéđ ƃýţéš àŕé ŕéàđ ƃàçķ ţĥŕöüĝĥ ţĥé ƒîļé'š ŕéàđéŕ, éàçĥ ƃļöçķ îš ƒöüñđ ţĥéŕé ƃý îţš ķéý (àñ éđîţ ƃéšîđé ţĥé ŕéḿöṽàļ çàñ ḿàķé ţĥé ŕéàđéŕ šķîþ àñ éàŕļîéŕ ƃļöçķ, à ÝÀḾĻ ṽàļüé ŵŕîţţéñ àš à ñüḿƃéŕ àḿöñĝ ţĥéḿ, ŵĥîçĥ ḿöṽéš éṽéŕý ƃļöçķ àƒţéŕ îţ), àñđ ţĥé ƒöŕḿàţ'š ŵŕîţéŕ ŕéḿöṽéš îţ (restructureEditionFile, ţĥé çàļļ delete_block ḿàķéš), ŵîţĥ ţĥé ŕéšüļţ šţàĝéđ îñ ţĥéîŕ þļàçé. change.BaseOps ļîšţš remove_edition ƒöŕ à ƒöŕḿàţ ţĥàţ ķééþš öñé éđîţîöñ þéŕ ƒîļé öñļý ŵĥéŕé îţš ŵŕîţéŕ đéçļàŕéš delete_block (ĴŠÖÑ, ÝÀḾĻ, ÀŔƂ). Ñö ƒîļé îš đéļéţéđ: à ĴŠÖÑ ţŕàñšļàţîöñ ŵĥöšé ļàšţ ķéý îš ŕéḿöṽéđ îš ŵŕîţţéñ àš {}.

À ŕéḿöṽàļ öŕ à çŕéàţîöñ ţĥé ŵŕîţéŕ çàññöţ ḿàķé (à ÝÀḾĻ šéǫüéñçé îţéḿ, ñàḿéđ ƃý îţš þöšîţîöñ; à ķéý à ṽàļüé ţĥàţ ŕéàđš àš ñö ƃļöçķ àļŕéàđý ĥöļđš; àñý ƃļöçķ öƒ à ƒöŕḿàţ ŵĥöšé ŵŕîţéŕ àđđš ñöñé) ŕéƒüšéš ţĥàţ öþéŕàţîöñ àļöñé, àš unsupported ñàḿîñĝ ţĥé ƃļöçķ àñđ ţĥé ƒîļé: ţĥé šţàĝé ĥàñđš ţĥé ŕéƒüšàļ ţö ţĥé šéŕṽîçé'š éđîţöŕ (change.EditionRefuser) àñđ ŕéţüŕñš change.ErrRefused, šö éṽéŕý öţĥéŕ öþéŕàţîöñ öƒ ţĥé çĥàñĝé šéţ îš not_applied, ƃļöçķéđ ƃý îţ, àš à ŕéƒüšàļ îñ ţĥé þàšš ļéàṽéš ţĥéḿ. Ţĥé ŕéàđ-ƃàçķš öƒ à ƃîļîñĝüàļ ƒîļé ŕéƒüšé à ŕéḿöṽàļ ţĥé šàḿé ŵàý.

Options.Materialize ŵŕîţéš éṽéŕý éđîţîöñ ƒîļé à çĥàñĝé ŵŕîţéš ţĥé šéçöñđ ŵàý, ƒŕöḿ ţĥé đöçüḿéñţ'š šķéļéţöñ, ŵĥéţĥéŕ öŕ ñöţ ţĥé ƒîļé éẋîšţš: éàçĥ ƃļöçķ çàŕŕîéš ţĥé éđîţîöñ ţĥé çĥàñĝé ĝàṽé îţ, éļšé ŵĥàţ îţš þàŕţñéŕ îñ ţĥé ƒîļé ĥéļđ, éļšé ţĥé đöçüḿéñţ'š öŵñ ţéẋţ. Ţĥé ƒîļé ţĥéñ ƒöļļöŵš ţĥé đöçüḿéñţ'š šţŕüçţüŕé, šö à ƃļöçķ ţĥé đöçüḿéñţ ĝàîñéđ šîñçé ţĥé ƒîļé ŵàš ŵŕîţţéñ ţàķéš îţš éđîţîöñ, àñđ à ƃļöçķ öñļý ţĥé ƒîļé ĥéļđ, öŕ à çöḿḿéñţ, îš ĝöñé. À ḿöñöļîñĝüàļ ƒîļé ŵĥöšé ƃļöçķš ĥàṽé šţöþþéđ þàîŕîñĝ öñé ţö öñé ŵîţĥ ţĥé đöçüḿéñţ'š îš ŵŕîţţéñ ţĥîš ŵàý éṽéñ ŵĥéñ ţĥé çĥàñĝé šéţ çĥàñĝéš ñö çöñţéñţ îñ îţ, àñđ à ŵŕîţé ţĥàţ ĝîṽéš ţĥé ƃýţéš ţĥé ƒîļé ĥöļđš îš đŕöþþéđ, šö ţĥé ƒîļé îš ŕéþöŕţéđ üñŵŕîţţéñ. À ƃîļîñĝüàļ ƒîļé ţĥàţ šţîļļ þàîŕš öñé ţö öñé ķééþš ţĥé ƒîŕšţ ŵàý, šö îţš ĥéàđéŕ (îţš ļàñĝüàĝé, îţš þļüŕàļ ŕüļé) àñđ îţš çöḿḿéñţš šţàý; öñçé ţĥé đöçüḿéñţ ĝàîñéđ öŕ ļöšţ à üñîţ îţ îš ŵŕîţţéñ ƒŕöḿ ţĥé đöçüḿéñţ'š šķéļéţöñ ţöö, ţĥé đöçüḿéñţ'š ĥéàđéŕ ŵîţĥ îţ. kapi merge, îţš ḿàţéŕîàļîžîñĝ ƒöŕḿ àñđ kapi pull ƃüîļđ ţĥéîŕ šéŕṽîçé ŵîţĥ îţ, ƃéçàüšé éàçĥ ŵŕîţéš à ŵĥöļé ţŕàñšļàţîöñ ŵĥéŕé ţĥé öţĥéŕ šüŕƒàçéš éđîţ öñé îñ þļàçé.

Àñ éđîţîöñ ŵîţĥ ñö ƒîļé ýéţ, šüçĥ àš à ĥéļđ-ƃàçķ ļöçàļé'š đŕàƒţš, îš ķéþţ ƃý à filehome.Keeper, ţĥé ŵöŕķšþàçé ĥöḿé (core/workhome). Ţĥé ļàýöüţ ḿàŕķš îţ EditionFile.Kept, ŵîţĥ ţĥé ƒîļé à đéļîṽéŕý ŵîļļ ŵŕîţé îţ ţö àš îţš Path. Ţĥé šţàĝé ĵöîñš ţĥé ķéþţ éđîţîöñ (Keeper.Edition, éàçĥ ƃļöçķ'š éđîţîöñ ƃý ţĥé đöçüḿéñţ'š ƃļöçķ ķéý) ţö ţĥé đöçüḿéñţ àš îţ ĵöîñš àñ éđîţîöñ ƒîļé, àñđ ĥàñđš ţĥé éđîţîöñš ţĥé éđîţöŕ çĥàñĝéđ ţö ţĥé ķééþéŕ àš öñé filehome.KeptWrite îñšţéàđ öƒ šţàĝîñĝ à ƒîļé. Ţĥé çöḿḿîţ ļöçķ îš ţĥé ļöçķ öƒ ţĥé ƒîļé ţĥé éđîţîöñ ŵîļļ ƃé đéļîṽéŕéđ ţö, šö à đéļîṽéŕý àñđ à ŵŕîţé ţö ţĥé ķéþţ éđîţîöñ ţàķé ţüŕñš. Keeper.Commit šţöŕéš ţĥé ŵŕîţé öñļý ŵĥîļé ţĥé éđîţîöñ'š ĥéàđ îš šţîļļ ţĥé ţöķéñ ţĥé šţàĝé ŕéàđ, àñđ àþþéñđš ţĥé çĥàñĝé'š ŕéçöŕđ àš îţ đöéš, ŵĥîçĥ ţĥé šéŕṽîçé ĥàñđš îţ ţĥŕöüĝĥ change.RecordingStaged. À ķéþţ éđîţîöñ çöḿḿîţš ƃéƒöŕé àñý šţàĝéđ ƒîļé îš ŕéñàḿéđ, šö à ŕéƒüšàļ ţĥéŕé ļéàṽéš éṽéŕý ƒîļé àš îţ ŵàš. À ĥéàđ ţĥàţ ḿöṽéđ ƃéƒöŕé ţĥé šéţţļé ḿàķéš ţĥé šţàĝé'š þàšš àĝàîñ, àñđ öñé ţĥàţ ḿöṽéš àƒţéŕ îţ ŕéƒüšéš ţĥé çĥàñĝé šéţ àš doc_changed. Ţĥé ŕéšüļţ ñàḿéš ţĥé ŵöŕķšþàçé ĥöḿé ƒöŕ ţĥàţ éđîţîöñ.

À ŕéƒéŕéñçé ţö ţĥé éđîţîöñ'š ƒîļé îţšéļƒ ({"doc": "i18n/de/guide.md", "block": "installieren/p"}) ŕéšöļṽéš ţö ţĥé đöçüḿéñţ àñđ ţĥé éđîţîöñ, àñđ ţĥé ƃļöçķ ķéý ţĥé Ĝéŕḿàñ ƒîļé ŕéàđš ŵîţĥ îš ţŕàñšļàţéđ ţö ţĥé đöçüḿéñţ'š ţĥŕöüĝĥ ţĥé šàḿé ĵöîñ (change.EditionKeyResolver). Ŕéšüļţš éçĥö ţĥé çàñöñîçàļ ŕéƒéŕéñçé. À ŕéàđ öƒ ţĥé Ĝéŕḿàñ ƒîļé šĥöŵš ţĥé Ĝéŕḿàñ éđîţîöñ àš éàçĥ ƃļöçķ'š öŵñ.

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

À šéššîöñ îš à change.StructuralSession àñđ ļîšţš ţĥé šţŕüçţüŕàļ öþéŕàţîöñš îţš đöçüḿéñţ'š ŵŕîţéŕ ŵŕîţéš (format.StructuralOps), ţĥé ŵŕîţéŕ çöñƒîĝüŕéđ ƒöŕ ţĥàţ đöçüḿéñţ; filehome.Formats ŕéþöŕţš ţĥé ļîšţ à ƃüîļţ-îñ ƒöŕḿàţ'š ŵŕîţéŕ đéçļàŕéš ŵîţĥ îţš đéƒàüļţš. Đéšçŕîƃîñĝ à đöçüḿéñţ, îţš ƃļöçķš' öþéŕàţîöñš îñ à ŕéàđ, àñđ Apply ƒöļļöŵ ţĥé šéššîöñ'š ļîšţ. À šţàĝé ŵĥöšé Want îš Structural ƃéĝîñš ŵîţĥ restructure (structure.go):

  1. Îţ ĵöîñš ţĥé éđîţîöñš ţĥé çĥàñĝé šéţ ñééđš (éṽéŕý éđîţîöñ à ŕéḿöṽéđ ƃļöçķ ḿàý ĥöļđ, ƒŕöḿ DocInfo.Derived, àñđ éṽéŕý éđîţîöñ à ñéŵ ƃļöçķ ñàḿéš) àñđ ŕéàđš ţĥé đöçüḿéñţ, ĥàñđîñĝ éàçĥ ƃļöçķ ţö ţĥé šéŕṽîçé'š éđîţöŕ (change.Restructurer.Locate). Ţĥé éđîţöŕ çĥéçķš éàçĥ öþéŕàţîöñ àĝàîñšţ ţĥöšé ƃļöçķš àñđ ŕéţüŕñš ţĥé éđîţš îñ çĥàñĝé-šéţ öŕđéŕ.
  2. Îţ ŕéàđš ţĥé đöçüḿéñţ'š ƒîļé àñđ ĥàš ţĥé ƒöŕḿàţ'š ŵŕîţéŕ (format.StructureEditor.EditStructure) ḿàķé éṽéŕý éđîţ îñ îţ: à ŕéḿöṽéđ ƃļöçķ ƃý ţĥé ƃļöçķ àš îţš ŕéàđéŕ ŕéàđ îţ, à ñéŵ ƃļöçķ ƃéšîđé îţš àñçĥöŕ ŵîţĥ ţĥé çöñţéñţ öƒ ţĥé đöçüḿéñţ'š öŵñ éđîţîöñ àš îţš ṽàļüé.
  3. Îţ đöéš ţĥé šàḿé ƒöŕ éàçĥ éđîţîöñ'š ƒîļé ţĥàţ éẋîšţš: à ŕéḿöṽéđ ƃļöçķ'š þàŕţñéŕ îñ ţĥàţ ƒîļé ĝöéš, àñđ à ñéŵ ƃļöçķ ţĥàţ ñàḿéš ţĥé éđîţîöñ ĝöéš ƃéšîđé ţĥé þàŕţñéŕ öƒ îţš àñçĥöŕ, öŕ, ŵîţĥ ñö àñçĥöŕ, ļàšţ îñ ţĥé öƃĵéçţ öŕ ḿàþþîñĝ îţš ķéý ñàḿéš îñ ţĥàţ ƒîļé. Ŵĥéŕé ţĥé ƒîļé ĝîṽéš îţš ķéýš à þŕéƒîẋ öƒ îţš öŵñ (de.nav.home ŵĥéŕé ţĥé đöçüḿéñţ ĥàš en.nav.home), ţĥé ñéŵ ķéý ţàķéš ţĥàţ þŕéƒîẋ. À ñéŵ ƃļöçķ ŵĥöšé àñçĥöŕ ĥàš ñö þàŕţñéŕ îñ ţĥé ƒîļé îš ŕéƒüšéđ àš unsupported ƒöŕ ţĥàţ éđîţîöñ; öñé ŵĥöšé àñçĥöŕ àñ éàŕļîéŕ öþéŕàţîöñ àđđéđ ĝöéš ƃéšîđé ţĥàţ ƃļöçķ ŵĥéñ ţĥé éàŕļîéŕ öþéŕàţîöñ ĝàṽé ţĥé ƒîļé îţš éđîţîöñ ţöö.
  4. Îţ ķééþš ţĥé ŕéšüļţš îñ ţĥé šéššîöñ'š öṽéŕļàý, àñđ ţĥé ŕéšţ öƒ ţĥé šţàĝé ŕéàđš ţĥéḿ îñ þļàçé öƒ ţĥé ƒîļéš: ţĥé ĵöîñ, ţĥé đöçüḿéñţ'š þàšš, àñđ ţĥé ŵŕîţéš öƒ ţĥé éđîţîöñš. À ƒîļé ţĥàţ đöéš ñöţ éẋîšţ ýéţ îš ŵŕîţţéñ îñ ţĥàţ þàšš ƒŕöḿ ţĥé đöçüḿéñţ àš ţĥé éđîţš ļéƒţ îţ, ţĥé ñéŵ ƃļöçķ'š éđîţîöñ ĝîṽéñ ţö ţĥé ḿàţéŕîàļîžéđ ƒîļé.

À ŵŕîţéŕ'š ŕéƒüšàļ (format.StructureError) ŕéƒüšéš ţĥé öþéŕàţîöñ îţ ñàḿéš: à ķéý ţĥé đöçüḿéñţ ĥöļđš ŵîţĥ ñö ƃļöçķ (à ñüḿƃéŕ, à ñéšţéđ öƃĵéçţ) àš invalid, àñýţĥîñĝ éļšé àš unsupported. Ŵĥéñ ţĥé þàšš çĥàñĝéš ñö çöñţéñţ öƒ à ƒîļé ţĥé éđîţš ţöüçĥéđ, ţĥé šţàĝéđ ƒîļé îš ţĥé ŵŕîţéŕ'š ŕéšüļţ îţšéļƒ; öţĥéŕŵîšé ţĥé þàšš'š ŵŕîţéŕ ŵŕîţéš ţĥé ŕéšüļţ ŵîţĥ ţĥé çöñţéñţ éđîţš îñ îţ. À šţŕüçţüŕàļ éđîţ ĥöļđš ţĥé ƒîļé ŵĥöļé îñ ḿéḿöŕý, àñđ ţĥé šţŕéàḿîñĝ þàţĥ àþþļîéš ţö éṽéŕý öţĥéŕ çĥàñĝé. Settle ḿàķéš ţĥé ŵĥöļé šţàĝé àĝàîñ, šţŕüçţüŕàļ éđîţš îñçļüđéđ, ŵĥéñ à ƒîļé ḿöṽéđ.

À đöçüḿéñţ à ŕüñ þŕöđüçéđ​

À ƒļöŵ, à þüļļ àñđ à çöñṽéŕĝéñçé þàšš'š đéļîṽéŕý ŵŕîţé à đöçüḿéñţ ŵĥöļé, àñđ ţĥéý çöḿḿîţ îţ ţĥŕöüĝĥ ţĥé ĥöḿé ţöö. Home.Produce(ctx, path, before, write) šţàĝéš ŵĥàţ write þŕöđüçéš ƃéšîđé ţĥé ƒîļé àţ path (atomicfile.StageWithParents), ŵîţĥ ţĥé ƒîļé'š ḿöđé, ĥàšĥîñĝ ţĥé ƃýţéš àš ţĥéý àŕé ŵŕîţţéñ; before îš ţĥé ƒîļé'š đîĝéšţ ŵĥéñ ţĥé þŕöđüçéŕ ŕéàđ îţ (filehome.Digest, éḿþţý ƒöŕ à ƒîļé ţĥàţ đîđ ñöţ éẋîšţ). Produced.Commit öþéñš ţĥé ļöçķ ƒîļé ţĥé ƒîļé'š çĥàñĝé šéţš ļöçķ (Home.lockPath, ţĥé šàḿé đîŕéçţöŕý àñđ ţĥé šàḿé PrepareLocks), ţàķéš îţ, àñđ ĥàšĥéš ţĥé ƒîļé àĝàîñ:

  • Îţ ĥöļđš before: ţĥé šţàĝéđ ƒîļé îš ŕéñàḿéđ öñţö îţ.
  • Îţ ĥöļđš ţĥé þŕöđüçéđ ƃýţéš àļŕéàđý (ţĥé ŕüñ çĥàñĝéđ ñöţĥîñĝ, öŕ àñ îđéñţîçàļ ŕüñ çöḿḿîţţéđ ƒîŕšţ): ţĥé šţàĝéđ ƒîļé îš đîšçàŕđéđ àñđ ñöţĥîñĝ îš ŵŕîţţéñ.
  • Îţ ĥöļđš àñýţĥîñĝ éļšé: ţĥé šţàĝéđ ƒîļé îš đîšçàŕđéđ, ñöţĥîñĝ îš ŵŕîţţéñ, àñđ Commit ŕéţüŕñš à *filehome.MovedError (errors.Is filehome.ErrMoved) ñàḿîñĝ ţĥé ƒîļé àñđ ƃöţĥ đîĝéšţš.

Ţĥé ĥöḿé ĥöļđš ţĥé þŕöđüçéŕ'š ƃýţéš àñđ ñöţ îţš öþéŕàţîöñš, šö à ḿöṽéđ ƒîļé îš ñöţ àþþļîéđ àĝàîñ ĥéŕé. Ţĥé ķàþî ĥöšţ ƒöļļöŵš éàçĥ đöçüḿéñţ öƒ à ƒļöŵ ŕüñ àñđ àþþļîéš ţĥé ŕüñ'š öþéŕàţîöñš ţĥŕöüĝĥ ţĥé çĥàñĝé šéŕṽîçé ŵĥéñ ţĥé ƒîļé ḿöṽéđ, ŵĥîçĥ ŕéàđš ţĥé ƒîļé àĝàîñ üñđéŕ ţĥé ļöçķ àñđ ŕéƒüšéš ţĥé öþéŕàţîöñš ŵĥöšé if_match ƒàîļš ţö ĥöļđ. Produced.Release đîšçàŕđš à šţàĝéđ ƒîļé ţĥàţ ŵàš ñöţ çöḿḿîţţéđ. À ĥöḿé ƃüîļţ ŵîţĥ Options.WriteNothing šţàĝéš ñöţĥîñĝ: Produce ŕüñš ţĥé þŕöđüçéŕ îñţö ţĥé đîĝéšţ àļöñé àñđ Commit ŵŕîţéš ñöţĥîñĝ, ŵĥîçĥ --print-ops üšéš. Options.WriteUnder ñàḿéš à đîŕéçţöŕý šüçĥ à ĥöḿé šţîļļ ŵŕîţéš îñ, àš àñý ĥöḿé ŵŕîţéš: à þŕîñţîñĝ çöñṽéŕĝéñçé þàšš'š þŕîṽàţé đŕàƒţ ţŕéé, ŵĥîçĥ îţš đéļîṽéŕý ĝàţé ŕéàđš. À ĥöḿé ţĥàţ öñļý þŕöđüçéš đöçüḿéñţš ţàķéš à ñîļ ļàýöüţ; Open öñ îţ îš ŕéƒüšéđ.

À çĥàñĝé'š ŕéçöŕđ (change.EditionChange.Block) îš à çöþý öƒ ţĥé ƃļöçķ àš ţĥé çĥàñĝé ļéƒţ îţ, ŵîţĥ îţš šéţ öƒ éđîţîöñš çöþîéđ: ţĥé ĥöḿé ţàķéš ţĥé éđîţîöñš îţ ĵöîñéđ ƒŕöḿ ţĥéîŕ öŵñ ƒîļéš öüţ öƒ ţĥé ƃļöçķ öñçé ţĥé ŵŕîţéŕ ĥàš šééñ îţ, àñđ ţĥé ŕéçöŕđ šţîļļ ŕéàđš ţĥé šţàḿþ ţĥé çĥàñĝé ļéƒţ öñ šüçĥ àñ éđîţîöñ (TestFileHome_TheRecordReadsAnEditionInItsOwnFileAsTheChangeLeftIt).

Þŕéṽîéŵ​

À þŕéṽîéŵ šţàĝéš éàçĥ đöçüḿéñţ àñđ šéţţļéš ñöñé: ţĥé šéŕṽîçé ŕéļéàšéš éṽéŕý šţàĝé àƒţéŕ ţĥé çöḿḿîţ çĥéçķ, šö ţĥé ţéḿþöŕàŕý ƒîļéš àŕé ŕéḿöṽéđ àñđ ţĥé đöçüḿéñţš ķééþ ţĥéîŕ ƃýţéš. Staged.Diff ŕéñđéŕš à üñîƒîéđ đ öƒ éàçĥ ƒîļé îţ ŵöüļđ ŵŕîţé, ƒŕöḿ ţĥé šţàĝéđ ƃýţéš àĝàîñšţ ţĥé ƒîļé, ŵĥéñ ƃöţĥ àŕé ţéẋţ öƒ àţ ḿöšţ 1 ḾîƂ; àñ àŕçĥîṽé ḿéḿƃéŕ îš đéđ àš ţĥé ḿéḿƃéŕ.

Ţéšţš​

  • changetest.Run îš ţĥé çöñƒöŕḿàñçé šüîţé, ŕüñ ƃý TestFileHome_Conformance öñ ţŵö ĴŠÖÑ đöçüḿéñţš ŵîţĥ ḿöđé 0640, à Ƒŕéñçĥ ÞÖ çàţàļöĝ ŵĥöšé ţŕàñšļàţîöñ îţ ŕéḿöṽéš àñđ çŕéàţéš àĝàîñ, àñđ à ĴŠÖÑ đöçüḿéñţ ŵĥöšé Ƒŕéñçĥ îţ ŕéḿöṽéš ƒŕöḿ fr/d.json àñđ çŕéàţéš àĝàîñ ţĥéŕé; îţš îñţéŕļéàṽîñĝ çàšéš ŕüñ à šéçöñđ šéñđéŕ ƒŕöḿ Options.BeforeSettle. TestFileHome_RemovesATranslationFromItsOwnFile ŕéḿöṽéš à ñéšţéđ ķéý'š ţŕàñšļàţîöñ ƒŕöḿ de/guide.json îñ þļàçé àñđ üñđéŕ Options.Materialize, TestFileHome_RemovingEveryTranslationKeepsTheFile ļéàṽéš {}, àñđ TestFileHome_RefusesARemovalTheFormatCannotWrite ŕéƒüšéš öñé ƒŕöḿ à Ḿàŕķđöŵñ ţŕàñšļàţîöñ àñđ ŵŕîţéš ñöţĥîñĝ. TestFileHome_ARemovalBesideAnEditTakesOutTheBlockItNames ŕéḿöṽéš à ÝÀḾĻ ţŕàñšļàţîöñ ƃéšîđé àñ éđîţ ţĥàţ ḿàķéš àñ éàŕļîéŕ ƃļöçķ ŕéàđ àš ñöñé, îñ þļàçé àñđ ḿàţéŕîàļîžéđ; TestFileHome_AWriterRefusalRefusesTheRemovalAlone ŕéƒüšéš à šéǫüéñçé îţéḿ'š ŕéḿöṽàļ àļöñé àñđ ƃéšîđé àñ éđîţ, ŵĥîçĥ îš not_applied; TestFileHome_ARemovedTranslationIsCreatedAgain ŕéḿöṽéš à ţŕàñšļàţîöñ ƒŕöḿ ĴŠÖÑ, ÝÀḾĻ, à ÝÀḾĻ ƒîļé üñđéŕ îţš ļàñĝüàĝé'š ŕööţ àñđ ÀŔƂ, çĥéçķš éṽéŕý öţĥéŕ ţŕàñšļàţîöñ šţîļļ þàîŕš, àñđ çŕéàţéš îţ àĝàîñ ƃéšîđé ţĥé ƃļöçķ îţ šàţ ƃý; TestFileHome_ATranslationIsCreatedInAFileWithNoBlockLeft àñđ TestFileHome_ACreationTheWriterCannotMakeIsRefused çöṽéŕ àñ éḿþţý ƒîļé àñđ à ķéý à ñüḿƃéŕ ĥöļđš. Ţĥé ŕéḿöṽàļ çéļļš öƒ ţĥé öþéŕàţîöñš ḿàţŕîẋ (core/formats/opsmatrix_removal_test.go) ĥöļđ ĴŠÖÑ, ÝÀḾĻ àñđ ÀŔƂ ţö ţĥéîŕ ƃýţéš, à ţŕàñšļàţîöñ çŕéàţéđ àĝàîñ îñçļüđéđ, à ÝÀḾĻ šéǫüéñçé îţéḿ ţö ţĥé ŕéƒüšàļ, àñđ éṽéŕý öţĥéŕ ƒöŕḿàţ ŵîţĥ öñé éđîţîöñ þéŕ ƒîļé ţö ţĥé ŕéƒüšàļ. TestFileHome_RemovingATranslationABilingualFileHolds ŕéḿöṽéš à ţŕàñšļàţîöñ ƒŕöḿ à ÞÖ çàţàļöĝ àñđ ŕéƒüšéš ţĥé ŕéḿöṽàļ ƒŕöḿ ẊĻÎƑƑ 1.2, ẊĻÎƑƑ 2 àñđ ŢḾẊ, ŵŕîţîñĝ ñöţĥîñĝ; TestFileHome_RemovingATranslationFromItsOwnBilingualFile đöéš ţĥé šàḿé ŵĥéŕé ţĥé ţŕàñšļàţîöñ îš à çàţàļöĝ öƒ îţš öŵñ, àñđ ļéàṽéš ţĥé đöçüḿéñţ'š ƒîļé àš îţ ŵàš; TestFileHome_ABilingualRemovalRefusalHoldsTheEditBesideIt ŕéƒüšéš ţĥé ẊĻÎƑƑ ŕéḿöṽàļ àļöñé, ţĥé éđîţ ƃéšîđé îţ not_applied.
  • TestFileHome_TwoProcessesEditingDifferentBlocksLoseNoEdit šţàŕţš ţĥé ţéšţ ƃîñàŕý àš ţŵö ŵŕîţéŕ þŕöçéššéš öṽéŕ 50 ŕöüñđš; éàçĥ šţàĝéš àñ éđîţ öƒ à đéŕéñţ þàŕàĝŕàþĥ öƒ öñé ĤŢḾĻ ƒîļé àñđ ŵàîţš àţ à ƃàŕŕîéŕ üñţîļ ƃöţĥ ĥàṽé šţàĝéđ. À ţĥîŕđ öƒ ţĥé ŕöüñđš ļéţ ţĥé ƒîŕšţ ŵŕîţéŕ ƒîñîšĥ ƃéƒöŕé ţĥé šéçöñđ šéţţļéš, à ţĥîŕđ ţĥé ŕéṽéŕšé, àñđ à ţĥîŕđ ļéţ ţĥé ļöçķ đéçîđé. Ƃöţĥ éđîţš àŕé îñ ţĥé ƒîļé àƒţéŕ éṽéŕý ŕöüñđ. Šéţţļîñĝ ŵîţĥöüţ ţĥé šéçöñđ þàšš ļöšéš àñ éđîţ îñ ţĥé ƒîŕšţ ŕöüñđ. Îţ šķîþš üñđéŕ GOOS=js, ŵĥîçĥ çàññöţ šţàŕţ à þŕöçéšš.
  • TestFileHome_TwoWritersOfOneBlockConflict šţàĝéš ţŵö éđîţš öƒ öñé ƃļöçķ àĝàîñšţ öñé çöñţéñţ îñ öñé þŕöçéšš: öñé ļàñđš àñđ ţĥé öţĥéŕ îš ŕéƒüšéđ àš stale ŵîţĥ ŵĥàţ ţĥé ƒîŕšţ ŵŕöţé. make test-wasm-stores ŕüñš îţ üñđéŕ GOOS=js ţöö, ŵĥéŕé öñļý ţĥé ļöçķ'š ḿüţéẋ öŕđéŕš ţĥé ţŵö.
  • TestFileHome_ALargeEditStaysInBoundedMemory éđîţš öñé ḿéššàĝé öƒ à 100,000-ḿéššàĝé ĴŠÖÑ çàţàļöĝ öƒ àƃöüţ 8 ḾîƂ àñđ àššéŕţš ţĥé ĥéàþ ţĥé éđîţ ţàķéš šţàýš üñđéŕ 24 ḾîƂ; ţĥé šţŕéàḿîñĝ þàţĥ ţàķéš üñđéŕ 2 ḾîƂ, àñđ à ƃüƒƒéŕéđ ŕöüñđ ţŕîþ öƒ ţĥé šàḿé çàţàļöĝ ţàķéš àƃöüţ 80 ḾîƂ.
  • TestFileHome_ADocumentThatMovedOnceIsAppliedAgain àñđ TestFileHome_ADocumentThatKeepsMovingIsDocChanged ḿöṽé ţĥé ƒîļé ƃéţŵééñ ţĥé šţàĝé àñđ ţĥé çöḿḿîţ.
  • Ţĥé éđîţîöñ ţéšţš ŵŕîţé à ţŕàñšļàţîöñ ţĥŕöüĝĥ îţš öŵñ ƒîļé, ḿàţéŕîàļîžé à ḿîššîñĝ öñé ŵîţĥöüţ çŕéàţîñĝ îţš đîŕéçţöŕý ƃéƒöŕé ţĥé çöḿḿîţ, ŕéƒüšé àñ éđîţ ţĥàţ ŵöüļđ ŕéŵŕîţé àñ éẋîšţîñĝ Ḿàŕķđöŵñ ţŕàñšļàţîöñ (àļöñé, ŵîţĥ àñ éđîţ ƃéšîđé îţ not_applied), ñàḿé ţĥé éđîţîöñš à šöüŕçé éđîţ ļéàṽéš šţàļé, àñđ éđîţ àñ àŕçĥîṽé ḿéḿƃéŕ îñ þļàçé. TestFileHome_MaterializeWritesAnEditionFileFromTheDocument ŵŕîţéš à ƃļöçķ àñ éẋîšţîñĝ ţŕàñšļàţîöñ ļàçķš üñđéŕ Options.Materialize, ķééþîñĝ ţĥé ţŕàñšļàţîöñ'š öţĥéŕ ḿéššàĝéš îñ ţĥé đöçüḿéñţ'š öŕđéŕ àñđ đŕöþþîñĝ öñé öñļý ţĥé ţŕàñšļàţîöñ ĥéļđ, ŵĥéŕé ţĥé šàḿé çĥàñĝé ŵîţĥöüţ îţ àđđš ţĥé ķéý ƃéšîđé ţĥé öñé ƃéƒöŕé îţ àñđ ķééþš ţĥé ŕéšţ. TestFileHome_MaterializeBringsADriftedEditionFileBackToTheDocument ŵŕîţéš à ţŕàñšļàţîöñ ŵĥöšé ƃļöçķš ĥàṽé šţöþþéđ þàîŕîñĝ ŵîţĥ ţĥé đöçüḿéñţ'š üñđéŕ à çĥàñĝé ţĥàţ çĥàñĝéš ñö çöñţéñţ, àñđ ļéàṽéš öñé ţĥàţ šţîļļ þàîŕš üñŵŕîţţéñ. TestFileHome_ABilingualTranslationFileHoldsTheEditionAsItsTranslation ŕéàđš à Ƒŕéñçĥ ÞÖ çàţàļöĝ ƃéšîđé àñ Éñĝļîšĥ öñé àš îţš ḿšĝšţŕ, àñđ ķééþš éṽéŕý ţŕàñšļàţîöñ ţĥé çĥàñĝé ļéàṽéš àñđ ţĥé çàţàļöĝ'š ĥéàđéŕ îñ þļàçé, üñđéŕ Options.Materialize ţöö, üñţîļ ţĥé šöüŕçé ĝàîñš à ḿéššàĝé.
  • TestFileHome_AnEditionFileThatMovesDuringTheStageIsReadAgain ļéţš àñöţĥéŕ ŵŕîţéŕ šàṽé ţĥé Ĝéŕḿàñ ƒîļé ŕîĝĥţ àƒţéŕ ţĥé šţàĝé ŕéàđ îţ: ţĥé éđîţ îš àþþļîéđ àĝàîñ ţö ŵĥàţ ţĥàţ ŵŕîţéŕ ŵŕöţé, àñđ àñ éđîţ öƒ ţĥé šàḿé ƃļöçķ îš ŕéƒüšéđ àš stale.
  • TestFileHome_KeepsABackupOfWhatACommitReplaces ŵŕîţéš à ƃàçķüþ ŵîţĥ ţĥé öŕîĝîñàļ ƃýţéš àñđ ḿöđé öñ à çöḿḿîţ, àñđ ñöñé ƒöŕ à þŕéṽîéŵ, à ŕéƒüšàļ öŕ àñ üñçĥàñĝéđ éđîţ; TestService_ReadEachReadsTheWholeDocument ŕéàđš þàšţ ţĥé ḿöšţ à þàĝé ĥöļđš îñ öñé þàšš.
  • Ţĥé šţŕüçţüŕé ţéšţš àđđ àñđ ŕéḿöṽé ķéýš öƒ ĴŠÖÑ, ÝÀḾĻ àñđ ÀŔƂ çàţàļöĝš ŵîţĥ çöñţéñţ éđîţš ƃéšîđé ţĥéḿ, ŵŕîţé à ñéŵ ƃļöçķ'š éđîţîöñ îñţö àñ éẋîšţîñĝ ţŕàñšļàţîöñ àñđ îñţö öñé ŵŕîţţéñ ƒöŕ ţĥé ƒîŕšţ ţîḿé, ŕéḿöṽé à ƃļöçķ ƒŕöḿ éṽéŕý ţŕàñšļàţîöñ, ţàķé à ƒîļé'š ķéý þŕéƒîẋ, þüţ à ñéŵ ķéý ŵîţĥ ñö àñçĥöŕ îñ ţĥé ḿàþþîñĝ îţš ķéý ñàḿéš îñ éṽéŕý ƒîļé, ḿàķé ţĥé éđîţš àĝàîñ ŵĥéñ ţĥé ƒîļé ḿöṽéđ, àñđ ŕéƒüšé à ķéý ĥéļđ ŵîţĥöüţ à ƃļöçķ, àñ àñçĥöŕ ŵîţĥ ñö þàŕţñéŕ îñ à ţŕàñšļàţîöñ, àñđ à ƒöŕḿàţ ţĥàţ àđđš ñö ƃļöçķš. Ţĥé öþéŕàţîöñš ḿàţŕîẋ (core/formats/opsmatrix_structural_test.go) ĥöļđš éàçĥ ƒöŕḿàţ ţĥàţ đéçļàŕéš ţĥé öþéŕàţîöñš ţö îţš çéļļš.
  • TestFileHome_OneFileNamedTwiceIsRefused ñàḿéš ţŵö ḿéḿƃéŕš öƒ öñé àŕçĥîṽé, àñđ à ƒîļé àñđ à ļîñķ ţö îţ, îñ öñé çĥàñĝé šéţ; TestFileHome_ACommitInterruptedAfterOneFileReportsWhatLanded šţöþš à ŕéñàḿé àƒţéŕ àñöţĥéŕ ļàñđéđ; TestFileHome_ABilingualFileTakesOnlyTheEditionsItHolds éđîţš ţĥé ţŕàñšļàţîöñ àñ ẊĻÎƑƑ ƒîļé àñđ à ÞÖ çàţàļöĝ ĥöļđ àñđ ŕéƒüšéš ţĥé éđîţîöñš ţĥéý çàññöţ ĥöļđ; TestFileHome_KeepsItsLockDirectoryToItsUser ŕéƒüšéš à ļöçķ đîŕéçţöŕý öţĥéŕš ḿàý ŵŕîţé ţö; TestFileHome_PreparesTheLockDirectoryAtTheFirstCommit ŕüñš PrepareLocks öñçé, àţ ţĥé ƒîŕšţ çöḿḿîţ àñđ ñéṽéŕ öñ à ŕéàđ.
  • TestProduce_CommitsWhatTheRunWrote çöḿḿîţš à þŕöđüçéđ đöçüḿéñţ öṽéŕ ţĥé ƒîļé îţ ŕéàđ, çŕéàţéš à ñéŵ ƒîļé'š đîŕéçţöŕý öñļý àţ ţĥé çöḿḿîţ, ļéàṽéš à ƒîļé ţĥàţ àļŕéàđý ĥöļđš ţĥé ƃýţéš, àñđ ķééþš à ƒîļé à þéŕšöñ šàṽéđ öŕ àñöţĥéŕ ŵŕîţéŕ çŕéàţéđ ḿéàñŵĥîļé, ŕéþöŕţîñĝ îţ ḿöṽéđ; TestProduce_TakesTheLockAChangeSetCommitsUnder ĥöļđš à çĥàñĝé šéţ'š çöḿḿîţ ļöçķ àñđ ƒîñđš ţĥé þŕöđüçéđ đöçüḿéñţ ŵàîţîñĝ ƒöŕ îţ, ţĥéñ ŕéƒüšéđ ƃéçàüšé ţĥé çĥàñĝé šéţ ļàñđéđ ƒîŕšţ; TestProduce_AHomeThatWritesNothingStagesNothing, TestProduce_AHomeThatWritesNothingStillWritesUnderItsTree àñđ TestProduce_KeepsTheModeOfTheFileItReplaces çöṽéŕ ţĥé ŕéšţ.
  • Îñ core/workhome, TestWorkspaceHome_Conformance ŕüñš ţĥé çöñƒöŕḿàñçé šüîţé öñ ţĥé Ĝéŕḿàñ éđîţîöñ öƒ à ĴŠÖÑ ƒîļé ţĥàţ ñö ƒîļé ĥöļđš, TestWorkspaceHome_KeepsTheEditionInTheLog ŵŕîţéš à ķéþţ éđîţîöñ ţĥàţ ļàñđš îñ ñö ƒîļé, îš ŕéçöŕđéđ öñçé àñđ ŕéàđš ƃàçķ ŵîţĥ ţĥé šţàţüš àñđ öŕîĝîñ ţĥé ŵŕîţé ļéƒţ, àñđ TestWorkspaceHome_RefusesAStaleHead ŕéƒüšéš àš doc_changed à çöḿḿîţ šţàĝéđ öñ à ĥéàđ àñöţĥéŕ ŵŕîţéŕ ḿöṽéđ, šţöŕîñĝ ñöţĥîñĝ.
  • Îñ ţĥé ĥöšţ, TestChangeService_AProjectCatalogsTranslationLivesInItsTargetFile ŕéàđš àñđ ŵŕîţéš ţĥé Ƒŕéñçĥ öƒ à ÞÖ çàţàļöĝ àñđ öƒ à ÞÖ ţéḿþļàţé îñ po/fr.po, ŵîţĥ àñđ ŵîţĥöüţ à ţàŕĝéţ ļàñĝüàĝé àñđ ţĥŕöüĝĥ éîţĥéŕ ƒîļé, ļéàṽîñĝ ţĥé šöüŕçé'š ƃýţéš; ţĥé ĥöšţ àñđ Ķàþî Đéšķţöþ çöñƒöŕḿàñçé ŕüñš ŕéḿöṽé ţĥé Ƒŕéñçĥ ƒŕöḿ po/fr.po ƃéšîđé po/en.po, àñđ ţĥé ĥöšţ'š ƒŕöḿ locales/fr.json ƃéšîđé locales/en.json ţöö. TestChangeService_ASourceDocumentResolvesWithoutTheWholeRecipe ļöçàţéš à šöüŕçé ƒîļé àñđ îţš ţŕàñšļàţîöñš ŵîţĥöüţ éẋþàñđîñĝ à þàţţéŕñ, TestChangeService_AReadWritesNothing ŕéàđš à þŕöĵéçţ ŵîţĥöüţ çŕéàţîñĝ îţš šţàţé đîŕéçţöŕý, àñđ TestMCPApplyEdits_EachProjectInItsOwnSourceLanguage éđîţš à ţŕàñšļàţîöñ îñ à þŕöĵéçţ ŵŕîţţéñ îñ ţĥé ļàñĝüàĝé àñöţĥéŕ þŕöĵéçţ ţŕàñšļàţéš îñţö.