unofficial mirror of guix-patches@gnu.org 
 help / color / mirror / code / Atom feed
* [bug#73921] [PATCH] svn-download: Add support for partial checkout.
@ 2024-10-21  1:08 Maxim Cournoyer
  2024-11-12  8:36 ` bug#73921: " Maxim Cournoyer
  0 siblings, 1 reply; 2+ messages in thread
From: Maxim Cournoyer @ 2024-10-21  1:08 UTC (permalink / raw)
  To: 73921
  Cc: Maxim Cournoyer, Christopher Baines, Josselin Poiret,
	Ludovic Courtès, Mathieu Othacehe, Maxim Cournoyer,
	Simon Tournier, Tobias Geerinckx-Rice

* guix/svn-download.scm (<svn-reference>)
[subdirectories]: New field.
(svn-fetch): Set "svn subdirectories" environment variable when subdirectories
are provided.
(svn-fetch-builder): Pass subdirectories to svn-fetch.
* guix/build/svn.scm (svn-fetch) [subdirectories]: New keyword argument.
Implement alternative code path when it's provided.
* doc/guix.texi (svn-reference): Document the new field.

Change-Id: I21ca96bc48d26dafca82b26daccef0d324f79dc5
---

Note: At first I was planning to use this to checkout exactly one
subdirectory of a game data SVN repository, but later I realized SVN
allows for checking out any subdirectory, which made this addition
unnecessary.

I guess it could still be useful when wanting to select more than one
subdirectory, but the perhaps svn-multi-fetch could be used instead,
to combine multiple SVN checkouts into one (IIUC).

Anyway, I'm sending this to guix-devel; if anyone find it useful it
could be considered for guix-patches.

 doc/guix.texi         |  3 ++
 guix/build/svn.scm    | 74 ++++++++++++++++++++++++++++---------------
 guix/svn-download.scm | 20 +++++++++---
 3 files changed, 68 insertions(+), 29 deletions(-)

diff --git a/doc/guix.texi b/doc/guix.texi
index b9f71527a3..2d1e5bdd2c 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -8312,6 +8312,9 @@ origin Reference
 
 @item @code{password} (default: @code{#f})
 Password to access the Subversion repository, if required.
+
+@item @code{subdirectories} (default: @code{#f})
+Only recurse into subdirectories, resulting in a partial checkout.
 @end table
 @end deftp
 
diff --git a/guix/build/svn.scm b/guix/build/svn.scm
index 875d3c50ca..1b1c9b1b5c 100644
--- a/guix/build/svn.scm
+++ b/guix/build/svn.scm
@@ -3,6 +3,7 @@
 ;;; Copyright © 2014 Sree Harsha Totakura <sreeharsha@totakura.in>
 ;;; Copyright © 2018 Mark H Weaver <mhw@netris.org>
 ;;; Copyright © 2020 Simon Tournier <zimon.toutoune@gmail.com>
+;;; Copyright © 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -21,6 +22,9 @@
 
 (define-module (guix build svn)
   #:use-module (guix build utils)
+  #:use-module (ice-9 match)
+  #:use-module (srfi srfi-1)
+  #:use-module (srfi srfi-26)
   #:use-module (srfi srfi-34)
   #:export (svn-fetch))
 
@@ -33,35 +37,55 @@ (define-module (guix build svn)
 
 (define* (svn-fetch url revision directory
                     #:key (svn-command "svn")
-                    (recursive? #t)
-                    (user-name #f)
-                    (password #f))
+                    recursive?
+                    user-name
+                    password
+                    subdirectories)
   "Fetch REVISION from URL into DIRECTORY.  REVISION must be an integer, and a
-valid Subversion revision.  Return #t on success, #f otherwise."
+valid Subversion revision.  If SUBDIRECTORIES is provided, only these
+subdirectories will be fully fetched (partial checkout).  Return #t on
+success, #f otherwise."
+  (define base-options
+    `("--non-interactive"
+      ;; Trust the server certificate.  This is OK as we
+      ;; verify the checksum later.  This can be removed when
+      ;; ca-certificates package is added.
+      "--trust-server-cert"
+      "-r" ,(number->string revision)
+      ,@(if (and user-name password)
+            (list (string-append "--username=" user-name)
+                  (string-append "--password=" password))
+            '())
+      ,@(if recursive?
+            '()
+            (list "--ignore-externals"))))
+
   (guard (c ((invoke-error? c)
              (report-invoke-error c)
              #f))
-    (apply invoke svn-command
-           "export" "--non-interactive"
-           ;; Trust the server certificate.  This is OK as we
-           ;; verify the checksum later.  This can be removed when
-           ;; ca-certificates package is added.
-           "--trust-server-cert" "-r" (number->string revision)
-
-           ;; Disable keyword substitutions (keywords are CVS-like strings
-           ;; like "$Date$", "$Id$", and so on) for two reasons: (1) some
-           ;; expansions depend on the local time zone, and (2) SWH disables
-           ;; it in its archive for this very reason.
-           "--ignore-keywords"
-
-           `(,@(if (and user-name password)
-                   (list (string-append "--username=" user-name)
-                         (string-append "--password=" password))
-                   '())
-             ,@(if recursive?
-                   '()
-                   (list "--ignore-externals"))
-             ,url ,directory))
+    (match subdirectories
+      (#f
+       (apply invoke svn-command "export"
+              (append base-options
+                      `(;; Disable keyword substitutions (keywords are CVS-like strings
+                        ;; like "$Date$", "$Id$", and so on) for two reasons: (1) some
+                        ;; expansions depend on the local time zone, and (2) SWH disables
+                        ;; it in its archive for this very reason.
+                        "--ignore-keywords"
+                        ,url ,directory))))
+      (_
+       (apply invoke svn-command "checkout"
+              (append base-options
+                      `(,@(if subdirectories
+                              (list "--depth" "immediates")
+                              '())
+                        ,url ,directory)))
+       (with-directory-excursion directory
+         (apply invoke svn-command "update"
+                (append base-options
+                        (append-map (cut list "--set-depth" "infinity" <>)
+                                    subdirectories)))
+         (delete-file-recursively ".svn"))))
     #t))
 
 ;;; svn.scm ends here
diff --git a/guix/svn-download.scm b/guix/svn-download.scm
index b20cdc79d1..e263498f30 100644
--- a/guix/svn-download.scm
+++ b/guix/svn-download.scm
@@ -2,6 +2,7 @@
 ;;; Copyright © 2014-2016, 2019, 2021-2024 Ludovic Courtès <ludo@gnu.org>
 ;;; Copyright © 2014 Sree Harsha Totakura <sreeharsha@totakura.in>
 ;;; Copyright © 2017, 2019, 2021 Ricardo Wurmus <rekado@elephly.net>
+;;; Copyright © 2024 Maxim Cournoyer <maxim.cournoyer@gmail.com>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -35,6 +36,7 @@ (define-module (guix svn-download)
             svn-reference?
             svn-reference-url
             svn-reference-revision
+            svn-reference-subdirectories
             svn-reference-recursive?
             svn-reference-user-name
             svn-reference-password
@@ -65,6 +67,8 @@ (define-record-type* <svn-reference>
   svn-reference?
   (url        svn-reference-url)                    ; string
   (revision   svn-reference-revision)               ; number
+  (subdirectories svn-reference-subdirectories      ;list or #f
+                  (default #f))
   (recursive? svn-reference-recursive? (default #f))
   (user-name  svn-reference-user-name (default #f))
   (password   svn-reference-password (default #f)))
@@ -84,7 +88,7 @@ (define (svn-fetch-builder svn hash-algo)
   (define guile-gnutls
     (module-ref (resolve-interface '(gnu packages tls)) 'guile-gnutls))
 
-  (define tar+gzip                                ;for (guix swh)
+  (define tar+gzip                      ;for (guix swh)
     (list (module-ref (resolve-interface '(gnu packages compression))
                       'gzip)
           (module-ref (resolve-interface '(gnu packages base))
@@ -96,7 +100,7 @@ (define (svn-fetch-builder svn hash-algo)
                                (guix build download-nar)
                                (guix build utils)
                                (guix swh)))
-    (with-extensions (list guile-json guile-gnutls   ;for (guix swh)
+    (with-extensions (list guile-json guile-gnutls ;for (guix swh)
                            guile-lzlib)
       #~(begin
           (use-modules (guix build svn)
@@ -105,7 +109,8 @@ (define (svn-fetch-builder svn hash-algo)
                        (guix build download-nar)
                        (guix build utils)
                        (guix swh)
-                       (ice-9 match))
+                       (ice-9 match)
+                       (srfi srfi-26))
 
           ;; Add tar and gzip to $PATH so
           ;; 'swh-download-directory-by-nar-hash' can invoke them.
@@ -120,7 +125,9 @@ (define (svn-fetch-builder svn hash-algo)
                                              ("yes" #t)
                                              (_ #f))
                               #:user-name (getenv "svn user name")
-                              #:password (getenv "svn password")))
+                              #:password (getenv "svn password")
+                              #:subdirectories (and=> (getenv "svn subdirectories")
+                                                      (cut string-split <> #\:))))
               (and (download-method-enabled? 'nar)
                    (download-nar #$output))
               (and (download-method-enabled? 'swh)
@@ -164,6 +171,11 @@ (define* (svn-fetch ref hash-algo hash
                               `(("svn password"
                                  . ,(svn-reference-password ref)))
                               '())
+                        ,@(if (svn-reference-subdirectories ref)
+                              `(("svn subdirectories"
+                                 . ,(string-join
+                                     (svn-reference-subdirectories ref) ":")))
+                              '())
                         ,@(match (getenv "GUIX_DOWNLOAD_METHODS")
                             (#f '())
                             (value

base-commit: 503919fcf01d7eb8d550df5c3993aee9a966ba9b
-- 
2.46.0





^ permalink raw reply related	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2024-11-12  8:38 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-21  1:08 [bug#73921] [PATCH] svn-download: Add support for partial checkout Maxim Cournoyer
2024-11-12  8:36 ` bug#73921: " Maxim Cournoyer

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/guix.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).