Compare commits
6 commits
9a1eb30700
...
49fab59c91
Author | SHA1 | Date | |
---|---|---|---|
|
49fab59c91 | ||
|
ec10041024 | ||
|
3a1b236147 | ||
|
fdbb9cfe26 | ||
|
5a2ed6c68d | ||
|
f76eecc321 |
3 changed files with 116 additions and 11 deletions
16
README.md
16
README.md
|
@ -18,11 +18,12 @@
|
||||||
**yadm** is a tool for managing [dotfiles][].
|
**yadm** is a tool for managing [dotfiles][].
|
||||||
|
|
||||||
* Based on [Git][], with full range of Git's features
|
* Based on [Git][], with full range of Git's features
|
||||||
* Supports system-specific alternative files or templated files
|
* Supports system-specific [alternative][feature-alternates] files or
|
||||||
* Encryption of private data using [GnuPG][], [OpenSSL][], [transcrypt][], or
|
[templated][feature-templates] files
|
||||||
[git-crypt][]
|
* [Encryption][feature-encryption] of private data using [GnuPG][],
|
||||||
* Customizable initialization (bootstrapping)
|
[OpenSSL][], [transcrypt][], or [git-crypt][]
|
||||||
* Customizable hooks for before and after any operation
|
* Customizable initialization ([bootstrapping][feature-bootstrap])
|
||||||
|
* Customizable [hooks][feature-hooks] for before and after any operation
|
||||||
|
|
||||||
Complete features, usage, examples and installation instructions can be found on
|
Complete features, usage, examples and installation instructions can be found on
|
||||||
the [yadm.io][website-link] website.
|
the [yadm.io][website-link] website.
|
||||||
|
@ -63,6 +64,11 @@ The star count helps others discover yadm.
|
||||||
[develop-commits]: https://github.com/yadm-dev/yadm/commits/develop
|
[develop-commits]: https://github.com/yadm-dev/yadm/commits/develop
|
||||||
[develop-date]: https://img.shields.io/github/last-commit/yadm-dev/yadm/develop.svg?label=develop
|
[develop-date]: https://img.shields.io/github/last-commit/yadm-dev/yadm/develop.svg?label=develop
|
||||||
[dotfiles]: https://en.wikipedia.org/wiki/Hidden_file_and_hidden_directory
|
[dotfiles]: https://en.wikipedia.org/wiki/Hidden_file_and_hidden_directory
|
||||||
|
[feature-alternates]: https://yadm.io/docs/alternates
|
||||||
|
[feature-bootstrap]: https://yadm.io/docs/bootstrap
|
||||||
|
[feature-hooks]: https://yadm.io/docs/hooks
|
||||||
|
[feature-encryption]: https://yadm.io/docs/encryption
|
||||||
|
[feature-templates]: https://yadm.io/docs/templates
|
||||||
[gh-pages-badge]: https://img.shields.io/github/actions/workflow/status/yadm-dev/yadm/test.yml?branch=gh-pages
|
[gh-pages-badge]: https://img.shields.io/github/actions/workflow/status/yadm-dev/yadm/test.yml?branch=gh-pages
|
||||||
[git-crypt]: https://github.com/AGWA/git-crypt
|
[git-crypt]: https://github.com/AGWA/git-crypt
|
||||||
[homebrew-badge]: https://img.shields.io/homebrew/v/yadm.svg
|
[homebrew-badge]: https://img.shields.io/homebrew/v/yadm.svg
|
||||||
|
|
|
@ -14,11 +14,16 @@ if [[ ! -d "$BOOTSTRAP_D" ]]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
find -L "$BOOTSTRAP_D" -type f | sort | while IFS= read -r bootstrap; do
|
declare -a bootstraps
|
||||||
if [[ -x "$bootstrap" && ! "$bootstrap" =~ "##" && ! "$bootstrap" =~ "~$" ]]; then
|
while IFS= read -r bootstrap; do
|
||||||
if ! "$bootstrap"; then
|
if [[ -x "$bootstrap" && ! "$bootstrap" =~ "##" && ! "$bootstrap" =~ ~$ ]]; then
|
||||||
echo "Error: bootstrap '$bootstrap' failed" >&2
|
bootstraps+=("$bootstrap")
|
||||||
exit 1
|
fi
|
||||||
fi
|
done < <(find -L "$BOOTSTRAP_D" -type f | sort)
|
||||||
|
|
||||||
|
for bootstrap in "${bootstraps[@]}"; do
|
||||||
|
if ! "$bootstrap"; then
|
||||||
|
echo "Error: bootstrap '$bootstrap' failed" >&2
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
94
contrib/bootstrap/bootstrap-source
Normal file
94
contrib/bootstrap/bootstrap-source
Normal file
|
@ -0,0 +1,94 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Save this file as ~/.config/yadm/bootstrap and make it executable. It expects
|
||||||
|
# environment variable `file` with a name of shell script to execute.
|
||||||
|
# `file` can be relative to ~/.config/yadm/ or has full path.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# file=install yadm bootstrap
|
||||||
|
# or
|
||||||
|
# file=~/.config/yadm/install yadm bootstrap
|
||||||
|
#
|
||||||
|
# where `~/.config/yadm/install` can be like this:
|
||||||
|
#
|
||||||
|
# [[ ! $(type -t install) = 'function' ]] && echo "Usage: file=$(basename "$0") yadm bootstrap" && exit 1
|
||||||
|
#
|
||||||
|
# confirm yes 'softwareupdate --agree-to-license --install --all' "$(info 'Install ' warning 'OSX updates')"
|
||||||
|
# install 'brew' '/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"'
|
||||||
|
#
|
||||||
|
# brew bundle --global
|
||||||
|
#
|
||||||
|
|
||||||
|
TEXT_COLOR_RED=$(tput setaf 1)
|
||||||
|
TEXT_COLOR_GREEN=$(tput setaf 2)
|
||||||
|
TEXT_COLOR_BLUE=$(tput setaf 4)
|
||||||
|
TEXT_COLOR_YELLOW=$(tput setaf 3)
|
||||||
|
TEXT_DEFAULT=$(tput sgr0)
|
||||||
|
|
||||||
|
info() {
|
||||||
|
printf "${TEXT_COLOR_BLUE}%s${TEXT_DEFAULT}" "$1"; "${@:2}"
|
||||||
|
}
|
||||||
|
|
||||||
|
error() {
|
||||||
|
printf "${TEXT_COLOR_RED}%s${TEXT_DEFAULT}" "$1"; "${@:2}"
|
||||||
|
}
|
||||||
|
|
||||||
|
success() {
|
||||||
|
printf "${TEXT_COLOR_GREEN}%s${TEXT_DEFAULT}" "$1"; "${@:2}"
|
||||||
|
}
|
||||||
|
|
||||||
|
warning() {
|
||||||
|
printf "${TEXT_COLOR_YELLOW}%s${TEXT_DEFAULT}" "$1"; "${@:2}"
|
||||||
|
}
|
||||||
|
|
||||||
|
source_if_exists() {
|
||||||
|
local src=$1
|
||||||
|
local verbose="${2:-no}"
|
||||||
|
|
||||||
|
[[ ! -f $src ]] && return 1;
|
||||||
|
[[ "${verbose:0:1}" == v* ]] && printf "%s\n\n" "$(info "-> $src")";
|
||||||
|
source "$src"
|
||||||
|
}
|
||||||
|
|
||||||
|
command_exists () {
|
||||||
|
command -v "$1" &> /dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
# install a 'command' via 'code' if it was not previously installed yet
|
||||||
|
install() {
|
||||||
|
local command=$1
|
||||||
|
local code=$2
|
||||||
|
local message=$(info 'Installing ' warning "$command")
|
||||||
|
|
||||||
|
if command_exists "$command"; then
|
||||||
|
echo "$message...[$(success 'already')]"
|
||||||
|
else
|
||||||
|
echo "$message..."
|
||||||
|
eval "$code"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# execute a 'code' after confirmation from user
|
||||||
|
confirm() {
|
||||||
|
local default_answer="${1:-no}"
|
||||||
|
local code=$2
|
||||||
|
local message=$3
|
||||||
|
local options answer
|
||||||
|
|
||||||
|
if [[ "${default_answer:0:1}" == y* ]]; then
|
||||||
|
options="$(success 'YES')/no"
|
||||||
|
else
|
||||||
|
options="yes/$(success 'NO')"
|
||||||
|
fi
|
||||||
|
|
||||||
|
read -r -p "${message} [${options}]:" answer
|
||||||
|
answer=${answer:-$default_answer}
|
||||||
|
|
||||||
|
if [[ "${answer:0:1}" == y* ]]; then
|
||||||
|
eval "$code"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
source_if_exists "$(dirname "${0}")/$file" v ||
|
||||||
|
source_if_exists $file v ||
|
||||||
|
([[ -z $file ]] && echo "Usage: file=FILENAME yadm bootstrap" || echo "Can't locate file '$file' for bootstrapping")
|
Loading…
Reference in a new issue