Adding a few helpers that let packages know their names and version numbers
svn: r7506
This commit is contained in:
parent
d78bfca30d
commit
a4c853d32a
|
@ -209,6 +209,23 @@ planet require specification. This function downloads and installs the
|
||||||
specified package if necessary, but does not verify that the actual
|
specified package if necessary, but does not verify that the actual
|
||||||
file within it actually exists.
|
file within it actually exists.
|
||||||
|
|
||||||
|
> (this-package-version) :: SYNTAX
|
||||||
|
> (this-package-version-name) :: SYNTAX
|
||||||
|
> (this-package-version-owner) :: SYNTAX
|
||||||
|
> (this-package-version-maj) :: SYNTAX
|
||||||
|
> (this-package-version-min) :: SYNTAX
|
||||||
|
|
||||||
|
Macros that expand into expressions that evaluate to information about
|
||||||
|
the name, owner, and version number of the package in which they
|
||||||
|
appear. this-package-version returns a list consisting of a string
|
||||||
|
naming the package's owner, a string naming the package, a number
|
||||||
|
indicating the package major version and a number indicating the
|
||||||
|
package minor version, or #f if the expression appears outside the
|
||||||
|
context of a package. The others are just convenience macros that
|
||||||
|
select out the relevant field, or return #f if the expression
|
||||||
|
appears outside the context of a PLaneT package.
|
||||||
|
|
||||||
|
|
||||||
_The PLaneT search order_
|
_The PLaneT search order_
|
||||||
-------------------------
|
-------------------------
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,8 @@
|
||||||
(lib "pack.ss" "setup")
|
(lib "pack.ss" "setup")
|
||||||
(lib "plt-single-installer.ss" "setup")
|
(lib "plt-single-installer.ss" "setup")
|
||||||
(lib "getinfo.ss" "setup")
|
(lib "getinfo.ss" "setup")
|
||||||
(lib "unpack.ss" "setup"))
|
(lib "unpack.ss" "setup")
|
||||||
|
(lib "etc.ss"))
|
||||||
|
|
||||||
#| The util collection provides a number of useful functions for interacting with the PLaneT system. |#
|
#| The util collection provides a number of useful functions for interacting with the PLaneT system. |#
|
||||||
|
|
||||||
|
@ -436,4 +437,73 @@
|
||||||
(lambda (row)
|
(lambda (row)
|
||||||
(let ([p (row->package row)])
|
(let ([p (row->package row)])
|
||||||
(when p
|
(when p
|
||||||
(erase-metadata p)))))))
|
(erase-metadata p))))))
|
||||||
|
|
||||||
|
;; ============================================================
|
||||||
|
;; VERSION INFO
|
||||||
|
|
||||||
|
(provide this-package-version
|
||||||
|
this-package-version-name
|
||||||
|
this-package-version-owner
|
||||||
|
this-package-version-maj
|
||||||
|
this-package-version-min)
|
||||||
|
|
||||||
|
(define-syntax (this-package-version stx)
|
||||||
|
(syntax-case stx ()
|
||||||
|
[(_)
|
||||||
|
#`(this-package-version/proc
|
||||||
|
#,(datum->syntax-object stx `(,#'this-expression-source-directory)))]))
|
||||||
|
|
||||||
|
(define-syntax define-getters
|
||||||
|
(syntax-rules ()
|
||||||
|
[(define-getters (name position) ...)
|
||||||
|
(begin
|
||||||
|
(define-syntax (name stx)
|
||||||
|
(syntax-case stx ()
|
||||||
|
[(name)
|
||||||
|
#`(let ([p #,(datum->syntax-object stx `(,#'this-package-version))])
|
||||||
|
(and p (position p)))]))
|
||||||
|
...)]))
|
||||||
|
|
||||||
|
(define-getters
|
||||||
|
(this-package-version-name pd->name)
|
||||||
|
(this-package-version-owner pd->owner)
|
||||||
|
(this-package-version-maj pd->maj)
|
||||||
|
(this-package-version-min pd->min))
|
||||||
|
|
||||||
|
;; ----------------------------------------
|
||||||
|
|
||||||
|
(define (this-package-version/proc srcdir)
|
||||||
|
(let* ([package-roots (get-all-planet-packages)]
|
||||||
|
[thepkg (ormap (predicate->projection (contains-dir? srcdir))
|
||||||
|
package-roots)])
|
||||||
|
(and thepkg (archive-retval->simple-retval thepkg))))
|
||||||
|
|
||||||
|
;; predicate->projection : #f \not\in X ==> (X -> boolean) -> (X -> X)
|
||||||
|
(define (predicate->projection pred) (λ (x) (if (pred x) x #f)))
|
||||||
|
|
||||||
|
;; contains-dir? : path -> pkg -> boolean
|
||||||
|
(define ((contains-dir? srcdir) alleged-superdir-pkg)
|
||||||
|
(let* ([nsrcdir (normalize-path srcdir)]
|
||||||
|
[nsuperdir (normalize-path (car alleged-superdir-pkg))]
|
||||||
|
[nsrclist (explode-path nsrcdir)]
|
||||||
|
[nsuperlist (explode-path nsuperdir)])
|
||||||
|
(list-prefix? nsuperlist nsrclist)))
|
||||||
|
|
||||||
|
(define (list-prefix? sup sub)
|
||||||
|
(let loop ([sub sub]
|
||||||
|
[sup sup])
|
||||||
|
(cond
|
||||||
|
[(null? sup) #t]
|
||||||
|
[(equal? (car sup) (car sub))
|
||||||
|
(loop (cdr sub) (cdr sup))]
|
||||||
|
[else #f])))
|
||||||
|
|
||||||
|
(define (archive-retval->simple-retval p)
|
||||||
|
(list-refs p '(1 2 4 5)))
|
||||||
|
|
||||||
|
(define-values (pd->owner pd->name pd->maj pd->min)
|
||||||
|
(apply values (map (λ (n) (λ (l) (list-ref l n))) '(0 1 2 3))))
|
||||||
|
|
||||||
|
(define (list-refs p ns)
|
||||||
|
(map (λ (n) (list-ref p n)) ns)))
|
||||||
|
|
Loading…
Reference in New Issue
Block a user