guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

05/05: squash! Add 'guix style'.


From: guix-commits
Subject: 05/05: squash! Add 'guix style'.
Date: Sun, 27 Jun 2021 16:47:16 -0400 (EDT)

civodul pushed a commit to branch wip-simplified-packages
in repository guix.

commit 1c0b4dc989a786608161fac6403b27b292f173ff
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Sun Jun 27 22:43:28 2021 +0200

    squash! Add 'guix style'.
    
    Add the '--input-simplification' option.
---
 doc/guix.texi          | 22 +++++++++++++
 guix/scripts/style.scm | 85 ++++++++++++++++++++++++++++++++++++--------------
 tests/style.scm        | 38 ++++++++++++++++++++++
 3 files changed, 121 insertions(+), 24 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index 132c064..ddd7606 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -12103,6 +12103,28 @@ guix style -e '(@@ (gnu packages gcc) gcc-5)'
 @end example
 
 styles the @code{gcc-5} package definition.
+
+@item --input-simplification=@var{policy}
+Specify the package input simplification policy for cases where an input
+label does not match the corresponding package name.  @var{policy} may
+be one of the following:
+
+@table @code
+@item silent
+Simplify inputs only when the change is ``silent'', meaning that the
+package does not need to be rebuilt (its derivation is unchanged).
+
+@item safe
+Simplify inputs only when that is ``safe'' to do: the package might need
+to be rebuilt, but the change is known to have no observable effect.
+
+@item always
+Simplify inputs even when input labels do not match package names, and
+even if that might have an observable effect.
+@end table
+
+The default is @code{silent}, meaning that input simplifications do not
+trigger any package rebuild.
 @end table
 
 @node Invoking guix lint
diff --git a/guix/scripts/style.scm b/guix/scripts/style.scm
index 14b4439d..3c10019 100644
--- a/guix/scripts/style.scm
+++ b/guix/scripts/style.scm
@@ -217,18 +217,19 @@
 ;;; Simplifying input expressions.
 ;;;
 
-(define (simplify-inputs location package str inputs)
+(define (label-matches? label name)
+  "Return true if LABEL matches NAME, a package name."
+  (or (string=? label name)
+      (and (string-prefix? "python-" label)
+           (string-prefix? "python2-" name)
+           (string=? (string-drop label (string-length "python-"))
+                     (string-drop name (string-length "python2-"))))))
+
+(define* (simplify-inputs location package str inputs
+                          #:key (label-matches? label-matches?))
   "Simplify the inputs field of PACKAGE (a string) at LOCATION; its current
 value is INPUTS the corresponding source code is STR.  Return a string to
 replace STR."
-  (define (label-matches? label name)
-    ;; Return true if LABEL matches NAME, a package name.
-    (or (string=? label name)
-        (and (string-prefix? "python-" label)
-             (string-prefix? "python2-" name)
-             (string=? (string-drop label (string-length "python-"))
-                       (string-drop name (string-length "python2-"))))))
-
   (define (simplify-input-expression return)
     (match-lambda
       ((label ('unquote symbol)) symbol)
@@ -381,8 +382,13 @@ bailing out~%")
               package)
      str)))
 
-(define (simplify-package-inputs package)
-  "Edit the source code of PACKAGE to simplify its inputs field if needed."
+(define* (simplify-package-inputs package
+                                  #:key (policy 'silent))
+  "Edit the source code of PACKAGE to simplify its inputs field if needed.
+POLICY is a symbol that defines whether to simplify inputs; it can one of
+'silent (change only if the resulting derivation is the same), 'safe (change
+only if semantics are known to be unaffected), and 'always (fearlessly
+simplify inputs!)."
   (for-each (lambda (field-name field)
               (match (field package)
                 (()
@@ -390,22 +396,39 @@ bailing out~%")
                 (inputs
                  (match (package-field-location package field-name)
                    (#f
-                    ;; (unless (null? (field package))
-                    ;;   (warning (package-location package)
-                    ;;            (G_ "source location not found for '~a' of 
'~a'~%")
-                    ;;            field-name (package-name package)))
+                    ;; If the location of FIELD-NAME is not found, it may be
+                    ;; that PACKAGE inherits from another package.
                     #f)
                    (location
-                    (edit-expression (location->source-properties location)
-                                     (lambda (str)
-                                       (simplify-inputs location
-                                                        (package-name package)
-                                                        str inputs))))))))
+                    (edit-expression
+                     (location->source-properties location)
+                     (lambda (str)
+                       (define matches?
+                         (match policy
+                           ('silent
+                            ;; Simplify inputs only when the label matches
+                            ;; perfectly, such that the resulting derivation
+                            ;; is unchanged.
+                            label-matches?)
+                           ('safe
+                            ;; If PACKAGE has no arguments, labels are known
+                            ;; to have no effect: this is a "safe" change, but
+                            ;; it may change the derivation.
+                            (if (null? (package-arguments package))
+                                (const #t)
+                                label-matches?))
+                           ('always
+                            ;; Assume it's gonna be alright.
+                            (const #f))))
+
+                       (simplify-inputs location
+                                        (package-name package)
+                                        str inputs
+                                        #:label-matches? matches?))))))))
             '(inputs native-inputs propagated-inputs)
             (list package-inputs package-native-inputs
                   package-propagated-inputs)))
 
-
 (define (package-location<? p1 p2)
   "Return true if P1's location is \"before\" P2's."
   (let ((loc1 (package-location p1))
@@ -429,6 +452,14 @@ bailing out~%")
         (option '(#\e "expression") #t #f
                 (lambda (opt name arg result)
                   (alist-cons 'expression arg result)))
+        (option '("input-simplification") #t #f
+                (lambda (opt name arg result)
+                  (let ((symbol (string->symbol arg)))
+                    (unless (memq symbol '(silent safe always))
+                      (leave (G_ "~a: invalid input simplification policy~%")
+                             arg))
+                    (alist-cons 'input-simplification-policy symbol
+                                result))))
 
         (option '(#\h "help") #f #f
                 (lambda args
@@ -445,6 +476,10 @@ Update package definitions to the latest style.\n"))
   -L, --load-path=DIR    prepend DIR to the package module search path"))
   (display (G_ "
   -e, --expression=EXPR  consider the package EXPR evaluates to"))
+  (display (G_ "
+      --input-simplification=POLICY
+                         follow POLICY for package input simplification, one
+                         of 'silent', 'safe', or 'always'"))
   (newline)
   (display (G_ "
   -h, --help             display this help and exit"))
@@ -455,7 +490,7 @@ Update package definitions to the latest style.\n"))
 
 (define %default-options
   ;; Alist of default option values.
-  '())
+  '((input-simplification-policy . silent)))
 
 
 ;;;
@@ -478,8 +513,10 @@ Update package definitions to the latest style.\n"))
                                  (('expression . str)
                                   (read/eval str))
                                  (_ #f))
-                               opts)))
-    (for-each simplify-package-inputs
+                               opts))
+         (policy   (assoc-ref opts 'input-simplification-policy)))
+    (for-each (lambda (package)
+                (simplify-package-inputs package #:policy policy))
               ;; Sort package by source code location so that we start editing
               ;; files from the bottom and going upward.  That way, the
               ;; 'location' field of <package> records is not invalidated as
diff --git a/tests/style.scm b/tests/style.scm
index 426ffc2..ada9197 100644
--- a/tests/style.scm
+++ b/tests/style.scm
@@ -214,6 +214,44 @@
     (list (package-inputs (@ (my-packages) my-coreutils))
           (read-package-field (@ (my-packages) my-coreutils) 'inputs 2))))
 
+(test-equal "input labels, 'safe' policy"
+  (list `(("gmp" ,gmp) ("acl" ,acl))
+        "\
+      (inputs (list gmp acl))\n")
+  (call-with-test-package '((inputs `(("GMP" ,gmp) ("ACL" ,acl)))
+                            (arguments '()))      ;no build system arguments
+    (lambda (directory)
+      (define file
+        (string-append directory "/my-packages.scm"))
+
+      (system* "guix" "style" "-L" directory "my-coreutils"
+               "--input-simplification=safe")
+
+      (load file)
+      (list (package-inputs (@ (my-packages) my-coreutils))
+            (read-package-field (@ (my-packages) my-coreutils) 'inputs)))))
+
+(test-equal "input labels, 'safe' policy, nothing changed"
+  (list `(("GMP" ,gmp) ("ACL" ,acl))
+        "\
+      (inputs `((\"GMP\" ,gmp) (\"ACL\" ,acl)))\n")
+  (call-with-test-package '((inputs `(("GMP" ,gmp) ("ACL" ,acl)))
+                            ;; Non-empty argument list, so potentially unsafe
+                            ;; input simplification.
+                            (arguments
+                             '(#:configure-flags
+                               (assoc-ref %build-inputs "GMP"))))
+    (lambda (directory)
+      (define file
+        (string-append directory "/my-packages.scm"))
+
+      (system* "guix" "style" "-L" directory "my-coreutils"
+               "--input-simplification=safe")
+
+      (load file)
+      (list (package-inputs (@ (my-packages) my-coreutils))
+            (read-package-field (@ (my-packages) my-coreutils) 'inputs)))))
+
 (test-equal "input labels, margin comment"
   (list `(("gmp" ,gmp))
         `(("acl" ,acl))



reply via email to

[Prev in Thread] Current Thread [Next in Thread]