nar: Ensure VCS directories are recursively excluded
Previously only top level VCS directories were excluded but that behavior
does not match the one from the guix hash -x -S nar
command who recursively
excludes those directories when computing a nar hash.
So ensure to have the same behavior to avoid hash mismatch issues when using a directory loader.
We can check that behavior using the following git repository from the guix sources file where submodules are included.
{
"type": "git",
"git_url": "https://github.com/dimkr/loksh",
"integrity": "sha256-djjJH+mknmOfleVJhSkCLqCIaELh2gjZZE/xdNZuPtY=",
"outputHashAlgo": "sha256",
"outputHashMode": "recursive",
"git_ref": "7.3"
}
When a submodule is exported, git creates a .git
file containing
the path to the submodule git data folder. We can check that the
nar hash computed by guix by excluding VCS directories is the right one.
anlambert@carnavalet:/tmp$ git clone https://github.com/dimkr/loksh
Cloning into 'loksh'...
remote: Enumerating objects: 817, done.
remote: Counting objects: 100% (116/116), done.
remote: Compressing objects: 100% (61/61), done.
remote: Total 817 (delta 53), reused 98 (delta 38), pack-reused 701
Receiving objects: 100% (817/817), 771.04 KiB | 967.00 KiB/s, done.
Resolving deltas: 100% (531/531), done.
anlambert@carnavalet:/tmp$ cd loksh/
(swh) ✔ /tmp/loksh [master|✔]
17:33 $ git checkout 7.3
Note: switching to '7.3'.
(swh) ✔ /tmp/loksh [7.3|✔]
17:33 $ git submodule init
Submodule 'subprojects/lolibc' (https://github.com/dimkr/lolibc) registered for path 'subprojects/lolibc'
(swh) ✔ /tmp/loksh [7.3|✔]
17:33 $ git submodule update
Cloning into '/tmp/loksh/subprojects/lolibc'...
Submodule path 'subprojects/lolibc': checked out 'f6e9da78ba0ca66a8711a7e8cc64e418e68eaa00'
(swh) ✔ /tmp/loksh [7.3|✔]
17:34 $ cat subprojects/lolibc/.git
gitdir: ../../.git/modules/subprojects/lolibc
(swh) ✔ /tmp/loksh [7.3|✔]
17:33 $ guix hash -x -S nar -f base64 .
djjJH+mknmOfleVJhSkCLqCIaELh2gjZZE/xdNZuPtY=
Prior that MR, the swh nar
command was not returning the same hash.
(swh) ✔ /tmp/loksh [7.3|✔]
17:49 $ swh nar -x -f base64 .
/xgb/b9yzktnwfolnsunczevnoija+ovs5s1hhrlygg=
After that MR, the computed hash matches the one computed by guix.
(swh) ✔ /tmp/loksh [7.3|✔]
17:53 $ swh nar -x -f base64 .
djjJH+mknmOfleVJhSkCLqCIaELh2gjZZE/xdNZuPtY=
Related to swh-loader-git#4751.