guix refresh -u -L does not work with relative path

  • Open
  • quality assurance status badge
Details
2 participants
  • Andreas Enge
  • Simon Tournier
Owner
unassigned
Submitted by
Andreas Enge
Severity
normal
A
A
Andreas Enge wrote on 10 Nov 2023 18:11
(address . bug-guix@gnu.org)
ZU5kQcGUOC_l0B3C@jurong
Hello,

to reproduce this weird (and very specific!) problem, do the following:
cd /tmp
mkdir proj
copy the attached example.scm into /tmp/proj

Now
guix refresh -u -L proj python-numpy-illustrated
yields the error
proj/example.scm:10:2: python-numpy-illustrated: updating from version 0.3 to version 0.3.1...
proj/example.scm:10:2: warning: python-numpy-illustrated: no `version' field in source; skipping
and does not update the package; whereas
guix refresh -u -L /tmp/proj python-numpy-illustrated
works as expected.

Without the "-u" things work with a relative path (as indicated by the
first line before the error message above), and I have not found other
guix commands that pose problems with relative paths.

Andreas
(define-module (example) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix download) #:use-module (guix packages) #:use-module (guix build-system pyproject) #:use-module (guix build-system python) #:use-module (gnu packages python-xyz)) (define-public python-numpy-illustrated (package (name "python-numpy-illustrated") (version "0.3.1") (source (origin (method url-fetch) (uri (pypi-uri "numpy-illustrated" version)) (sha256 (base32 "0s7ki6lm9xwd4pj7rx6al230wbywqk11wjvgdk44lbdq2fz7kfxd")))) (build-system pyproject-build-system) (propagated-inputs (list python-numpy)) (home-page "https://github.com/axil/numpy-illustrated") (synopsis "Helper functions from the NumPy Illustrated guide") (description "This package provides helper functions for the @url{https://betterprogramming.pub/numpy-illustrated-the-visual-guide-to-numpy-3b1d4976de1d?sk=57b908a77aa44075a49293fa1631dd9b, NumPy Illustrated} programming guide.") (license license:expat)))
A
A
Andreas Enge wrote on 10 Nov 2023 18:14
Re: bug#67048: Acknowledgement (guix refresh -u -L does not work with relative path)
(address . 67048@debbugs.gnu.org)
ZU5k6WGIofEzv_Z3@jurong
My mail client has secretly updated the file while I was carrying out
the experiment; the attached version should be the one before refreshing.

Andreas
(define-module (example) #:use-module ((guix licenses) #:prefix license:) #:use-module (guix download) #:use-module (guix packages) #:use-module (guix build-system pyproject) #:use-module (guix build-system python) #:use-module (gnu packages python-xyz)) (define-public python-numpy-illustrated (package (name "python-numpy-illustrated") (version "0.3") (source (origin (method url-fetch) (uri (pypi-uri "numpy-illustrated" version)) (sha256 (base32 "1x3gd19hhmlg51i5aj070y7w0lk47gx6yx3r3f45396bgdfnsw4i")))) (build-system pyproject-build-system) (propagated-inputs (list python-numpy)) (home-page "https://github.com/axil/numpy-illustrated") (synopsis "Helper functions from the NumPy Illustrated guide") (description "This package provides helper functions for the @url{https://betterprogramming.pub/numpy-illustrated-the-visual-guide-to-numpy-3b1d4976de1d?sk=57b908a77aa44075a49293fa1631dd9b, NumPy Illustrated} programming guide.") (license license:expat)))
S
S
Simon Tournier wrote on 13 Nov 2023 19:28
Re: bug#67048: guix refresh -u -L does not work with relative path
(name . Ludovic Courtès)(address . ludo@gnu.org)
8734x9fqye.fsf@gmail.com
Hi,

On Fri, 10 Nov 2023 at 18:11, Andreas Enge <andreas@enge.fr> wrote:

Toggle quote (5 lines)
> guix refresh -u -L proj python-numpy-illustrated
> yields the error
> proj/example.scm:10:2: python-numpy-illustrated: updating from version 0.3 to version 0.3.1...
> proj/example.scm:10:2: warning: python-numpy-illustrated: no `version' field in source; skipping

The issue is from several layers; (search-path %load-path file) returns
#false. See:

1. package-field-location from (guix packages)
called by update-package-source from (guix upstream)

2. update-package-source from (guix upstream)
called by package-update from same module
called by update-package from (guix scripts refresh)

The issue looks similar as #66901 [1]. Well, I have tried to improve
the situation by setting some ’canonicalize-path’ here or there.
However, then the next issue is from the call ’(absolute-location loc)’
in ’update-package-source’ from module (guix upstream); it returns:

Toggle snippet (39 lines)
Backtrace:
In ice-9/boot-9.scm:
724:2 19 (call-with-prompt _ _ #<procedure default-prompt-handler (k proc)>)
In ice-9/eval.scm:
619:8 18 (_ #(#(#<directory (guile-user) 7f45f4f17c80>)))
In guix/ui.scm:
2324:7 17 (run-guix . _)
2287:10 16 (run-guix-command _ . _)
In ice-9/boot-9.scm:
1752:10 15 (with-exception-handler _ _ #:unwind? _ #:unwind-for-type _)
1752:10 14 (with-exception-handler _ _ #:unwind? _ #:unwind-for-type _)
In guix/store.scm:
659:37 13 (thunk)
2168:25 12 (run-with-store #<store-connection 256.99 7f45d56dc1e0> #<procedure 7f45d5385ca0 at ice-9/eval.scm:333:13 (a)> #:guile-for-build _ #:system _ …)
In ice-9/eval.scm:
191:27 11 (_ #(#(#<directory (guix scripts refresh) 7f45ea7c1d20> #<procedure 7f45d5385d60 at ice-9/eval.scm:333:13 (a)>) (#<<update-spec> package…>) …))
In ice-9/boot-9.scm:
152:2 10 (with-fluid* _ _ _)
152:2 9 (with-fluid* _ _ _)
152:2 8 (with-fluid* _ _ _)
In ice-9/eval.scm:
619:8 7 (_ #(#(#<directory (guix scripts refresh) 7f45ea7c1d20> (#<<update-spec> package: #<package python-numpy-illustrated@0.3 proj/example.s…>) …)))
In srfi/srfi-1.scm:
634:9 6 (for-each #<procedure 7f45d41d1280 at ice-9/eval.scm:333:13 (a)> (#<<update-spec> package: #<package python-numpy-illustrated@0.3 proj/exam…>))
In ice-9/eval.scm:
619:8 5 (_ #(#(#(#(#(#(#(#(#(#(#(#(#<directory (guix upstream) 7f45e9af08c0>) #<package python-numpy-illustrated@0.…> …) …) …) …) …) …) …) …) …) …) …))
155:9 4 (_ #(#(#(#(#(#(#(#(#(#(#(#(#<directory (guix upstream) 7f45e9af08c0>) #<package python-numpy-illustrated@0.…> …) …) …) …) …) …) …) …) …) …) …))
In guix/diagnostics.scm:
354:20 3 (absolute-location #<<location> file: "proj/example.scm" line: 10 column: 2>)
In unknown file:
2 (raise #<&formatted-message format: "file '~a' not found on load path\n" arguments: ("proj/example.scm")>)
In ice-9/boot-9.scm:
1685:16 1 (raise-exception _ #:continuable? _)
1685:16 0 (raise-exception _ #:continuable? _)

ice-9/boot-9.scm:1685:16: In procedure raise-exception:
Wrong type (expecting exact integer): #<&formatted-message format: "file '~a' not found on load path\n" arguments: ("proj/example.scm")>

Hum, it needs to be investigated…


Cheers,
simon
S
S
Simon Tournier wrote on 14 Nov 2023 18:28
[PATCH] DRAFT guix: upstream: Allow relative file name.
(address . 67048@debbugs.gnu.org)(name . Simon Tournier)(address . zimon.toutoune@gmail.com)
e895f5607273d78a9092e9a83ae655ac2a111a35.1699982814.git.zimon.toutoune@gmail.com
Reported by Andreas Enge <andreas@enge.fr>.

* guix/diagnostics.scm (absolute-location): Return FILE from
'canonicalize-path' when 'search-path' fails.
* guix/packages.scm (package-field-location): New procedure 'file-name' and
use it. When 'search-path' does not find FILE in %LOAD-PATH, try
'canonicalize-path'.
* guix/upstream.scm (update-package-source): When 'search-path' fails, test if
FILE exists.

Change-Id: I9337041b43e17ace82416db5840f04113f9544fc
---
guix/diagnostics.scm | 13 +++++-----
guix/packages.scm | 57 +++++++++++++++++++++++++-------------------
guix/upstream.scm | 6 +++--
3 files changed, 43 insertions(+), 33 deletions(-)

Toggle diff (119 lines)
diff --git a/guix/diagnostics.scm b/guix/diagnostics.scm
index 3f1f527b43..f79df1ca2d 100644
--- a/guix/diagnostics.scm
+++ b/guix/diagnostics.scm
@@ -349,12 +349,13 @@ (define (absolute-location loc)
;; 'search-path' might return #f in obscure cases, such as
;; when %LOAD-PATH includes "." or ".." and LOC comes from a
;; file in a subdirectory thereof.
- (match (search-path %load-path (location-file loc))
- (#f
- (raise (formatted-message
- (G_ "file '~a' not found on load path")
- (location-file loc))))
- (str str)))
+ (let ((file (location-file loc)))
+ (or (search-path %load-path file)
+ (and (file-exists? file)
+ (canonicalize-path file))
+ (raise (formatted-message
+ (G_ "file '~a' not found on load path")
+ file)))))
(location-line loc)
(location-column loc)))
diff --git a/guix/packages.scm b/guix/packages.scm
index e2e82692ad..ea05b739a8 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -750,37 +750,44 @@ (define (deprecated-package old-name p)
(define (package-field-location package field)
"Return the source code location of the definition of FIELD for PACKAGE, or
#f if it could not be determined."
+ (define (file-name relative-file file-found line column)
+ (catch 'system-error
+ (lambda ()
+ ;; In general we want to keep relative file names for modules.
+ (call-with-input-file file-found
+ (lambda (port)
+ (go-to-location port line column)
+ (match (read port)
+ ((or ('package inits ...)
+ ('package/inherit _ inits ...))
+ (let ((field (assoc field inits)))
+ (match field
+ ((_ value)
+ (let ((loc (and=> (source-properties value)
+ source-properties->location)))
+ (and loc
+ ;; Preserve the original file name, which may be a
+ ;; relative file name.
+ (set-field loc (location-file) relative-file))))
+ (_
+ #f))))
+ (_
+ #f)))))
+ (lambda _
+ #f)))
+
(match (package-location package)
(($ <location> file line column)
(match (search-path %load-path file)
((? string? file-found)
- (catch 'system-error
- (lambda ()
- ;; In general we want to keep relative file names for modules.
- (call-with-input-file file-found
- (lambda (port)
- (go-to-location port line column)
- (match (read port)
- ((or ('package inits ...)
- ('package/inherit _ inits ...))
- (let ((field (assoc field inits)))
- (match field
- ((_ value)
- (let ((loc (and=> (source-properties value)
- source-properties->location)))
- (and loc
- ;; Preserve the original file name, which may be a
- ;; relative file name.
- (set-field loc (location-file) file))))
- (_
- #f))))
- (_
- #f)))))
- (lambda _
- #f)))
+ (file-name file file-found line column))
(#f
;; FILE could not be found in %LOAD-PATH.
- #f)))
+ (let ((file-found (and (file-exists? file)
+ (canonicalize-path file))))
+ (if file-found
+ (file-name file file-found line column)
+ #f)))))
(_ #f)))
(define-syntax-rule (this-package-input name)
diff --git a/guix/upstream.scm b/guix/upstream.scm
index e28ae12f3f..5403aa833d 100644
--- a/guix/upstream.scm
+++ b/guix/upstream.scm
@@ -645,8 +645,10 @@ (define* (update-package-source package source hash)
((? git-reference? ref)
(git-reference-commit ref))
(_ #f)))
- (file (and=> (location-file loc)
- (cut search-path %load-path <>))))
+ (file (or (and=> (location-file loc)
+ (cut search-path %load-path <>))
+ (and=> (location-file loc)
+ file-exists?))))
(if file
;; Be sure to use absolute filename. Replace the URL directory
;; when OLD-URL is available; this is useful notably for

base-commit: 3d15e9e5bcd7cdad33f9832e4956f494c47e1937
--
2.41.0
S
S
Simon Tournier wrote on 14 Nov 2023 18:52
Re: bug#67048: guix refresh -u -L does not work with relative path
(name . Ludovic Courtès)(address . ludo@gnu.org)
87fs18dxxm.fsf@gmail.com
Hi,

On Mon, 13 Nov 2023 at 19:28, Simon Tournier <zimon.toutoune@gmail.com> wrote:

Toggle quote (5 lines)
>> guix refresh -u -L proj python-numpy-illustrated
>> yields the error
>> proj/example.scm:10:2: python-numpy-illustrated: updating from version 0.3 to version 0.3.1...
>> proj/example.scm:10:2: warning: python-numpy-illustrated: no `version' field in source; skipping

As mentioned in [1], the issue is from ’search-path’ – it returns #false
– it is involved in several layers.

See https://issues.guix.gnu.org/67048#3 for a patch proposal.


Some details: When invoking “guix refresh” (guix scripts refresh):

+ It calls the procedure ’update-package’

+ which calls ’update-package-source’; see guix/upstream.scm

+ which calls ’package-field-location’; see guix/package.scm

(match (search-path %load-path file)
((? string? file-found)
[...]
(#f
;; FILE could not be found in %LOAD-PATH.
#f)))

-> Therefore in ’update-package-source’, the variable ’version-loc’ is
false:

(version-loc (package-field-location package 'version)))
(if version-loc

+ Once fixed, later in ’update-package-source’, it reads,

(file (and=> (location-file loc)
(cut search-path %load-path <>))))
(if file

-> Therefore, the variable ’file’ is false.

+ Once fixed, later in ’update-package-source’ it calls
’absolute-location’; see guix/diagnostics.scm.

(if (string-prefix? "/" (location-file loc))
[...]
(match (search-path %load-path (location-file loc))
(#f
(raise (formatted-message



Well, I do not know how to do better than

WDYT?

Cheers,
simon


1: bug#67048: guix refresh -u -L does not work with relative path
Simon Tournier <zimon.toutoune@gmail.com>
Mon, 13 Nov 2023 19:28:25 +0100
id:8734x9fqye.fsf@gmail.com
?
Your comment

Commenting via the web interface is currently disabled.

To comment on this conversation send an email to 67048@debbugs.gnu.org

To respond to this issue using the mumi CLI, first switch to it
mumi current 67048
Then, you may apply the latest patchset in this issue (with sign off)
mumi am -- -s
Or, compose a reply to this issue
mumi compose
Or, send patches to this issue
mumi send-email *.patch