Subject: bug#43581: closed (Re: [bug#43581] [PATCH] guix build: Add '--without-tests'.)

From: [email-masked] (GNU bug Tracking System)
Date: Sun, 27 Sep 2020 20:59:02 +0000

Your bug report

#43581: [PATCH] guix build: Add '--without-tests'.

which was filed against the guix-patches package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
43581: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=43581
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: [bug#43581] [PATCH] guix build: Add '--without-tests'.
From: Ludovic Courtès <[email-masked]>
To: Jan Nieuwenhuizen <[email-masked]>
Cc: [email-masked]
Date: Sun, 27 Sep 2020 22:58:44 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

Hi,

Jan Nieuwenhuizen <[email-masked]> skribis:

>> * guix/scripts/build.scm (transform-package-tests): New procedure.
>> (%transformations, %transformation-options)
>
> Nitpick, use comma                          ^
>
>> show-transformation-options-help): Add it.

Oops yes, and I forgot to fix it before pushing.  :-/

>> +Turning off tests leads to a different store item.  Consequently, when
>> +using this option, anything that depends on @var{package} must be
>> +rebuilt, as in this example:
>
> This makes sense, so I'm curious about it's usefulness in practice, but
> there have been several times during porting sessions where I have
> disabled tests by editing the package.

Yeah, that’s the typical use case.

> $ time ./pre-inst-env guix build automake --without-tests=automake --verbosity=1
> The following derivation will be built:
>    /gnu/store/0m9qp0rf74d6sray1ip6h050fzmrrya3-automake-1.16.2.drv
> building /gnu/store/0m9qp0rf74d6sray1ip6h050fzmrrya3-automake-1.16.2.drv...
> |offloading build of /gnu/store/0m9qp0rf74d6sray1ip6h050fzmrrya3-automake-1.16.2.drv to 'kluit.dezyne.org'
> /gnu/store/7qsz3avcfk6b6am0zj9ahsmjy8x6drxr-automake-1.16.2
>
> real	0m14.316s
> user	0m1.203s
> sys	0m0.072s

That’s also one of the packages I had in mind.  :-)

Ricardo Wurmus <[email-masked]> skribis:

> This looks good to me.  It’s much more convenient for the casual user
> than to clone the Guix repo and to edit the package definition there, or
> to extend the package collection with GUIX_PACKAGE_PATH or even a
> channel.

Yup.

> I suppose we’d have to fix all those packages that moved the check phase
> without also checking for the “#:tests?” keyword.  There are quite a few
> of those that thus wouldn’t be affected by “--without-tests”.

Right, hopefully there aren’t too many of those.

Pushed as f458cfbcc54ed87b1a87dd9e150ea276f17eab74, thanks!

Ludo’.

Subject: [PATCH] guix build: Add '--without-tests'.
From: Ludovic Courtès <[email-masked]>
To: [email-masked]
Cc: Ludovic Courtès <[email-masked]>
Date: Wed, 23 Sep 2020 22:42:49 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

* guix/scripts/build.scm (transform-package-tests): New procedure.
(%transformations, %transformation-options)
show-transformation-options-help): Add it.
* tests/scripts-build.scm ("options->transformation, without-tests"):
New test.
* doc/guix.texi (Package Transformation Options): Document it.
---
 doc/guix.texi           | 22 ++++++++++++++++++++++
 guix/scripts/build.scm  | 31 ++++++++++++++++++++++++++++---
 tests/scripts-build.scm | 14 ++++++++++++++
 3 files changed, 64 insertions(+), 3 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 949551a163..67d0a70ae0 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -9270,6 +9270,28 @@ guix build --with-branch=guile-sqlite3=master cuirass
 This is similar to @option{--with-branch}, except that it builds from
 @var{commit} rather than the tip of a branch.  @var{commit} must be a valid
 Git commit SHA1 identifier or a tag.
+
+@cindex test suite, skipping
+@item --without-tests=@var{package}
+Build @var{package} without running its tests.  This can be useful in
+situations where you want to skip the lengthy test suite of a
+intermediate package, or if a package's test suite fails in a
+non-deterministic fashion.  It should be used with care because running
+the test suite is a good way to ensure a package is working as intended.
+
+Turning off tests leads to a different store item.  Consequently, when
+using this option, anything that depends on @var{package} must be
+rebuilt, as in this example:
+
+@example
+guix install --without-tests=python python-notebook
+@end example
+
+The command above installs @code{python-notebook} on top of
+@code{python} built without running its test suite.  To do so, it also
+rebuilds everything that depends on @code{python}, including
+@code{python-notebook} itself.
+
 @end table
 
 @node Additional Build Options
diff --git a/guix/scripts/build.scm b/guix/scripts/build.scm
index 38e0516c95..f238e9b876 100644
--- a/guix/scripts/build.scm
+++ b/guix/scripts/build.scm
@@ -393,6 +393,25 @@ a checkout of the Git repository at the given URL."
         (rewrite obj)
         obj)))
 
+(define (transform-package-tests specs)
+  "Return a procedure that, when passed a package, sets #:tests? #f in its
+'arguments' field."
+  (define (package-without-tests p)
+    (package/inherit p
+      (arguments
+       (substitute-keyword-arguments (package-arguments p)
+         ((#:tests? _ #f) #f)))))
+
+  (define rewrite
+    (package-input-rewriting/spec (map (lambda (spec)
+                                         (cons spec package-without-tests))
+                                       specs)))
+
+  (lambda (store obj)
+    (if (package? obj)
+        (rewrite obj)
+        obj)))
+
 (define %transformations
   ;; Transformations that can be applied to things to build.  The car is the
   ;; key used in the option alist, and the cdr is the transformation
@@ -403,7 +422,8 @@ a checkout of the Git repository at the given URL."
     (with-graft  . ,transform-package-inputs/graft)
     (with-branch . ,transform-package-source-branch)
     (with-commit . ,transform-package-source-commit)
-    (with-git-url . ,transform-package-source-git-url)))
+    (with-git-url . ,transform-package-source-git-url)
+    (without-tests . ,transform-package-tests)))
 
 (define %transformation-options
   ;; The command-line interface to the above transformations.
@@ -423,7 +443,9 @@ a checkout of the Git repository at the given URL."
           (option '("with-commit") #t #f
                   (parser 'with-commit))
           (option '("with-git-url") #t #f
-                  (parser 'with-git-url)))))
+                  (parser 'with-git-url))
+          (option '("without-tests") #t #f
+                  (parser 'without-tests)))))
 
 (define (show-transformation-options-help)
   (display (G_ "
@@ -443,7 +465,10 @@ a checkout of the Git repository at the given URL."
                          build PACKAGE from COMMIT"))
   (display (G_ "
       --with-git-url=PACKAGE=URL
-                         build PACKAGE from the repository at URL")))
+                         build PACKAGE from the repository at URL"))
+  (display (G_ "
+      --without-tests=PACKAGE
+                         build PACKAGE without running its tests")))

 (define (options->transformation opts)
diff --git a/tests/scripts-build.scm b/tests/scripts-build.scm
index 32876e956a..12114fc8f5 100644
--- a/tests/scripts-build.scm
+++ b/tests/scripts-build.scm
@@ -264,5 +264,19 @@
                        ((("x" dep3))
                         (map package-source (list dep1 dep3))))))))))))
 
+(test-assert "options->transformation, without-tests"
+  (let* ((dep (dummy-package "dep"))
+         (p   (dummy-package "foo"
+                (inputs `(("dep" ,dep)))))
+         (t   (options->transformation '((without-tests . "dep")
+                                         (without-tests . "tar")))))
+    (with-store store
+      (let ((new (t store p)))
+        (match (bag-direct-inputs (package->bag new))
+          ((("dep" dep) ("tar" tar) _ ...)
+           ;; TODO: Check whether TAR has #:tests? #f when transformations
+           ;; apply to implicit inputs.
+           (equal? (package-arguments dep)
+                   '(#:tests? #f))))))))
 
 (test-end)
-- 
2.28.0