diff --git a/core/autoload/bootstrap.el b/core/autoload/bootstrap.el new file mode 100644 index 000000000..071dce510 --- /dev/null +++ b/core/autoload/bootstrap.el @@ -0,0 +1,89 @@ +;;; bootstrap.el --- for bootstrap scripts + +;; This functionality is incomplete, do not use it. + +(defvar doom-bootstrappers nil + "") + +;;;###autoload +(defun doom/bootstrap-module (module submodule) + "TODO" + (interactive + (let* ((mod (completing-read "Select module: " + (mapcar (lambda (mod) (format "%s\t%s" (car mod) (cdr mod))) + doom-modules))) + (mods (s-split "\t" mod))) + mods)) + (unless (and module submodule) + (error "Aaaa %s %s" module submodule)) + (let ((path (doom-module-path module submodule))) + ;; + (message "Bootstrapping %s %s in %s" module submodule path))) + +(defun doom--collect (rest) + (let ((forms)) + (while (not (keywordp (car rest))) + (push (pop rest) forms)) + (reverse forms))) + +;;;###autoload +(defmacro bootstrap! (name desc &rest rest) + "" + (let ((argc (length rest)) + bs-exec + bs-exec-after) + (unless (= 0 (mod argc 2)) + (error "Incorrect number of arguments for bootstrap (%s)" argc)) + (while rest + (let* ((arg (pop rest)) + (arg-name (symbol-name arg))) + (cond ((eq arg :after) + (add-to-list 'bs-exec-after (doom--collect rest) t)) + + ((string-prefix-p ":if-" arg-name) + (let ((os-name (substring arg-name (length ":if-"))) + (os-sym (intern os-name)) + (os-exec (doom--collect rest))) + (add-to-list 'bs-exec (cons os-sym os-exec) t)))))) + `(push (list ',name ,desc + (lambda () + (letf (((symbol-function 'sh) (symbol-function 'bs-sh)) + ((symbol-function 'sudo) (symbol-function 'bs-sudo)) + ((symbol-function 'repo) (symbol-function 'bs-repo))) + ,@(mapcar (lambda (f) + `(when (bs-is-os ',(car f)) + ,@(cdr os-exec))) + bs-exec) + ,@bs-exec-after))) + doom-bootstrappers))) + + +;;;###autoload +(defun bs-repo (repo-url path) + "Clone a remote version-controlled repo at REPO-URL to PATH, if it exists. +Requires the corresponding client, e.g. git for git repos, hg for mercurial, +etc.") + +;;;###autoload +(defun bs-sh (command) + "Runs a shell command and prints any output to the DOOM buffer.") + +;;;###autoload +(defun bs-sudo (command) + "Runs a shell command as admin, prompting for a password. Prints any output to +the DOOM buffer.") + +;;;###autoload +(defun bs-is-os (os) + "Rudimentary OS checking." + (let ((gnu-linux-p (eq system-type 'gnu/linux)) + (os (if (symbolp os) (symbol-name os) os))) + (pcase os + ("macos" (eq system-type 'darwin)) + ("linux" gnu-linux-p) + ("arch" (and gnu-linux-pj(f-exists-p "/etc/arch-release"))) + ("debian" (and gnu-linux-p (f-exists-p "/etc/debian_version"))) + ))) + +(provide 'bootstrap) +;;; bootstrap.el ends here