Arroyo can construct a configuration for nix-community/home-manager
from any number of org-roam files using
the Arroyo System Cache and Org Babel. There is a colloquial
"nixlib" directory, currently file:~/org/cce/nixlib which all NixOS files are
relative to. By adding a keyword #+ARROYO_HOME_MODULE: hm/import-file.nix
and
then tangling to e.g. ~/org/cce/nixlib/hm/import-file.nix
you can
generate a modular home-manager
configuration.
"ARROYO_HOME_EPKGS" used in emacs generator
'arroyo-db-keywords "ARROYO_HOME_MODULE" nil #'equal)
(add-to-list 'arroyo-db-keywords "CCE_HOME_MODULE" nil #'equal)
(add-to-list 'arroyo-db--schemata
(add-to-list
'(home-manager
[(file :not-null);(file-hash :not-null)
(home-module :not-null) role]))
defun arroyo-home-manager-update-db (&optional keywords-too)
("P")
(interactive when keywords-too
(
(arroyo-db-update-all-roam-files))if (org-roam-file-p)
(= file $s1)]
(arroyo-db-query [:delete :from home_manager :where (
(buffer-file-name))
(arroyo-db-query [:delete :from home_manager]))
(when-let* ((argsif (org-roam-file-p)
(list [:select [file value] :from keywords
(keyword $v1) :and (= file $s2)]
:where (in vector "ARROYO_HOME_MODULE" "CCE_HOME_MODULE")
(
(buffer-file-name))list [:select [file value] :from keywords
(keyword $v1)]
:where (in vector "ARROYO_HOME_MODULE" "CCE_HOME_MODULE"))))
(apply #'arroyo-db-query args))
(results (;; attach role
(results (-map (pcase-lambda (`(,file ,value))list file value (arroyo-db-get "ARROYO_NIXOS_ROLE" file)))
(
results)))
(arroyo-db-query [:insert :into home-manager :values $v1]lambda (result) (apply #'vector result))
(-map (
results))))'arroyo-db-update-functions #'arroyo-home-manager-update-db) (add-to-list
arroyo-home-manager-imports
returns a
string suitable for import
'ing in home-manager's literate
helpers.
defun arroyo-home-manager-imports1 ()
(
(->> [:select [home-module file] :from home-manager]
(arroyo-db-query)))
defun arroyo-home-manager-imports (&optional role)
(
(if-let* ((imports (arroyo-home-manager-imports1))not role)))
(no-role? (
(->> imports#'car)
(-map #'s-less?)
(-sort "\n"))
(s-join progn
(let* ((all-files (-map #'cadr imports))
(#'car (arroyo-db-query [:select file :from home-manager :where (like role $r1)] (format "%%%s%%" role))))
(role-only-files (-map "ARROYO_NIXOS_EXCLUDE" role))
(exclude-these-files (arroyo-db-by-keyword ;; also need to exclude things whose ARROYO_NIXOS_ROLE is not `role'!
(not-my-role-files#'car
(-map
(arroyo-db-query [:select file :from home-manager
:where (!= role $s1)]list role))))
(;; combine all those lists in to a single authoritative list.
(amalgamated-files
(-union role-only-files
(->> all-files
(--remove (-contains? exclude-these-files it))
(--remove (-contains? not-my-role-files it)))));; make them relative to org-roam-directory for the module orderer
(rel-files (--map (file-relative-name it org-roam-directory) amalgamated-files)));; filter imports
(->> rel-files
(arroyo-utils-order-modules)lambda (file)
(-map (caar (arroyo-db-query [:select home-module :from home-manager
(= file $s1)]
:where (
(expand-file-name file org-roam-directory)))))#'identity)
(-filter #'s-less?)))))) (-sort
provide 'arroyo-home-manager) (