changelog shortlog graph tags branches files raw help

Mercurial > core / changeset: homer fixups

changeset 342: 254cca648492
parent 341: ce1c1743c85f
child 343: 56826abc2d56
author: Richard Westhaver <ellis@rwest.io>
date: Mon, 13 May 2024 21:10:33 -0400
files: lisp/bin/bin.asd lisp/bin/homer.lisp lisp/bin/skel.lisp lisp/lib/krypt/krypt.asd lisp/lib/skel/core/err.lisp lisp/lib/skel/core/obj.lisp lisp/lib/skel/pkg.lisp lisp/std/file.lisp lisp/std/pkg.lisp skelfile
description: homer fixups
     1.1--- a/lisp/bin/bin.asd	Mon May 13 18:40:39 2024 -0400
     1.2+++ b/lisp/bin/bin.asd	Mon May 13 21:10:33 2024 -0400
     1.3@@ -17,7 +17,7 @@
     1.4   :build-pathname "homer"
     1.5   :entry-point "bin/homer::main"
     1.6   :depends-on (:uiop :cl-ppcre :std :cli
     1.7-               :organ :skel :nlp :rdb :packy)
     1.8+               :organ :skel :nlp :rdb :packy :krypt)
     1.9   :components ((:file "homer"))
    1.10   :in-order-to ((test-op (test-op "app/tests")))
    1.11   :perform (test-op (o c) (symbol-call :rt :do-tests :app)))
     2.1--- a/lisp/bin/homer.lisp	Mon May 13 18:40:39 2024 -0400
     2.2+++ b/lisp/bin/homer.lisp	Mon May 13 21:10:33 2024 -0400
     2.3@@ -3,26 +3,29 @@
     2.4 ;;; Code:
     2.5 (defpackage :bin/homer
     2.6   (:nicknames :homer)
     2.7-  (:use :cl :std :log :sxp :rdb :skel :packy :cli :obj/id)
     2.8+  (:use :cl :std :log :sxp :rdb :skel :packy :cli :obj/id :krypt :vc)
     2.9   (:export :main :home-config))
    2.10 
    2.11 (in-package :bin/homer)
    2.12 (defvar *user* (sb-posix:getenv "USER"))
    2.13 (defvar *user-homedir* (user-homedir-pathname))
    2.14 (defvar *default-user-homerc* (merge-pathnames ".homerc" *user-homedir*))
    2.15+(declaim (type home-config *home-config*))
    2.16+(defvar *home-config*)
    2.17 
    2.18 (defclass home-config (sxp id)
    2.19   ((user :initform *user* :initarg :user :type string)
    2.20    (path :initform nil :initarg :path :type (or pathname null))
    2.21+   (src ::initform nil :initarg :src :type (or null pathname vc-repo))
    2.22    (skel :initform (load-user-skelrc) :initarg :skel :type (or pathname sk-user-config))
    2.23-   (krypt :initarg :krypt)
    2.24+   (krypt :initform (load-kryptrc) :initarg :krypt :type (or pathname krypt-config))
    2.25    (packy :initarg :packy :type (or pathname pk-user-config))
    2.26-   (mail :initarg :mail)
    2.27+   (mail :initarg :mail :type pathname)
    2.28    (shell :initarg :shell :type (or pathname shell-user-config))
    2.29    (editor :initarg :editor :type (or pathname editor-user-config))
    2.30    (wm :initarg :wm :type (or pathname wm-user-config))
    2.31-   (browser :initarg :browser :type (or pathname browser-user-config))
    2.32-   (paths :initarg :paths :type list)))
    2.33+   (browser :initarg :browser :type (or pathname browser-user-config))))
    2.34+
    2.35 
    2.36 (defmethod print-object ((self home-config) stream)
    2.37   (print-unreadable-object (self stream :type t)
    2.38@@ -37,8 +40,8 @@
    2.39         ;; ast is valid, modify object, set ast nil
    2.40         (progn
    2.41           (sb-int:doplist (k v) ast
    2.42-            (when-let ((s (find-homer-symbol k)))
    2.43-              (setf (slot-value self s) v))) ;; needs to be correct package
    2.44+            (when-let ((s (find-homer-symbol k))) ;; needs to be correct package
    2.45+              (setf (slot-value self s) v)))
    2.46           (setf (ast self) nil)
    2.47           self)
    2.48         ;; invalid ast, signal error
    2.49@@ -56,14 +59,35 @@
    2.50 (defun load-homerc (&optional (file *default-user-homerc*))
    2.51   "Load a homerc configuration from FILE. Defaults to ~/.homerc."
    2.52   (let ((form (file-read-forms file)))
    2.53-    (load-ast (make-instance 'home-config :ast form :path file :id (sxhash form)))))
    2.54+    (setq *home-config* (load-ast (make-instance 'home-config :ast form :path file :id (sxhash form))))
    2.55+    (with-slots (src) *home-config*
    2.56+      (if src
    2.57+          (setf src (pathname src))
    2.58+          (setf src (pathname (sb-posix:getenv "HOMER")))))))
    2.59 
    2.60+;;; CLI
    2.61 (defopt homer-help (print-help $cli))
    2.62 (defopt homer-version (print-version $cli))
    2.63 (defopt homer-log-level (when $val (setq *log-level* :debug)))
    2.64 
    2.65 (defcmd homer-show
    2.66-  (describe (load-homerc)))
    2.67+  (describe *home-config*))
    2.68+
    2.69+(defun compare-to-home (src)
    2.70+  "Compare a SRC path to what is stored in the user's home. Return a cons with
    2.71+the last modified timestamp of each file (SRC . HOME) or NIL."
    2.72+  (info! src))
    2.73+
    2.74+(defcmd homer-check
    2.75+  (let ((cfg *home-config*))
    2.76+    (with-slots (src) cfg
    2.77+      (if-let ((src (probe-file src)))
    2.78+        (mapcar #'compare-to-home (std/file:find-files src (push "readme.org" *hidden-paths*)))
    2.79+        (error 'file-error :pathname src)))))
    2.80+
    2.81+(defcmd homer-push)
    2.82+(defcmd homer-pull)
    2.83+(defcmd homer-clean)
    2.84 
    2.85 (define-cli $cli
    2.86   :name "homer"
    2.87@@ -75,11 +99,13 @@
    2.88           (:name "help" :global t :description "print help" :thunk homer-help)
    2.89           (:name "version" :global t :description "print version" :thunk homer-version))
    2.90   :cmds (make-cmds
    2.91-          (:name show :thunk homer-show)))
    2.92+          (:name show :thunk homer-show)
    2.93+          (:name check :thunk homer-check)))
    2.94 
    2.95 (defun run ()
    2.96   (let ((*log-level* :info))
    2.97     (with-cli (opts cmds args) $cli
    2.98+      (load-homerc)
    2.99       (do-cmd $cli)
   2.100       (debug-opts $cli))))
   2.101 
     3.1--- a/lisp/bin/skel.lisp	Mon May 13 18:40:39 2024 -0400
     3.2+++ b/lisp/bin/skel.lisp	Mon May 13 21:10:33 2024 -0400
     3.3@@ -71,8 +71,8 @@
     3.4               (finish-output))))
     3.5     (t (skel-error "unknown VC type"))))
     3.6 
     3.7-(defun skc-show-case (sel)
     3.8-  (std/string:string-case (sel :default (skel-error))
     3.9+(defun sk-slot-case (sel)
    3.10+  (std/string:string-case (sel :default (skel-error "invalid slot"))
    3.11     (":id" (std:format-sxhash (obj/id:id *skel-project*)))
    3.12     (":name" (sk-name *skel-project*))
    3.13     (":author" (sk-author *skel-project*))
    3.14@@ -85,6 +85,8 @@
    3.15     (":scripts" (sk-scripts *skel-project*))
    3.16     (":snippets" (sk-snippets *skel-project*))
    3.17     (":rules" (sk-rules *skel-project*))
    3.18+    (":env" (sk-env *skel-project*))
    3.19+    (":vars" (sk-vars *skel-project*))
    3.20     (":imports" (sk-imports *skel-project*))
    3.21     (":stash" (sk-stash *skel-project*))
    3.22     (":store" (sk-store *skel-project*))
    3.23@@ -94,7 +96,7 @@
    3.24 
    3.25 (defcmd skc-show
    3.26   (if $args 
    3.27-      (mapc (lambda (x) (when-let ((ret (skc-show-case x))) (println ret))) $args)
    3.28+      (mapc (lambda (x) (when-let ((ret (sk-slot-case x))) (println ret))) $args)
    3.29       (describe (if (boundp '*skel-project*) *skel-project*
    3.30                     (if (boundp '*skel-user-config*) *skel-user-config*
    3.31                         (if (boundp '*skel-system-config*) *skel-system-config*
     4.1--- a/lisp/lib/krypt/krypt.asd	Mon May 13 18:40:39 2024 -0400
     4.2+++ b/lisp/lib/krypt/krypt.asd	Mon May 13 21:10:33 2024 -0400
     4.3@@ -2,12 +2,12 @@
     4.4   :version "0.1.0"
     4.5   :maintainer "ellis <ellis@rwest.io>"
     4.6   :bug-tracker "https://vc.compiler.company/comp/core/issues"
     4.7-  :depends-on (:std :log :obj :dat :rdb)
     4.8+  :depends-on (:std :log :obj :dat :rdb :cry)
     4.9   :serial t
    4.10   :components ((:file "pkg")
    4.11                (:file "err")
    4.12                (:file "krypt"))
    4.13-  :in-order-to ((test-op (test-op :cry/tests))))
    4.14+  :in-order-to ((test-op (test-op :krypt/tests))))
    4.15 
    4.16 (defsystem :krypt/tests
    4.17   :depends-on (:rt :krypt)
     5.1--- a/lisp/lib/skel/core/err.lisp	Mon May 13 18:40:39 2024 -0400
     5.2+++ b/lisp/lib/skel/core/err.lisp	Mon May 13 21:10:33 2024 -0400
     5.3@@ -1,7 +1,7 @@
     5.4 ;;; Conditions
     5.5 (in-package :skel/core)
     5.6-
     5.7-(define-condition skel-error (std-error) ())
     5.8+(eval-always
     5.9+  (deferror skel-error (std-error) () (:auto t)))
    5.10 
    5.11 (deferror skel-syntax-error (sxp-syntax-error) () (:auto t))
    5.12 (deferror skel-fmt-error (sxp-fmt-error) () (:auto t))
     6.1--- a/lisp/lib/skel/core/obj.lisp	Mon May 13 18:40:39 2024 -0400
     6.2+++ b/lisp/lib/skel/core/obj.lisp	Mon May 13 21:10:33 2024 -0400
     6.3@@ -141,7 +141,7 @@
     6.4   (print-unreadable-object (self stream :type t)
     6.5     (format stream "~A" (sk-rule-target self))
     6.6     (when-let ((source (sk-rule-source self)))
     6.7-              (format stream " :source ~A" source))))
     6.8+      (format stream " :source ~A" source))))
     6.9 
    6.10 ;; Note that SK-RUN directly on a rule currently does NOT touch the sources.
    6.11 (defmethod sk-run ((self sk-rule))
    6.12@@ -392,6 +392,8 @@
    6.13          :initform (make-array 0 :element-type 'sk-document :adjustable t)
    6.14          :accessor sk-docs :type (vector sk-document))
    6.15    (components :initarg :components :initform nil :accessor sk-components :type list)
    6.16+   (vars :initarg :vars :initform nil :accessor sk-vars :type list)
    6.17+   (env :initarg :env :initform nil :accessor sk-env :type list)
    6.18    (scripts :initarg :scripts
    6.19             :initform (make-array 0 :element-type 'sk-script :adjustable t)
    6.20             :accessor sk-scripts
    6.21@@ -437,6 +439,20 @@
    6.22             (setf (sk-docs self) (map 'vector (lambda (d) (apply #'make-sk-document d)) docs)))
    6.23           (when-let ((scripts (sk-scripts self)))
    6.24             (setf (sk-scripts self) (map 'vector #'make-sk-script scripts)))
    6.25+          (when-let ((env (sk-env self)))
    6.26+            (setf (sk-env self) (mapcar
    6.27+                                 (lambda (e)
    6.28+                                   (etypecase e
    6.29+                                     (symbol (cons
    6.30+                                              (sb-int:keywordicate e)
    6.31+                                              (sb-posix:getenv (format nil "~a" (symbol-name e)))))
    6.32+                                     (string (cons
    6.33+                                              (sb-int:keywordicate e)
    6.34+                                              (sb-posix:getenv (format nil "~a" (symbol-name e)))))
    6.35+                                     (list
    6.36+                                      (cons (sb-int:keywordicate (car e)) (cdr e)))))
    6.37+                                 
    6.38+                                 env)))
    6.39           (when-let ((rules (sk-rules self)))
    6.40             (setf (sk-rules self) (map 'vector
    6.41                                        (lambda (x)
    6.42@@ -470,15 +486,15 @@
    6.43      (if (listp (ast self))
    6.44          (with-open-stream (st stream)
    6.45 	   (loop for (k v . rest) on (ast self)
    6.46-	       by #'cddr
    6.47-	       unless (or (null v) (null k))
    6.48-	       do 
    6.49-		  (write k :stream stream :pretty pretty :case case :readably t :array t :escape t)
    6.50-		  (write-char #\space st)
    6.51-		  (if (or (eq (type-of v) 'skel) (subtypep (type-of v) 'structure-object))
    6.52-		      (write-sxp-stream v stream :pretty pretty :case case)
    6.53-		      (write v :stream stream :pretty pretty :case case :readably t :array t :escape t))
    6.54-		  (write-char #\newline st)))
    6.55+	         by #'cddr
    6.56+	         unless (or (null v) (null k))
    6.57+	         do 
    6.58+		    (write k :stream stream :pretty pretty :case case :readably t :array t :escape t)
    6.59+		    (write-char #\space st)
    6.60+		    (if (or (eq (type-of v) 'skel) (subtypep (type-of v) 'structure-object))
    6.61+		        (write-sxp-stream v stream :pretty pretty :case case)
    6.62+		        (write v :stream stream :pretty pretty :case case :readably t :array t :escape t))
    6.63+		    (write-char #\newline st)))
    6.64 	 (error 'sxp-fmt-error)))
    6.65     (t (write (ast self) :stream stream :pretty pretty :case case :readably t :array t :escape t))))
    6.66 
    6.67@@ -513,7 +529,6 @@
    6.68 
    6.69 (defmethod sk-install-user-config ((self sk-project) (cfg sk-user-config))
    6.70   (with-slots (vc store stash license author) (debug! cfg) ;; log-level, custom, fmt
    6.71-    ;; (trace! "sk-user-config VC:" vc)
    6.72     (cas (sk-vc self) nil vc)
    6.73     (cas (sk-stash self) nil stash)
    6.74     (cas (sk-store self) nil store)
     7.1--- a/lisp/lib/skel/pkg.lisp	Mon May 13 18:40:39 2024 -0400
     7.2+++ b/lisp/lib/skel/pkg.lisp	Mon May 13 21:10:33 2024 -0400
     7.3@@ -79,6 +79,7 @@
     7.4    :edit-skelrc
     7.5    :skel :sk-meta :def-sk-class :sk-project :sk-target :sk-source :sk-vc
     7.6    :sk-vc-meta :sk-vc-meta-kind :sk-vc-meta-remotes
     7.7+   :sk-vars :sk-env
     7.8    :sk-rule :sk-rule-target :sk-rule-source :sk-rule-recipe :make-sk-rule
     7.9    :sk-make
    7.10    :sk-description :sk-kind :sk-rules :sk-version :sk-name :sk-docs :sk-document 
     8.1--- a/lisp/std/file.lisp	Mon May 13 18:40:39 2024 -0400
     8.2+++ b/lisp/std/file.lisp	Mon May 13 21:10:33 2024 -0400
     8.3@@ -397,14 +397,18 @@
     8.4   (and (not (pathname-name path))
     8.5        (not (pathname-type path))))
     8.6 
     8.7-(defun hidden-path-p (path)
     8.8-  "Return T if PATH is a hidden file or directory or NIL else."
     8.9+(defvar *hidden-paths* (list ".hg" ".git"))
    8.10+
    8.11+(defun hidden-path-p (path &optional strict)
    8.12+  "Return T if PATH is strictly a hidden file or directory or NIL else."
    8.13   (declare (type pathname path))
    8.14   (let ((name (if (directory-path-p path)
    8.15                   (car (last (pathname-directory path)))
    8.16                   (file-namestring path))))
    8.17     (and (plusp (length name))
    8.18-         (eq (char name 0) #\.))))
    8.19+         (if strict
    8.20+             (eq (char name 0) #\.)
    8.21+             (member name *hidden-paths* :test 'equal)))))
    8.22 
    8.23 (defun directory-path (path)
    8.24   "If PATH is a directory pathname, return it as it is. If it is a file
    8.25@@ -417,7 +421,7 @@
    8.26                                         (list (file-namestring path)))
    8.27                      :name nil :type nil :defaults path)))
    8.28 
    8.29-(defun find-files (path)
    8.30+(defun find-files (path &optional (hide *hidden-paths*))
    8.31   "Return a list of all files contained in the directory at PATH or any of its
    8.32 subdirectories."
    8.33   (declare (type (or pathname string) path))
    8.34@@ -428,7 +432,7 @@
    8.35     (let ((paths nil)
    8.36           (children (list-directory (directory-path path))))
    8.37       (dolist (child children paths)
    8.38-        (unless (hidden-path-p child)
    8.39+        (unless (and hide (hidden-path-p child (eq t hide)))
    8.40           (if (directory-path-p child)
    8.41               (setf paths (append paths (find-files child)))
    8.42               (push child paths)))))))
     9.1--- a/lisp/std/pkg.lisp	Mon May 13 18:40:39 2024 -0400
     9.2+++ b/lisp/std/pkg.lisp	Mon May 13 21:10:33 2024 -0400
     9.3@@ -353,6 +353,7 @@
     9.4    :file-date
     9.5    :file-timestamp
     9.6    :directory-path-p
     9.7+   :*hidden-paths*
     9.8    :hidden-path-p
     9.9    :directory-path
    9.10    :find-files
    10.1--- a/skelfile	Mon May 13 18:40:39 2024 -0400
    10.2+++ b/skelfile	Mon May 13 21:10:33 2024 -0400
    10.3@@ -11,6 +11,7 @@
    10.4 :vc :hg
    10.5 :docs ((:org "readme"))
    10.6 :scripts "x.lisp"
    10.7+:env (home (cc "clang") shell term)
    10.8 :rules
    10.9 ((all (x compile std prelude build))
   10.10  (x () #$if [ ! -f x ];