From a7db59b3fd217374d1da821a51f53c987e9c96a3 Mon Sep 17 00:00:00 2001 From: Ricardo Wurmus Date: Sun, 25 Aug 2024 22:35:47 +0200 Subject: [PATCH] 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 --- etc/committer.scm.in | 20 ++++++++++++++++---- 1 file 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 +;;; Copyright © 2020, 2021, 2022, 2023 Ricardo Wurmus ;;; Copyright © 2021 Sarah Morgensen ;;; Copyright © 2021 Xinglu Chen ;;; Copyright © 2022 Maxim Cournoyer @@ -255,10 +255,18 @@ (define (new-sexp hunk) (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 @@ (define (listify items) (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.~%"