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
'(:name "elisp"
:keys nil
:dependencies ((paredit-mode . :latest))))))
:dependencies ((:name rainbow-delimiters
:version :latest))))))
(provide 'cubes/elisp)

View File

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

View File

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

View File

@ -27,7 +27,7 @@
(require 'cl-lib)
(require 'fg42/utils)
(require 'fg42/state)
(defun fg42/system-cons (system k v)
"Set the given key K to the given value V in the SYSTEM."
@ -59,7 +59,7 @@
(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))
`(defun ,name ()
(fg42/cube-compose ,@body)))

View File

@ -24,6 +24,7 @@
;; Each system has to have a `start' function to start the setup process.
;;
;;; Code:
(require 'fpkg)
(require 'fg42/system/core)
@ -35,18 +36,52 @@
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)
"Install the given dependency DEP."
(message ">>>> %s" dep))
"Install the given dependency list 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)
"Install the dependencies in the SYSTEM."
(mapcar #'fg42/system-install-dependency
(fg42/system-get system :dependencies))
(when (not (fg42/system-dependencies-installed? system))
(fg42/system-refresh-package-index system)
(mapc #'fg42/system-install-dependency
(fg42/system-get system :dependencies)))
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)
;;; dependencies.el ends here