el-get icon indicating copy to clipboard operation
el-get copied to clipboard

el-get-self-update => el-get can not find a recipe for package "nil".

Open dabrahams opened this issue 13 years ago • 9 comments

Debugger entered--Lisp error: (error "el-get can not find a recipe for package \"nil\".")
  signal(error ("el-get can not find a recipe for package \"nil\"."))
  error("el-get can not find a recipe for package \"%s\"." nil)
  (if filename (el-get-read-recipe-file filename) (error "el-get can not find a recipe for package \"%s\"." package))
  (let ((filename (el-get-recipe-filename package))) (if filename (el-get-read-recipe-file filename) (error "el-get can not find a recipe for package \"%s\"." package)))
  el-get-read-recipe(nil)
  (cond ((or (null source) (symbolp source)) (el-get-read-recipe package)) ((null (plist-get source :type)) (progn (let* ((def (el-get-read-recipe package)) (--cl-var-- source) (--cl-var-- nil) (prop nil) (override nil)) (while (consp --cl-var--) (setq --cl-var-- --cl-var-- prop (car (prog1 --cl-var-- ...)) override (car --cl-var--)) (plist-put def prop override) (setq --cl-var-- (cddr --cl-var--))) def))) (t source))
  (let ((source (progn (let* ((--cl-var-- el-get-sources) (src nil) (--cl-var-- t) --cl-var--) (while (and (consp --cl-var--) (progn ... ...)) (setq --cl-var-- (cdr --cl-var--))) --cl-var--)))) (cond ((or (null source) (symbolp source)) (el-get-read-recipe package)) ((null (plist-get source :type)) (progn (let* ((def (el-get-read-recipe package)) (--cl-var-- source) (--cl-var-- nil) (prop nil) (override nil)) (while (consp --cl-var--) (setq --cl-var-- --cl-var-- prop (car ...) override (car --cl-var--)) (plist-put def prop override) (setq --cl-var-- (cddr --cl-var--))) def))) (t source)))
  el-get-package-def(nil)
  (if (or (symbolp package-or-source) (stringp package-or-source)) (el-get-package-def package-or-source) package-or-source)
  (let* ((def (if (or (symbolp package-or-source) (stringp package-or-source)) (el-get-package-def package-or-source) package-or-source)) (builtin (plist-get def :builtin))) (if (and builtin (>= emacs-major-version builtin)) (quote builtin) (plist-get def :type)))
  el-get-package-method(nil)
  (let* ((source (el-get-package-def package)) (old-source (el-get-read-package-status-recipe package)) (method (el-get-package-method source)) (old-method (el-get-package-method old-source))) (not (eq method old-method)))
  el-get-update-requires-reinstall("el-get")
  (if (el-get-update-requires-reinstall package) (el-get-reinstall package) (let* ((package (el-get-as-symbol package)) (new-dependencies (remove-if (quote el-get-package-is-installed) (el-get-dependencies package))) (source (el-get-package-def package))) (if (plist-get source :checksum) (error "el-get: remove checksum from package %s to update it." package) (if new-dependencies (progn (setq el-get-next-packages new-dependencies) (add-hook (quote el-get-post-init-hooks) (quote el-get-install-next-packages)) (if el-get-update-post-dependency-fun (progn (remove-hook ... el-get-update-post-dependency-fun))) (setq el-get-update-post-dependency-fun (list (quote lambda) (quote ...) (list ... ... ... ... ...))) (add-hook (quote el-get-post-init-hooks) el-get-update-post-dependency-fun (quote append)) (el-get-install-next-packages)) (el-get-do-update package)))))
  el-get-update("el-get")
  (let ((el-get-default-process-sync t) (el-get-dir (expand-file-name ".." (file-name-directory el-get-script)))) (el-get-update "el-get"))
  el-get-self-update()
  call-interactively(el-get-self-update record nil)
  command-execute(el-get-self-update record)
  execute-extended-command(nil "el-get-self-update")
  call-interactively(execute-extended-command nil nil)

dabrahams avatar Feb 18 '13 20:02 dabrahams

Also experiencing this issue.

zwass avatar Feb 24 '13 05:02 zwass

Can't reproduce. Will try again later.

dimitri avatar Feb 24 '13 21:02 dimitri

Spent a while tracking this down today. The problem comes from changing the el-get-status-file variable after installing el-get. This means that you won't have el-get in your status file, because it will have been put in the default status file at ~/.emacs.d/el-get/.status.el. Then when you call el-get-self-update, a call is made to find the old recipe from the status file at line 740 of el-get.el (https://github.com/dimitri/el-get/blob/master/el-get.el#L740). This returns nil because it isn't found in your new status file, causing the error.

I'm not sure if there's a good solution, other than setting the el-get-status-file variable before installing el-get. Perhaps this should be noted in the documentation?

zwass avatar Feb 26 '13 00:02 zwass

Hmm. If the user changes the status file location via M-x customize, we should probably automatically move it to its new location, and note this special behavior in the documentation. Alternatively, we can decide to make this not user-customizable and require the status file to live inside el-get-dir. Thoughts?

DarwinAwardWinner avatar Feb 26 '13 00:02 DarwinAwardWinner

I want my status file in ~/.emacs.d, separate from the rest of el-get, so your first option sounds better. If you point me in the right direction, I'll take a crack at implementation.

zwass avatar Feb 26 '13 01:02 zwass

If you look at the documentation for defcustom, you'll see that it takes a keyword argument :set which defaults to the set-default function. This is the function that is called when the variable is set through the custom interface. In order to do additional stuff when the variable is changed, you should implement your own function that acts as a wrapper to set-default. That is, it should take the same arguments as set-default, and it should call set-default with those same arguments at the end and return the result. But before calling set-default, your function should implement the additional functionality required (i.e. moving the file).

Basically:

    (defun el-get--set-status-file (symbol value)
      (let ((oldvalue (eval symbol)))
        (message "Renaming el-get-status file from \"%s\" to \"%s\"." oldvalue value)
        ;; YOUR CODE HERE
      (set-default symbol value))

    (defcustom el-get-status-file
      (concat (file-name-as-directory el-get-dir) ".status.el")
      "Define where to store and read the package statuses"
      :set el-get--set-status-file)

DarwinAwardWinner avatar Feb 26 '13 01:02 DarwinAwardWinner

I also experience this problem. Not sure what this el-get-status-file thing is about. All my stuff is default as far as I'm aware (all under ~/.emacs.d).However my .status.el has: (el-get status "removed" recipe nil)

Bit weird isn't it?

Update: even scarier, my ~/.emacs.d/el-get/el-get just gone!

berenddeboer avatar Jun 14 '13 22:06 berenddeboer

@zwass do you want to implement the solution then? or maybe that's another PR I will see there after ;-)

dimitri avatar Jul 21 '13 22:07 dimitri

Had a similar issue installing from scratch on Emacs 26.3

while installing el-get: El-get can not find a recipe for package "el-get"

Shutdown Emacs, restart and the repo cloning started and install completed correctly. :/

ameuret avatar May 25 '20 06:05 ameuret