From ca45da9fc9b1eee399ce4344b18cbb129daeca4c Mon Sep 17 00:00:00 2001 From: Robert Vollmert Date: Thu, 13 Jun 2019 21:39:14 +0200 Subject: import: hackage: Handle Hackage revisions. Hackage packages can have metadata revisions (Cabal file only) that are not reflected in the source archive. The Haskell build system has support for this, but until now the Hackage importer would create a package based on the revised Cabal file which would then build using the old Cabal file. Fixes . * guix/import/cabal.scm (): Add 'revision' field. (eval-cabal): Parse 'x-revision:' property. * guix/import/hackage.scm (read-cabal-and-hash): New procedure. (hackage-fetch-and-hash): New procedure. (hackage-fetch): Rewrite using 'hackage-fetch-and-hash'. (hackage-module->sexp): Add 'cabal-hash' argument and use it to populate the '#:cabal-revision' argument. (hackage->guix-package): Use the new '-and-hash' functions to get the hash of the Cabal file and pass it to 'hackage-module->sexp'. * guix/tests/hackage.scm: Test import of Cabal file revision. Signed-off-by: Timothy Sample --- tests/hackage.scm | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'tests') diff --git a/tests/hackage.scm b/tests/hackage.scm index 38a5825af7..14176b2cf9 100644 --- a/tests/hackage.scm +++ b/tests/hackage.scm @@ -274,6 +274,51 @@ executable cabal (test-assert "hackage->guix-package test multiline desc (braced)" (eval-test-with-cabal test-cabal-multiline-braced match-ghc-foo)) +;; Check Hackage Cabal revisions. +(define test-cabal-revision + "name: foo +version: 1.0.0 +x-revision: 2 +homepage: http://test.org +synopsis: synopsis +description: description +license: BSD3 +executable cabal + build-depends: + HTTP >= 4000.2.5 && < 4000.3, + mtl >= 2.0 && < 3 +") + +(define-package-matcher match-ghc-foo-revision + ('package + ('name "ghc-foo") + ('version "1.0.0") + ('source + ('origin + ('method 'url-fetch) + ('uri ('string-append + "https://hackage.haskell.org/package/foo/foo-" + 'version + ".tar.gz")) + ('sha256 + ('base32 + (? string? hash))))) + ('build-system 'haskell-build-system) + ('inputs + ('quasiquote + (("ghc-http" ('unquote 'ghc-http))))) + ('arguments + ('quasiquote + ('#:cabal-revision + ("2" "0xxd88fb659f0krljidbvvmkh9ppjnx83j0nqzx8whcg4n5qbyng")))) + ('home-page "http://test.org") + ('synopsis (? string?)) + ('description (? string?)) + ('license 'bsd-3))) + +(test-assert "hackage->guix-package test cabal revision" + (eval-test-with-cabal test-cabal-revision match-ghc-foo-revision)) + (test-assert "read-cabal test 1" (match (call-with-input-string test-read-cabal-1 read-cabal) ((("name" ("test-me")) -- cgit v1.2.3 From 5c7f87881a52a6424fc6722376b990284a06de5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Mon, 17 Jun 2019 22:48:44 +0200 Subject: tests: Avoid 'delete-paths' calls for 'derivation-prerequisites-to-build'. * tests/derivations.scm ("derivation-prerequisites-to-build when outputs already present"): Insert random text in BUILDER, and remove two calls to 'delete-paths'. Use 'derivation->output-path' for INPUT-PATH instead of an old idiom. --- tests/derivations.scm | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) (limited to 'tests') diff --git a/tests/derivations.scm b/tests/derivations.scm index c421d094a4..93f4cdd8ee 100644 --- a/tests/derivations.scm +++ b/tests/derivations.scm @@ -816,20 +816,17 @@ (null? (derivation-prerequisites-to-build %store drv)))) (test-assert "derivation-prerequisites-to-build when outputs already present" - (let* ((builder '(begin (mkdir %output) #t)) + (let* ((builder `(begin ,(random-text) (mkdir %output) #t)) (input-drv (build-expression->derivation %store "input" builder)) - (input-path (derivation-output-path - (assoc-ref (derivation-outputs input-drv) - "out"))) + (input-path (derivation->output-path input-drv)) (drv (build-expression->derivation %store "something" builder #:inputs `(("i" ,input-drv)))) (output (derivation->output-path drv))) - ;; Make sure these things are not already built. - (when (valid-path? %store input-path) - (delete-paths %store (list input-path))) - (when (valid-path? %store output) - (delete-paths %store (list output))) + ;; Assume these things are not already built. + (when (or (valid-path? %store input-path) + (valid-path? %store output)) + (error "things already built" input-drv)) (and (equal? (map derivation-input-path (derivation-prerequisites-to-build %store drv)) -- cgit v1.2.3 From 3149c002644b927e0245d237cdda3a6aeca00e4a Mon Sep 17 00:00:00 2001 From: Robert Vollmert Date: Sun, 16 Jun 2019 16:18:29 +0200 Subject: utils: canonical-newline-port: Fix handling of carriage return at buffer end. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Prior to this change the added test fails for me locally at byte 1024. It might depend on some default buffer sizes. Fixes . * tests/utils.scm ("canonical-newline-port-1024"): Add test. * guix/utils.scm (canonical-newline-port): Correct comments on CR/LF. Remove CR even when they're at the end of the buffer. Signed-off-by: Ludovic Courtès --- tests/utils.scm | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'tests') diff --git a/tests/utils.scm b/tests/utils.scm index 44861384ab..f78ec356bd 100644 --- a/tests/utils.scm +++ b/tests/utils.scm @@ -230,6 +230,12 @@ skip these tests." "This is a journey\r\nInto the sound\r\nA journey ...\n"))) (get-string-all (canonical-newline-port port)))) +(test-equal "canonical-newline-port-1024" + (string-concatenate (make-list 100 "0123456789abcde\n")) + (let ((port (open-string-input-port + (string-concatenate + (make-list 100 "0123456789abcde\r\n"))))) + (get-string-all (canonical-newline-port port)))) (test-equal "edit-expression" "(display \"GNU Guix\")\n(newline)\n" -- cgit v1.2.3 From b46a9b9a5e833989396565c9d924cc97ce080703 Mon Sep 17 00:00:00 2001 From: Robert Vollmert Date: Sun, 16 Jun 2019 16:55:36 +0200 Subject: import: hackage: Add two expected failing test cases. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds failing test cases for two hackage import bugs: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=25138 https://debbugs.gnu.org/cgi/bugreport.cgi?bug=35743 * tests/hackage.scm: Make comment style consistent. Add two cabal parsing tests, marked as expected failures. Signed-off-by: Ludovic Courtès --- tests/hackage.scm | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) (limited to 'tests') diff --git a/tests/hackage.scm b/tests/hackage.scm index 14176b2cf9..77e333cbfc 100644 --- a/tests/hackage.scm +++ b/tests/hackage.scm @@ -1,5 +1,6 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 Federico Beffa +;;; Copyright © 2019 Robert Vollmert ;;; ;;; This file is part of GNU Guix. ;;; @@ -236,7 +237,7 @@ library (test-assert "hackage->guix-package test 6" (eval-test-with-cabal test-cabal-6 match-ghc-foo-6)) -;; Check multi-line layouted description +;; Check multi-line layouted description. (define test-cabal-multiline-layout "name: foo version: 1.0.0 @@ -254,7 +255,7 @@ executable cabal (test-assert "hackage->guix-package test multiline desc (layout)" (eval-test-with-cabal test-cabal-multiline-layout match-ghc-foo)) -;; Check multi-line braced description +;; Check multi-line braced description. (define test-cabal-multiline-braced "name: foo version: 1.0.0 @@ -274,6 +275,53 @@ executable cabal (test-assert "hackage->guix-package test multiline desc (braced)" (eval-test-with-cabal test-cabal-multiline-braced match-ghc-foo)) +;; Check mixed layout. Compare e.g. warp. +(define test-cabal-mixed-layout + "name: foo +version: 1.0.0 +homepage: http://test.org +synopsis: synopsis +description: description +license: BSD3 +executable cabal + build-depends: + HTTP >= 4000.2.5 && < 4000.3, + mtl >= 2.0 && < 3 + ghc-options: -Wall +") + +;; Fails: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=35743 +(test-expect-fail 1) +(test-assert "hackage->guix-package test mixed layout" + (eval-test-with-cabal test-cabal-mixed-layout match-ghc-foo)) + +;; Check flag executable. Compare e.g. darcs. +(define test-cabal-flag-executable + "name: foo +version: 1.0.0 +homepage: http://test.org +synopsis: synopsis +description: description +license: BSD3 +flag executable + description: Build executable + default: True +executable cabal + if !flag(executable) + buildable: False + else + buildable: True + + build-depends: + HTTP >= 4000.2.5 && < 4000.3, + mtl >= 2.0 && < 3 +") + +;; Fails: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=25138 +(test-expect-fail 1) +(test-assert "hackage->guix-package test flag executable" + (eval-test-with-cabal test-cabal-flag-executable match-ghc-foo)) + ;; Check Hackage Cabal revisions. (define test-cabal-revision "name: foo -- cgit v1.2.3