progfolio / elpaca

An elisp package manager
GNU General Public License v3.0
621 stars 30 forks source link

Suggestion: use fboundp instead of checking the version for loaddefs #6

Closed ashton314 closed 2 years ago

ashton314 commented 2 years ago

What's wrong

I'm getting the following error on init:

Debugger entered--Lisp error: (file-missing "Cannot open load file" "No such file or directory" "loaddefs-gen")
  require(loaddefs-gen)
  (and (require 'loaddefs-gen) nil)
  (or (and (version< emacs-version "29") (require 'autoload)) (and (require 'loaddefs-gen) nil))
  (let* ((autoloadp (or (and (version< emacs-version "29") (require 'autoload)) (and (require 'loaddefs-gen) nil))) (default-directory dir) (name (format "%s-autoloads.el" package)) (output (expand-file-name name dir)) (generated-autoload-file output) (autoload-timestamps nil) (backup-inhibited t) (version-control 'never) (find-file-hook nil) (write-file-functions nil) (left-margin 0)) (if autoloadp (progn (write-region (autoload-rubric output nil 'feature) nil output nil 'silent))) (cond ((fboundp 'loaddefs-generate) (loaddefs-generate (let* ((seen nil) (--cl-var-- (elpaca--directory-files-recursively dir "\\.el$")) (file nil) (d nil) (--cl-var-- nil) (--cl-var-- t)) (while (consp --cl-var--) (setq file (car --cl-var--)) (setq d (file-name-directory file)) (if (member d seen) (progn) (setq --cl-var-- ...)) (setq seen (cons d seen)) (setq --cl-var-- (cdr --cl-var--)) (setq --cl-var-- nil)) (nreverse --cl-var--)) name nil nil nil t)) ((fboundp 'make-directory-autoloads) (make-directory-autoloads dir output)) ((fboundp 'update-directory-autoloads) (with-no-warnings (update-directory-autoloads dir)))) (let* ((buf (and t (find-buffer-visiting output)))) (if buf (kill-buffer buf) nil)) name)
  elpaca-generate-autoloads("elpaca" "/Users/ashton/.emacs.d/elpaca/repos/elpaca/")
  (progn (if (= 0 (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo)) nil (error "%s" (list (save-current-buffer (set-buffer buffer) (buffer-string))))) (byte-recompile-directory elpaca-repo 0 'force) (require 'elpaca) (elpaca-generate-autoloads "elpaca" elpaca-repo) (kill-buffer buffer))
  (condition-case err (progn (if (= 0 (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo)) nil (error "%s" (list (save-current-buffer (set-buffer buffer) (buffer-string))))) (byte-recompile-directory elpaca-repo 0 'force) (require 'elpaca) (elpaca-generate-autoloads "elpaca" elpaca-repo) (kill-buffer buffer)) ((debug error) (delete-directory elpaca-directory 'recursive) (save-current-buffer (set-buffer buffer) (goto-char (point-max)) (insert (format "\n%S" err)) (display-buffer buffer))))
  (if buffer (condition-case err (progn (if (= 0 (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo)) nil (error "%s" (list (save-current-buffer (set-buffer buffer) (buffer-string))))) (byte-recompile-directory elpaca-repo 0 'force) (require 'elpaca) (elpaca-generate-autoloads "elpaca" elpaca-repo) (kill-buffer buffer)) ((debug error) (delete-directory elpaca-directory 'recursive) (save-current-buffer (set-buffer buffer) (goto-char (point-max)) (insert (format "\n%S" err)) (display-buffer buffer)))) nil)
  (let* ((elpaca-repo (and t (expand-file-name "repos/elpaca/" elpaca-directory))) (elpaca-build (and elpaca-repo (expand-file-name "builds/elpaca/" elpaca-directory))) (elpaca-target (and elpaca-build (if (file-exists-p elpaca-build) elpaca-build elpaca-repo))) (elpaca-url (and elpaca-target "https://www.github.com/progfolio/elpaca.git")) (s (and elpaca-url (add-to-list 'load-path elpaca-target))) (s (and s (not (file-exists-p elpaca-repo)))) (buffer (and s (get-buffer-create "*elpaca-bootstrap*")))) (if buffer (condition-case err (progn (if (= 0 (call-process "git" nil buffer t "clone" elpaca-url elpaca-repo)) nil (error "%s" (list (save-current-buffer ... ...)))) (byte-recompile-directory elpaca-repo 0 'force) (require 'elpaca) (elpaca-generate-autoloads "elpaca" elpaca-repo) (kill-buffer buffer)) ((debug error) (delete-directory elpaca-directory 'recursive) (save-current-buffer (set-buffer buffer) (goto-char (point-max)) (insert (format "\n%S" err)) (display-buffer buffer)))) nil))
  load-with-code-conversion("/Users/ashton/.emacs.d/init.el" "/Users/ashton/.emacs.d/init.el" t t)
  load("/Users/ashton/.emacs.d/init" noerror nomessage)
  startup--load-user-init-file(#f(compiled-function () #<bytecode 0x1550e63276dba1>) #f(compiled-function () #<bytecode -0x1f3c6feddc0eaeb5>) t)
  command-line()
  normal-top-level()

After a little digging it seems this loaddefs-gen is pretty new. I'm down to rebuild my Emacs, but it's a little friction. Would checking if the necessary functions are defined work just as well as checking the version of Emacs? Though if this is behavior that's expected to be locked-in with the first release of Emacs 29, then I can see the case for leaving this as-is.

Version information

progfolio commented 2 years ago

Thanks for the suggestion.

I'm down to rebuild my Emacs, but it's a little friction.

I can sympathize with that. It's one of the challenges of running/developing against a development version of a piece of software. I usually rebuild once a week and that's how I ended up with the short-lived function signature mentioned in #4.

I've pushed a change which will load loaddefs-gen if present, and fall back autoload. I think that should handle it. Testing appreciated.

ashton314 commented 2 years ago

I rebuilt Emacs on my personal machine (nice speedy M1 Pro) and the original worked great. I just tried with a non-rebuilt Emacs on my dumpy slow intel i9 work machine ;-) and this new version works great. Thank you!