diff --git a/pkgs/distro-build/pack-and-catalog.rkt b/pkgs/distro-build/pack-and-catalog.rkt
index d13a2bc1b0..af77b8b133 100644
--- a/pkgs/distro-build/pack-and-catalog.rkt
+++ b/pkgs/distro-build/pack-and-catalog.rkt
@@ -8,12 +8,14 @@
openssl/sha1
net/url
pkg/strip
+ pkg/lib
setup/getinfo)
(define pack-dest-dir #f)
(define catalog-dirs null)
(define native? #f)
(define relative? #t)
+(define get-modules? #f)
(define checksum-dir #f)
(define src-dirs
@@ -27,6 +29,8 @@
(set! relative? #f)]
[("--at-checksum") dir "Copy each to to
/"
(set! checksum-dir dir)]
+ [("--mods") "Include modules and dependencies in catalog"
+ (set! get-modules? #t)]
#:multi
[("++catalog") catalog-dir "Write catalog entry to "
(set! catalog-dirs (cons catalog-dir catalog-dirs))]
@@ -39,6 +43,8 @@
(for ([catalog-dir (in-list catalog-dirs)])
(make-directory* catalog-dir))
+(define metadata-ns (make-base-namespace))
+
(define (stream-directory d)
(define-values (i o) (make-pipe (* 100 4096)))
(define (skip-path? p)
@@ -117,6 +123,11 @@
(define checksum-dest (if checksum-dir
(build-path checksum-dir checksum zip-file)
orig-dest))
+ (define pkg-dir (build-path src-dir pkg-name))
+ (define info (and get-modules?
+ (get-info/full pkg-dir
+ #:namespace metadata-ns
+ #:bootstrap? #t)))
(when dest-zip
(when checksum-dir
(make-directory* (build-path checksum-dir checksum))
@@ -135,7 +146,7 @@
((if relative? values path->complete-path)
(if dest-zip
checksum-dest
- (path->directory-path (build-path src-dir pkg-name)))))
+ (path->directory-path pkg-dir))))
'checksum checksum
'name (path->string pkg-name)
'author (string-join (for/list ([r (get 'pkg-authors)])
@@ -145,8 +156,17 @@
" ")
'description (get 'pkg-desc)
'tags '()
- 'dependencies '()
- 'modules '())
+ 'dependencies (if get-modules?
+ (append
+ (info 'deps (lambda () null))
+ (info 'build-deps (lambda () null)))
+ '())
+ 'modules (if get-modules?
+ (pkg-directory->module-paths
+ pkg-dir
+ (path->string pkg-name)
+ #:namespace metadata-ns)
+ '()))
o)
(newline o))))
(for ([catalog-dir (in-list catalog-dirs)])
diff --git a/pkgs/plt-services/meta/pkg-push/Makefile b/pkgs/plt-services/meta/pkg-push/Makefile
index 852d2df730..27130e5818 100644
--- a/pkgs/plt-services/meta/pkg-push/Makefile
+++ b/pkgs/plt-services/meta/pkg-push/Makefile
@@ -39,7 +39,8 @@ pull-latest-from-git:
# and a catalog in "build/archive/catalog":
PACK_ARCHIVE = --at-checksum $(PLT_TOP)/build/archive/pkgs \
--pack $(PLT_TOP)/build/archive/pre-pkgs \
- ++catalog $(PLT_TOP)/build/archive/catalog
+ ++catalog $(PLT_TOP)/build/archive/catalog \
+ --mods
archive-catalog:
rm -rf $(PLT_TOP)/build/archive/catalog
$(RACKET) -l- distro-build/pack-and-catalog --native $(PACK_ARCHIVE) $(PLT_TOP)/build/latest/native-pkgs
diff --git a/pkgs/plt-services/meta/pkg-push/push-catalog.rkt b/pkgs/plt-services/meta/pkg-push/push-catalog.rkt
index 690a330c47..95ef7afe20 100644
--- a/pkgs/plt-services/meta/pkg-push/push-catalog.rkt
+++ b/pkgs/plt-services/meta/pkg-push/push-catalog.rkt
@@ -10,6 +10,11 @@
http/head
pkg/lib)
+(define empty-source "empty.zip")
+(define empty-source-checksum "9f098dddde7f217879070816090c1e8e74d49432")
+;; Versions to map to the empty source:
+(define compatibility-versions '("5.3.4" "5.3.5" "5.3.6"))
+
(define-values (src-dir s3-hostname bucket dest-catalog)
(command-line
#:args
@@ -43,6 +48,25 @@
(hash-ref ht 'checksum)
i))))))
+;; Compute the package in the main distribution
+(define main-dist-pkgs
+ ;; A union-find would be better...
+ (let loop ([pkgs (set)] [check-pkgs (set "main-distribution")])
+ (cond
+ [(set-empty? check-pkgs) pkgs]
+ [else
+ (define a (set-first check-pkgs))
+ (define r (set-rest check-pkgs))
+ (if (set-member? pkgs a)
+ (loop pkgs r)
+ (loop (set-add pkgs a)
+ (set-union
+ r
+ (apply set (map (lambda (p) (if (pair? p) (car p) p))
+ (hash-ref (hash-ref new-pkgs a)
+ 'dependencies
+ '()))))))])))
+
(printf "Getting current S3 content...\n")
(define old-content (list->set (ls (string-append bucket "/pkgs"))))
(printf "... got it.\n")
@@ -123,6 +147,20 @@
port->bytes))
(read (open-input-bytes bs)))
+(define (add-compatibility-pkgs ht)
+ (hash-set ht 'versions
+ (for/fold ([ht2 (hash-ref ht 'versions (hash))]) ([v compatibility-versions])
+ (hash-set ht2 v (hash 'source
+ (format "http://~a.~a/pkgs/~a"
+ bucket
+ s3-hostname
+ empty-source)
+ 'checksum
+ empty-source-checksum)))))
+
+(define (add-rung-0 ht)
+ (hash-set ht 'ring 0))
+
;; ------------------------------
;; Upload current files:
@@ -137,7 +175,23 @@
(hash-ref ht 'source #f))
(equal? (hash-ref v 'checksum)
(hash-ref ht 'checksum #f)))))
- (values k v))])
+ (define (add-tag v t)
+ (define l (hash-ref v 'tags '()))
+ (if (member t l)
+ v
+ (hash-set v 'tags (cons t l))))
+ (values k (add-ring-0
+ (add-compatibility-pkgs
+ (cond
+ [(set-member? main-dist-pkgs k)
+ (add-tag v "main-distribution")]
+ [(let ([m (regexp-match #rx"^(.*)-test$" k)])
+ (and m
+ (set-member? main-dist-pkgs (cadr m))))
+ (add-tag v "main-tests")]
+ [(equal? k "racket-test")
+ (add-tag v "main-tests")]
+ [else v])))))])
(unless (zero? (hash-count changed-pkgs))
(printf "Updating catalog:\n")
(for ([k (in-hash-keys changed-pkgs)])