~ chicken-core (chicken-5) 029e0a7858f424a41a0380ef1838436d759cc17d
commit 029e0a7858f424a41a0380ef1838436d759cc17d Author: felix <felix@call-with-current-continuation.org> AuthorDate: Mon Jan 9 22:14:49 2017 +0100 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Mon Jan 9 22:14:49 2017 +0100 check installed egg-infos for files that may be overwritten diff --git a/chicken-install.scm b/chicken-install.scm index 89a87b5e..f10a25c2 100644 --- a/chicken-install.scm +++ b/chicken-install.scm @@ -515,6 +515,38 @@ tfs)))) +;; check installed eggs for already installed files + +(define (matching-installed-files egg fnames) + (let ((eggs (glob (make-pathname (repo-path) "*.egg-info")))) + (let loop ((eggs eggs) (same '())) + (cond ((null? eggs) same) + ((string=? egg (pathname-file (car eggs))) + (loop (cdr eggs) same)) + (else + (let* ((info (load-egg-info (car eggs))) + (files (assq 'installed-files info)) + (mfiles (and files + (filter (lambda (fname) + (and (not (member fname same)) + (member fname files))) + fnames)))) + (loop (cdr eggs) (append (or mfiles '()) same)))))))) + +(define (check-installed-files name info) + (let ((bad (matching-installed-files name + (cdr (assq 'installed-files info))))) + (unless (null? bad) + (flush-output) + (fprintf (current-error-port) + "\nthe extension `~a' will overwrite the following files:\n\n" name) + (for-each + (lambda (fname) + (fprintf (current-error-port) " ~a~%" fname)) + bad) + (exit 1)))) + + ;; retrieve eggs, recursively (if needed) (define (retrieve-eggs eggs) @@ -744,6 +776,7 @@ (and (not target-extension) (not host-extension))) (let-values (((build install info) (compile-egg-info info platform 'host))) + (check-installed-files name info) (let ((bscript (make-pathname dir name (build-script-extension 'host platform))) (iscript (make-pathname dir nameTrap