~ruther/guix-local

f903dc056a5176033daca7a69d5b2c8376ff0677 — Ludovic Courtès 13 years ago 5fe21fb
packages: Use `read' and source properties for `package-field-location'.

* guix/packages.scm (package-field-location): Rewrite using `read' and
  source properties.  Change to return #f upon failure.
* tests/packages.scm ("package-field-location"): Check for #f upon failure.
* build-aux/sync-synopses.scm: Adjust accordingly.
3 files changed, 25 insertions(+), 37 deletions(-)

M build-aux/sync-synopses.scm
M guix/packages.scm
M tests/packages.scm
M build-aux/sync-synopses.scm => build-aux/sync-synopses.scm +2 -1
@@ 52,7 52,8 @@
           ((package . descriptor)
            (let ((upstream   (gnu-package-doc-summary descriptor))
                  (downstream (package-synopsis package))
                  (loc        (package-field-location package 'synopsis)))
                  (loc        (or (package-field-location package 'synopsis)
                                  (package-location package))))
              (unless (and upstream (string=? upstream downstream))
                (format (guix-warning-port)
                        "~a: ~a: proposed synopsis: ~s~%"

M guix/packages.scm => guix/packages.scm +21 -35
@@ 28,8 28,6 @@
  #:use-module (srfi srfi-11)
  #:use-module (srfi srfi-34)
  #:use-module (srfi srfi-35)
  #:use-module ((ice-9 rdelim) #:select (read-line))
  #:use-module (ice-9 regex)
  #:re-export (%current-system)
  #:export (origin
            origin?


@@ 163,32 161,13 @@ representation."
                                                      16)))))

(define (package-field-location package field)
  "Return an estimate of the source code location of the definition of FIELD
for PACKAGE."
  (define field-rx
    (make-regexp (string-append "\\("
                                (regexp-quote (symbol->string field))
                                "[[:blank:]]*")))
  (define (seek-to-line port line)
    (let ((line (- line 1)))
      (let loop ()
        (when (< (port-line port) line)
          (unless (eof-object? (read-line port))
            (loop))))))

  (define (find-line port)
    (let loop ((line (read-line port)))
      (cond ((eof-object? line)
             (values #f #f))
            ((regexp-exec field-rx line)
             =>
             (lambda (match)
               ;; At this point `port-line' points to the next line, so need
               ;; need to add one.
               (values (port-line port)
                       (match:end match))))
            (else
             (loop (read-line port))))))
  "Return the source code location of the definition of FIELD for PACKAGE, or
#f if it could not be determined."
  (define (goto port line column)
    (unless (and (= (port-column port) (- column 1))
                 (= (port-line port) (- line 1)))
      (unless (eof-object? (read-char port))
        (goto port line column))))

  (match (package-location package)
    (($ <location> file line column)


@@ 196,14 175,21 @@ for PACKAGE."
       (lambda ()
         (call-with-input-file (search-path %load-path file)
           (lambda (port)
             (seek-to-line port line)
             (let-values (((line column)
                           (find-line port)))
               (if (and line column)
                   (location file line column)
                   (package-location package))))))
             (goto port line column)
             (match (read port)
               (('package inits ...)
                (let ((field (assoc field inits)))
                  (match field
                    ((_ value)
                     (and=> (or (source-properties value)
                                (source-properties field))
                            source-properties->location))
                    (_
                     #f))))
               (_
                #f)))))
       (lambda _
         (package-location package))))
         #f)))
    (_ #f)))



M tests/packages.scm => tests/packages.scm +2 -1
@@ 71,7 71,8 @@
    (and (equal? (read-at (package-field-location %bootstrap-guile 'name))
                 (package-name %bootstrap-guile))
         (equal? (read-at (package-field-location %bootstrap-guile 'version))
                 (package-version %bootstrap-guile)))))
                 (package-version %bootstrap-guile))
         (not (package-field-location %bootstrap-guile 'does-not-exist)))))

(test-assert "package-transitive-inputs"
  (let* ((a (dummy-package "a"))