From b1962898dac4c89c58db066f598b656ba42f8807 Mon Sep 17 00:00:00 2001 From: Stefan Kangas Date: Sun, 15 Sep 2019 01:49:37 +0200 Subject: [PATCH] Prompt to delete duplicate package directory on install * lisp/emacs-lisp/package.el (package-unpack): Prompt to delete package directory if it already exists. (Bug#7756) * test/lisp/emacs-lisp/package-tests.el (package-test-install-multi-file/pkg-dir-already-exists): New test case for installation when package directory already exists. (with-package-test): Support above test case. --- lisp/emacs-lisp/package.el | 6 +++++- test/lisp/emacs-lisp/package-tests.el | 12 +++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index ef0c5171de..2ac07bc055 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -888,7 +888,11 @@ package-unpack (if (> (length file-list) 1) 'tar 'single)))) ('tar (make-directory package-user-dir t) - ;; FIXME: should we delete PKG-DIR if it exists? + (when (and (file-directory-p pkg-dir) + (yes-or-no-p + (format "Package directory already exists: `%s'. Delete it?" + (directory-file-name pkg-dir)))) + (delete-directory pkg-dir 'recursive)) (let* ((default-directory (file-name-as-directory package-user-dir))) (package-untar-buffer dirname))) ('single diff --git a/test/lisp/emacs-lisp/package-tests.el b/test/lisp/emacs-lisp/package-tests.el index c757bccf67..ffe04e8fe7 100644 --- a/test/lisp/emacs-lisp/package-tests.el +++ b/test/lisp/emacs-lisp/package-tests.el @@ -109,7 +109,8 @@ with-package-test install location update-news - upload-base) + upload-base + create-directory) &rest body) "Set up temporary locations and variables for testing." (declare (indent 1) (debug (([&rest form]) body))) @@ -138,6 +139,9 @@ with-package-test ,(if basedir `(cd ,basedir)) (unless (file-directory-p package-user-dir) (mkdir package-user-dir)) + ,(if create-directory + `(make-directory (expand-file-name ,create-directory + package-test-user-dir) t)) (cl-letf (((symbol-function 'yes-or-no-p) (lambda (&rest r) t)) ((symbol-function 'y-or-n-p) (lambda (&rest r) t))) ,@(when install @@ -344,6 +348,12 @@ package-test-install-multifile (goto-char (point-min)) (should (re-search-forward re nil t))))))) +(ert-deftest package-test-install-multi-file/pkg-dir-already-exists () + "Install multi-file package over already existing directory." + (with-package-test (:basedir "package-resources" :install '(multi-file) + :create-directory "multi-file-0.2.3") + (should (package-installed-p 'multi-file)))) + (ert-deftest package-test-update-listing () "Ensure installed package status is updated." (with-package-test () -- 2.20.1