diff --git a/pkgs/racket-test/tests/pkg/tests-remove.rkt b/pkgs/racket-test/tests/pkg/tests-remove.rkt index 95c5bcac73..07f787058f 100644 --- a/pkgs/racket-test/tests/pkg/tests-remove.rkt +++ b/pkgs/racket-test/tests/pkg/tests-remove.rkt @@ -34,6 +34,10 @@ (shelly-install "remove test with immediately redundant package name" "test-pkgs/pkg-test1.zip" "pkg-test1 pkg-test1") + (shelly-install "remove test where second in given list does not exist" + "test-pkgs/pkg-test1.zip" + $ "raco pkg remove pkg-test1 not-there" =exit> 1 =stderr> #rx"not currently installed" + $ "racket -e '(require pkg-test1)'" =exit> 0) (shelly-install "remove of dep fails" "test-pkgs/pkg-test1.zip" $ "raco pkg show -l -u -a" =stdout> #rx"Package +Checksum +Source\npkg-test1 +[a-f0-9.]+ +\\(file .+/test-pkgs/pkg-test1.zip\"\\)\n" diff --git a/racket/collects/pkg/private/pkg-db.rkt b/racket/collects/pkg/private/pkg-db.rkt index 6cb242cd94..b36e50b3b9 100644 --- a/racket/collects/pkg/private/pkg-db.rkt +++ b/racket/collects/pkg/private/pkg-db.rkt @@ -25,7 +25,8 @@ update-auto scope->links-file installed-pkg-table - installed-pkg-names) + installed-pkg-names + pkg-not-installed) (define (read-pkg-db) (unless (pkg-lock-held) diff --git a/racket/collects/pkg/private/remove.rkt b/racket/collects/pkg/private/remove.rkt index 18b00183a8..a91278ca86 100644 --- a/racket/collects/pkg/private/remove.rkt +++ b/racket/collects/pkg/private/remove.rkt @@ -85,6 +85,13 @@ (list->set all-pkgs)) (define metadata-ns (make-metadata-namespace)) (define in-pkgs (remove-duplicates given-pkgs)) + + ;; Check that all packages are installed, so we don't remove half of + ;; them and leave things in an potentialy inconsistent state: + (for ([pkg (in-list in-pkgs)]) + (unless (set-member? all-pkgs pkg) + (pkg-not-installed pkg db))) + (define remove-pkgs (if auto? ;; compute fixpoint: