diff --git a/pkgs/plt-services/meta/pkg-index/official/.gitignore b/pkgs/plt-services/meta/pkg-index/official/.gitignore index cd3d01855c..ae6f4494c4 100644 --- a/pkgs/plt-services/meta/pkg-index/official/.gitignore +++ b/pkgs/plt-services/meta/pkg-index/official/.gitignore @@ -1 +1,5 @@ /root +/static/pkgs +/static/pkg +/static/pkgs-all +*json diff --git a/pkgs/plt-services/meta/pkg-index/official/common.rkt b/pkgs/plt-services/meta/pkg-index/official/common.rkt new file mode 100644 index 0000000000..8c5f70b814 --- /dev/null +++ b/pkgs/plt-services/meta/pkg-index/official/common.rkt @@ -0,0 +1,31 @@ +#lang racket/base +(require racket/file + racket/runtime-path + pkg/util + racket/string + web-server/http/id-cookie) + +(define-runtime-path src ".") + +(define-runtime-path root "root") +(make-directory* root) +(define secret-key + (make-secret-salt/file + (build-path root "secret.key"))) +(define users-path (build-path root "users")) +(make-directory* users-path) +(define users.new-path (build-path root "users.new")) +(make-directory* users.new-path) + +(github-client_id (file->string (build-path root "client_id"))) +(github-client_secret (file->string (build-path root "client_secret"))) + +(define pkgs-path (build-path root "pkgs")) +(make-directory* pkgs-path) + +(define static-path (build-path src "static")) + +(define (author->list as) + (string-split as)) + +(provide (all-defined-out)) diff --git a/pkgs/plt-services/meta/pkg-index/official/main.rkt b/pkgs/plt-services/meta/pkg-index/official/main.rkt index 55ad024f9a..1203290f0f 100644 --- a/pkgs/plt-services/meta/pkg-index/official/main.rkt +++ b/pkgs/plt-services/meta/pkg-index/official/main.rkt @@ -2,6 +2,7 @@ (module+ test (require rackunit)) (require web-server/http + "common.rkt" web-server/servlet-env racket/file xml @@ -38,24 +39,6 @@ (define (salty str) (sha1 (open-input-string str))) -(define-runtime-path src ".") - -(define-runtime-path root "root") -(make-directory* root) -(define secret-key - (make-secret-salt/file - (build-path root "secret.key"))) -(define users-path (build-path root "users")) -(make-directory* users-path) -(define users.new-path (build-path root "users.new")) -(make-directory* users.new-path) - -(github-client_id (file->string (build-path root "client_id"))) -(github-client_secret (file->string (build-path root "client_secret"))) - -(define pkgs-path (build-path root "pkgs")) -(make-directory* pkgs-path) - (define id-cookie-name "pnrid") ;; XXX Add a caching system @@ -159,9 +142,6 @@ new-v])) #f))) -(define (author->list as) - (string-split as)) - (define (page/rss req) (define ps (sort (map package-info (package-list)) @@ -1132,7 +1112,7 @@ #:ssl-cert (build-path root "server-cert.pem") #:ssl-key (build-path root "private-key.pem") #:extra-files-paths - (list (build-path src "static")) + (list static-path) #:servlet-regexp #rx"" #:port port)) diff --git a/pkgs/plt-services/meta/pkg-index/official/static.rkt b/pkgs/plt-services/meta/pkg-index/official/static.rkt new file mode 100644 index 0000000000..0e70592971 --- /dev/null +++ b/pkgs/plt-services/meta/pkg-index/official/static.rkt @@ -0,0 +1,75 @@ +#lang racket/base +(require web-server/http + racket/file + racket/match + json + net/url + racket/list + racket/path + racket/promise + meta/pkg-index/basic/main) + +(define convert-to-json + (match-lambda + [(? list? l) + (map convert-to-json l)] + [(? string? s) + s] + [(? hash? ht) + (for/hash ([(k v) (in-hash ht)]) + (values (convert-to-json-key k) + (convert-to-json v)))] + [(? number? n) + n] + [#f + #f] + [(? symbol? s) + (symbol->string s)] + [(? keyword? s) + (hasheq 'kw (keyword->string s))] + [x + (error 'convert-to-json "~e" x)])) +(define convert-to-json-key + (match-lambda + [(? string? s) + (string->symbol s)] + [(? symbol? s) + s] + [x + (error 'convert-to-json-key "~e" x)])) + +(module+ main + (require "common.rkt") + + (define pkg-list + (map path->string (directory-list pkgs-path))) + + (define dispatch + (pkg-index/basic + (λ () pkg-list) + (λ (pkg-name) + (define ht (file->value (build-path pkgs-path pkg-name))) + (hash-set* ht + 'name pkg-name + 'tags (hash-ref ht 'tags empty) + 'authors (author->list (hash-ref ht 'author "")))))) + + (define (url->request u) + (make-request #"GET" (string->url u) empty + (delay empty) #f "1.2.3.4" 80 "4.3.2.1")) + + (define (cache url file) + (define p (build-path static-path file)) + (make-directory* (path-only p)) + (with-output-to-file p + #:exists 'replace + (λ () ((response-output (dispatch (url->request url))) (current-output-port)))) + (with-output-to-file (path-add-suffix p #".json") + #:exists 'replace + (λ () (write-json (convert-to-json (file->value p))))) + (void)) + + (cache "/pkgs" "pkgs") + (cache "/pkgs-all" "pkgs-all") + (for ([p (in-list pkg-list)]) + (cache (format "/pkg/~a" p) (format "pkg/~a" p)))) diff --git a/pkgs/plt-services/meta/pkg-index/official/static/index.html b/pkgs/plt-services/meta/pkg-index/official/static/index.html new file mode 100644 index 0000000000..18fdb9b081 --- /dev/null +++ b/pkgs/plt-services/meta/pkg-index/official/static/index.html @@ -0,0 +1,39 @@ + + +
+Package | +Authors | +Description | +Tags | +
---|