diff options
Diffstat (limited to 'guix')
-rw-r--r-- | guix/build-system/texlive.scm | 15 | ||||
-rw-r--r-- | guix/build/svn.scm | 9 | ||||
-rw-r--r-- | guix/svn-download.scm | 59 |
3 files changed, 73 insertions, 10 deletions
diff --git a/guix/build-system/texlive.scm b/guix/build-system/texlive.scm index b6a86a1c62..ad99d1e2d0 100644 --- a/guix/build-system/texlive.scm +++ b/guix/build-system/texlive.scm @@ -30,6 +30,7 @@ texlive-build texlive-build-system texlive-ref + texlive-origin %texlive-tag %texlive-revision)) @@ -44,6 +45,20 @@ (define %texlive-tag "texlive-2018.2") (define %texlive-revision 49435) +(define (texlive-origin name version locations hash) + "Return an <origin> object for a TeX Live package consisting of multiple +LOCATIONS with a provided HASH. Use NAME and VERSION to compute a prettier +name for the checkout directory." + (origin + (method svn-multi-fetch) + (uri (svn-multi-reference + (url (string-append "svn://www.tug.org/texlive/tags/" + %texlive-tag "/Master/texmf-dist/")) + (locations locations) + (revision %texlive-revision))) + (file-name (string-append name "-" version "-checkout")) + (sha256 hash))) + (define (texlive-ref component id) "Return a <svn-reference> object for the package ID, which is part of the given Texlive COMPONENT." diff --git a/guix/build/svn.scm b/guix/build/svn.scm index 913f89471b..e3188add3e 100644 --- a/guix/build/svn.scm +++ b/guix/build/svn.scm @@ -36,7 +36,7 @@ "Fetch REVISION from URL into DIRECTORY. REVISION must be an integer, and a valid Subversion revision. Return #t on success, #f otherwise." (apply invoke svn-command - "checkout" "--non-interactive" + "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. @@ -46,13 +46,6 @@ valid Subversion revision. Return #t on success, #f otherwise." (string-append "--password=" password)) '()) ,url ,directory)) - - ;; The contents of '.svn' vary as a function of the current status - ;; of the repo. Since we want a fixed output, this directory needs - ;; to be taken out. - (with-directory-excursion directory - (for-each delete-file-recursively (find-files "." "^\\.svn$" #:directories? #t))) - #t) ;;; svn.scm ends here diff --git a/guix/svn-download.scm b/guix/svn-download.scm index c118869af1..5c25437059 100644 --- a/guix/svn-download.scm +++ b/guix/svn-download.scm @@ -1,7 +1,7 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2014, 2015, 2016 Ludovic Courtès <ludo@gnu.org> ;;; Copyright © 2014 Sree Harsha Totakura <sreeharsha@totakura.in> -;;; Copyright © 2017 Ricardo Wurmus <rekado@elephly.net> +;;; Copyright © 2017, 2019 Ricardo Wurmus <rekado@elephly.net> ;;; ;;; This file is part of GNU Guix. ;;; @@ -32,7 +32,14 @@ svn-reference-url svn-reference-revision svn-fetch - download-svn-to-store)) + download-svn-to-store + + svn-multi-reference + svn-multi-reference? + svn-multi-reference-url + svn-multi-reference-revision + svn-multi-reference-locations + svn-multi-fetch)) ;;; Commentary: ;;; @@ -83,6 +90,54 @@ HASH-ALGO (a symbol). Use NAME as the file name, or a generic name if #f." #:guile-for-build guile #:local-build? #t))) +(define-record-type* <svn-multi-reference> + svn-multi-reference make-svn-multi-reference + svn-multi-reference? + (url svn-multi-reference-url) ; string + (revision svn-multi-reference-revision) ; number + (locations svn-multi-reference-locations) ; list of strings + (user-name svn-multi-reference-user-name (default #f)) + (password svn-multi-reference-password (default #f))) + +(define* (svn-multi-fetch ref hash-algo hash + #:optional name + #:key (system (%current-system)) (guile (default-guile)) + (svn (subversion-package))) + "Return a fixed-output derivation that fetches REF, a <svn-multi-reference> +object. The output is expected to have recursive hash HASH of type +HASH-ALGO (a symbol). Use NAME as the file name, or a generic name if #f." + (define build + (with-imported-modules '((guix build svn) + (guix build utils)) + #~(begin + (use-modules (guix build svn) + (guix build utils) + (srfi srfi-1)) + (every (lambda (location) + ;; The directory must exist if we are to fetch only a + ;; single file. + (unless (string-suffix? "/" location) + (mkdir-p (string-append #$output "/" (dirname location)))) + (svn-fetch (string-append '#$(svn-multi-reference-url ref) + "/" location) + '#$(svn-multi-reference-revision ref) + (if (string-suffix? "/" location) + (string-append #$output "/" location) + (string-append #$output "/" (dirname location))) + #:svn-command (string-append #+svn "/bin/svn") + #:user-name #$(svn-multi-reference-user-name ref) + #:password #$(svn-multi-reference-password ref))) + '#$(svn-multi-reference-locations ref))))) + + (mlet %store-monad ((guile (package->derivation guile system))) + (gexp->derivation (or name "svn-checkout") build + #:system system + #:hash-algo hash-algo + #:hash hash + #:recursive? #t + #:guile-for-build guile + #:local-build? #t))) + (define* (download-svn-to-store store ref #:optional (name (basename (svn-reference-url ref))) #:key (log (current-error-port))) |