aboutsummaryrefslogtreecommitdiff
;;; GNU Guix --- Functional package management for GNU
;;; Copyright © 2015, 2018 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
;;;
;;; GNU Guix is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU General Public License as published by
;;; the Free Software Foundation; either version 3 of the License, or (at
;;; your option) any later version.
;;;
;;; GNU Guix is distributed in the hope that it will be useful, but
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;;; GNU General Public License for more details.
;;;
;;; You should have received a copy of the GNU General Public License
;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>.

(define-module (gnu system nss)
  #:use-module (rnrs enums)
  #:use-module (guix records)
  #:use-module (srfi srfi-9)
  #:use-module (ice-9 match)
  #:export (name-service-switch?
            name-service-switch
            name-service?
            name-service

            lookup-specification

            %default-nss
            %mdns-host-lookup-nss

            %files
            %compat
            %dns

            name-service-switch->string))

;;; Commentary:
;;;
;;; Bindings for libc's name service switch (NSS) configuration.
;;;
;;; Code:

(define-record-type* <name-service> name-service
  make-name-service
  name-service?
  (name     name-service-name)
  (reaction name-service-reaction
            (default (lookup-specification))))

;; Lookup specification (info "(libc) Actions in the NSS Configuration").

(define-enumeration lookup-action
  (return continue)
  make-lookup-action)

(define-enumeration lookup-status
  (success
   not-found
   unavailable
   try-again)
  make-lookup-status)

(define-record-type <lookup-status-negation>
  (lookup-status-negation status)
  lookup-status-negation?
  (status lookup-status-negation-status))

(define-record-type <lookup-reaction>
  (make-lookup-reaction status action)
  lookup-reaction?
  (status  lookup-reaction-status)
  (action  lookup-reaction-action))

(define-syntax lookup-reaction
  (syntax-rules (not =>)
    ((_ ((not status) => action))
     (make-lookup-reaction (lookup-status-negation (lookup-status status))
                           (lookup-action action)))
    ((_ (status => action))
     (make-lookup-reaction (lookup-status status)
                           (lookup-action action)))))

(define-syntax-rule (lookup-specification reaction ...)
  "Return an NSS lookup specification."
  (list (lookup-reaction reaction) ...))


;;;
;;; Common name services and default NSS configuration.
;;;

(define %compat
  ;; Note: Starting from version 2.26, libc no longer provides libnss_compat
  ;; so this specification has become useless.
  (name-service
    (name "compat")
    (reaction (lookup-specification (not-found => return)))))

(define %files
  (name-service (name "files")))

(define %dns
  ;; DNS is supposed to be authoritative, so unless it's unavailable, return
  ;; what it finds.
  (name-service
    (name "dns")
    (reaction (lookup-specification ((not unavailable) => return)))))

;; The NSS.  We list all the databases here because that allows us to
;; statically ensure that the user's configuration refers to existing
;; databases.  See libc/nss/databases.def for the list of databases.  Default
;; values obtained by looking for "DEFAULT_CONFIG" in libc/nss/*.c.
;;
;; Although libc places 'dns' before 'files' in the default configurations of
;; the 'hosts' and 'networks' databases, we choose to put 'files' before 'dns'
;; by default, so that users can override host/address mappings in /etc/hosts
;; and bypass DNS to improve their privacy and escape NSA's MORECOWBELL.
(define-record-type* <name-service-switch> name-service-switch
  make-name-service-switch
  name-service-switch?
  (aliases    name-service-switch-aliases
              (default '()))
  (ethers     name-service-switch-ethers
              (default '()))
  (group      name-service-switch-group
              (default (list %files)))
  (gshadow    name-service-switch-gshadow
              (default '()))
  (hosts      name-service-switch-hosts
              (default (list %files %dns)))
  (initgroups name-service-switch-initgroups
              (default '()))
  (netgroup   name-service-switch-netgroup
              (default '()))
  (networks   name-service-switch-networks
              (default (list %files %dns)))
  (password   name-service-switch-password
              (default (list %files)))
  (public-key name-service-switch-public-key
              (default '()))
  (rpc        name-service-switch-rpc
              (default '()))
  (services   name-service-switch-services
              (default '()))
  (shadow     name-service-switch-shadow
              (default (list %files))))

(define %default-nss
  ;; Default NSS configuration.
  (name-service-switch))

(define %mdns-host-lookup-nss
  (name-service-switch
    (hosts (list %files                           ;first, check /etc/hosts

                 ;; If the above did not succeed, try with 'mdns_minimal'.
                 (name-service
                   (name "mdns_minimal")

                   ;; 'mdns_minimal' is authoritative for '.local'.  When it
                   ;; returns "not found", no need to try the next methods.
                   (reaction (lookup-specification
                              (not-found => return))))

                 ;; Then fall back to DNS.
                 (name-service
                   (name "dns"))

                 ;; Finally, try with the "full" 'mdns'.
                 (name-service
                   (name "mdns"))))))


;;;
;;; Serialization.
;;;

(define (lookup-status->string status)
  (match status
    ('success     "SUCCESS")
    ('not-found   "NOTFOUND")
    ('unavailable "UNAVAIL")
    ('try-again   "TRYAGAIN")
    (($ <lookup-status-negation> status)
     (string-append "!" (lookup-status->string status)))))

(define lookup-reaction->string
  (match-lambda
   (($ <lookup-reaction> status action)
    (string-append (lookup-status->string status) "="
                   (symbol->string action)))))

(define name-service->string
  (match-lambda
   (($ <name-service> name ())
    name)
   (($ <name-service> name reactions)
    (string-append name " ["
                   (string-join (map lookup-reaction->string reactions))
                   "]"))))

(define (name-service-switch->string nss)
  "Return the 'nsswitch.conf' contents for NSS as a string.  See \"NSS
Configuration File\" in the libc manual."
  (let-syntax ((->string
                (syntax-rules ()
                  ((_ name field)
                   (match (field nss)
                     (()                          ;keep the default config
                      "")
                     ((services (... ...))
                      (string-append name ":\t"
                                     (string-join
                                      (map name-service->string services))
                                     "\n")))))))
    (string-append (->string "aliases"    name-service-switch-aliases)
                   (->string "ethers"     name-service-switch-ethers)
                   (->string "group"      name-service-switch-group)
                   (->string "gshadow"    name-service-switch-gshadow)
                   (->string "hosts"      name-service-switch-hosts)
                   (->string "initgroups" name-service-switch-initgroups)
                   (->string "netgroup"   name-service-switch-netgroup)
                   (->string "networks"   name-service-switch-networks)
                   (->string "passwd"     name-service-switch-password)
                   (->string "publickey"  name-service-switch-public-key)
                   (->string "rpc"        name-service-switch-rpc)
                   (->string "services"   name-service-switch-services)
                   (->string "shadow"     name-service-switch-shadow))))

;;; Local Variables:
;;; eval: (put 'name-service 'scheme-indent-function 0)
;;; eval: (put 'name-service-switch 'scheme-indent-function 0)
;;; End:

;;; nss.scm ends here
(shortdesc . "Strictly balanced brackets and numbers in command names") (longdesc . "This is a small, LuaLaTeX-only package providing you with three, sometimes useful features: It allows you to make brackets [...] \"strict\", meaning that each [ must be balanced by a ]. It allows you to use numbers in command names, so that you can do stuff like \\newcommand\\pi12{\\pi_{12}}. It allows you to use numbers and primes in command names, so that you can do stuff like \\newcommand\\pi'12{\\pi '_{12}}.") (docfiles . ("texmf-dist/doc/lualatex/stricttex/README.md" "texmf-dist/doc/lualatex/stricttex/stricttex.pdf")) (runfiles . ("texmf-dist/tex/lualatex/stricttex/stricttex.lua" "texmf-dist/tex/lualatex/stricttex/stricttex.sty")) (catalogue-license . "lppl1.3c"))) ("tex" (name . "tex") (shortdesc . "A sophisticated typesetting engine") (longdesc . "TeX is a typesetting system that incorporates...") (depend "cm" "hyphen-base" "tex.ARCH") (docfiles "texmf-dist/doc/man/man1/tex.1") (catalogue-license . "knuth")) ("texsis" . ((name . "texsis") (shortdesc . "Plain TeX macros for Physicists") (longdesc . "TeXsis is a TeX macro package which provides useful features for typesetting research papers and related documents. For example, it includes support specifically for: Automatic numbering of equations, figures, tables and references; Simplified control of type sizes, line spacing, footnotes, running headlines and footlines, and tables of contents, figures and tables; Specialized document formats for research papers, preprints and \"e-prints\", conference proceedings, theses, books, referee reports, letters, and memoranda; Simplified means of constructing an index for a book or thesis; Easy to use double column formatting; Specialized environments for lists, theorems and proofs, centered or non-justified text, and listing computer code; Specialized macros for easily constructing ruled tables. TeXsis was originally developed for physicists, but others may also find it useful. It is completely compatible with Plain TeX.") (depend . ("tex" "plain" "knuth-lib" "hyphen-base" "cm")) (docfiles . ("texmf-dist/doc/man/man1/texsis.1" "texmf-dist/doc/man/man1/texsis.man1.pdf" "texmf-dist/doc/otherformats/texsis/base/COPYING" "texmf-dist/doc/otherformats/texsis/base/Example.tex" "texmf-dist/doc/otherformats/texsis/base/Fonts.tex" "texmf-dist/doc/otherformats/texsis/base/INSTALL" "texmf-dist/doc/otherformats/texsis/base/Install.tex" "texmf-dist/doc/otherformats/texsis/base/MANIFEST" "texmf-dist/doc/otherformats/texsis/base/Manual.fgl" "texmf-dist/doc/otherformats/texsis/base/Manual.ref" "texmf-dist/doc/otherformats/texsis/base/Manual.tbl" "texmf-dist/doc/otherformats/texsis/base/Manual.tex" "texmf-dist/doc/otherformats/texsis/base/NEWS" "texmf-dist/doc/otherformats/texsis/base/README" "texmf-dist/doc/otherformats/texsis/base/TXSapxF.doc" "texmf-dist/doc/otherformats/texsis/base/TXScover.doc" "texmf-dist/doc/otherformats/texsis/base/TXSdcol.doc" "texmf-dist/doc/otherformats/texsis/base/TXSdoc.doc" "texmf-dist/doc/otherformats/texsis/base/TXSdoc0.doc" "texmf-dist/doc/otherformats/texsis/base/TXSdocM.doc" "texmf-dist/doc/otherformats/texsis/base/TXSend.doc" "texmf-dist/doc/otherformats/texsis/base/TXSenvmt.doc" "texmf-dist/doc/otherformats/texsis/base/TXSeqns.doc" "texmf-dist/doc/otherformats/texsis/base/TXSfigs.doc" "texmf-dist/doc/otherformats/texsis/base/TXSfmts.doc" "texmf-dist/doc/otherformats/texsis/base/TXSfonts.doc" "texmf-dist/doc/otherformats/texsis/base/TXSinstl.doc" "texmf-dist/doc/otherformats/texsis/base/TXSintro.doc" "texmf-dist/doc/otherformats/texsis/base/TXSletr.doc" "texmf-dist/doc/otherformats/texsis/base/TXSmisc.doc" "texmf-dist/doc/otherformats/texsis/base/TXSprns.doc" "texmf-dist/doc/otherformats/texsis/base/TXSrefs.doc" "texmf-dist/doc/otherformats/texsis/base/TXSrevs.doc" "texmf-dist/doc/otherformats/texsis/base/TXSruled.doc" "texmf-dist/doc/otherformats/texsis/base/TXSsects.doc" "texmf-dist/doc/otherformats/texsis/base/TXSsite.000" "texmf-dist/doc/otherformats/texsis/base/TXSsymb.doc" "texmf-dist/doc/otherformats/texsis/base/TXStags.doc" "texmf-dist/doc/otherformats/texsis/base/index.tex" "texmf-dist/doc/otherformats/texsis/base/letr" "texmf-dist/doc/otherformats/texsis/base/penguin.eps" "texmf-dist/doc/otherformats/texsis/base/penguin2.eps" "texmf-dist/doc/otherformats/texsis/base/texsis.el" "texmf-dist/doc/otherformats/texsis/base/texsis.lsm")) (runfiles . ("texmf-dist/bibtex/bst/texsis/texsis.bst" "texmf-dist/tex/texsis/base/AIP.txs" "texmf-dist/tex/texsis/base/CVformat.txs" "texmf-dist/tex/texsis/base/Elsevier.txs" "texmf-dist/tex/texsis/base/Exam.txs" "texmf-dist/tex/texsis/base/Formletr.txs" "texmf-dist/tex/texsis/base/IEEE.txs" "texmf-dist/tex/texsis/base/PhysRev.txs" "texmf-dist/tex/texsis/base/Spanish.txs" "texmf-dist/tex/texsis/base/Swedish.txs" "texmf-dist/tex/texsis/base/TXSconts.tex" "texmf-dist/tex/texsis/base/TXSdcol.tex" "texmf-dist/tex/texsis/base/TXSenvmt.tex" "texmf-dist/tex/texsis/base/TXSeqns.tex" "texmf-dist/tex/texsis/base/TXSfigs.tex" "texmf-dist/tex/texsis/base/TXSfmts.tex" "texmf-dist/tex/texsis/base/TXSfonts.tex" "texmf-dist/tex/texsis/base/TXShead.tex" "texmf-dist/tex/texsis/base/TXSinit.tex" "texmf-dist/tex/texsis/base/TXSletr.tex" "texmf-dist/tex/texsis/base/TXSmacs.tex" "texmf-dist/tex/texsis/base/TXSmemo.tex" "texmf-dist/tex/texsis/base/TXSprns.tex" "texmf-dist/tex/texsis/base/TXSrefs.tex" "texmf-dist/tex/texsis/base/TXSruled.tex" "texmf-dist/tex/texsis/base/TXSsects.tex" "texmf-dist/tex/texsis/base/TXSsite.tex" "texmf-dist/tex/texsis/base/TXSsymb.tex" "texmf-dist/tex/texsis/base/TXStags.tex" "texmf-dist/tex/texsis/base/TXStitle.tex" "texmf-dist/tex/texsis/base/Tablebod.txs" "texmf-dist/tex/texsis/base/WorldSci.txs" "texmf-dist/tex/texsis/base/color.txs" "texmf-dist/tex/texsis/base/nuclproc.txs" "texmf-dist/tex/texsis/base/printfont.txs" "texmf-dist/tex/texsis/base/spine.txs" "texmf-dist/tex/texsis/base/texsis.tex" "texmf-dist/tex/texsis/base/thesis.txs" "texmf-dist/tex/texsis/base/twin.txs" "texmf-dist/tex/texsis/config/texsis.ini")) (catalogue-license . "lppl"))) ("trsym" (name . "trsym") (shortdesc . "Symbols for transformations") (longdesc . "The bundle provides Metafont...") (docfiles "texmf-dist/doc/latex/trsym/README" "texmf-dist/doc/latex/trsym/manifest.txt" "texmf-dist/doc/latex/trsym/trsym.pdf") (srcfiles "texmf-dist/source/latex/trsym/trsym.dtx" "texmf-dist/source/latex/trsym/trsym.ins") (runfiles "texmf-dist/fonts/source/public/trsym/trsy.mf" "texmf-dist/fonts/source/public/trsym/trsy10.mf" "texmf-dist/fonts/source/public/trsym/trsy12.mf" "texmf-dist/fonts/tfm/public/trsym/trsy10.tfm" "texmf-dist/fonts/tfm/public/trsym/trsy12.tfm" "texmf-dist/tex/latex/trsym/trsym.sty" "texmf-dist/tex/latex/trsym/utrsy.fd") (catalogue-license . "lppl")) ("vlna" (name . "vlna") (shortdesc . "Add ~ after non-syllabic preposition") (longdesc . "Preprocessor for TeX source") (depend "vlna.ARCH") (docfiles "texmf-dist/doc/man/man1/vlna.1")) ("vlna.x86_64-linux" (shortdesc "x86_64-linux files of vlna") (binfiles "bin/x86_64-linux/vlna")) ("web" (depend "web.ARCH") (docfiles "texmf-dist/doc/man/man1/tangle.1")) ("web.x86_64-linux" (name . "web.x86_64-linux") (binfiles "bin/x86_64-linux/tangle")))) (test-assert "texlive->guix-package, no docfiles" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "example" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-example") ('version _) ('source ('origin ('method 'svn-multi-fetch) ('uri ('svn-multi-reference ('url ('texlive-packages-repository 'version)) ('revision 12345) ('locations ('list "tex/latex/example/")))) ('file-name ('git-file-name 'name 'version)) ('sha256 ('base32 (? string? hash))))) ('build-system 'texlive-build-system) ('home-page (? string?)) ('synopsis (? string?)) ('description (? string?)) ('license _)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "texsis" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-texsis") ('version _) ('source ('origin ('method 'svn-multi-fetch) ('uri ('svn-multi-reference ('url ('texlive-packages-repository 'version)) ('revision 12345) ('locations ('list "bibtex/bst/texsis/" "doc/man/man1/texsis.1" "doc/man/man1/texsis.man1.pdf" "doc/otherformats/texsis/base/" "tex/texsis/base/" "tex/texsis/config/")))) ('file-name ('git-file-name 'name 'version)) ('sha256 ('base32 (? string? hash))))) ('outputs ''("out" "doc")) ('build-system 'texlive-build-system) ('propagated-inputs ('list 'texlive-cm 'texlive-hyphen-base 'texlive-knuth-lib 'texlive-plain 'texlive-tex)) ('home-page (? string?)) ('synopsis (? string?)) ('description (? string?)) ('license 'lppl)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, with METAFONT files" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "trsym" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name _) ('version _) ('source _) ('outputs _) ('build-system _) ('native-inputs ('list 'texlive-metafont)) ('home-page (? string?)) ('synopsis (? string?)) ('description (? string?)) ('license _)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, with catalogue entry, no inputs" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "12many" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-12many") ('version _) ('source ('origin ('method 'svn-multi-fetch) ('uri ('svn-multi-reference ('url ('texlive-packages-repository 'version)) ('revision 12345) ('locations ('list "doc/latex/12many/" "source/latex/12many/" "tex/latex/12many/")))) ('file-name ('git-file-name 'name 'version)) ('sha256 ('base32 (? string? hash))))) ('outputs ''("out" "doc")) ('build-system 'texlive-build-system) ('home-page "https://ctan.org/pkg/one2many") ('synopsis (? string?)) ('description (? string?)) ('license 'lppl)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, multiple licenses" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "chs-physics-report" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-chs-physics-report") ('version _) ('source ('origin ('method 'svn-multi-fetch) ('uri ('svn-multi-reference ('url ('texlive-packages-repository 'version)) ('revision 12345) ('locations ('list "doc/latex/chs-physics-report/" "tex/latex/chs-physics-report/")))) ('file-name ('git-file-name 'name 'version)) ('sha256 ('base32 (? string? hash))))) ('outputs ''("out" "doc")) ('build-system 'texlive-build-system) ('home-page (? string?)) ('synopsis (? string?)) ('description (? string?)) ('license ('list 'public-domain 'cc-by-sa3.0))) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, meta-package" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "collection-texworks" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-collection-texworks") ('version '%texlive-version) ('source #f) ('build-system 'trivial-build-system) ('arguments ('list '#:builder ('gexp ('mkdir ('ungexp 'output))))) ('propagated-inputs ('list 'texlive-collection-basic)) ('home-page "https://www.tug.org/texlive/") ('synopsis (? string?)) ('description (? string?)) ('license ('fsf-free "https://www.tug.org/texlive/copying.html"))) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, with TeX format" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "lollipop" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-lollipop") ('version _) ('source ('origin ('method 'svn-multi-fetch) ('uri ('svn-multi-reference ('url ('texlive-packages-repository 'version)) ('revision 12345) ('locations ('list "doc/otherformats/lollipop/" "tex/lollipop/")))) ('file-name ('git-file-name 'name 'version)) ('sha256 ('base32 (? string? hash))))) ('outputs ''("out" "doc")) ('build-system 'texlive-build-system) ('arguments ('list '#:create-formats ('gexp ('list "lollipop")))) ('home-page (? string?)) ('synopsis (? string?)) ('description (? string?)) ('license 'gpl3)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, execute but no TeX format" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "adforn" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-adforn") ('version _) ('source _) ('outputs ''("out" "doc")) ('build-system 'texlive-build-system) ('home-page (? string?)) ('synopsis (? string?)) ('description (? string?)) ('license _)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, translate dependencies" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "collection-basic" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-collection-basic") ('version _) ('source _) ('build-system 'trivial-build-system) ('arguments ('list '#:builder ('gexp ('mkdir ('ungexp 'output))))) ('propagated-inputs ('list 'texlive-amsfonts 'texlive-hyphen-complete)) ('home-page (? string?)) ('synopsis (? string?)) ('description (? string?)) ('license _)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, lonely `hyphen-base' dependency and ARCH" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "tex" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-tex") ('version _) ('source _) ('outputs _) ('build-system 'texlive-build-system) ('arguments ('list '#:texlive-latex-bin? #f)) ('propagated-inputs ('list 'texlive-cm 'texlive-hyphen-base)) ('home-page (? string?)) ('synopsis (? string?)) ('description (? string?)) ('license _)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, single script, no extension" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "authorindex" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-authorindex") ('version _) ('source _) ('outputs _) ('build-system 'texlive-build-system) ('arguments ('list '#:link-scripts ('gexp ('list "authorindex")))) ('home-page (? string?)) ('synopsis (? string?)) ('description (? string?)) ('license _)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, multiple scripts, with extensions" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "cyrillic-bin" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-cyrillic-bin") ('version _) ('source _) ('outputs _) ('build-system 'texlive-build-system) ('arguments ('list '#:link-scripts ('gexp ('list "rubibtex.sh" "rumakeindex.sh")))) ('home-page _) ('synopsis _) ('description _) ('license _)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, script with associated input" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "pax" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-pax") ('version _) ('source _) ('outputs _) ('build-system 'texlive-build-system) ('arguments ('list '#:link-scripts ('gexp ('list "pdfannotextractor.pl")))) ('inputs ('list 'perl)) ('home-page _) ('synopsis _) ('description _) ('license _)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, propagated binaries, no script" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "vlna" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-vlna") ('version _) ('source _) ('outputs _) ('build-system 'texlive-build-system) ('propagated-inputs ('list 'texlive-vlna-bin)) ('home-page _) ('synopsis _) ('description _) ('license _)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, propagated binaries and scripts" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "m-tx" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-m-tx") ('version _) ('source _) ('build-system 'texlive-build-system) ('arguments ('list '#:link-scripts ('gexp ('list "m-tx.lua")))) ('propagated-inputs ('list 'texlive-m-tx-bin)) ('home-page _) ('synopsis _) ('description _) ('license _)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, with skipped propagated binaries" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "web" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-web") ('version _) ('source _) ('outputs _) ('build-system 'texlive-build-system) ('home-page _) ('synopsis _) ('description _) ('license _)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-assert "texlive->guix-package, with upstream-name property" ;; Replace network resources with sample data. (mock ((guix build svn) svn-fetch (lambda* (url revision directory #:key (svn-command "svn") (user-name #f) (password #f) (recursive? #t)) (mkdir-p directory) (with-output-to-file (string-append directory "/foo") (lambda () (display "source"))))) (let ((result (texlive->guix-package "r_und_s" #:version "0" #:database %fake-tlpdb))) (match result (('package ('name "texlive-r-und-s") ('version _) ('source _) ('properties _) ('build-system 'texlive-build-system) ('home-page _) ('synopsis _) ('description _) ('license _)) #true) (_ (begin (format #t "~s~%" result) (pk 'fail result #f))))))) (test-end "texlive")