From: Maxim Cournoyer <maxim.cournoyer@gmail.com>
To: "Ludovic Courtès" <ludo@gnu.org>
Cc: 58032@debbugs.gnu.org,
"Ludovic Courtès" <ludovic.courtes@inria.fr>,
43193@debbugs.gnu.org, philippe.swartvagher@inria.fr
Subject: [bug#43193] bug#58032: [PATCH] transformations: '--with-source' now operates in depth.
Date: Wed, 28 Sep 2022 12:46:39 -0400 [thread overview]
Message-ID: <87fsgbwiog.fsf@gmail.com> (raw)
In-Reply-To: <20220923204208.31957-1-ludo@gnu.org> ("Ludovic Courtès"'s message of "Fri, 23 Sep 2022 22:42:08 +0200")
Hi,
Ludovic Courtès <ludo@gnu.org> writes:
> From: Ludovic Courtès <ludovic.courtes@inria.fr>
>
> The '--with-source' option is the first one that was implemented, and
> it's the only one that would operate only on leaf packages rather than
> traversing the dependency graph. This change makes it consistent with
> the rest of the transformation options.
Good idea! I needed to workaround the lack of recursion at least once.
[...]
> diff --git a/guix/transformations.scm b/guix/transformations.scm
> index 411c4014cb..be2d31b8c7 100644
> --- a/guix/transformations.scm
> +++ b/guix/transformations.scm
> @@ -129,42 +129,46 @@ (define* (package-with-source p uri #:optional version)
> ;;; Transformations.
> ;;;
>
> -(define (transform-package-source sources)
> +(define (evaluate-source-replacement-specs specs)
> + "Parse SPECS, a list of strings like \"guile=/tmp/guile-4.2.tar.gz\" or just
> +\"/tmp/guile-4.2.tar.gz\" and return a list of package spec/procedure pairs as
> +expected by 'package-input-rewriting/spec'. Raise an error if an element of
> +SPECS uses invalid syntax."
> + (define not-equal
> + (char-set-complement (char-set #\=)))
> +
> + (map (lambda (spec)
> + (match (string-tokenize spec not-equal)
> + ((uri)
> + (let* ((base (tarball-base-name (basename uri)))
Unrelated, but 'tarball-base-name' is a bit of a misnomer since the file
could be a single, non-tarball archive (or plain file).
> + (name (hyphen-package-name->name+version base)))
> + (cons name
> + (lambda (old)
> + (package-with-source old uri)))))
> + ((spec uri)
> + (let-values (((name version)
> + (package-name->name+version spec)))
You usually recommend (srfi srfi-71) when using multiple values; why not
use it here? I don't have a preference myself (I find srfi-71
surprising for the non-initiated (I was), although I like its simple
interface! :-)).
> + ;; Note: Here VERSION is used as the version string of the new
> + ;; package rather than as part of the spec of the package being
> + ;; targeted.
> + (cons name
> + (lambda (old)
> + (package-with-source old uri version)))))
> + (_
> + (raise (formatted-message
> + (G_ "invalid source replacement specification: ~s")
> + spec)))))
> + specs))
> +
> +(define (transform-package-source replacement-specs)
> "Return a transformation procedure that replaces package sources with the
> -matching URIs given in SOURCES."
> - (define new-sources
> - (map (lambda (uri)
> - (match (string-index uri #\=)
> - (#f
> - ;; Determine the package name and version from URI.
> - (call-with-values
> - (lambda ()
> - (hyphen-package-name->name+version
> - (tarball-base-name (basename uri))))
> - (lambda (name version)
> - (list name version uri))))
> - (index
> - ;; What's before INDEX is a "PKG@VER" or "PKG" spec.
> - (call-with-values
> - (lambda ()
> - (package-name->name+version (string-take uri index)))
> - (lambda (name version)
> - (list name version
> - (string-drop uri (+ 1 index))))))))
> - sources))
> -
> - (lambda (obj)
> - (let loop ((sources new-sources)
> - (result '()))
> - (match obj
> - ((? package? p)
> - (match (assoc-ref sources (package-name p))
> - ((version source)
> - (package-with-source p source version))
> - (#f
> - p)))
> - (_
> - obj)))))
> +matching URIs given in REPLACEMENT-SPECS."
> + (let* ((replacements (evaluate-source-replacement-specs replacement-specs))
> + (rewrite (package-input-rewriting/spec replacements)))
> + (lambda (obj)
> + (if (package? obj)
> + (rewrite obj)
> + obj))))
>
> (define (evaluate-replacement-specs specs proc)
> "Parse SPECS, a list of strings like \"guile=guile@2.1\" and return a list
> diff --git a/tests/transformations.scm b/tests/transformations.scm
> index dbfe523518..47b1fc650d 100644
> --- a/tests/transformations.scm
> +++ b/tests/transformations.scm
> @@ -103,16 +103,11 @@ (define-module (test-transformations)
> "sha256" f))))))))))
>
> (test-assert "options->transformation, with-source, no matches"
> - ;; When a transformation in not applicable, a warning must be raised.
> (let* ((p (dummy-package "foobar"))
> (s (search-path %load-path "guix.scm"))
> (t (options->transformation `((with-source . ,s)))))
> - (let* ((port (open-output-string))
> - (new (parameterize ((guix-warning-port port))
> - (t p))))
> - (and (eq? new p)
> - (string-contains (get-output-string port)
> - "had no effect")))))
> + (eq? (package-source (t p))
> + (package-source p))))
I'd personally find it a better interface if it failed noisily when
--with-source doesn't have any effect. The warning was of little use
because it got lost in the other outputs; now it would be totally
silent, right?
> (test-assert "options->transformation, with-source, PKG=URI"
> (let* ((p (dummy-package "foo"))
> @@ -147,6 +142,29 @@ (define-module (test-transformations)
> (add-to-store store (basename s) #t
> "sha256" s)))))))
>
> +(test-assert "options->transformation, with-source, in depth"
> + (let* ((p0 (dummy-package "foo" (version "0.0")))
> + (s (search-path %load-path "guix.scm"))
> + (f (string-append "foo@42.0=" s))
> + (t (options->transformation `((with-source . ,f))))
> + (p1 (dummy-package "bar" (inputs (list p0))))
> + (p2 (dummy-package "baz" (inputs (list p1)))))
> + (with-store store
> + (let ((new (t p2)))
> + (and (not (eq? new p2))
> + (match (package-inputs new)
> + ((("bar" p1*))
> + (match (package-inputs p1*)
> + ((("foo" p0*))
> + (and (not (eq? p0* p0))
> + (string=? (package-name p0*) (package-name p0))
> + (string=? (package-version p0*) "42.0")
> + (string=? (add-to-store store (basename s) #t
> + "sha256" s)
> + (run-with-store store
> + (lower-object
> + (package-source p0*))))))))))))))
> +
The recursive? option should probably be #f in the add-store above,
since the "dummy" source is a single file. It may be better to create
the dummy file ourselves instead of relying on the existence of a
'guix.scm' one (it'd help clarify the test too, that bit was a bit
mysterious at first).
Other than that, LGTM!
Thanks,
Maxim
next prev parent reply other threads:[~2022-09-28 17:20 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-23 20:42 [bug#58032] [PATCH] transformations: '--with-source' now operates in depth Ludovic Courtès
2022-09-28 16:46 ` Maxim Cournoyer [this message]
2022-09-29 11:00 ` Ludovic Courtès
2022-09-29 21:11 ` bug#58032: " Ludovic Courtès
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://guix.gnu.org/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87fsgbwiog.fsf@gmail.com \
--to=maxim.cournoyer@gmail.com \
--cc=43193@debbugs.gnu.org \
--cc=58032@debbugs.gnu.org \
--cc=ludo@gnu.org \
--cc=ludovic.courtes@inria.fr \
--cc=philippe.swartvagher@inria.fr \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/guix.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).