[PATCH 0/2] Require Guile 3.0

  • Done
  • quality assurance status badge
Details
One participant
  • Ludovic Courtès
Owner
unassigned
Submitted by
Ludovic Courtès
Severity
normal
L
L
Ludovic Courtès wrote on 26 May 2021 23:12
(address . guix-patches@gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20210526211210.16830-1-ludo@gnu.org
Hi!

These patches drop support for Guile 2.2 so we can concentrate
on moving forward.

For the record, Guile 3.0 was released 1.5 year ago. In Debian,
Guile 3.0 is available but the ‘guix’ package is currently
built against 2.2 due to the GnuTLS/Guile bug at
https://issues.guix.gnu.org/46330; this is likely to be addressed
by the time we publish the next Guix release.

Thoughts?

Ludo’.

Ludovic Courtès (2):
maint: Require Guile 3.0.
ui, lint: Simplify exception handling in Guile 3 style.

configure.ac | 6 +--
doc/guix.texi | 3 +-
gnu/packages/package-management.scm | 34 ------------
guix/lint.scm | 81 +++++++++++++----------------
guix/scripts/deploy.scm | 7 +--
guix/store.scm | 16 ++----
guix/swh.scm | 20 +++----
guix/ui.scm | 60 ++++++++-------------
8 files changed, 72 insertions(+), 155 deletions(-)

--
2.31.1
L
L
Ludovic Courtès wrote on 26 May 2021 23:18
[PATCH 1/2] maint: Require Guile 3.0.
(address . 48685@debbugs.gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20210526211814.17116-1-ludo@gnu.org
* configure.ac: Require Guile 3.0.
* doc/guix.texi (Requirements): Adjust accordingly.
* gnu/packages/package-management.scm (guile2.2-guix): Remove.
* guix/lint.scm (exception-with-kind-and-args?): Remove 'cond-expand'.
* guix/scripts/deploy.scm (deploy-machine*): Likewise.
* guix/store.scm (call-with-store): Likewise.
* guix/swh.scm (http-get*, http-post*): Likewise.
* guix/ui.scm (without-compiler-optimizations, guard*)
(call-with-error-handling): Likewise.
---
configure.ac | 6 +---
doc/guix.texi | 3 +-
gnu/packages/package-management.scm | 34 ---------------------
guix/lint.scm | 11 ++-----
guix/scripts/deploy.scm | 7 ++---
guix/store.scm | 16 +++-------
guix/swh.scm | 20 ++++---------
guix/ui.scm | 46 ++++++++++-------------------
8 files changed, 33 insertions(+), 110 deletions(-)

Toggle diff (260 lines)
diff --git a/configure.ac b/configure.ac
index 583b902361..84592f6041 100644
--- a/configure.ac
+++ b/configure.ac
@@ -96,16 +96,12 @@ m4_pattern_forbid([^GUIX_])
dnl Search for 'guile' and 'guild'. This macro defines
dnl 'GUILE_EFFECTIVE_VERSION'.
-GUILE_PKG([3.0 2.2])
+GUILE_PKG([3.0])
GUILE_PROGS
if test "x$GUILD" = "x"; then
AC_MSG_ERROR(['guild' binary not found; please check your Guile installation.])
fi
-if test "x$GUILE_EFFECTIVE_VERSION" = "x2.2"; then
- PKG_CHECK_MODULES([GUILE], [guile-2.2 >= 2.2.6])
-fi
-
dnl Get CFLAGS and LDFLAGS for libguile.
GUILE_FLAGS
diff --git a/doc/guix.texi b/doc/guix.texi
index e8b0485f78..05a4f9a6e2 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -833,8 +833,7 @@ GNU Guix is available for download from its website at
GNU Guix depends on the following packages:
@itemize
-@item @url{https://gnu.org/software/guile/, GNU Guile}, version 3.0.x or
-2.2.x;
+@item @url{https://gnu.org/software/guile/, GNU Guile}, version 3.0.x;
@item @url{https://notabug.org/cwebber/guile-gcrypt, Guile-Gcrypt}, version
0.1.0 or later;
@item
diff --git a/gnu/packages/package-management.scm b/gnu/packages/package-management.scm
index 1cea8ed83d..6378d7c2d9 100644
--- a/gnu/packages/package-management.scm
+++ b/gnu/packages/package-management.scm
@@ -518,40 +518,6 @@ the Nix package manager.")
(invoke "make" "install-binPROGRAMS")))
(delete 'wrap-program)))))))
-
-(define-public guile2.2-guix
- (package
- (inherit guix)
- (name "guile2.2-guix")
- (native-inputs
- `(("guile" ,guile-2.2)
- ("gnutls" ,guile2.2-gnutls)
- ("guile-gcrypt" ,guile2.2-gcrypt)
- ("guile-json" ,guile2.2-json)
- ("guile-lib" ,guile2.2-lib)
- ("guile-sqlite3" ,guile2.2-sqlite3)
- ("guile-ssh" ,guile2.2-ssh)
- ("guile-git" ,guile2.2-git)
- ("guile-zlib" ,guile2.2-zlib)
- ("guile-lzlib" ,guile2.2-lzlib)
- ,@(fold alist-delete (package-native-inputs guix)
- '("guile" "gnutls" "guile-gcrypt" "guile-json"
- "guile-lib" "guile-sqlite3" "guile-ssh" "guile-git"
- "guile-zlib" "guile-lzlib"))))
- (inputs
- `(("guile" ,guile-2.2)
- ,@(alist-delete "guile" (package-inputs guix))))
- (propagated-inputs
- `(("gnutls" ,gnutls)
- ("guile-gcrypt" ,guile2.2-gcrypt)
- ("guile-json" ,guile2.2-json)
- ("guile-lib" ,guile2.2-lib)
- ("guile-sqlite3" ,guile2.2-sqlite3)
- ("guile-ssh" ,guile2.2-ssh)
- ("guile-git" ,guile2.2-git)
- ("guile-zlib" ,guile2.2-zlib)
- ("guile-lzlib" ,guile2.2-lzlib)))))
-
(define-public guile3.0-guix
(deprecated-package "guile3.0-guix" guix))
diff --git a/guix/lint.scm b/guix/lint.scm
index a2d6418b85..023a179ea6 100644
--- a/guix/lint.scm
+++ b/guix/lint.scm
@@ -1003,14 +1003,9 @@ descriptions maintained upstream."
(origin-uris origin))
'())))
-(cond-expand
- (guile-3
- ;; Guile 3.0.0 does not export this predicate.
- (define exception-with-kind-and-args?
- (exception-predicate &exception-with-kind-and-args)))
- (else ;Guile 2
- (define exception-with-kind-and-args?
- (const #f))))
+;; Guile 3.0.0 does not export this predicate.
+(define exception-with-kind-and-args?
+ (exception-predicate &exception-with-kind-and-args))
(define* (check-derivation package #:key store)
"Emit a warning if we fail to compile PACKAGE to a derivation."
diff --git a/guix/scripts/deploy.scm b/guix/scripts/deploy.scm
index 0725fba54b..b2029943e2 100644
--- a/guix/scripts/deploy.scm
+++ b/guix/scripts/deploy.scm
@@ -1,7 +1,7 @@
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2019 David Thompson <davet@gnu.org>
;;; Copyright © 2019 Jakob L. Kreuze <zerodaysfordays@sdf.org>
-;;; Copyright © 2020 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2020, 2021 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
@@ -125,10 +125,7 @@ Perform the deployment specified by FILE.\n"))
;; and include a '&message'. However, that message only contains
;; the format string. Thus, special-case it here to avoid
;; displaying a bare format string.
- ((cond-expand
- (guile-3
- ((exception-predicate &exception-with-kind-and-args) c))
- (else #f))
+ (((exception-predicate &exception-with-kind-and-args) c)
(raise c))
((message-condition? c)
diff --git a/guix/store.scm b/guix/store.scm
index 9d706ae590..cf5d5eeccc 100644
--- a/guix/store.scm
+++ b/guix/store.scm
@@ -648,18 +648,10 @@ connection. Use with care."
(close-connection store)
(apply values results)))))
- (cond-expand
- (guile-3
- (with-exception-handler (lambda (exception)
- (close-connection store)
- (raise-exception exception))
- thunk))
- (else ;Guile 2.2
- (catch #t
- thunk
- (lambda (key . args)
- (close-connection store)
- (apply throw key args)))))))
+ (with-exception-handler (lambda (exception)
+ (close-connection store)
+ (raise-exception exception))
+ thunk)))
(define-syntax-rule (with-store store exp ...)
"Bind STORE to an open connection to the store and evaluate EXPs;
diff --git a/guix/swh.scm b/guix/swh.scm
index 06d2957252..f6d5241e06 100644
--- a/guix/swh.scm
+++ b/guix/swh.scm
@@ -148,20 +148,12 @@
url
(string-append url "/")))
-(cond-expand
- (guile-3
- ;; XXX: Work around a bug in Guile 3.0.2 where #:verify-certificate? would
- ;; be ignored (<https://bugs.gnu.org/40486>).
- (define* (http-get* uri #:rest rest)
- (apply http-request uri #:method 'GET rest))
- (define* (http-post* uri #:rest rest)
- (apply http-request uri #:method 'POST rest)))
- (else ;Guile 2.2
- ;; Guile 2.2 did not have #:verify-certificate? so ignore it.
- (define* (http-get* uri #:key verify-certificate? streaming?)
- (http-request uri #:method 'GET #:streaming? streaming?))
- (define* (http-post* uri #:key verify-certificate? streaming?)
- (http-request uri #:method 'POST #:streaming? streaming?))))
+;; XXX: Work around a bug in Guile 3.0.2 where #:verify-certificate? would
+;; be ignored (<https://bugs.gnu.org/40486>).
+(define* (http-get* uri #:rest rest)
+ (apply http-request uri #:method 'GET rest))
+(define* (http-post* uri #:rest rest)
+ (apply http-request uri #:method 'POST rest))
(define %date-regexp
;; Match strings like "2014-11-17T22:09:38+01:00" or
diff --git a/guix/ui.scm b/guix/ui.scm
index 05b3f5f84c..6b0155f563 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -196,17 +196,11 @@ information, or #f if it could not be found."
(stack-ref stack 1) ;skip the 'throw' frame
last))))
-(cond-expand
- (guile-3
- (define-syntax-rule (without-compiler-optimizations exp)
- ;; Compile with the baseline compiler (-O1), which is much less expensive
- ;; than -O2.
- (parameterize (((@ (system base compile) default-optimization-level) 1))
- exp)))
- (else
- (define-syntax-rule (without-compiler-optimizations exp)
- ;; No easy way to turn off optimizations on Guile 2.2.
- exp)))
+(define-syntax-rule (without-compiler-optimizations exp)
+ ;; Compile with the baseline compiler (-O1), which is much less expensive
+ ;; than -O2.
+ (parameterize (((@ (system base compile) default-optimization-level) 1))
+ exp))
(define* (load* file user-module
#:key (on-error 'nothing-special))
@@ -674,22 +668,17 @@ or variants of @code{~a} in the same profile.")
or remove one of them from the profile.")
name1 name2)))))
-(cond-expand
- (guile-3
- ;; On Guile 3.0, in 'call-with-error-handling' we need to re-raise. To
- ;; preserve useful backtraces in case of unhandled errors, we want that to
- ;; happen before the stack has been unwound, hence 'guard*'.
- (define-syntax-rule (guard* (var clauses ...) exp ...)
- "This variant of SRFI-34 'guard' does not unwind the stack before
+;; On Guile 3.0, in 'call-with-error-handling' we need to re-raise. To
+;; preserve useful backtraces in case of unhandled errors, we want that to
+;; happen before the stack has been unwound, hence 'guard*'.
+(define-syntax-rule (guard* (var clauses ...) exp ...)
+ "This variant of SRFI-34 'guard' does not unwind the stack before
evaluating the tests and bodies of CLAUSES."
- (with-exception-handler
- (lambda (var)
- (cond clauses ... (else (raise var))))
- (lambda () exp ...)
- #:unwind? #f)))
- (else
- (define-syntax-rule (guard* (var clauses ...) exp ...)
- (guard (var clauses ...) exp ...))))
+ (with-exception-handler
+ (lambda (var)
+ (cond clauses ... (else (raise var))))
+ (lambda () exp ...)
+ #:unwind? #f))
(define (call-with-error-handling thunk)
"Call THUNK within a user-friendly error handler."
@@ -822,10 +811,7 @@ directories:~{ ~a~}~%")
;; Furthermore, use of 'guard*' ensures that the stack has not
;; been unwound when we re-raise, since that would otherwise show
;; useless backtraces.
- ((cond-expand
- (guile-3
- ((exception-predicate &exception-with-kind-and-args) c))
- (else #f))
+ (((exception-predicate &exception-with-kind-and-args) c)
(raise c))
((message-condition? c)
--
2.31.1
L
L
Ludovic Courtès wrote on 26 May 2021 23:18
[PATCH 2/2] ui, lint: Simplify exception handling in Guile 3 style.
(address . 48685@debbugs.gnu.org)(name . Ludovic Courtès)(address . ludo@gnu.org)
20210526211814.17116-2-ludo@gnu.org
* guix/lint.scm (check-derivation)[try]: Remove "catch #t" wrapping.
* guix/ui.scm (call-with-error-handling): Remove "catch 'system-error"
and move 'system-error handling to the &exception-with-kind-and-args
clause.
---
guix/lint.scm | 70 +++++++++++++++++++++++----------------------------
guix/ui.scm | 14 +++++------
2 files changed, 39 insertions(+), 45 deletions(-)

Toggle diff (116 lines)
diff --git a/guix/lint.scm b/guix/lint.scm
index 023a179ea6..41dd5d0633 100644
--- a/guix/lint.scm
+++ b/guix/lint.scm
@@ -1010,45 +1010,39 @@ descriptions maintained upstream."
(define* (check-derivation package #:key store)
"Emit a warning if we fail to compile PACKAGE to a derivation."
(define (try store system)
- (catch #t ;TODO: Remove 'catch' when Guile 2.x is no longer supported.
- (lambda ()
- (guard (c ((store-protocol-error? c)
- (make-warning package
- (G_ "failed to create ~a derivation: ~a")
- (list system
- (store-protocol-error-message c))))
- ((exception-with-kind-and-args? c)
- (make-warning package
- (G_ "failed to create ~a derivation: ~s")
- (list system
- (cons (exception-kind c)
- (exception-args c)))))
- ((message-condition? c)
- (make-warning package
- (G_ "failed to create ~a derivation: ~a")
- (list system
- (condition-message c))))
- ((formatted-message? c)
- (let ((str (apply format #f
- (formatted-message-string c)
- (formatted-message-arguments c))))
- (make-warning package
- (G_ "failed to create ~a derivation: ~a")
- (list system str)))))
- (parameterize ((%graft? #f))
- (package-derivation store package system #:graft? #f)
+ (guard (c ((store-protocol-error? c)
+ (make-warning package
+ (G_ "failed to create ~a derivation: ~a")
+ (list system
+ (store-protocol-error-message c))))
+ ((exception-with-kind-and-args? c)
+ (make-warning package
+ (G_ "failed to create ~a derivation: ~s")
+ (list system
+ (cons (exception-kind c)
+ (exception-args c)))))
+ ((message-condition? c)
+ (make-warning package
+ (G_ "failed to create ~a derivation: ~a")
+ (list system
+ (condition-message c))))
+ ((formatted-message? c)
+ (let ((str (apply format #f
+ (formatted-message-string c)
+ (formatted-message-arguments c))))
+ (make-warning package
+ (G_ "failed to create ~a derivation: ~a")
+ (list system str)))))
+ (parameterize ((%graft? #f))
+ (package-derivation store package system #:graft? #f)
- ;; If there's a replacement, make sure we can compute its
- ;; derivation.
- (match (package-replacement package)
- (#f #t)
- (replacement
- (package-derivation store replacement system
- #:graft? #f))))))
- (lambda args
- (make-warning package
- (G_ "failed to create ~a derivation: ~s")
- (list system args)))))
+ ;; If there's a replacement, make sure we can compute its
+ ;; derivation.
+ (match (package-replacement package)
+ (#f #t)
+ (replacement
+ (package-derivation store replacement system
+ #:graft? #f))))))
(define (check-with-store store)
(filter lint-warning?
diff --git a/guix/ui.scm b/guix/ui.scm
index 6b0155f563..d3e01f846d 100644
--- a/guix/ui.scm
+++ b/guix/ui.scm
@@ -812,7 +812,12 @@ directories:~{ ~a~}~%")
;; been unwound when we re-raise, since that would otherwise show
;; useless backtraces.
(((exception-predicate &exception-with-kind-and-args) c)
- (raise c))
+ (if (eq? 'system-error (exception-kind c)) ;EPIPE & co.
+ (match (exception-args c)
+ ((proc format-string format-args . _)
+ (leave (G_ "~a: ~a~%") proc
+ (apply format #f format-string format-args))))
+ (raise c)))
((message-condition? c)
;; Normally '&message' error conditions have an i18n'd message.
@@ -822,12 +827,7 @@ directories:~{ ~a~}~%")
(when (fix-hint? c)
(display-hint (condition-fix-hint c)))
(exit 1)))
- ;; Catch EPIPE and the likes.
- (catch 'system-error
- thunk
- (lambda (key proc format-string format-args . rest)
- (leave (G_ "~a: ~a~%") proc
- (apply format #f format-string format-args))))))
+ (thunk)))
(define-syntax-rule (leave-on-EPIPE exp ...)
"Run EXP... in a context where EPIPE errors are caught and lead to 'exit'
--
2.31.1
L
L
Ludovic Courtès wrote on 1 Jun 2021 23:28
Re: bug#48685: [PATCH 0/2] Require Guile 3.0
(address . 48685-done@debbugs.gnu.org)
87a6o9z344.fsf@gnu.org
Ludovic Courtès <ludo@gnu.org> skribis:

Toggle quote (3 lines)
> maint: Require Guile 3.0.
> ui, lint: Simplify exception handling in Guile 3 style.

Pushed as 5bcb4f8a58ad316174768c167927c03be3272786!

Ludo’.
Closed
?