aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Courtès <ludo@gnu.org>2012-06-28 23:15:24 +0200
committerLudovic Courtès <ludo@gnu.org>2012-06-28 23:15:24 +0200
commit35f3c5f5ad0be31c7b8930c9cb6bcc8ac252829e (patch)
treeb8c6762733cf84f6deab98593dd625e46636f9a7
parentdba6b34bdd21c4c03895f6eddf461a440ee3b13a (diff)
downloadpatches-35f3c5f5ad0be31c7b8930c9cb6bcc8ac252829e.tar
patches-35f3c5f5ad0be31c7b8930c9cb6bcc8ac252829e.tar.gz
Track the source location of packages.
* guix/packages.scm (<location>): New record type. (location, source-properties->location): New procedures. (<package>)[location]: New field. * tests/packages.scm ("GNU Hello"): Test `package-location'.
-rw-r--r--guix/packages.scm42
-rw-r--r--tests/packages.scm2
2 files changed, 42 insertions, 2 deletions
diff --git a/guix/packages.scm b/guix/packages.scm
index c7633accef..00751cedd5 100644
--- a/guix/packages.scm
+++ b/guix/packages.scm
@@ -21,7 +21,14 @@
#:use-module (guix store)
#:use-module (guix build-system)
#:use-module (ice-9 match)
- #:export (source
+ #:use-module (srfi srfi-9)
+ #:export (location
+ location?
+ location-file
+ location-line
+ location-column
+
+ source
package-source?
package-source-uri
package-source-method
@@ -44,6 +51,7 @@
package-license
package-platforms
package-maintainers
+ package-location
package-source-derivation
package-derivation
@@ -56,6 +64,32 @@
;;;
;;; Code:
+;; A source location.
+(define-record-type <location>
+ (make-location file line column)
+ location?
+ (file location-file) ; file name
+ (line location-line) ; 1-indexed line
+ (column location-column)) ; 0-indexed column
+
+(define location
+ (memoize
+ (lambda (file line column)
+ "Return the <location> object for the given FILE, LINE, and COLUMN."
+ (and line column file
+ (make-location file line column)))))
+
+(define (source-properties->location loc)
+ "Return a location object based on the info in LOC, an alist as returned
+by Guile's `source-properties', `frame-source', `current-source-location',
+etc."
+ (let ((file (assq-ref loc 'filename))
+ (line (assq-ref loc 'line))
+ (col (assq-ref loc 'column)))
+ (location file (and line (+ line 1)) col)))
+
+
+;; The source of a package, such as a tarball URL and fetcher.
(define-record-type* <package-source>
source make-package-source
package-source?
@@ -65,6 +99,7 @@
(file-name package-source-file-name ; optional file name
(default #f)))
+;; A package.
(define-record-type* <package>
package make-package
package?
@@ -88,7 +123,10 @@
(long-description package-long-description) ; one or two paragraphs
(license package-license (default '()))
(platforms package-platforms (default '()))
- (maintainers package-maintainers (default '())))
+ (maintainers package-maintainers (default '()))
+ (location package-location
+ (default (and=> (current-source-location)
+ source-properties->location))))
(define (package-source-derivation store source)
"Return the derivation path for SOURCE, a package source."
diff --git a/tests/packages.scm b/tests/packages.scm
index 76f63f3662..8df58a8bd2 100644
--- a/tests/packages.scm
+++ b/tests/packages.scm
@@ -36,6 +36,8 @@
(test-assert "GNU Hello"
(and (package? hello)
+ (or (location? (package-location hello))
+ (not (package-location hello)))
(let* ((drv (package-derivation %store hello))
(out (derivation-path->output-path drv)))
(and (build-derivations %store (list drv))