diff --git a/collects/repo-time-stamp/.gitattributes b/collects/repo-time-stamp/.gitattributes new file mode 100644 index 0000000000..9cdb23de2e --- /dev/null +++ b/collects/repo-time-stamp/.gitattributes @@ -0,0 +1 @@ +/stamp.rkt ident export-subst diff --git a/collects/repo-time-stamp/stamp.rkt b/collects/repo-time-stamp/stamp.rkt index 7512066c3a..d39cb78600 100644 --- a/collects/repo-time-stamp/stamp.rkt +++ b/collects/repo-time-stamp/stamp.rkt @@ -1 +1,38 @@ -#lang scheme/base (provide stamp) (define stamp "17apr2010") +#lang racket/base + +(provide stamp) + +(define archive-id "$Format:%ct|%h|a$") +;; when exported through `git archive', the above becomes something like +;; "1273562690|cabd414|a" + +(require racket/system racket/runtime-path) + +(define-runtime-path this "stamp.rkt") + +(define stamp + (let ([rx:secs+id #rx"^([0-9]+)\\|([0-9a-f]+)\\|(.*?)[ \r\n]*$"]) + (for*/or ([x (list + ;; info from an archive (incl. nightly builds) + (lambda () archive-id) + ;; try to run git to get the current info + (lambda () + (let ([exe (or (find-executable-path "git") + (find-executable-path "git.exe"))]) + (and exe + (let ([out (open-output-string)]) + (parameterize ([current-output-port out]) + (system* exe "log" "-1" + "--pretty=format:%ct|%h|g") + (get-output-string out)))))) + ;; fallback: get the date of this file, no id + (lambda () + (format "~a|0|f" + (file-or-directory-modify-seconds this))))]) + (let* ([x (x)] + [m (and (string? x) (regexp-match rx:secs+id x))] + [d (and m (seconds->date (string->number (cadr m))))]) + (define (pad02 f) (let ([n (f d)]) (if (< n 10) (format "0~a" n) n))) + (and d (apply format "~a-~a-~a(~a/~a)" + (date-year d) (pad02 date-month) (pad02 date-day) + (cddr m)))))))