Situace
Repozitář musí jít někam, kde se nedá naklonovat: do kontextu jazykového modelu, k recenzentovi na uzamčeném stroji, do sítě bez připojení k internetu, do auditu, který musí kontroly spustit na kopii. Ručně je to git ls-files, tar a seznam výjimek přepisovaný z paměti a selhává dvěma způsoby, které se projeví až na druhém konci — kde nikdo nemůže kopii s originálem porovnat a kde obě selhání vypadají, jako by byl rozbitý repozitář, a ne chybná kopie. Něco nesledovaného putovalo, co nemělo, nebo zmizela souborová oprávnění a nic ve stromu nepoběží.
Co spouštíte
archive --list: profily, každý je jiný čtenář, a tedy jiný snapshotarchive --dry-run: co by se přeneslo, s každým vynechaným souborem připsaným pravidlu, které jej vynechaloarchive: snímek, ověřený svým vlastním kontejnerem dřív, než se příkaz vrátí
Scénář
setup: installed
given:
- 'a repository with the layer installed and its files committed'
steps:
- id: profiles
run: ['archive', '--list']
note: 'the snapshots are declarations in share/archive.yaml, not flags'
expect:
exit: 0
stdout_contains: ['context', 'audit', 'governance']
- id: what-would-travel
run: ['archive', '--dry-run']
note: 'the count archived is stated beside the count tracked, so a selection that matched nothing cannot look like one that matched everything'
expect:
exit: 0
stdout_contains: ['profile context', 'tracked file', 'nothing written']
- id: written-and-read-back
run: ['archive', '--format', 'tar.gz']
note: 'the archive is opened again before the command returns'
expect:
exit: 0
stdout_contains: ['OK archive', 'read back']
- id: no-such-profile
run: ['archive', 'nosuch']
note: 'exit 12 is MISSING_ARTIFACT, and the message names the command that lists what exists'
expect:
exit: 12
stdout_contains: ['no profile', 'archive --list']
then:
- 'nothing untracked is in the archive, because the file set is the git index'
- 'every entry carries the mode the index records, and the archive says so in its own manifest'
- 'the archive was read back before the command returned, and an unreadable one is a failure rather than a delivery'Výsledek
Jedno gesto místo zapamatovaného zaklínadla. Co se vynechává, je deklarováno, ne přepisováno, a deklarace, kterou čte pro generované soubory, je .gitattributes, kterou repozitář už udržuje z jiného důvodu — takže neexistuje druhý seznam, který by zastaral. Kopie dorazí se svými režimy a lze ji jedním skriptem zprovoznit, což znamená, že kontrola, která v ní selže, selhala z důvodu, který patří repozitáři.