From 71f82174a58c60882e4a96289dd3b3d01043b544 Mon Sep 17 00:00:00 2001 From: Ricardo Wurmus Date: Sun, 1 Dec 2024 09:05:37 +0100 Subject: [PATCH] import/cran: Enhance import pattern. * guix/import/cran.scm (import-pattern): Comment; capture direct namespace imports as well as silent imports. Change-Id: Ia54035d6f230d695aa950adb3e691cbce4f2d416 --- guix/import/cran.scm | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/guix/import/cran.scm b/guix/import/cran.scm index 01fb8552f9..fe69cb87f7 100644 --- a/guix/import/cran.scm +++ b/guix/import/cran.scm @@ -552,10 +552,23 @@ (define (needed-libraries-in-directory dir) (set) (find-files dir "(Makevars(.in.*)?|configure.*)")))) -;; A pattern matching "library" or "require" statements, capturing the first -;; argument. +;; A pattern matching package imports. It detects uses of "library" or +;; "require", capturing the first argument; it also detects direct access of +;; namespaces via "::" or ":::", capturing the namespace. (define import-pattern - (make-regexp "^ *(require|library)\\(\"?([^, \")]+)")) + (make-regexp + (string-append + ;; Ignore leading spaces, but don't capture commented expressions. + "(^ *" + ;; Quiet imports + "(suppressPackageStartupMessages\\()?" + ;; the actual import statement. + "(require|library)\\(\"?([^, \")]+)" + ;; Or perhaps... + "|" + ;; ...direct namespace access. + " *([A-Za-z0-9]+):::?" + ")"))) (define (needed-test-inputs-in-directory dir) "Return a set of R package names that are found in library import @@ -581,8 +594,10 @@ (define (needed-test-inputs-in-directory dir) (else (loop (fold (lambda (match acc) - (let ((imported (match:substring match 2))) - (if (or (string=? imported package-directory-name) + (let ((imported (or (match:substring match 4) + (match:substring match 5)))) + (if (or (not imported) + (string=? imported package-directory-name) (member imported default-r-packages)) acc (set-insert imported acc)))) @@ -623,8 +638,9 @@ (define (needed-vignettes-inputs-in-directory dir) (else (loop (fold (lambda (match acc) - (let ((imported (match:substring match 2))) - (if (or (string=? imported package-directory-name) + (let ((imported (match:substring match 4))) + (if (or (not imported) + (string=? imported package-directory-name) (member imported default-r-packages)) acc (set-insert imported acc))))