From e59ba046b5c8f01fb8195c32a327b4d20f323492 Mon Sep 17 00:00:00 2001 From: Sameer Rahmani Date: Fri, 29 Jan 2021 02:00:52 +0000 Subject: [PATCH] Install dependencies by grabbing them from the system monad --- core/cubes/elisp.el | 3 ++- core/cubes/org.el | 2 +- core/fg42/system.el | 7 +----- core/fg42/system/core.el | 4 +-- core/fg42/system/dependencies.el | 43 +++++++++++++++++++++++++++++--- 5 files changed, 45 insertions(+), 14 deletions(-) diff --git a/core/cubes/elisp.el b/core/cubes/elisp.el index 9660db9..08fd590 100644 --- a/core/cubes/elisp.el +++ b/core/cubes/elisp.el @@ -35,7 +35,8 @@ system '(:name "elisp" :keys nil - :dependencies ((paredit-mode . :latest)))))) + :dependencies ((:name rainbow-delimiters + :version :latest)))))) (provide 'cubes/elisp) diff --git a/core/cubes/org.el b/core/cubes/org.el index e4a60a5..76e5689 100644 --- a/core/cubes/org.el +++ b/core/cubes/org.el @@ -35,7 +35,7 @@ system '(:name "org" :keys nil - :dependencies ((org-mode . :latest)))))) + :dependencies ((:name org :version :latest)))))) (provide 'cubes/org) diff --git a/core/fg42/system.el b/core/fg42/system.el index e02de27..3f50269 100644 --- a/core/fg42/system.el +++ b/core/fg42/system.el @@ -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 diff --git a/core/fg42/system/core.el b/core/fg42/system/core.el index ef7455f..da55d01 100644 --- a/core/fg42/system/core.el +++ b/core/fg42/system/core.el @@ -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))) diff --git a/core/fg42/system/dependencies.el b/core/fg42/system/dependencies.el index 9164613..2a3c183 100644 --- a/core/fg42/system/dependencies.el +++ b/core/fg42/system/dependencies.el @@ -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