Install dependencies by grabbing them from the system monad

This commit is contained in:
Sameer Rahmani 2021-01-29 02:00:52 +00:00
parent bbebc214ae
commit e59ba046b5
5 changed files with 45 additions and 14 deletions

View File

@ -35,7 +35,8 @@
system system
'(:name "elisp" '(:name "elisp"
:keys nil :keys nil
:dependencies ((paredit-mode . :latest)))))) :dependencies ((:name rainbow-delimiters
:version :latest))))))
(provide 'cubes/elisp) (provide 'cubes/elisp)

View File

@ -35,7 +35,7 @@
system system
'(:name "org" '(:name "org"
:keys nil :keys nil
:dependencies ((org-mode . :latest)))))) :dependencies ((:name org :version :latest))))))
(provide 'cubes/org) (provide 'cubes/org)

View File

@ -24,7 +24,7 @@
;; Each system has to have a `start' function to start the setup process. ;; Each system has to have a `start' function to start the setup process.
;; ;;
;;; Code: ;;; Code:
(require 'fg42/state) (require 'fg42/system/dependencies)
;;;###autoload ;;;###autoload
@ -33,15 +33,10 @@
(require 'fg42/utils) (require 'fg42/utils)
(require 'fg42/system/core) (require 'fg42/system/core)
(require 'fg42/system/dependencies) (require 'fg42/system/dependencies)
(require 'fg42/system/utils)
(debug-message "Starting the default system.")
(let ((system-map (funcall system '()))) (let ((system-map (funcall system '())))
(fg42/system-install-dependencies system-map))) (fg42/system-install-dependencies system-map)))
(provide 'fg42/system) (provide 'fg42/system)
;;; system.el ends here ;;; system.el ends here

View File

@ -27,7 +27,7 @@
(require 'cl-lib) (require 'cl-lib)
(require 'fg42/utils) (require 'fg42/utils)
(require 'fg42/state)
(defun fg42/system-cons (system k v) (defun fg42/system-cons (system k v)
"Set the given key K to the given value V in the SYSTEM." "Set the given key K to the given value V in the SYSTEM."
@ -59,7 +59,7 @@
(defmacro defsystem (name props &rest body) (defmacro defsystem (name props &rest body)
"Define a system with the given NAME, DOCSTRING and BODY." "Define a system with the given NAME, PROPS and BODY."
(declare (indent 1)) (declare (indent 1))
`(defun ,name () `(defun ,name ()
(fg42/cube-compose ,@body))) (fg42/cube-compose ,@body)))

View File

@ -24,6 +24,7 @@
;; Each system has to have a `start' function to start the setup process. ;; Each system has to have a `start' function to start the setup process.
;; ;;
;;; Code: ;;; Code:
(require 'fpkg)
(require 'fg42/system/core) (require 'fg42/system/core)
@ -35,18 +36,52 @@
system)) system))
(defun fg42/system-dependencies (system)
"Return a flat list of dependencies of the SYSTEM."
(seq-reduce
(lambda (lst pair)
(append lst (cdr pair)))
(fg42/system-get system :dependencies)
'()))
(defun fg42/system-install-dependency (dep) (defun fg42/system-install-dependency (dep)
"Install the given dependency DEP." "Install the given dependency list DEP.
(message ">>>> %s" dep)) dep is in (cube-name (...dependencies...)) format."
(message "Installing dependencies of '%s' cube..." (car dep))
(mapcar #'fpkg/install-package (cdr dep)))
(defun fg42/system-install-dependencies (system) (defun fg42/system-install-dependencies (system)
"Install the dependencies in the SYSTEM." "Install the dependencies in the SYSTEM."
(mapcar #'fg42/system-install-dependency (when (not (fg42/system-dependencies-installed? system))
(fg42/system-get system :dependencies)) (fg42/system-refresh-package-index system)
(mapc #'fg42/system-install-dependency
(fg42/system-get system :dependencies)))
system) system)
(defun fg42/system-refresh-package-index (system)
"Refresh the package index of the SYSTEM is dependencies were missing."
(unless (fg42/system-dependencies-installed? system)
;; check for new packages (package versions)
(message "Refreshing package database...")
;; TODO: call different function to update every source
;; in the system. Something similar to what we do
;; with package-install on FPKG
(fpkg/initialize system)
(package-refresh-contents)))
(defun fg42/system-dependencies-installed? (system)
"Return t if all the dependencies of the given SYSTEM are installed."
(let ((pkgs (fg42/system-dependencies system)))
(seq-reduce
(lambda (all-installed? pkg)
(and all-installed?
(fpkg/package-installed? pkg)))
pkgs
t)))
(provide 'fg42/system/dependencies) (provide 'fg42/system/dependencies)
;;; dependencies.el ends here ;;; dependencies.el ends here