]> apps.delaporte.us Git - dotfiles.git/blobdiff - bin/dot
Track install in ~/dot
[dotfiles.git] / bin / dot
diff --git a/bin/dot b/bin/dot
index 4e21e72397c556d8b1a73fc9833242bc0f6edac9..c3e4a6aa10f9fa5c7c9e3d16c529605a27dcafba 100755 (executable)
--- a/bin/dot
+++ b/bin/dot
@@ -1,32 +1,35 @@
 #!/bin/bash
-# dot - a (mostly) one script dotfiles manager
-#
-# Copyright 2026 Edward Delaporte V
-# Licensed under AGPLv3 and later.
-#
-# Features
-#   symlinks - any file in $HOME/dotfiles/files may be symlinked
-#
-# dot setup
-#              install the necessary tools to $HOME/envs/dot
-#
-# dot list
-#   list available roles
-#
-# dot check
-#   check setup vs expected
-#
-# dot add ROLE
-#   add ROLE to localhost
-#
-# dot apply
-#              apply all added ROLES
+read -d '' HELP << EOF
+dot - a (mostly) one script dotfiles manager
 
+Copyright 2026 Edward Delaporte V
+Licensed under AGPLv3 and later.
+
+dot setup
+       install the necessary tools to $HOME/envs/dot
+
+dot link FILE
+  updates ~/dot.HOSTNAME.yaml
+  to include a symlink from ~/dotfiles/files/FILE to ~/.FILE
+
+dot check
+       check setup against ~/dot.HOSTNAME.yaml
+
+dot apply
+       apply config in ~/dot.HOSTNAME.yaml
+EOF
+
+if [ ! -n "$1" ] || [ "$1" == "help" ]; then
+       echo "$HELP"
+fi
 # set -v
 
 ENVS="$HOME/envs"
 ANSIBLE="$ENVS/ansible/bin/ansible-playbook"
 TASKFILE="$HOME/dot.$HOSTNAME.yaml"
+LINKFILES="$HOME/dotfiles/files"
+INSTALLS="$HOME/dotfiles/install"
+DOT="$HOME/dot"
 
 read -d '' EMPTY_TASKFILE << EOF
 ---
@@ -36,8 +39,9 @@ read -d '' EMPTY_TASKFILE << EOF
   connection: local
 
   tasks:
-               - name: Do nothing
-      ansible.builtin.shell: echo "Nothing to do."
+    - name: Check on $TASKFILE
+      ansible.builtin.stat:
+        path: $TASKFILE
 EOF
 
 
@@ -67,6 +71,7 @@ if [ "$1" == "reset" ]; then
                exit 1
        fi
        echo "$EMPTY_TASKFILE" > $TASKFILE
+       echo ""
 fi
 
 
@@ -74,34 +79,66 @@ if [ "$1" == "check" ]; then
        $ANSIBLE $TASKFILE --check --diff
 fi
 
-if [ "$1" == "list" ]; then
-  echo "May symlink:"
-       cd $HOME/dotfiles/files
-       ls -p | grep -v /
-fi
+if [ "$1" == "link" ]; then
+       if [ ! -n "$2" ]; then
+               echo "May symlink:"
+               cd $LINKFILES
+               ls -p | grep -v /
+               exit 1
+       fi
+
+read -d '' LINK_THIS_FILE << EOF
 
+    - name: symlink $2
+      ansible.builtin.file:
+        src: "$LINKFILES/$2"
+        dest: "$HOME/.$2"
+        state: "link"
+EOF
 
+       echo "    $LINK_THIS_FILE" >> $TASKFILE
+       echo "$2 added to symlinks in $TASKFILE"
+       echo "Run 'dot apply' to create all configured symlinks"
+fi
 
 
+if [ "$1" == "apply" ]; then
+  if [[ ! -f "$TASKFILE" ]]; then
+               echo "$TASKFILE is missing. Run 'dot setup'"
+               exit 1
+       fi
+       $ANSIBLE $TASKFILE
+fi
 
-if [ "$1" == "link" ]; then
+if [ "$1" == "install" ]; then
        if [ ! -n "$2" ]; then
-               echo "May symlink:"
-               cd $HOME/dotfiles/files
+               echo "Can install:"
+               cd $INSTALLS
                ls -p | grep -v /
+               exit 1
+       fi
+  if [[ ! -f "$INSTALLS/$2.sh" ]]; then
+               echo "No such install script $INSTALLS/$2.sh"
+               echo "Run dot install with no params to list scripts."
+               exit 1
        fi
 
-read -d '' LINK_FILE << EOF
----
-  tasks:
-               - name: Create a symbolic link
-                       ansible.builtin.file:
-                               src: /file/to/link/to
-                               dest: /path/to/symlink
-                               owner: foo
-                               group: foo
-                               state: link
+mkdir -p $DOT
+read -d '' RUN_INSTALL << EOF
+    - name: check $2
+      stat:
+        path: "$DOT/$2.installed"
+      register: $2_installed
+    - name: install $2
+      ansible.builtin.shell: |
+        "$INSTALLS/$2.sh"
+        touch "$DOT/$2.installed"
+      when: not $2_installed.stat.exists
+    - name: verify $2 is installed
+      ansible.builtin.debug:
+        msg: "$2 is installed."
+      when: $2_installed.stat.exists
 EOF
-
+       echo "    $RUN_INSTALL" >> $TASKFILE
+       echo "Run 'dot apply' to run the install"
 fi
-