ŹRÓDŁO Po udanym przestawieniu systemów na własne kopie kanałów dobrze jest spisać proces aktualizacji tych kanałów. Jest bardziej skomplikowany, niż proste wydanie polecenia guix.


ŹRÓDŁO DO ZROBIENIA Kanał Guix jest strukturą danych opartą o repozytorium Git. Sterowanie wersją kanału sprowadza się do sterowania zawartością jego repozytorium. W czasie pisania dokumentacja Guix nie mówi o tym bezpośrednio, tylko przez implikację, co warto byłoby poprawić.

Klonowanie publicznej kopii repozytorium

Zawsze istnieje możliwość, że aktualizację kopiowanych kanałów trzeba przeprowadzić w nowym środowisku. W tej sytuacji należy sklonować kopie kanałów do aktualizacji, a nie kanoniczne.

$ git clone ssh://git@marekpasnikowski.pl:23/guix.git
Klonowanie do „guix”...
remote: Enumerating objects: 898163, done.
remote: Counting objects: 100% (898163/898163), done.
remote: Compressing objects: 100% (178366/178366), done.
remote: Total 898163 (delta 719454), reused 898020 (delta 719313), pack-reused 0 (from 0)
Pobieranie obiektów: 100% (898163/898163), 316.88 MiB | 30.38 MiB/s, gotowe.
Rozwiązywanie delt: 100% (719454/719454), gotowe.

$ git clone ssh://git@marekpasnikowski.pl:23/nonguix.git
Klonowanie do „nonguix”...
remote: Enumerating objects: 11424, done.
remote: Counting objects: 100% (11424/11424), done.
remote: Compressing objects: 100% (4362/4362), done.
remote: Total 11424 (delta 7010), reused 11424 (delta 7010), pack-reused 0 (from 0)
Pobieranie obiektów: 100% (11424/11424), 2.57 MiB | 33.76 MiB/s, gotowe.
Rozwiązywanie delt: 100% (7010/7010), gotowe.

$ git clone ssh://git@marekpasnikowski.pl:23/guix-rust-past-crates.git
Klonowanie do „guix-rust-past-crates”...
remote: Enumerating objects: 617, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 617 (delta 2), reused 0 (delta 0), pack-reused 605 (from 1)
Pobieranie obiektów: 100% (617/617), 1.86 MiB | 4.89 MiB/s, gotowe.
Rozwiązywanie delt: 100% (207/207), gotowe.

Po sklonowaniu kopii repozytoriów problemem do rozwiązania jest brak odniesień do kanonicznych repozytoriów, z których chcę pobrać aktualizacje.

$ git -C guix remote -v
origin  ssh://git@marekpasnikowski.pl:23/guix.git (fetch)
origin  ssh://git@marekpasnikowski.pl:23/guix.git (push)

$ git -C guix-rust-past-crates remote -v
origin  ssh://git@marekpasnikowski.pl:23/guix-rust-past-crates.git (fetch)
origin  ssh://git@marekpasnikowski.pl:23/guix-rust-past-crates.git (push)

$ git -C nonguix remote -v
origin  ssh://git@marekpasnikowski.pl:23/nonguix.git (fetch)
origin  ssh://git@marekpasnikowski.pl:23/nonguix.git (push)

ŹRÓDŁO Wykorzystując zdolność Git do posiadania wielu repozytoriów zdalnych dodaję adresy kanoniczne.

$ git -C guix remote add upstream https://codeberg.org/guix/guix.git

$ git -C guix-rust-past-crates remote add upstream https://codeberg.org/guix/guix-rust-past-crates.git

$ git -C nonguix remote add upstream https://gitlab.com/nonguix/nonguix.git

Teraz te repozytoria posiadają wymagane łącza do kanonicznych repozytoriów.

$ git -C guix remote -v
origin  ssh://git@marekpasnikowski.pl:23/guix.git (fetch)
origin  ssh://git@marekpasnikowski.pl:23/guix.git (push)
upstream        https://codeberg.org/guix/guix.git (fetch)
upstream        https://codeberg.org/guix/guix.git (push)

$ git -C guix-rust-past-crates remote -v
origin  ssh://git@marekpasnikowski.pl:23/guix-rust-past-crates.git (fetch)
origin  ssh://git@marekpasnikowski.pl:23/guix-rust-past-crates.git (push)
upstream        https://codeberg.org/guix/guix-rust-past-crates.git (fetch)
upstream        https://codeberg.org/guix/guix-rust-past-crates.git (push)

$ git -C nonguix remote -v
origin  ssh://git@marekpasnikowski.pl:23/nonguix.git (fetch)
origin  ssh://git@marekpasnikowski.pl:23/nonguix.git (push)
upstream        https://gitlab.com/nonguix/nonguix.git (fetch)
upstream        https://gitlab.com/nonguix/nonguix.git (push)

Aktualizacja repozytoriów

Projekty są rozwijane w różnym tempie. Niektóre projekty można aktualizować na ślepo, a w innych trzeba zwracać szczególną uwagę na wersje i kompatybilność z innymi projektami.

Guix ma bardzo szybkie tempo zmian i każdego dnia wybieram ostatnią zmianę z poprzedniego dnia jako cel aktualizacji. Używam do tego kombinacji poleceń git fetch i git merge. git fetch pobiera aktualny stan danych z kanonicznego repozytorium bez zmieniania katalogu roboczego. Należy tutaj użyć odnośnika do zdalnego repozytorium upstream. git merge wskazuje do której zmiany ma być przewinięty katalog roboczy.

$ git -C guix fetch upstream
remote: Enumerating objects: 3164, done.
remote: Counting objects: 100% (3023/3023), done.
remote: Compressing objects: 100% (721/721), done.
remote: Total 2879 (delta 2307), reused 2715 (delta 2158), pack-reused 0 (from 0)
Pobieranie obiektów: 100% (2879/2879), 1.09 MiB | 5.10 MiB/s, gotowe.
Rozwiązywanie delt: 100% (2307/2307), wykonano z 105 lokalnymi obiektami.
Z https://codeberg.org/guix/guix
 * [nowa gałąź]            audio-team                                    -> upstream/audio-teamm
 * [nowa gałąź]            c++-team                                      -> upstream/c++-team
 * [nowa gałąź]            crypto-updates                                -> upstream/crypto-updates
 …
 * [nowa gałąź]            world-rebuild                                 -> upstream/world-rebuild

$ git -C guix merge 1f0abd8ff511b2e22858864476d6f566809020c0
Aktualizowanie 97d60fd2d2..1f0abd8ff5
Fast-forward
 doc/guix.texi                                                       |   14 +-
 gnu/local.mk                                                        |    4 +-
 gnu/packages/build-tools.scm                                        |    6 +-
 gnu/packages/chromium.scm                                           |  376 ++++++++++--------
 gnu/packages/ci.scm                                                 |  217 +++++------
 gnu/packages/cpp.scm                                                |   14 -
 gnu/packages/dotnet.scm                                             |   21 ++
 gnu/packages/finance.scm                                            |   69 ----
 gnu/packages/game-development.scm                                   |   41 --
 gnu/packages/hyperledger.scm                                        |  210 -----------
 gnu/packages/machine-learning.scm                                   |   43 ---
 gnu/packages/maths.scm                                              |    4 +-
 gnu/packages/patches/ungoogled-chromium-RUNPATH.patch               |    2 +-
 gnu/packages/patches/ungoogled-chromium-extension-search-path.patch |   16 +-
 gnu/packages/patches/ungoogled-chromium-ffmpeg-compat.patch         |   68 ----
 gnu/packages/patches/ungoogled-chromium-nullptr_t.patch             |   44 +++
 gnu/packages/patches/ungoogled-chromium-system-ffmpeg.patch         |   18 -
 gnu/packages/patches/ungoogled-chromium-system-nspr.patch           |   24 +-
 gnu/packages/python-xyz.scm                                         |    4 +-
 gnu/packages/rust-apps.scm                                          |  116 +++++-
 gnu/packages/rust-crates.scm                                        | 1533 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
 gnu/packages/shellutils.scm                                         |    4 +-
 gnu/packages/version-control.scm                                    |   10 +-
 gnu/services/cuirass.scm                                            |   43 ++-
 gnu/system/examples/bare-bones.tmpl                                 |   14 +-
 po/packages/POTFILES.in                                             |    1 -
 26 files changed, 1975 insertions(+), 941 deletions(-)
 delete mode 100644 gnu/packages/hyperledger.scm
 delete mode 100644 gnu/packages/patches/ungoogled-chromium-ffmpeg-compat.patch
 create mode 100644 gnu/packages/patches/ungoogled-chromium-nullptr_t.patch
 delete mode 100644 gnu/packages/patches/ungoogled-chromium-system-ffmpeg.patch

Nonguix czasami ma zmiany zależne od zmian w Guix, więc też warto stosować kombinację git fetch i git merge. Dzisiaj nie ma zmian w tym projekcie, więc drugie polecenie nie ma sensu.

$ git -C nonguix fetch upstream
Z https://gitlab.com/nonguix/nonguix
 * [nowa gałąź]      add-rpath                       -> upstream/add-rpath
 * [nowa gałąź]      add-skype                       -> upstream/add-skype
 * [nowa gałąź]      beacondb-api-key                -> upstream/beacondb-api-key
 …
 * [nowa gałąź]      wip-mono                        -> upstream/wip-mono

Guix-rust-past-crates jest projektem archiwalnym, więc z dużą dozą pewności można zastosować git pull spodziewając się braku zmian. A w przypadku zaistnienia zmiany prawie na pewno dotyczy ona już wprowadzonej zmiany w Guix.

$ git -C guix-rust-past-crates pull
Już aktualne.

DO ZROBIENIA Po wprowadzeniu tych zmian należałoby je lokalnie przetestować, ale nie posiadam jeszcze do tego właściwego mechanizmu.

Pozostaje tylko wysłać te zmiany do publicznych kopii repozytoriów.

$ git -C guix push
Enter passphrase for key '/home/marek/.ssh/id_rsa':
Wymienianie obiektów: 170, gotowe.
Zliczanie obiektów: 100% (170/170), gotowe.
Kompresja delt z użyciem do 32 wątków
Kompresowanie obiektów: 100% (48/48), gotowe.
Zapisywanie obiektów: 100% (137/137), 55.39 KiB | 55.39 MiB/s, gotowe.
Total 137 (delta 110), reused 114 (delta 89), pack-reused 0 (from 0)
remote: Rozwiązywanie delt: 100% (110/110), wykonano z 31 lokalnymi obiektami.
To ssh://marekpasnikowski.pl:23/guix.git
   97d60fd2d2..1f0abd8ff5  master -> master

$ git -C guix-rust-past-crates push
Enter passphrase for key '/home/marek/.ssh/id_rsa':
Everything up-to-date

$ git -C nonguix push
Enter passphrase for key '/home/marek/.ssh/id_rsa':
Everything up-to-date