]> apps.delaporte.us Git - dotfiles.git/blob - bin/dot
06d0db4640ad8c658f1d5c50850a6261aaf021ce
[dotfiles.git] / bin / dot
1 #!/bin/bash
2 # dot - a (mostly) one script dotfiles manager
3 #
4 # Copyright 2026 Edward Delaporte V
5 # Licensed under AGPLv3 and later.
6 #
7 # Features
8 # symlinks - any file in $HOME/dotfiles/files may be symlinked
9 #
10 # dot setup
11 # install the necessary tools to $HOME/envs/dot
12 #
13 # dot link FILE
14 # updates ~/dot.HOSTNAME.yaml
15 # to include a symlink from ~/dotfiles/files/FILE to ~/.FILE
16 #
17 # dot check
18 # check setup against ~/dot.HOSTNAME.yaml
19 #
20 # dot apply
21 # apply config in ~/dot.HOSTNAME.yaml
22
23 # set -v
24
25 ENVS="$HOME/envs"
26 ANSIBLE="$ENVS/ansible/bin/ansible-playbook"
27 TASKFILE="$HOME/dot.$HOSTNAME.yaml"
28 LINKFILES="$HOME/dotfiles/files"
29
30 read -d '' EMPTY_TASKFILE << EOF
31 ---
32 - name: Set up dotfiles on $HOSTNAME
33 gather_facts: no
34 hosts: localhost
35 connection: local
36
37 tasks:
38 - name: Check on $TASKFILE
39 ansible.builtin.stat:
40 path: $TASKFILE
41 EOF
42
43
44 if [ "$1" == "setup" ]; then
45 if [[ ! -f "$ANSIBLE" ]]; then
46 mkdir -p "$ENVS"
47 echo "Setting up Ansible in ~/envs/ansible"
48 cd $HOME/envs; python3 -m venv ansible
49 $HOME/envs/ansible/bin/pip install ansible jinja2
50 fi
51 if [[ -f "$ANSIBLE" ]]; then
52 echo "[ ok ]: Ansible setup at $ANSIBLE"
53 fi
54 if [[ ! -f "$TASKFILE" ]]; then
55 echo "Creating $TASKFILE"
56 echo "$EMPTY_TASKFILE" >> $TASKFILE
57 fi
58 if [[ -f "$TASKFILE" ]]; then
59 echo "[ ok ]: dot config at $TASKFILE"
60 fi
61 fi
62
63 if [ "$1" == "reset" ]; then
64 read -n1 -p "Reset $TASKFILE? [y,N]" input
65 if [[ ! $input == "Y" && ! $input == "y" ]]; then
66 echo "Aborted by user"
67 exit 1
68 fi
69 echo "$EMPTY_TASKFILE" > $TASKFILE
70 echo ""
71 fi
72
73
74 if [ "$1" == "check" ]; then
75 $ANSIBLE $TASKFILE --check --diff
76 fi
77
78 if [ "$1" == "link" ]; then
79 if [ ! -n "$2" ]; then
80 echo "May symlink:"
81 cd $LINKFILES
82 ls -p | grep -v /
83 exit 1
84 fi
85
86 read -d '' LINK_THIS_FILE << EOF
87
88 - name: symlink $2
89 ansible.builtin.file:
90 src: "$LINKFILES/$2"
91 dest: "$HOME/.$2"
92 state: "link"
93 EOF
94
95 echo " $LINK_THIS_FILE" >> $TASKFILE
96 echo "$2 added to symlinks in $TASKFILE"
97 echo "Run 'dot apply' to create all configured symlinks"
98 fi
99
100
101 if [ "$1" == "apply" ]; then
102 if [[ ! -f "$TASKFILE" ]]; then
103 echo "$TASKFILE is missing. Run 'dot setup'"
104 exit 1
105 fi
106 $ANSIBLE $TASKFILE
107 fi
108
109