Import jen a pouze přidává

Díl 6 ze 9 — ./blog.sh v1.3

Nový import archivu býval věc, kterou jsi dělal opatrně, v noci, po záloze. Běh šel a stáhl každý obrázek znovu – obrázky, které archiv už držel, bajt po bajtu – a každé z těch stažení dopadlo na soubor, který už byl správně.

To je opraveno a oprava je jedna věta: identita souboru médií je adresa, ze které přišel.

Archiv už to ví

Každá položka médií si zapisuje svůj src. Nový import porovná, co zdroj nabízí, s tím, co archiv drží, a stáhne jen to, co chybí. Nad úplným archivem to není vůbec nic – druhý běh téhož importu nestáhne jediný obrázek a v souhrnu to řekne.

Zdroj sám se pořád čte, a to je poctivá hranice toho tvrzení: export ležící na tvém disku nestojí nic, zatímco feed nebo API se stahuje pokaždé, protože jinak nejde zjistit, jestli se něco změnilo.

Tady je skutečný import z Ghostu spuštěný podruhé nad archivem, který ho už drží:

Hotovo. Zapsaných postů: 118, souborů médií: 419.
  Z toho 419 archiv už má a bere si je z něj, ne ze zdroje.
  Postů naplánovaných v Ghostu: 18 — dorazily jako drafty; naplánuj je
  tady, až budeš chtít.

Tři vteřiny. Čtyři sta devatenáct obrázků, ani jeden stažený.

Nikdy nenahrazeno. Ani přepínačem, ani ničím

Soubor, který už v archivu je, se nikdy nepřepíše. Ani novým importem, ani REFETCH_MEDIA=1, které jen přiměje běh znovu se zeptat zdroje na každou adresu, místo aby věřil vlastním záznamům – na disk dopadnou pořád jen soubory, které chyběly.

Důvod je ten, že bajty, které import přináší, pocházejí odněkud, za co engine nemůže ručit. CDN, která překóduje, platforma, která začne přidávat vodoznak, export, který se sestavil špatně: cokoli z toho, jednou vzaté za bernou minci, potichu nahradí originály, které už nedostaneš zpět. Archiv vyhrává každý spor.

Když stažený soubor už neodpovídá kopii, kterou archiv drží, stažení se zahodí a započítá. Ten čítač je jediný poctivý signál, že se zdroj od tvého archivu vzdálil – a počítá jen bajty zvenčí, takže příspěvek, který používá obrázek z jiného příspěvku, se za posun nepovažuje.

Obrázek, který odejde a vrátí se

Zdroje se samy upravují. Fotka v březnu z příspěvku vypadne a v červnu se znovu objeví, a naivně je každé z toho nový soubor: obrázek odejde, jméno se uvolní, návrat vyrazí bajt po bajtu shodný duplikát pod novým číslem.

Teď si uchované verze příspěvku pamatují adresu, pod kterou byl soubor uložen, takže vracející se obrázek si vezme zpět jméno, které měl. Když to selže, odpoví vlastní bajty souboru – identita podle obsahu, kontrolovaná vždy, ne jen když se jméno střetne. Položka, která adresu nikdy nenesla, se pozná stejně.

Smyslem vší té mechaniky je jedna vlastnost: cyklus vypadnutí a návratu adresář příspěvku nezvětší a nový import za rok zapíše týž strom, jaký zapsal dnes.

A příspěvek popisuje to, co tam skutečně je

Šířka a výška se po umístění médií znovu čtou z vlastní kopie archivu, takže příspěvek nemůže tvrdit rozměry nad souborem, který nikdy nedorazil. Kopie, která se nedá změřit, nechá stát předchozí záznam. Položka, jejíž soubor chybí úplně, zůstane říkat přesně to, co říkala – a ./blog.sh check je nástroj, který ji najde, protože nic z toho, co import dělá, poškozený soubor neopraví.

Import má být nudný. Spusť ho znovu v úterý a zjisti, že se nic nestalo: to je ta funkce.

Komentáře