~ chicken-core (chicken-5) a1b5f0eabcdb56b6aa64010ca7e79359dfc325db


commit a1b5f0eabcdb56b6aa64010ca7e79359dfc325db
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Jul 11 22:57:26 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Mon Jul 11 22:57:26 2011 +0200

    parse henrietta response and properly set default version

diff --git a/setup-download.scm b/setup-download.scm
index 5c03d42d..2b6fbd93 100644
--- a/setup-download.scm
+++ b/setup-download.scm
@@ -38,7 +38,8 @@
 			temporary-directory)
 
   (import scheme chicken foreign)
-  (import extras irregex posix utils srfi-1 data-structures tcp srfi-13 files setup-api)
+  (import extras irregex posix utils srfi-1 data-structures tcp srfi-13 srfi-14 files
+	  setup-api)
 
   (define-constant +default-tcp-connect-timeout+ 30000) ; 30 seconds
   (define-constant +default-tcp-read/write-timeout+ 30000) ; 30 seconds
@@ -239,9 +240,10 @@
 		     (if tests "&tests=yes" ""))]
 	      [eggdir (make-pathname tmpdir egg) ] )
 	  (unless (file-exists? eggdir) (create-directory eggdir))
-	  (http-fetch host port locn eggdir proxy-host proxy-port proxy-user-pass)
-	  ; If we get here then version of egg exists
-	  (values eggdir (or version "")) ) ) ) )
+	  (let ((fversion
+		 (http-fetch host port locn eggdir proxy-host proxy-port proxy-user-pass)))
+	    ;; If we get here then version of egg exists
+	    (values eggdir (or fversion version "")) ) ) ) ))
 
   (define (network-failure msg . args)
     (signal
@@ -329,28 +331,47 @@
 
   (define (http-retrieve-files in out dest)
     (d "reading files ...~%")
-    (let get-files ([files '()])
-      (let ([name (read in)])
-	(cond [(and (pair? name) (eq? 'error (car name)))
-	       (throw-server-error (cadr name) (cddr name))]
-	      [(or (eof-object? name) (not name))
-	       (close-input-port in)
-	       (close-output-port out)
-	       (reverse files) ]
-	      [(not (string? name))
-	       (error "invalid file name - possibly corrupt transmission" name) ]
-	      [(string-suffix? "/" name)
-	       (read in)		; skip size
-	       (d "  ~a~%" name)
-	       (create-directory (make-pathname dest name))
-	       (get-files files) ]
-	      [else
-	       (d "  ~a~%" name)
-	       (let* ([size (read in)]
-		      [_ (read-line in)]
-		      [data (read-string size in)] )
-		 (with-output-to-file (make-pathname dest name) (cut display data) ) )
-	       (get-files (cons name files)) ] ) ) ) )
+    (let ((version #f))
+      (define (skip)
+	(let ((ln (read-line in)))
+	  (cond ((or (eof-object? ln)
+		     (irregex-match " *#!eof *" ln))
+		 (open-input-string ""))
+		((irregex-match " *#\\|[- ]*([^ ]+) *\\|#.*" ln) =>
+		 (lambda (m)
+		   (let ((v (irregex-match-substring m 1)))
+		     (cond ((and version (not (string=? v version)))
+			    (warning "files-versions are not identical" ln version)
+			    (set! version #f))
+			   (else
+			    (set! version v)))
+		     (open-input-string ln))))
+		((string-every char-set:whitespace ln)
+		 (skip))
+		(else
+		 (error "unrecognized file-information - possibly corrupt transmission" 
+			ln)))))
+      (let get-files ((files '()))
+	(let ((ins (skip)))
+	  (let ((name (read ins)))
+	    (cond ((and (pair? name) (eq? 'error (car name)))
+		   (throw-server-error (cadr name) (cddr name)))
+		  ((or (eof-object? name) (not name))
+		   (close-input-port in)
+		   (close-output-port out)
+		   version)
+		  ((not (string? name))
+		   (error "invalid file name - possibly corrupt transmission" name) )
+		  ((string-suffix? "/" name)
+		   (d "  ~a~%" name)
+		   (create-directory (make-pathname dest name))
+		   (get-files files) )
+		  (else
+		   (d "  ~a~%" name)
+		   (let* ((size (read ins))
+			  (data (read-string size in)) )
+		     (with-output-to-file (make-pathname dest name) (cut display data) ) )
+		   (get-files (cons name files)) ) ) ) ) )))
 
   (define (http-fetch host port locn dest proxy-host proxy-port proxy-user-pass)
     (let-values (((in out)
Trap