emacs-eldev / eldev

Elisp development tool
https://emacs-eldev.github.io/eldev/
GNU General Public License v3.0
227 stars 17 forks source link

eldev upgrade-self fail #10

Closed tsuu32 closed 4 years ago

tsuu32 commented 4 years ago

Thanks for the Eldev which is very nice tool. I got an error when running eldev upgrade-self.

log:

$ eldev -dtT upgrade-self
[00:00.005]  Started up on Thu Mar 12 20:35:21 2020
[00:00.005]  Running on GNU Emacs 26.3 (build 1, x86_64-apple-darwin18.7.0, Carbon Version 158 AppKit 1671.6)
              of 2019-11-28
[00:00.005]  Project directory: ‘/Users/masahiro/Codes/emacs_lisp/auctex-cluttex/’
[00:00.006]  No file ‘/Users/masahiro/.eldev/config’, not applying user-specific configuration
[00:00.006]  Loading file ‘Eldev’...
[00:00.006]  Using package archive ‘gnu’ at ‘https://elpa.gnu.org/packages/’ with priority 300
[00:00.007]  Using package archive ‘melpa-stable’ at ‘https://stable.melpa.org/packages/’ with priority 200
[00:00.007]  No file ‘Eldev-local’, not customizing build
[00:00.007]  Executing command ‘upgrade-self’...

[00:00.025]  Debugger entered--Lisp error: (wrong-type-argument stringp eldev--resolve-package-archive)
               expand-file-name(eldev--resolve-package-archive "/Users/masahiro/.eldev/26.3/bootstrap/archives")
               eldev--fetch-archive-contents(t)
               eldev--install-or-upgrade-dependencies(eldev nil t nil nil t)
               eldev-upgrade-self()
               apply(eldev-upgrade-self nil)
               eldev-cli(("-dtT" "upgrade-self"))
               (kill-emacs (eldev-cli (append (cdr (member "--" command-line-args)) nil)))
               eval((kill-emacs (eldev-cli (append (cdr (member "--" command-line-args)) nil))))
               command-line-1(("--execute" "(let ((eldev--emacs-version (format \"%s.%s\" emacs-major-version emacs-minor-version))\n      (eldev--dir           (getenv \"ELDEV_DIR\"))\n      ;; This is intentional.  First, this is in case ELDEV_LOCAL is\n      ;; defined, second, this is just Eldev default for packages.\n      (load-prefer-newer    t))\n  ;; Setting `debug-on-error' would be useful, but it can break many\n  ;; `package-*' functions, since those use `with-demoted-errors' and\n  ;; so `condition-case-unless-debug'.\n  (unless (and (fboundp 'version<=) (version<= \"24.1\" eldev--emacs-version))\n    (error \"Eldev requires Emacs 24.1 or newer\"))\n  (setf package-user-dir       (expand-file-name \"bootstrap\" (expand-file-name eldev--emacs-version (if (= (length eldev--dir) 0) \"~/.eldev\" eldev--dir)))\n        package-directory-list nil\n        package-archives       nil)\n  (require 'package)\n  (package-initialize t)\n  (let ((package-archives '((\"melpa-stable\" . \"http://stable.melpa.org/packages/\")))\n        (archive-name      \"Melpa stable\")\n        (inhibit-message  t)\n        (eldev-local      (getenv \"ELDEV_LOCAL\"))\n        eldev-pkg\n        requirements)\n    (unless (= (length eldev-local) 0)\n      (if (string-prefix-p \":pa:\" eldev-local)\n          (setf package-archives `((\"bootstrap-pa\" . ,(file-name-as-directory (substring eldev-local (length \":pa:\")))))\n                archive-name     \"a local package archive\")\n        (with-temp-buffer\n          (insert-file-contents-literally (expand-file-name \"eldev.el\" eldev-local))\n          (setf eldev-pkg                    (package-buffer-info)\n                (package-desc-dir eldev-pkg) (expand-file-name eldev-local))\n          ;; Currently Eldev has no external dependencies, but let's be generic.\n          (dolist (requirement (package-desc-reqs eldev-pkg))\n            (unless (package-activate (car requirement))\n              (push requirement requirements))))))\n    (when (if eldev-pkg\n              requirements\n            (not (package-activate 'eldev)))\n      (let ((inhibit-message nil))\n        (message \"Bootstrapping Eldev for Emacs %s from %s...\\n\" eldev--emacs-version archive-name)\n        (when eldev-pkg\n          (message \"Eldev package itself will be used from `%s'\\n\" eldev-local)))\n      (package-refresh-contents)\n      (if eldev-pkg\n          (package-download-transaction (package-compute-transaction nil requirements))\n        (package-install 'eldev)))\n    (when eldev-pkg\n      (push `(eldev . (,eldev-pkg)) package-alist)\n      ;; `package--autoloads-file-name' is package-private.\n      (let* ((autoloads-file     (expand-file-name (format \"%s-autoloads\" (package-desc-name eldev-pkg))\n                                                   (package-desc-dir eldev-pkg)))\n             (autoloads-disabler (lambda (do-load file &rest args) (unless (equal file autoloads-file) (apply do-load file args)))))\n        (advice-add #'load :around autoloads-disabler)\n        (package-activate-1 eldev-pkg)\n        (advice-remove #'load autoloads-disabler))))\n  (require 'eldev)\n  (eldev-start-up))" "--execute" "(kill-emacs (eldev-cli (append (cdr (member \"--\" command-line-args)) nil)))" "--" "-dtT" "upgrade-self"))
               command-line()
               normal-top-level()

I think this is a bug in eldev--install-or-upgrade-dependencies.

        (setf package-archives `(,(if eldev--upgrade-self-from-forced-pa
                                      `("bootstrap-pa" . ,(file-name-as-directory eldev--upgrade-self-from-forced-pa))
-                                    `(eldev--resolve-package-archive (if eldev-upgrade-self-from-stable 'melpa-stable 'melpa-unstable))))
+                                    (eldev--resolve-package-archive (if eldev-upgrade-self-from-stable 'melpa-stable 'melpa-unstable))))
doublep commented 4 years ago

Thank you for the spot-on analysis, I applied the patch to master, will be available in 0.3. Of course you still cannot upgrade Eldev with the recommended procedure, but at least starting with the next version it will be possible. Meanwhile, you can e.g. rm -rf ~/.eldev/2* and let Eldev bootstrap itself anew, thus using the latest available version.

I also noticed that upgrade-self didn't work when invoked from a random directory (e.g. home) with no Elisp package. This is now also fixed.