~ chicken-core (chicken-5) /scripts/mini-salmonella.scm


  1;;;; mini-salmonella.scm - very simple tool to build all eggs
  2
  3
  4(module mini-salmonella ()
  5
  6(import scheme chicken)
  7(import posix file extras data-structures setup-api (chicken process))
  8
  9(define (usage code)
 10  (print "usage: mini-salmonella [-h] [-test] [-debug] [-download] [-trunk] EGGDIR [PREFIX]")
 11  (exit code) )
 12
 13(define *eggdir* #f)
 14(define *debug* #f)
 15(define *run-tests* #f)
 16(define *download* #f)
 17(define *trunk* #f)
 18
 19(define *prefix* (get-environment-variable "CHICKEN_PREFIX"))
 20
 21(let loop ((args (command-line-arguments)))
 22  (when (pair? args)
 23    (let ((arg (car args)))
 24      (cond ((string=? "-h" arg) (usage 0))
 25	    ((string=? "-test" arg) (set! *run-tests* #t))
 26	    ((string=? "-debug" arg) (set! *debug* #t))
 27	    ((string=? "-download" arg) (set! *download* #t))
 28	    ((string=? "-trunk" arg) (set! *trunk* #t))
 29	    (*eggdir* (set! *prefix* arg))
 30	    (else (set! *eggdir* arg)))
 31      (loop (cdr args)))))
 32
 33(unless *eggdir* (usage 1))
 34
 35(define-foreign-variable *binary-version* int "C_BINARY_VERSION")
 36(define *repository* (make-pathname *prefix* (conc "lib/chicken/" *binary-version*)))
 37(define *snapshot* (directory *repository*))
 38
 39(define (cleanup-repository)
 40  (for-each 
 41   (lambda (f)
 42     (let ((f2 (make-pathname *repository* f)))
 43       (cond ((member f2 *snapshot*))
 44             ((directory? f2)
 45              (remove-directory f2))
 46             (else
 47              (delete-file f2)))))
 48   (directory *repository*)))
 49
 50(define *chicken-install*
 51  (normalize-pathname (make-pathname *prefix* "bin/chicken-install")))
 52
 53(define *eggs* (directory *eggdir*))
 54
 55(define (find-newest egg)
 56  (let* ((ed (make-pathname *eggdir* egg))
 57	 (tagsdir (directory-exists? (make-pathname ed "tags")))
 58	 (trunkdir (directory-exists? (make-pathname ed "trunk"))))
 59    (cond ((and *trunk* trunkdir) trunkdir)
 60	  (tagsdir
 61	   (let ((tags (sort (directory tagsdir) version>=?)))
 62	     (if (null? tags)
 63		 (or trunkdir ed)
 64		 (make-pathname ed (string-append "tags/" (car tags))))))
 65	  (else (or trunkdir ed)))))
 66
 67(define (report egg msg . args)
 68  (printf "~a..~?~%" (make-string (max 2 (- 32 (string-length egg))) #\.)
 69	  msg args) )
 70
 71(define *errlogfile* "mini-salmonella.errors.log")
 72(define *logfile* "mini-salmonella.log")
 73(define *tmplogfile* "mini-salmonella.tmp.log")
 74
 75(on-exit (lambda () (delete-file* *tmplogfile*)))
 76
 77(define (copy-log egg file)
 78  (let ((log (with-input-from-file file read-string)))
 79    (with-output-to-file *errlogfile*
 80      (lambda ()
 81	(print #\newline egg #\:)
 82	(display log))
 83      #:append)))
 84
 85(define *failed* 0)
 86(define *succeeded* 0)
 87
 88(define (install-egg egg dir)
 89  (let ((command
 90	 (conc
 91	  *chicken-install* " -force "
 92	  (if *run-tests* "-test " "")
 93	  (if *trunk* "-trunk " "")
 94	  (if *download* 
 95	      ""
 96	      (string-append "-t local -l " (normalize-pathname *eggdir*) " "))
 97	  egg " "
 98	  (cond ((not *debug*)
 99		 (delete-file* (string-append *logfile* ".out"))
100		 (sprintf "2>~a >>~a.out" *tmplogfile* *logfile*))
101		(else "")))))
102    (when *debug*
103      (print "  " command))
104    (let ((status (system command)))
105      (cond ((zero? status)
106	     (report egg "OK")
107	     (set! *succeeded* (add1 *succeeded*)))
108	    (else
109	     (report egg "FAILED")
110	     (set! *failed* (add1 *failed*))
111	     (unless *debug* (copy-log egg *tmplogfile*)))))))
112
113(delete-file* *errlogfile*)
114(delete-file* *logfile*)
115
116(for-each
117 (lambda (egg)
118   (and-let* ((dir (find-newest egg)))
119     (if *debug*
120	 (print "\n\n######################################## " egg "\n")
121	 (print* egg))
122     (cleanup-repository)
123     (let ((meta (file-exists? (make-pathname dir egg "meta"))))
124       (if meta
125	   (let ((setup (file-exists? (make-pathname dir egg "setup"))))
126	     (if setup
127		 (install-egg egg dir)
128		 (report egg "<no .setup script>")) )
129	   (report egg "<no .meta file>")))))
130 (sort (directory *eggdir*) string<?))
131
132(print "\nSucceeded: " *succeeded* ", failed: " *failed* ", total: "
133       (+ *succeeded* *failed*))
134
135)
Trap