diff options
author | Ricardo Wurmus <rekado@elephly.net> | 2024-08-25 22:35:47 +0200 |
---|---|---|
committer | Ricardo Wurmus <rekado@elephly.net> | 2024-08-26 11:39:38 +0200 |
commit | a7db59b3fd217374d1da821a51f53c987e9c96a3 (patch) | |
tree | 8fc3034ac61e03d14c110f5b8bc36df45ae1d4f6 /etc | |
parent | a2e10e2878fb926e769a35866515f178611297c7 (diff) | |
download | guix-a7db59b3fd217374d1da821a51f53c987e9c96a3.tar.gz |
committer: Avoid // in xpath.
When using // we assume that the package definition's S-expression is a nesting of proper lists. This is not guaranteed to be true, because a package definition may contain alists. By using an explicit path to the field of interest we avoid recursion through all child nodes, thus avoiding child nodes that are more likely to contain improper lists. * etc/committer.scm.in (change-commit-message): Replace // with a path for the PACKAGE symbol. Change-Id: Idefaec9f5c3538484432e15a5865a68fc16e7369
Diffstat (limited to 'etc')
-rwxr-xr-x | etc/committer.scm.in | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/etc/committer.scm.in b/etc/committer.scm.in index 0705b29fd9..c49935da60 100755 --- a/etc/committer.scm.in +++ b/etc/committer.scm.in @@ -3,7 +3,7 @@ !# ;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2020, 2021 Ricardo Wurmus <rekado@elephly.net> +;;; Copyright © 2020, 2021, 2022, 2023 Ricardo Wurmus <rekado@elephly.net> ;;; Copyright © 2021 Sarah Morgensen <iskarian@mgsn.dev> ;;; Copyright © 2021 Xinglu Chen <public@yoctocell.xyz> ;;; Copyright © 2022 Maxim Cournoyer <maxim.cournoyer@gmail.com> @@ -255,10 +255,18 @@ corresponding to the top-level definition containing the staged changes." (define* (change-commit-message file-name old new #:optional (port (current-output-port))) "Print ChangeLog commit message for changes between OLD and NEW." (define (get-values expr field) - (match ((xpath:sxpath `(// ,field quasiquote *)) expr) + (match ((xpath:node-or + (xpath:sxpath `(*any* *any* package ,field quasiquote *)) + ;; For let binding + (xpath:sxpath `(*any* *any* (*any*) package ,field quasiquote *))) + (cons '*TOP* expr)) (() ;; New-style plain lists - (match ((xpath:sxpath `(// ,field list *)) expr) + (match ((xpath:node-or + (xpath:sxpath `(*any* *any* package ,field list *)) + ;; For let binding + (xpath:sxpath `(*any* *any* (*any*) package ,field list *))) + (cons '*TOP* expr)) ((inner) inner) (_ '()))) ;; Old-style labelled inputs @@ -275,7 +283,11 @@ corresponding to the top-level definition containing the staged changes." (define variable-name (second old)) (define version - (and=> ((xpath:sxpath '(// version *any*)) new) + (and=> ((xpath:node-or + (xpath:sxpath '(*any* *any* package version *any*)) + ;; For let binding + (xpath:sxpath '(*any* *any* (*any*) package version *any*))) + (cons '*TOP* new)) first)) (format port "gnu: ~a: Update to ~a.~%~%* ~a (~a): Update to ~a.~%" |