<feed xmlns='http://www.w3.org/2005/Atom'>
<title>guix/tests, branch r-team</title>
<subtitle>Transactional package manager, declarative GNU/Linux distribution, reproducible deployment tool, and more! https://guix.gnu.org</subtitle>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/'/>
<entry>
<title>build/node: Preserve field order of modified JSON files.</title>
<updated>2026-07-08T16:33:27+00:00</updated>
<author>
<name>Maxim Cournoyer</name>
<email>maxim@guixotic.coop</email>
</author>
<published>2026-06-11T06:50:48+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=ef58e493c341ff4f61fb8caf4e14f02fd28c55d3'/>
<id>ef58e493c341ff4f61fb8caf4e14f02fd28c55d3</id>
<content type='text'>
* guix/build/node-build-system.scm (with-atomic-json-file-replacement): Call
json-&gt;scm with #:ordered #t.
* tests/node.scm ("modify-json, ordering"): New test.
("delete-dev-dependencies/except"): Adjust expected output accordingly.

Change-Id: I9cf0475a7bac0cad8f5fd3d479c50eb35eac3f32
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* guix/build/node-build-system.scm (with-atomic-json-file-replacement): Call
json-&gt;scm with #:ordered #t.
* tests/node.scm ("modify-json, ordering"): New test.
("delete-dev-dependencies/except"): Adjust expected output accordingly.

Change-Id: I9cf0475a7bac0cad8f5fd3d479c50eb35eac3f32
</pre>
</div>
</content>
</entry>
<entry>
<title>build/node: Add `delete-dependencies/except' procedure.</title>
<updated>2026-07-08T16:33:27+00:00</updated>
<author>
<name>Maxim Cournoyer</name>
<email>maxim@guixotic.coop</email>
</author>
<published>2026-06-10T00:00:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=230a8b05a844a67f2eeb0f554301d1fe2b52a937'/>
<id>230a8b05a844a67f2eeb0f554301d1fe2b52a937</id>
<content type='text'>
This adds a more convenient means to filter out most, but not all, development
dependencies.

* guix/build/node-build-system.scm (%dependency-keys)
(%dev-dependency-keys): New variables.
(delete-dependencies) [#:negate?, #:dependency-keys]: New arguments.  Log
removed dependencies.
(delete-dependencies/except, delete-dev-dependencies/except): New procedures.
* tests/node.scm: New test.
* Makefile.am (SCM_TESTS): Register it.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This adds a more convenient means to filter out most, but not all, development
dependencies.

* guix/build/node-build-system.scm (%dependency-keys)
(%dev-dependency-keys): New variables.
(delete-dependencies) [#:negate?, #:dependency-keys]: New arguments.  Log
removed dependencies.
(delete-dependencies/except, delete-dev-dependencies/except): New procedures.
* tests/node.scm: New test.
* Makefile.am (SCM_TESTS): Register it.
</pre>
</div>
</content>
</entry>
<entry>
<title>tests: git: Avoid duplicated helper code.</title>
<updated>2026-07-06T10:00:49+00:00</updated>
<author>
<name>Simon Tournier</name>
<email>zimon.toutoune@gmail.com</email>
</author>
<published>2026-07-03T11:27:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=f729199e7b7f8933ee73ac7cb7a234e62beef025'/>
<id>f729199e7b7f8933ee73ac7cb7a234e62beef025</id>
<content type='text'>
* tests/git.scm (git): New procedure.
("update-cached-checkout, tag",
"update-cached-checkout, recursive submodules follow ref",
"update-cached-checkout, symref tag",
"update-cached-checkout, symref pull-request"): Use it.

Change-Id: I85aa14e729be1efe691418e74e37d6ae1fd3e633
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* tests/git.scm (git): New procedure.
("update-cached-checkout, tag",
"update-cached-checkout, recursive submodules follow ref",
"update-cached-checkout, symref tag",
"update-cached-checkout, symref pull-request"): Use it.

Change-Id: I85aa14e729be1efe691418e74e37d6ae1fd3e633
</pre>
</div>
</content>
</entry>
<entry>
<title>tests: git: Avoid nested checks for submodules.</title>
<updated>2026-07-06T10:00:25+00:00</updated>
<author>
<name>Simon Tournier</name>
<email>zimon.toutoune@gmail.com</email>
</author>
<published>2026-07-03T11:04:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=1178100657fba8f4b1ff23d7752c9d9b13c7d938'/>
<id>1178100657fba8f4b1ff23d7752c9d9b13c7d938</id>
<content type='text'>
Follow up of 8d27b1158de3cc1823d33847cb722722c769a27e discussed in #9231.

* tests/git.scm ("update-cached-checkout, recursive submodules follow ref"):
Replace the nested 'let' by 'let*'.

Merges: #9683
Change-Id: Ibd212bbd2b6fbf02f6fcae0ecb21922686b5f8bc
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Follow up of 8d27b1158de3cc1823d33847cb722722c769a27e discussed in #9231.

* tests/git.scm ("update-cached-checkout, recursive submodules follow ref"):
Replace the nested 'let' by 'let*'.

Merges: #9683
Change-Id: Ibd212bbd2b6fbf02f6fcae0ecb21922686b5f8bc
</pre>
</div>
</content>
</entry>
<entry>
<title>scripts: substitute: Accommodate renaming unwritable directories.</title>
<updated>2026-07-05T09:47:15+00:00</updated>
<author>
<name>Reepca Russelstein</name>
<email>reepca@russelstein.xyz</email>
</author>
<published>2026-07-03T22:37:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=57fd857c1e3ff11511ba451021d559e874b50e34'/>
<id>57fd857c1e3ff11511ba451021d559e874b50e34</id>
<content type='text'>
This fixes a regression introduced in 26d7eb8a4adafc648ef035e91b6bbc4945d4c962
when running ‘guix-daemon’ without root privileges.

On rootless installations, we must abide by the usual file access rules, which
include the requirement that a directory be writable before it be renamed (the
rationale being that its ".." entry needs to be modified).

* guix/scripts/substitute.scm (rename-file*): New procedure.
(guix-substitute): Use it.
* tests/substitute.scm (directory-nar-sha256): New procedure.
(%narinfo/directory): New variable.
(call-with-narinfo): Add '#:directory?' keyword argument.
(with-directory-narinfo): New syntax.
("substitute, authorized key, directory"): New test case.

Fixes: guix/guix#9686
Change-Id: I9d399dd5f1717b7d02854d97e1100a0a464fac75
Signed-off-by: Ludovic Courtès &lt;ludo@gnu.org&gt;
Merges: #9702
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This fixes a regression introduced in 26d7eb8a4adafc648ef035e91b6bbc4945d4c962
when running ‘guix-daemon’ without root privileges.

On rootless installations, we must abide by the usual file access rules, which
include the requirement that a directory be writable before it be renamed (the
rationale being that its ".." entry needs to be modified).

* guix/scripts/substitute.scm (rename-file*): New procedure.
(guix-substitute): Use it.
* tests/substitute.scm (directory-nar-sha256): New procedure.
(%narinfo/directory): New variable.
(call-with-narinfo): Add '#:directory?' keyword argument.
(with-directory-narinfo): New syntax.
("substitute, authorized key, directory"): New test case.

Fixes: guix/guix#9686
Change-Id: I9d399dd5f1717b7d02854d97e1100a0a464fac75
Signed-off-by: Ludovic Courtès &lt;ludo@gnu.org&gt;
Merges: #9702
</pre>
</div>
</content>
</entry>
<entry>
<title>profiles: Add manifest generator based on build-system.</title>
<updated>2026-07-03T13:10:29+00:00</updated>
<author>
<name>Romain GARBAGE</name>
<email>romain.garbage@inria.fr</email>
</author>
<published>2026-03-18T14:47:08+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=ce9929fadfcdb1426eec4ea228aaf68db7fd2db3'/>
<id>ce9929fadfcdb1426eec4ea228aaf68db7fd2db3</id>
<content type='text'>
* guix/profiles.scm (build-system-&gt;manifest): New procedure.
* doc/guix.texi (Writing Manifests): Document it.
* tests/profiles.scm: Test it.

Merges: #7272
Change-Id: Iaba54d5d4a1a9ae304de45f91374098617adebfc
Signed-off-by: Simon Tournier &lt;zimon.toutoune@gmail.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
* guix/profiles.scm (build-system-&gt;manifest): New procedure.
* doc/guix.texi (Writing Manifests): Document it.
* tests/profiles.scm: Test it.

Merges: #7272
Change-Id: Iaba54d5d4a1a9ae304de45f91374098617adebfc
Signed-off-by: Simon Tournier &lt;zimon.toutoune@gmail.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>substitutes: Ignore narinfos that don’t match the request [security fix].</title>
<updated>2026-07-02T17:42:48+00:00</updated>
<author>
<name>Ludovic Courtès</name>
<email>ludo@gnu.org</email>
</author>
<published>2026-06-24T09:34:05+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=2ef8ed9f0df53bddf14bdecc2ea48c2d233213cc'/>
<id>2ef8ed9f0df53bddf14bdecc2ea48c2d233213cc</id>
<content type='text'>
Previously, by serving a valid, signed, and authorized narinfo that does not
match what the client asked for, an attacker could cause users to get the
wrong substitute.

* guix/substitutes.scm (fetch-narinfos)[handle-narinfo-response]: Check
whether the result of ‘read-narinfo’ matches ‘request’ and ignore it if it
doesn’t.
[do-fetch]: Likewise with ‘narinfo-from-file’.
* tests/substitute.scm ("query narinfo that returns different store path")
("substitute, narinfo does not match requested store item"): New tests.

Reported-by: Reepca Russelstein &lt;reepca@russelstein.xyz&gt;
Signed-off-by: Ludovic Courtès &lt;ludo@gnu.org&gt;
Merges: #9665
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Previously, by serving a valid, signed, and authorized narinfo that does not
match what the client asked for, an attacker could cause users to get the
wrong substitute.

* guix/substitutes.scm (fetch-narinfos)[handle-narinfo-response]: Check
whether the result of ‘read-narinfo’ matches ‘request’ and ignore it if it
doesn’t.
[do-fetch]: Likewise with ‘narinfo-from-file’.
* tests/substitute.scm ("query narinfo that returns different store path")
("substitute, narinfo does not match requested store item"): New tests.

Reported-by: Reepca Russelstein &lt;reepca@russelstein.xyz&gt;
Signed-off-by: Ludovic Courtès &lt;ludo@gnu.org&gt;
Merges: #9665
</pre>
</div>
</content>
</entry>
<entry>
<title>tests: challenge: produce narinfo StorePath with proper hash length.</title>
<updated>2026-07-02T17:42:48+00:00</updated>
<author>
<name>Reepca Russelstein</name>
<email>reepca@russelstein.xyz</email>
</author>
<published>2026-06-17T02:03:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=f50c196e5a34ae21e8a9f4b7e9d92e2264a5a879'/>
<id>f50c196e5a34ae21e8a9f4b7e9d92e2264a5a879</id>
<content type='text'>
Recent changes caused (guix narinfo) to start validating the StorePath of all
narinfos, which is what finally caught this.

* tests/challenge.scm (call-mismatch-test): produce an item path whose hash
  has 32 nix-base32 characters, rather than 32 bytes.

Change-Id: I19a5c0106c913d9ad37fb53a28e8add8bd6ec2a0
Signed-off-by: Ludovic Courtès &lt;ludo@gnu.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Recent changes caused (guix narinfo) to start validating the StorePath of all
narinfos, which is what finally caught this.

* tests/challenge.scm (call-mismatch-test): produce an item path whose hash
  has 32 nix-base32 characters, rather than 32 bytes.

Change-Id: I19a5c0106c913d9ad37fb53a28e8add8bd6ec2a0
Signed-off-by: Ludovic Courtès &lt;ludo@gnu.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>narinfo: Reject narinfos where store file names are invalid.</title>
<updated>2026-07-02T17:42:48+00:00</updated>
<author>
<name>Ludovic Courtès</name>
<email>ludo@gnu.org</email>
</author>
<published>2026-06-08T21:50:14+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=5e0b68f3737ec29595bf92c8ce209702f5bd80be'/>
<id>5e0b68f3737ec29595bf92c8ce209702f5bd80be</id>
<content type='text'>
This change safeguards against narinfos that would advertise
“StorePath: /gnu/store/…-foo/../../../etc/passwd” or similar, which could
otherwise propagate down the line and lead to attempts to overwrite said file,
should ‘guix-daemon’ be running as root.

* guix/narinfo.scm (narinfo-maker): Validate ‘path’, ‘references’, and
‘deriver’ and return #f upon failure.
(read-narinfo, string-&gt;narinfo): Adjust docstring accordingly.
* guix/substitutes.scm (fetch-narinfos): Remove check for ‘narinfo-path’
prefix; instead check whether ‘read-narinfo’ returned true.
(cached-narinfo): Check whether ‘string-&gt;narinfo’ returned true.
* tests/substitute.scm ("query narinfo that contains invalid store path"): New
test.

Change-Id: I0be2ea88b7f762144fca35373363364df3264b5a
Signed-off-by: Ludovic Courtès &lt;ludo@gnu.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
This change safeguards against narinfos that would advertise
“StorePath: /gnu/store/…-foo/../../../etc/passwd” or similar, which could
otherwise propagate down the line and lead to attempts to overwrite said file,
should ‘guix-daemon’ be running as root.

* guix/narinfo.scm (narinfo-maker): Validate ‘path’, ‘references’, and
‘deriver’ and return #f upon failure.
(read-narinfo, string-&gt;narinfo): Adjust docstring accordingly.
* guix/substitutes.scm (fetch-narinfos): Remove check for ‘narinfo-path’
prefix; instead check whether ‘read-narinfo’ returned true.
(cached-narinfo): Check whether ‘string-&gt;narinfo’ returned true.
* tests/substitute.scm ("query narinfo that contains invalid store path"): New
test.

Change-Id: I0be2ea88b7f762144fca35373363364df3264b5a
Signed-off-by: Ludovic Courtès &lt;ludo@gnu.org&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>tests: Fix improper narinfo ‘Deriver’ and ‘References’ field values.</title>
<updated>2026-07-02T17:42:47+00:00</updated>
<author>
<name>Ludovic Courtès</name>
<email>ludo@gnu.org</email>
</author>
<published>2026-06-08T21:42:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.vineetk.net/guix/commit/?id=26fe5af3e39405b19b8b52f6e3263cd9d1cb8653'/>
<id>26fe5af3e39405b19b8b52f6e3263cd9d1cb8653</id>
<content type='text'>
The mistake was harmless because the ‘Deriver’ and ‘References’ field values
were unchecked so far.

* tests/substitute.scm (%narinfo)
("query narinfo with signature over irrelevant bits")
("query narinfo with signature over relevant subset")
("substitute, invalid hash")
("substitute, two invalid narinfos"): Remove store prefix from ‘Deriver’ field
value.  Add hash part to ‘Deriver’ and ‘References’ values.
* tests/guix-daemon.sh: Likewise.

Change-Id: I0af4b9aa4b64cebf46d221ffab17bf5663b0cc11
Signed-off-by: Ludovic Courtès &lt;ludo@gnu.org&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The mistake was harmless because the ‘Deriver’ and ‘References’ field values
were unchecked so far.

* tests/substitute.scm (%narinfo)
("query narinfo with signature over irrelevant bits")
("query narinfo with signature over relevant subset")
("substitute, invalid hash")
("substitute, two invalid narinfos"): Remove store prefix from ‘Deriver’ field
value.  Add hash part to ‘Deriver’ and ‘References’ values.
* tests/guix-daemon.sh: Likewise.

Change-Id: I0af4b9aa4b64cebf46d221ffab17bf5663b0cc11
Signed-off-by: Ludovic Courtès &lt;ludo@gnu.org&gt;
</pre>
</div>
</content>
</entry>
</feed>
