Created
June 26, 2012 00:14
-
-
Save ioanrogers/2992239 to your computer and use it in GitHub Desktop.
vcsh rc-zsh submodule update
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[submodule ".ls_colors"] | |
path = .ls_colors | |
url = git://github.com/trapd00r/LS_COLORS.git | |
[submodule ".zsh/plugins/zsh-syntax-highlighting-filetypes"] | |
path = .zsh/plugins/zsh-syntax-highlighting-filetypes | |
url = git://github.com/trapd00r/zsh-syntax-highlighting-filetypes.git |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[ -z "$XDG_CONFIG_HOME" ] && XDG_CONFIG_HOME="$HOME/.config" | |
+ [ -z ] | |
+ XDG_CONFIG_HOME=/home/ioan/.config | |
[ -r "$XDG_CONFIG_HOME/vcsh/config" ] && . "$XDG_CONFIG_HOME/vcsh/config" | |
+ [ -r /home/ioan/.config/vcsh/config ] | |
[ -n "$VCSH_DEBUG" ] && set -vx | |
+ [ -n 1 ] | |
+ set -vx | |
[ -z "$VCSH_REPO_D" ] && VCSH_REPO_D="$XDG_CONFIG_HOME/vcsh/repo.d" | |
+ [ -z ] | |
+ VCSH_REPO_D=/home/ioan/.config/vcsh/repo.d | |
[ -z "$VCSH_HOOK_D" ] && VCSH_HOOK_D="$XDG_CONFIG_HOME/vcsh/hooks-enabled" | |
+ [ -z ] | |
+ VCSH_HOOK_D=/home/ioan/.config/vcsh/hooks-enabled | |
[ -z "$VCSH_BASE" ] && VCSH_BASE="$HOME" | |
+ [ -z ] | |
+ VCSH_BASE=/home/ioan | |
[ -z "$VCSH_GITIGNORE" ] && VCSH_GITIGNORE='exact' | |
+ [ -z ] | |
+ VCSH_GITIGNORE=exact | |
SELF=$(basename $0) | |
+ basename /usr/bin/vcsh | |
+ SELF=vcsh | |
help() { | |
echo "usage: $SELF <args> | |
clone <remote> \\ | |
[<repo>] Clone from an existing repository | |
help Display this help text | |
delete Delete an existing repository | |
enter Enter repository; spawn new instance of \$SHELL | |
init <repo> Initialize a new repository | |
list List all repositories | |
list-tracked List all files tracked by vcsh | |
list-tracked-by \\ | |
<repo> List files tracked by a repository | |
rename <repo> \\ | |
<newname> Rename repository | |
run <repo> \\ | |
<command> Use this repository | |
setup Set up repository with recommended settings | |
which <substring> Find substring in name of any tracked file | |
write-gitignore \\ | |
<repo> Write .gitignore.d/<repo> via git ls-files | |
<repo> <git command> Shortcut to run git commands directly | |
<repo> Shortcut to enter repository" >&2 | |
} | |
debug() { | |
[ -n "$VCSH_DEBUG" ] && echo "$SELF: debug: $@" | |
} | |
verbose() { | |
if [ -n "$VCSH_DEBUG" ] || [ -n "$VCSH_VERBOSE" ]; then echo "$SELF: verbose: $@"; fi | |
} | |
fatal() { | |
echo "$SELF: fatal: $1" >&2 | |
exit $2 | |
} | |
error() { | |
echo "$SELF: error: $1" >&2 | |
} | |
info() { | |
echo "$SELF: info: $1" | |
} | |
clone() { | |
init | |
git remote add origin "$GIT_REMOTE" | |
git config branch.master.remote origin | |
git config branch.master.merge refs/heads/master | |
if [ $(git ls-remote origin master 2> /dev/null | wc -l ) -lt 1 ]; then | |
info "remote is empty, not merging anything" | |
exit | |
fi | |
git fetch --recurse-submodules=yes | |
for object in $(git ls-tree -r origin/master | awk '{print $4}'); do | |
[ -e "$object" ] && | |
error "'$object' exists." && | |
VCSH_CONFLICT=1; | |
done | |
[ "$VCSH_CONFLICT" = '1' ] && | |
fatal "will stop after fetching and not try to merge! | |
Once this situation has been resolved, run 'vcsh run $VCSH_REPO_NAME git pull' to finish cloning.\n" 17 | |
git merge origin/master | |
} | |
delete() { | |
cd "$VCSH_BASE" || fatal "could not enter '$VCSH_BASE'" 11 | |
use | |
info "This operation WILL DETROY DATA!" | |
files=$(git ls-files) | |
echo "These files will be deleted: | |
$files | |
AGAIN, THIS WILL DELETE YOUR DATA! | |
To continue, type 'Yes, do as I say'" | |
read answer | |
[ "x$answer" = 'xYes, do as I say' ] || exit 16 | |
for file in $files; do | |
rm -f $file || info "could not delete '$file', continuing with deletion" | |
done | |
rm -r "$GIT_DIR" || error "could not delete '$GIT_DIR'" | |
} | |
enter() { | |
hook pre-enter | |
use | |
$SHELL | |
hook post-enter | |
} | |
git_dir_exists() { | |
[ -d "$GIT_DIR" ] || fatal "no repository found for '$VCSH_REPO_NAME'" 12 | |
} | |
hook() { | |
for hook in $VCSH_HOOK_D/$1* $VCSH_HOOK_D/$VCSH_REPO_NAME.$1*; do | |
[ -x "$hook" ] || continue | |
info "executing '$hook'" | |
"$hook" | |
done | |
} | |
init() { | |
[ ! -e "$GIT_DIR" ] || fatal "'$GIT_DIR' exists" 10 | |
export GIT_WORK_TREE="$VCSH_BASE" | |
mkdir -p "$GIT_WORK_TREE" || fatal "could not create '$GIT_WORK_TREE'" 50 | |
cd "$GIT_WORK_TREE" || fatal "could not enter '$GIT_WORK_TREE'" 11 | |
git init | |
setup | |
} | |
list() { | |
for i in "$VCSH_REPO_D"/*.git; do | |
echo $(basename "$i" .git) | |
done | |
} | |
get_files() { | |
export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" | |
git ls-files | |
} | |
list_tracked() { | |
for VCSH_REPO_NAME in $(list); do | |
get_files | |
done | sort -u | |
} | |
list_tracked_by() { | |
use | |
git ls-files | sort -u | |
} | |
rename() { | |
git_dir_exists | |
[ -d "$GIT_DIR_NEW" ] && fatal "'$GIT_DIR_NEW' exists" 54 | |
mv -f "$GIT_DIR" "$GIT_DIR_NEW" || fatal "Could not mv '$GIT_DIR' '$GIT_DIR_NEW'" 52 | |
} | |
run() { | |
hook pre-run | |
use | |
$VCSH_EXTERNAL_COMMAND | |
hook post-run | |
} | |
setup() { | |
hook pre-setup | |
use | |
git config core.worktree "$GIT_WORK_TREE" | |
git config core.excludesfile ".gitignore.d/$VCSH_REPO_NAME" | |
git config vcsh.vcsh 'true' | |
[ -e "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" ] && git add -f "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" | |
hook post-setup | |
} | |
use() { | |
git_dir_exists | |
export GIT_WORK_TREE="$(git config --get core.worktree)" | |
export VCSH_DIRECTORY="$VCSH_REPO_NAME" | |
} | |
which() { | |
for VCSH_REPO_NAME in $(list); do | |
for VCSH_FILE in $(get_files); do | |
echo $VCSH_FILE | grep -q "$VCSH_COMMAND_PARAMETER" && echo "$VCSH_REPO_NAME: $VCSH_FILE" | |
done | |
done | sort -u | |
} | |
write_gitignore() { | |
use | |
cd "$VCSH_BASE" || fatal "could not enter '$VCSH_BASE'" 11 | |
gitignores=$(for file in $(git ls-files); do | |
while true; do | |
echo $file; new="${file%/*}" | |
[ "$file" = "$new" ] && break | |
file="$new" | |
done; | |
done | sort -u) | |
tempfile=$(mktemp) || fatal "could not create tempfile" 51 | |
echo '*' > "$tempfile" || fatal "could not write to '$tempfile'" 57 | |
for gitignore in $gitignores; do | |
echo "$gitignore" | sed 's/^/!/' >> "$tempfile" || fatal "could not write to '$tempfile'" 57 | |
if [ x$VCSH_GITIGNORE = x'recursive' ] && [ -d "$gitignore" ]; then | |
{ echo "$gitignore/*" | sed 's/^/!/' >> "$tempfile" || fatal "could not write to '$tempfile'" 57; } | |
fi | |
done | |
if diff -N "$tempfile" "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" > /dev/null; then | |
rm -f "$tempfile" || error "could not delete '$tempfile'" | |
exit | |
fi | |
if [ -e "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" ]; then | |
info "'$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME' differs from new data, moving it to '$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME.bak'" | |
mv -f "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME.bak" || | |
fatal "could not move '$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME' to '$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME.bak'" 53 | |
fi | |
mv -f "$tempfile" "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" || | |
fatal "could not move '$tempfile' to '$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME'" 53 | |
} | |
if [ ! "x$VCSH_GITIGNORE" = 'xexact' ] && [ ! "x$VCSH_GITIGNORE" = 'xrecursive' ]; then | |
fatal "'\$VCSH_GITIGNORE' must be either 'exact' or 'recursive'" 1 | |
fi | |
+ [ ! xexact = xexact ] | |
if [ "$1" = 'clone' ]; then | |
[ -z "$2" ] && fatal "$1: please specify a remote" 1 | |
export VCSH_COMMAND="$1" | |
GIT_REMOTE="$2" | |
[ -n "$3" ] && VCSH_REPO_NAME="$3" || VCSH_REPO_NAME=$(basename "$GIT_REMOTE" .git) | |
export VCSH_REPO_NAME | |
export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" | |
elif [ "$1" = 'which' ]; then | |
[ -z "$2" ] && fatal "$1: please specify a filename" 1 | |
[ -n "$3" ] && fatal "$1: too many parameters" 1 | |
export VCSH_COMMAND="$1" | |
export VCSH_COMMAND_PARAMETER="$2" | |
elif [ "$1" = 'delete' ] || | |
[ "$1" = 'enter' ] || | |
[ "$1" = 'init' ] || | |
[ "$1" = 'list-tracked-by' ] || | |
[ "$1" = 'rename' ] || | |
[ "$1" = 'run' ] || | |
[ "$1" = 'setup' ] || | |
[ "$1" = 'write-gitignore' ]; then | |
[ -z $2 ] && fatal "$1: please specify repository to work on" 1 | |
[ "$1" = 'rename' -a -z "$3" ] && fatal "$1: please specify a target name" 1 | |
[ "$1" = 'run' -a -z "$3" ] && fatal "$1: please specify a command" 1 | |
export VCSH_COMMAND="$1" | |
export VCSH_REPO_NAME="$2" | |
export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" | |
[ "$VCSH_COMMAND" = 'rename' ] && export GIT_DIR_NEW="$VCSH_REPO_D/$3.git" | |
[ "$VCSH_COMMAND" = 'run' ] && shift 2 && export VCSH_EXTERNAL_COMMAND="$*" | |
[ "$VCSH_COMMAND" = 'write-gitignore' ] | |
elif [ "$1" = 'list' ] || | |
[ "$1" = 'list-tracked' ]; then | |
export VCSH_COMMAND="$1" | |
elif [ -n "$2" ]; then | |
export VCSH_COMMAND='run' | |
export VCSH_REPO_NAME="$1" | |
export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" | |
[ -d $GIT_DIR ] || { help; exit 1; } | |
shift 1 | |
export VCSH_EXTERNAL_COMMAND="git $*" | |
elif [ -n "$1" ]; then | |
export VCSH_COMMAND='enter' | |
export VCSH_REPO_NAME="$1" | |
export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" | |
[ -d $GIT_DIR ] || { help; exit 1; } | |
else | |
# $1 is empty, or 'help' | |
help && exit | |
fi | |
+ [ rc-zsh = clone ] | |
+ [ rc-zsh = which ] | |
+ [ rc-zsh = delete ] | |
+ [ rc-zsh = enter ] | |
+ [ rc-zsh = init ] | |
+ [ rc-zsh = list-tracked-by ] | |
+ [ rc-zsh = rename ] | |
+ [ rc-zsh = run ] | |
+ [ rc-zsh = setup ] | |
+ [ rc-zsh = write-gitignore ] | |
+ [ rc-zsh = list ] | |
+ [ rc-zsh = list-tracked ] | |
+ [ -n submodule ] | |
+ export VCSH_COMMAND=run | |
+ export VCSH_REPO_NAME=rc-zsh | |
+ export GIT_DIR=/home/ioan/.config/vcsh/repo.d/rc-zsh.git | |
+ [ -d /home/ioan/.config/vcsh/repo.d/rc-zsh.git ] | |
+ shift 1 | |
+ export VCSH_EXTERNAL_COMMAND=git submodule update | |
# Did we receive a directory instead of a name? | |
# Mangle the input to fit normal operation. | |
if echo $VCSH_REPO_NAME | grep -q '/'; then | |
export GIT_DIR=$VCSH_REPO_NAME | |
export VCSH_REPO_NAME=$(basename "$VCSH_REPO_NAME" .git) | |
fi | |
+ echo rc-zsh | |
+ grep -q / | |
for check_directory in "$VCSH_REPO_D" "$VCSH_BASE/.gitignore.d" | |
do | |
if [ ! -d "$check_directory" ]; then | |
if [ -e "$check_directory" ]; then | |
fatal "'$check_directory' exists but is not a directory" 13 | |
else | |
info "attempting to create '$check_directory'" | |
mkdir -p "$check_directory" || fatal "could not create '$check_directory'" 50 | |
fi | |
fi | |
done | |
+ [ ! -d /home/ioan/.config/vcsh/repo.d ] | |
+ [ ! -d /home/ioan/.gitignore.d ] | |
verbose "$VCSH_COMMAND begin" | |
+ verbose run begin | |
+ [ -n 1 ] | |
+ echo vcsh: verbose: run begin | |
export VCSH_COMMAND=$(echo $VCSH_COMMAND | sed 's/-/_/g') | |
+ sed s/-/_/g | |
+ echo run | |
+ export VCSH_COMMAND=run | |
hook pre-command | |
+ hook pre-command | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/pre-command* ] | |
+ continue | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/rc-zsh.pre-command* ] | |
+ continue | |
$VCSH_COMMAND | |
+ run | |
+ hook pre-run | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/pre-run* ] | |
+ continue | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/rc-zsh.pre-run* ] | |
+ continue | |
+ use | |
+ git_dir_exists | |
+ [ -d /home/ioan/.config/vcsh/repo.d/rc-zsh.git ] | |
+ git config --get core.worktree | |
+ export GIT_WORK_TREE=/home/ioan | |
+ export VCSH_DIRECTORY=rc-zsh | |
+ git submodule update | |
fatal: working tree '/home/ioan' already exists. | |
Clone of 'git://github.com/trapd00r/LS_COLORS.git' into submodule path '.ls_colors' failed | |
+ hook post-run | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/post-run* ] | |
+ continue | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/rc-zsh.post-run* ] | |
+ continue | |
hook post-command | |
+ hook post-command | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/post-command* ] | |
+ continue | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/rc-zsh.post-command* ] | |
+ continue | |
verbose "$VCSH_COMMAND end, exiting" | |
+ verbose run end, exiting | |
+ [ -n 1 ] | |
+ echo vcsh: verbose: run end, exiting |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[ -z "$XDG_CONFIG_HOME" ] && XDG_CONFIG_HOME="$HOME/.config" | |
+ [ -z ] | |
+ XDG_CONFIG_HOME=/home/ioan/.config | |
[ -r "$XDG_CONFIG_HOME/vcsh/config" ] && . "$XDG_CONFIG_HOME/vcsh/config" | |
+ [ -r /home/ioan/.config/vcsh/config ] | |
[ -n "$VCSH_DEBUG" ] && set -vx | |
+ [ -n 1 ] | |
+ set -vx | |
[ -z "$VCSH_REPO_D" ] && VCSH_REPO_D="$XDG_CONFIG_HOME/vcsh/repo.d" | |
+ [ -z ] | |
+ VCSH_REPO_D=/home/ioan/.config/vcsh/repo.d | |
[ -z "$VCSH_HOOK_D" ] && VCSH_HOOK_D="$XDG_CONFIG_HOME/vcsh/hooks-enabled" | |
+ [ -z ] | |
+ VCSH_HOOK_D=/home/ioan/.config/vcsh/hooks-enabled | |
[ -z "$VCSH_BASE" ] && VCSH_BASE="$HOME" | |
+ [ -z ] | |
+ VCSH_BASE=/home/ioan | |
[ -z "$VCSH_GITIGNORE" ] && VCSH_GITIGNORE='exact' | |
+ [ -z ] | |
+ VCSH_GITIGNORE=exact | |
SELF=$(basename $0) | |
+ basename /usr/bin/vcsh | |
+ SELF=vcsh | |
help() { | |
echo "usage: $SELF <args> | |
clone <remote> \\ | |
[<repo>] Clone from an existing repository | |
help Display this help text | |
delete Delete an existing repository | |
enter Enter repository; spawn new instance of \$SHELL | |
init <repo> Initialize a new repository | |
list List all repositories | |
list-tracked List all files tracked by vcsh | |
list-tracked-by \\ | |
<repo> List files tracked by a repository | |
rename <repo> \\ | |
<newname> Rename repository | |
run <repo> \\ | |
<command> Use this repository | |
setup Set up repository with recommended settings | |
which <substring> Find substring in name of any tracked file | |
write-gitignore \\ | |
<repo> Write .gitignore.d/<repo> via git ls-files | |
<repo> <git command> Shortcut to run git commands directly | |
<repo> Shortcut to enter repository" >&2 | |
} | |
debug() { | |
[ -n "$VCSH_DEBUG" ] && echo "$SELF: debug: $@" | |
} | |
verbose() { | |
if [ -n "$VCSH_DEBUG" ] || [ -n "$VCSH_VERBOSE" ]; then echo "$SELF: verbose: $@"; fi | |
} | |
fatal() { | |
echo "$SELF: fatal: $1" >&2 | |
exit $2 | |
} | |
error() { | |
echo "$SELF: error: $1" >&2 | |
} | |
info() { | |
echo "$SELF: info: $1" | |
} | |
clone() { | |
init | |
git remote add origin "$GIT_REMOTE" | |
git config branch.master.remote origin | |
git config branch.master.merge refs/heads/master | |
if [ $(git ls-remote origin master 2> /dev/null | wc -l ) -lt 1 ]; then | |
info "remote is empty, not merging anything" | |
exit | |
fi | |
git fetch --recurse-submodules=yes | |
for object in $(git ls-tree -r origin/master | awk '{print $4}'); do | |
[ -e "$object" ] && | |
error "'$object' exists." && | |
VCSH_CONFLICT=1; | |
done | |
[ "$VCSH_CONFLICT" = '1' ] && | |
fatal "will stop after fetching and not try to merge! | |
Once this situation has been resolved, run 'vcsh run $VCSH_REPO_NAME git pull' to finish cloning.\n" 17 | |
git merge origin/master | |
} | |
delete() { | |
cd "$VCSH_BASE" || fatal "could not enter '$VCSH_BASE'" 11 | |
use | |
info "This operation WILL DETROY DATA!" | |
files=$(git ls-files) | |
echo "These files will be deleted: | |
$files | |
AGAIN, THIS WILL DELETE YOUR DATA! | |
To continue, type 'Yes, do as I say'" | |
read answer | |
[ "x$answer" = 'xYes, do as I say' ] || exit 16 | |
for file in $files; do | |
rm -f $file || info "could not delete '$file', continuing with deletion" | |
done | |
rm -r "$GIT_DIR" || error "could not delete '$GIT_DIR'" | |
} | |
enter() { | |
hook pre-enter | |
use | |
$SHELL | |
hook post-enter | |
} | |
git_dir_exists() { | |
[ -d "$GIT_DIR" ] || fatal "no repository found for '$VCSH_REPO_NAME'" 12 | |
} | |
hook() { | |
for hook in $VCSH_HOOK_D/$1* $VCSH_HOOK_D/$VCSH_REPO_NAME.$1*; do | |
[ -x "$hook" ] || continue | |
info "executing '$hook'" | |
"$hook" | |
done | |
} | |
init() { | |
[ ! -e "$GIT_DIR" ] || fatal "'$GIT_DIR' exists" 10 | |
export GIT_WORK_TREE="$VCSH_BASE" | |
mkdir -p "$GIT_WORK_TREE" || fatal "could not create '$GIT_WORK_TREE'" 50 | |
cd "$GIT_WORK_TREE" || fatal "could not enter '$GIT_WORK_TREE'" 11 | |
git init | |
setup | |
} | |
list() { | |
for i in "$VCSH_REPO_D"/*.git; do | |
echo $(basename "$i" .git) | |
done | |
} | |
get_files() { | |
export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" | |
git ls-files | |
} | |
list_tracked() { | |
for VCSH_REPO_NAME in $(list); do | |
get_files | |
done | sort -u | |
} | |
list_tracked_by() { | |
use | |
git ls-files | sort -u | |
} | |
rename() { | |
git_dir_exists | |
[ -d "$GIT_DIR_NEW" ] && fatal "'$GIT_DIR_NEW' exists" 54 | |
mv -f "$GIT_DIR" "$GIT_DIR_NEW" || fatal "Could not mv '$GIT_DIR' '$GIT_DIR_NEW'" 52 | |
} | |
run() { | |
hook pre-run | |
use | |
$VCSH_EXTERNAL_COMMAND | |
hook post-run | |
} | |
setup() { | |
hook pre-setup | |
use | |
git config core.worktree "$GIT_WORK_TREE" | |
git config core.excludesfile ".gitignore.d/$VCSH_REPO_NAME" | |
git config vcsh.vcsh 'true' | |
[ -e "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" ] && git add -f "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" | |
hook post-setup | |
} | |
use() { | |
git_dir_exists | |
export GIT_WORK_TREE="$(git config --get core.worktree)" | |
export VCSH_DIRECTORY="$VCSH_REPO_NAME" | |
} | |
which() { | |
for VCSH_REPO_NAME in $(list); do | |
for VCSH_FILE in $(get_files); do | |
echo $VCSH_FILE | grep -q "$VCSH_COMMAND_PARAMETER" && echo "$VCSH_REPO_NAME: $VCSH_FILE" | |
done | |
done | sort -u | |
} | |
write_gitignore() { | |
use | |
cd "$VCSH_BASE" || fatal "could not enter '$VCSH_BASE'" 11 | |
gitignores=$(for file in $(git ls-files); do | |
while true; do | |
echo $file; new="${file%/*}" | |
[ "$file" = "$new" ] && break | |
file="$new" | |
done; | |
done | sort -u) | |
tempfile=$(mktemp) || fatal "could not create tempfile" 51 | |
echo '*' > "$tempfile" || fatal "could not write to '$tempfile'" 57 | |
for gitignore in $gitignores; do | |
echo "$gitignore" | sed 's/^/!/' >> "$tempfile" || fatal "could not write to '$tempfile'" 57 | |
if [ x$VCSH_GITIGNORE = x'recursive' ] && [ -d "$gitignore" ]; then | |
{ echo "$gitignore/*" | sed 's/^/!/' >> "$tempfile" || fatal "could not write to '$tempfile'" 57; } | |
fi | |
done | |
if diff -N "$tempfile" "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" > /dev/null; then | |
rm -f "$tempfile" || error "could not delete '$tempfile'" | |
exit | |
fi | |
if [ -e "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" ]; then | |
info "'$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME' differs from new data, moving it to '$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME.bak'" | |
mv -f "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME.bak" || | |
fatal "could not move '$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME' to '$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME.bak'" 53 | |
fi | |
mv -f "$tempfile" "$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME" || | |
fatal "could not move '$tempfile' to '$VCSH_BASE/.gitignore.d/$VCSH_REPO_NAME'" 53 | |
} | |
if [ ! "x$VCSH_GITIGNORE" = 'xexact' ] && [ ! "x$VCSH_GITIGNORE" = 'xrecursive' ]; then | |
fatal "'\$VCSH_GITIGNORE' must be either 'exact' or 'recursive'" 1 | |
fi | |
+ [ ! xexact = xexact ] | |
if [ "$1" = 'clone' ]; then | |
[ -z "$2" ] && fatal "$1: please specify a remote" 1 | |
export VCSH_COMMAND="$1" | |
GIT_REMOTE="$2" | |
[ -n "$3" ] && VCSH_REPO_NAME="$3" || VCSH_REPO_NAME=$(basename "$GIT_REMOTE" .git) | |
export VCSH_REPO_NAME | |
export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" | |
elif [ "$1" = 'which' ]; then | |
[ -z "$2" ] && fatal "$1: please specify a filename" 1 | |
[ -n "$3" ] && fatal "$1: too many parameters" 1 | |
export VCSH_COMMAND="$1" | |
export VCSH_COMMAND_PARAMETER="$2" | |
elif [ "$1" = 'delete' ] || | |
[ "$1" = 'enter' ] || | |
[ "$1" = 'init' ] || | |
[ "$1" = 'list-tracked-by' ] || | |
[ "$1" = 'rename' ] || | |
[ "$1" = 'run' ] || | |
[ "$1" = 'setup' ] || | |
[ "$1" = 'write-gitignore' ]; then | |
[ -z $2 ] && fatal "$1: please specify repository to work on" 1 | |
[ "$1" = 'rename' -a -z "$3" ] && fatal "$1: please specify a target name" 1 | |
[ "$1" = 'run' -a -z "$3" ] && fatal "$1: please specify a command" 1 | |
export VCSH_COMMAND="$1" | |
export VCSH_REPO_NAME="$2" | |
export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" | |
[ "$VCSH_COMMAND" = 'rename' ] && export GIT_DIR_NEW="$VCSH_REPO_D/$3.git" | |
[ "$VCSH_COMMAND" = 'run' ] && shift 2 && export VCSH_EXTERNAL_COMMAND="$*" | |
[ "$VCSH_COMMAND" = 'write-gitignore' ] | |
elif [ "$1" = 'list' ] || | |
[ "$1" = 'list-tracked' ]; then | |
export VCSH_COMMAND="$1" | |
elif [ -n "$2" ]; then | |
export VCSH_COMMAND='run' | |
export VCSH_REPO_NAME="$1" | |
export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" | |
[ -d $GIT_DIR ] || { help; exit 1; } | |
shift 1 | |
export VCSH_EXTERNAL_COMMAND="git $*" | |
elif [ -n "$1" ]; then | |
export VCSH_COMMAND='enter' | |
export VCSH_REPO_NAME="$1" | |
export GIT_DIR="$VCSH_REPO_D/$VCSH_REPO_NAME.git" | |
[ -d $GIT_DIR ] || { help; exit 1; } | |
else | |
# $1 is empty, or 'help' | |
help && exit | |
fi | |
+ [ rc-zsh = clone ] | |
+ [ rc-zsh = which ] | |
+ [ rc-zsh = delete ] | |
+ [ rc-zsh = enter ] | |
+ [ rc-zsh = init ] | |
+ [ rc-zsh = list-tracked-by ] | |
+ [ rc-zsh = rename ] | |
+ [ rc-zsh = run ] | |
+ [ rc-zsh = setup ] | |
+ [ rc-zsh = write-gitignore ] | |
+ [ rc-zsh = list ] | |
+ [ rc-zsh = list-tracked ] | |
+ [ -n submodule ] | |
+ export VCSH_COMMAND=run | |
+ export VCSH_REPO_NAME=rc-zsh | |
+ export GIT_DIR=/home/ioan/.config/vcsh/repo.d/rc-zsh.git | |
+ [ -d /home/ioan/.config/vcsh/repo.d/rc-zsh.git ] | |
+ shift 1 | |
+ export VCSH_EXTERNAL_COMMAND=git submodule update | |
# Did we receive a directory instead of a name? | |
# Mangle the input to fit normal operation. | |
if echo $VCSH_REPO_NAME | grep -q '/'; then | |
export GIT_DIR=$VCSH_REPO_NAME | |
export VCSH_REPO_NAME=$(basename "$VCSH_REPO_NAME" .git) | |
fi | |
+ grep -q / | |
+ echo rc-zsh | |
for check_directory in "$VCSH_REPO_D" "$VCSH_BASE/.gitignore.d" | |
do | |
if [ ! -d "$check_directory" ]; then | |
if [ -e "$check_directory" ]; then | |
fatal "'$check_directory' exists but is not a directory" 13 | |
else | |
info "attempting to create '$check_directory'" | |
mkdir -p "$check_directory" || fatal "could not create '$check_directory'" 50 | |
fi | |
fi | |
done | |
+ [ ! -d /home/ioan/.config/vcsh/repo.d ] | |
+ [ ! -d /home/ioan/.gitignore.d ] | |
verbose "$VCSH_COMMAND begin" | |
+ verbose run begin | |
+ [ -n 1 ] | |
+ echo vcsh: verbose: run begin | |
export VCSH_COMMAND=$(echo $VCSH_COMMAND | sed 's/-/_/g') | |
+ echo run | |
+ sed s/-/_/g | |
+ export VCSH_COMMAND=run | |
hook pre-command | |
+ hook pre-command | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/pre-command* ] | |
+ continue | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/rc-zsh.pre-command* ] | |
+ continue | |
$VCSH_COMMAND | |
+ run | |
+ hook pre-run | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/pre-run* ] | |
+ continue | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/rc-zsh.pre-run* ] | |
+ continue | |
+ use | |
+ git_dir_exists | |
+ [ -d /home/ioan/.config/vcsh/repo.d/rc-zsh.git ] | |
+ git config --get core.worktree | |
+ export GIT_WORK_TREE=/home/ioan | |
+ export VCSH_DIRECTORY=rc-zsh | |
+ git submodule update | |
+ hook post-run | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/post-run* ] | |
+ continue | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/rc-zsh.post-run* ] | |
+ continue | |
hook post-command | |
+ hook post-command | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/post-command* ] | |
+ continue | |
+ [ -x /home/ioan/.config/vcsh/hooks-enabled/rc-zsh.post-command* ] | |
+ continue | |
verbose "$VCSH_COMMAND end, exiting" | |
+ verbose run end, exiting | |
+ [ -n 1 ] | |
+ echo vcsh: verbose: run end, exiting |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment