X-Git-Url: https://git.madduck.net/code/vcsh.git/blobdiff_plain/c03340ae79c2230828c3b3e15a314e167f637d2e..77739e9453107e3f69fa809e940885f316fb9a15:/vcsh?ds=sidebyside diff --git a/vcsh b/vcsh index 54026cf..4464c85 100755 --- a/vcsh +++ b/vcsh @@ -108,9 +108,8 @@ help() { help Display this help text init Initialize a new repository list List all repositories - list-tracked List all files tracked by vcsh - list-tracked-by \\ - List files tracked by a repository + list-tracked \\ + [] List all files tracked all or one repositories list-untracked \\ [<-r>] [] List all files not tracked by all or one repositories pull Pull from all vcsh remotes @@ -247,46 +246,22 @@ get_files() { } list_tracked() { - for VCSH_REPO_NAME in $(list); do - get_files - done | sed "s,^,$(printf '%s\n' "$VCSH_BASE/" | \ - sed 's/[,\&]/\\&/g')," | sort -u -} - -list_tracked_by() { - use - git ls-files | sed "s,^,$(printf '%s\n' "$VCSH_BASE/" | \ - sed 's/[,\&]/\\&/g')," | sort -u -} - -pull() { - hook pre-pull - for VCSH_REPO_NAME in $(list); do - printf '%s: ' "$VCSH_REPO_NAME" - GIT_DIR=$VCSH_REPO_D/$VCSH_REPO_NAME.git; export GIT_DIR - use - git pull - VCSH_COMMAND_RETURN_CODE=$? - echo - done - hook post-pull + VCSH_REPO_NAME=$2; export VCSH_REPO_NAME + if [ -n "$VCSH_REPO_NAME" ]; then + get_files | list_tracked_helper + else + for VCSH_REPO_NAME in $(list); do + get_files + done | list_tracked_helper + fi } -push() { - hook pre-push - for VCSH_REPO_NAME in $(list); do - printf '%s: ' "$VCSH_REPO_NAME" - GIT_DIR=$VCSH_REPO_D/$VCSH_REPO_NAME.git; export GIT_DIR - use - git push - VCSH_COMMAND_RETURN_CODE=$? - echo - done - hook post-push +list_tracked_helper() { + sed "s,^,$(printf '%s\n' "$VCSH_BASE/" | sed 's/[,\&]/\\&/g')," | sort -u } -retire() { - unset VCSH_DIRECTORY +list_tracked_by() { + list_tracked $2 } list_untracked() { @@ -338,6 +313,36 @@ list_untracked_helper() { comm -12 --nocheck-order $temp_file_others $temp_file_untracked_copy > $temp_file_untracked } +pull() { + hook pre-pull + for VCSH_REPO_NAME in $(list); do + printf '%s: ' "$VCSH_REPO_NAME" + GIT_DIR=$VCSH_REPO_D/$VCSH_REPO_NAME.git; export GIT_DIR + use + git pull + VCSH_COMMAND_RETURN_CODE=$? + echo + done + hook post-pull +} + +push() { + hook pre-push + for VCSH_REPO_NAME in $(list); do + printf '%s: ' "$VCSH_REPO_NAME" + GIT_DIR=$VCSH_REPO_D/$VCSH_REPO_NAME.git; export GIT_DIR + use + git push + VCSH_COMMAND_RETURN_CODE=$? + echo + done + hook post-push +} + +retire() { + unset VCSH_DIRECTORY +} + rename() { git_dir_exists [ -d "$GIT_DIR_NEW" ] && fatal "'$GIT_DIR_NEW' exists" 54 @@ -374,6 +379,12 @@ status() { status_helper() { GIT_DIR=$VCSH_REPO_D/$VCSH_REPO_NAME.git; export GIT_DIR use + remote_tracking_branch=$(git rev-parse --abbrev-ref --symbolic-full-name @{u} 2> /dev/null) && { + commits_behind=$(git log ..${remote_tracking_branch} --oneline | wc -l) + commits_ahead=$(git log ${remote_tracking_branch}.. --oneline | wc -l) + [ ${commits_behind} -ne 0 ] && echo "Behind $remote_tracking_branch by $commits_behind commits" + [ ${commits_ahead} -ne 0 ] && echo "Ahead of $remote_tracking_branch by $commits_ahead commits" + } git status --short --untracked-files='no' VCSH_COMMAND_RETURN_CODE=$? } @@ -568,6 +579,9 @@ check_dir "$VCSH_REPO_D" verbose "$VCSH_COMMAND begin" VCSH_COMMAND=$(echo "$VCSH_COMMAND" | sed 's/-/_/g'); export VCSH_COMMAND +# Source repo-specific configuration file +[ -r "$XDG_CONFIG_HOME/vcsh/config.d/$VCSH_REPO_NAME" ] && . "$XDG_CONFIG_HOME/vcsh/config.d/$VCSH_REPO_NAME" + # source overlay functions for overlay in "$VCSH_OVERLAY_D/$VCSH_COMMAND"* "$VCSH_OVERLAY_D/$VCSH_REPO_NAME.$VCSH_COMMAND"*; do [ -r "$overlay" ] || continue