diff --git a/README.md b/README.md index abf938e..f4975a7 100644 --- a/README.md +++ b/README.md @@ -1,19 +1,34 @@ # AutoYADM -AutoYADM is a small shell utility to automate the process of managing dotfiles with [YADM](https://github.com/yadm-dev/yadm) by allowing the user to define a list of files & directories to be automatically added, committed and pushed whenever the script is run. **Most notably, AutoYADM accounts for newly created files previously untracked by YADM.** +AutoYADM is a small shell utility to automate the process of managing dotfiles +with [YADM](https://github.com/yadm-dev/yadm) by allowing the user to define a +list of files & directories to be automatically added, committed and pushed +whenever the script is run. **Most notably, AutoYADM accounts for newly created +files previously untracked by YADM.** + +The benefits of this approach: + +1. Robust version control thanks to YADM and Git. +2. You won't forget to commit new files in important folders. +3. Maintain control over paths to auto-commit, and paths to only manually + commit. + +I have personally been using AutoYADM to sync my dotfiles between devices +without any problems since October 2024. ## Features -- Configure a list of files & directories to be automatically tracked by YADM +- Configure a list of files & directories to be automatically tracked by YADM. - Tracked directories will also track any new files inside them! -- Automatically add, commit, and push tracked paths +- Automatically add, commit, and push tracked paths. +- `.ignore` support with `fd`. ## Installation Simply clone the repository: ```Bash -git clone git@github.com:ficcdaf/autoyadm.git +git clone https://git.sr.ht/~ficd/autoyadm ``` You may consider adding aliases to your shell configuration: @@ -25,36 +40,44 @@ alias yadmadd="/path/to/autoyadm/yadmadd.sh" alias autoyadm="AUTOYADMPUSH=1 /path/to/autoyadm/autoyadm.sh" ``` -
-Click to see dependencies +**Dependencies**: - [YADM](https://github.com/yadm-dev/yadm) - `git` -- Bash/Zsh -- `openssh` (optional) - -
+- `fd` (optional, but recommended) + - fallback to `find` otherwise +- `openssh` (required for pushing) ## Usage -> Note: The following assumes you have created shell aliases to the two scripts. You may, of course, simply call them directly. +> Note: The following assumes you have created shell aliases to the two scripts. +> You may, of course, simply call them directly. ### Tracking -AutoYADM maintains a list of files and directories for automatic tracking. _**All** children of tracked directories will be tracked, including newly created, previously untracked files._ For example, if you add your Neovim configuration at `~/.config/nvim` to tracking, then any new files you create inside that folder will automatically be added and committed by AutoYADM. +AutoYADM maintains a list of files and directories for automatic tracking. +_**All** children of tracked directories will be tracked, including newly +created, previously untracked files._ For example, if you add your Neovim +configuration at `~/.config/nvim` to tracking, then any new files you create +inside that folder will automatically be added and committed by AutoYADM. -The tracking file is stored in `~/.config/yadm/tracked`. `$XDG_CONFIG_HOME` is respected. The file will be automatically created if it doesn't already exist. You can even add it to tracking: `yadmadd ~/.config/yadm/tracked` +The tracking file is stored in `~/.config/yadm/tracked`. `$XDG_CONFIG_HOME` is +respected. The file will be automatically created if it doesn't already exist. +You can even add it to tracking: `yadmadd ~/.config/yadm/tracked` -> **Important**: Symlinks are _**not**_ added; this is to avoid conflicts with `yadm alt` +> **Important**: Symlinks are _**not**_ added; this is to avoid conflicts with +> `yadm alt` -The tracking file contains the paths to tracked files & directories **relative to $HOME**. For example: +The tracking file contains the paths to tracked files & directories **relative +to $HOME**. For example: ``` .bashrc .config/nvim ``` -To add paths to be tracked, you may use `yadmadd.sh`. Any valid absolute or relative path should work. +To add paths to be tracked, you may use `yadmadd.sh`. Any valid absolute or +relative path should work. ```Bash $ yadmadd ~/.bashrc @@ -67,6 +90,20 @@ $ yadmadd .bashrc .zshrc .config/nvim To remove a target from tracking, simply delete it from the `tracked` file. +### Ignoring Certain Files + +It's possible to ignore certain patterns inside a folder you're otherwise +tracking with `yadmadd`. For example, suppose you've added `.config/foo`, but +you want to specifically ignore `.config/foo/bar.log`. You can use a `.ignore` +file for this: + +```sh +echo "bar.log" > ~/.config/foo/.ignore +``` + +The `.ignore` file must be in the root of the directory you've added with +`yadmadd`. You also need `fd` available on your `$PATH` for ignoring to work. + ### Committing & Pushing To automatically add and commit your tracking targets, use `autoyadm.sh`: @@ -75,7 +112,8 @@ To automatically add and commit your tracking targets, use `autoyadm.sh`: $ autoyadm ``` -By default, automatic pushing is disabled. You can enable it with an environment variable: +By default, automatic pushing is disabled. You can enable it with an environment +variable: ```Bash $ export AUTOYADMPUSH=1 @@ -84,17 +122,24 @@ $ autoyadm $ AUTOYADMPUSH=1 autoyadm ``` -> Note: For auto push to work, ssh-agent must be enabled, and the environment file needs to exist inside `~/.ssh`. Furthermore, you must have SSH setup with your git host. +> Note: For auto push to work, ssh-agent must be enabled, and the environment +> file needs to exist inside `~/.ssh`. Furthermore, you must have SSH setup with +> your git host. ### Calling AutoYADM Automatically -By default, AutoYADM only runs when the user calls it explicitly. If you want to automate this process, you are responsible for setting it up yourself. You may consider configuring a cron job for this. The following example will run AutoYADM every 15 minutes, with automatic push enabled, appending its output to a log file: +By default, AutoYADM only runs when the user calls it explicitly. If you want to +automate this process, you are responsible for setting it up yourself. You may +consider configuring a cron job for this. The following example will run +AutoYADM every 15 minutes, with automatic push enabled, appending its output to +a log file: ```Bash */15 * * * * AUTOYADMPUSH=1 /path/to/autoyadm/audoyadm.sh >> /path/to/log/file.log ``` -If you are on Arch Linux, you can follow these instructions to set up the cron job: +If you are on Arch Linux, you can follow these instructions to set up the cron +job: ```Bash # Install a cron daemon if you @@ -108,12 +153,3 @@ $ crontab -e $ systemctl enable cronie $ systemctl start cronie ``` - -## Feature Roadmap - -- [x] Allow custom `tracked` file location & name -- [ ] Optionally allow symlinks only if they are explicitly added to tracking - -## Contributing - -Contributions are very welcome. This is a very small and simple script, but if you have some improvements or new features, please feel free to submit a PR. Bug reports welcome, too. diff --git a/autoyadm.sh b/autoyadm.sh index 962acc0..7d02ec3 100755 --- a/autoyadm.sh +++ b/autoyadm.sh @@ -4,6 +4,8 @@ # from a file and executes "yadm add" # on all of them, then creates a timestamped # commit and pushes the changes. +# Author: Daniel Fichtinger +# License: MIT AYE="AutoYADM Error:" AYM="AutoYADM:" @@ -35,6 +37,16 @@ if [ -z "$HOST" ]; then HOST="$(hostname)" fi +# check if fd is installed, +# if so we prefer that. Setting this variable +# avoids needing to repeat the check on every +# fd/find invocation. +if command -v fd >/dev/null; then + FD="true" +else + FD="false" +fi + # First we read each path from "tracked" (while read -r relpath; do path="$HOME/$relpath" @@ -42,7 +54,12 @@ fi # if the path points to a directory # This ensures symlinks are not added if [ -d "$path" ]; then - find "$path" -type f -exec yadm add {} + + if [ "$FD" == "true" ]; then + # we prefer fd because it respects .ignore + fd -t f . "$path" -X yadm add + else + find "$path" -type f -exec yadm add {} + + fi # If just a file, we add directly elif [ -f "$path" ]; then yadm add "$path"