summaryrefslogtreecommitdiff
path: root/guix
diff options
context:
space:
mode:
Diffstat (limited to 'guix')
-rw-r--r--guix/build-system/texlive.scm15
-rw-r--r--guix/build/svn.scm9
-rw-r--r--guix/svn-download.scm59
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)))