Skip to content

Instantly share code, notes, and snippets.

@sogaiu
Last active March 1, 2024 12:57
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sogaiu/7a7ef4aca3bdd621e9c50368c7d62a23 to your computer and use it in GitHub Desktop.
Save sogaiu/7a7ef4aca3bdd621e9c50368c7d62a23 to your computer and use it in GitHub Desktop.
partially analyzed elpaca startup code
;; going to assume for concreteness that `user-emacs-directory` is "~/.emacs.d"
(defvar elpaca-installer-version 0.6)
;; "~/.emacs.d/elpaca"
(defvar elpaca-directory (expand-file-name "elpaca/" user-emacs-directory))
;; "~/.emacs.d/elpaca/builds"
(defvar elpaca-builds-directory (expand-file-name "builds/" elpaca-directory))
;; "~/.emacs.d/elpaca/repos"
(defvar elpaca-repos-directory (expand-file-name "repos/" elpaca-directory))
;; used in the `let` binding below and on the very last line
(defvar elpaca-order
'(elpaca :repo "https://github.com/progfolio/elpaca.git"
:ref nil
:files (:defaults "elpaca-test.el" (:exclude "extensions"))
:build (:not elpaca--activate-package)))
;;
(let* (;; "~/.emacs.d/elapaca/repos/elpaca"
(repo (expand-file-name "elpaca/" elpaca-repos-directory))
;; "~/.emacs.d/elpaca/builds/elpaca"
(build (expand-file-name "elpaca/" elpaca-builds-directory))
;; everything after the `elpaca` in `elpaca-order` -- i.e. `(:repo ...)`
(order (cdr elpaca-order))
(default-directory repo))
;; changing `load-path` affects where things like `require` look for code
(add-to-list 'load-path (if (file-exists-p build) build repo))
;; if the "elpaca/repos" subdirectory (of ~/.emacs.d) does not exist already...
(unless (file-exists-p repo)
;; create the "~/.emacs.d/elpaca/repos" directory
(make-directory repo t)
;; `subr-x needs to be required for emacsen with version 27 and below
(when (< emacs-major-version 28) (require 'subr-x))
;; like `condition-case` except debugging is not prevented -- `condition-case` is a bit like `try`
(condition-case-unless-debug err
(if-let (;; select the "*elpaca-bootstrap*" window, creating it if necessary
(buffer (pop-to-buffer-same-window "*elpaca-bootstrap*"))
;; git clone https://github.com/progfolio/elpaca.git
((zerop (call-process "git" nil buffer t "clone"
(plist-get order :repo) repo)))
;; git checkout
((zerop (call-process "git" nil buffer t "checkout"
(or (plist-get order :ref) "--"))))
;; construct full path to emacs
(emacs (concat invocation-directory invocation-name))
;; byte-compile
((zerop (call-process emacs nil buffer nil
"-Q" "-L" "." "--batch"
"--eval"
(concat "(byte-recompile-directory"
" \".\" 0 'force)"))))
;; require elpaca so `elpaca-*` callables become usable hereafter
((require 'elpaca))
((elpaca-generate-autoloads "elpaca" repo)))
(progn (message "%s" (buffer-string)) (kill-buffer buffer))
(error "%s" (with-current-buffer buffer (buffer-string))))
((error) (warn "%s" err) (delete-directory repo 'recursive))))
(unless (require 'elpaca-autoloads nil t)
(require 'elpaca)
(elpaca-generate-autoloads "elpaca" repo)
(load "./elpaca-autoloads")))
(add-hook 'after-init-hook #'elpaca-process-queues)
(elpaca `(,@elpaca-order))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment