#!/usr/bin/env bash
BASEDIR="$PWD"
ENVDIR="$PWD/env"
+export GREP_OPTIONS=
usage() {
cat <<EOF
delete <name> Delete an environment
rename <newname> Rename the current environment
diff Show differences between current state and environment
- save Save your changes to the environment
+ save [message] Save your changes to the environment, optionally using
+ the given commit message
revert Revert your changes since last save
Options:
git init &&
touch .config &&
mkdir files &&
- git-add . &&
- git-commit -q -m "Initial import"
+ git add . &&
+ git commit -q -m "Initial import"
} || {
rm -rf .git
error "Failed to initialize the environment directory"
}
env_sync_data() {
- [ \! -L "$BASEDIR/.config" -a -f "$BASEDIR/.config" ] && mv "$BASEDIR/.config" "$ENVDIR"
- git-add .
- git-add -u
+ [ \! -L "$BASEDIR/.config" ] && [ -f "$BASEDIR/.config" ] && mv "$BASEDIR/.config" "$ENVDIR"
+ git add .
+ git add -u
}
env_sync() {
local STR="$1"
env_sync_data
- git-commit -m "${STR:-Update} at $(date)"
+ git commit -m "${STR:-Update} at $(date)"
}
env_link_config() {
}
env_do_reset() {
- git-reset --hard HEAD
- git-clean -d -f
+ git reset --hard HEAD
+ git clean -d -f
}
env_list() {
env_init
- git-branch | grep -vE '^. master$'
+ git branch --color | grep -vE '^. master$'
}
env_diff() {
env_init
env_sync_data
- git-diff --cached
+ git diff --cached --color=auto
+ env_link_config
}
env_save() {
env_init
- env_sync
+ env_sync "$@"
env_link_config
}
}
env_ask_sync() {
+ env_sync_data
LINES="$(env_diff | wc -l)" # implies env_init
[ "$LINES" -gt 0 ] && {
if ask_bool 1 "Do you want to save your changes"; then
env_sync
else
- env_sync_data
env_do_reset
fi
}
env_init
[ -L "$BASEDIR/.config" ] && rm -f "$BASEDIR/.config"
[ -L "$BASEDIR/files" ] && rm -f "$BASEDIR/files"
- [ -f "$ENVDIR/.config" ] || ( cd "$ENVDIR/files" && find | grep -vE '^\.$' > /dev/null )
+ [ -f "$ENVDIR/.config" ] || ( cd "$ENVDIR/files" && find . | grep -vE '^\.$' > /dev/null )
env_sync_data
if ask_bool 1 "Do you want to keep your current config and files"; then
mkdir -p "$BASEDIR/files"
- cp -a "$ENVDIR/files/*" "$BASEDIR/files" 2>/dev/null >/dev/null
+ shopt -s dotglob
+ cp -a "$ENVDIR/files/"* "$BASEDIR/files" 2>/dev/null >/dev/null
+ shopt -u dotglob
cp "$ENVDIR/.config" "$BASEDIR/"
else
rm -rf "$BASEDIR/files" "$BASEDIR/.config"
env_delete() {
local name="${1##*/}"
+ env_init
[ -z "$name" ] && usage
- [ -f "$envdir/.git/refs/heads/$name" ] || error "environment '$name' not found"
- branch="$(git-branch | grep '^\* ' | awk '{print $2}')"
- [ "$name" = "branch" ] && error "cannot delete the currently selected environment"
- git-branch -D "$name"
+ branch="$(git branch | grep '^\* ' | awk '{print $2}')"
+ [ "$name" = "$branch" ] && error "cannot delete the currently selected environment"
+ git branch -D "$name"
}
env_switch() {
local name="${1##*/}"
[ -z "$name" ] && usage
- [ -f "$ENVDIR/.git/refs/heads/$name" ] || error "environment '$name' not found"
env_init
env_ask_sync
- git-checkout "$NAME"
+ git checkout "$name" || error "environment '$name' not found"
env_link_config
}
env_rename() {
local NAME="${1##*/}"
env_init
- git-branch -m "$NAME"
+ git branch -m "$NAME"
}
env_new() {
[ -z "$NAME" ] && usage
env_init 1
- branch="$(git-branch | grep '^\* ' | awk '{print $2}')"
- if [ -n "$branch" -a "$branch" != "master" ]; then
+ branch="$(git branch | grep '^\* ' | awk '{print $2}')"
+ if [ -n "$branch" ] && [ "$branch" != "master" ]; then
env_ask_sync
if ask_bool 0 "Do you want to clone the current environment?"; then
from="$branch"
fi
rm -f "$BASEDIR/.config" "$BASEDIR/files"
fi
- git-checkout -b "$1" "$from"
- if [ -f "$BASEDIR/.config" -o -d "$BASEDIR/files" ]; then
- if ask_bool 1 "Do you want to keep your current config and files?"; then
- [ -d "$BASEDIR/files" -a \! -L "$BASEDIR/files" ] && {
- mv "$BASEDIR/files/"* "$ENVDIR/" 2>/dev/null
+ git checkout -b "$1" "$from"
+ if [ -f "$BASEDIR/.config" ] || [ -d "$BASEDIR/files" ]; then
+ if ask_bool 1 "Do you want to start your configuration repository with the current configuration?"; then
+ if [ -d "$BASEDIR/files" ] && [ \! -L "$BASEDIR/files" ]; then
+ mkdir -p "$ENVDIR/files"
+ shopt -s dotglob
+ mv "$BASEDIR/files/"* "$ENVDIR/files/" 2>/dev/null
+ shopt -u dotglob
rmdir "$BASEDIR/files"
- }
+ fi
env_sync
else
rm -rf "$BASEDIR/.config" "$BASEDIR/files"