From 792d11e85a8aeec9bd7e92e8a6e6b097a2d32727 Mon Sep 17 00:00:00 2001 From: Tyler Akins Date: Tue, 16 Jun 2015 14:02:54 -0500 Subject: [PATCH] Removing the multiple calls to determine VCS type This removed the subshell from _determine_vcs_base_and_type so it can set environment variables. Because this always runs at the beginning of the scripts, there's no need to do checking if REPOBASE is unset or if VCS_TYPE is not yet determined, thus I simplified one function and eliminated which_vcs. --- bin/_blackbox_common.sh | 91 +++++++++++++--------------------- bin/blackbox_deregister_file | 3 +- bin/blackbox_register_new_file | 2 +- bin/blackbox_update_all_files | 3 +- 4 files changed, 37 insertions(+), 62 deletions(-) diff --git a/bin/_blackbox_common.sh b/bin/_blackbox_common.sh index 17a71a4..4ae0aec 100755 --- a/bin/_blackbox_common.sh +++ b/bin/_blackbox_common.sh @@ -17,45 +17,36 @@ : "${EDITOR:=vi}" ; -# Outputs a string that is the base directory of this VCS repo. -# By side-effect, sets the variable VCS_TYPE to either 'git', 'hg', -# 'svn' or 'unknown'. -function _determine_vcs_base_and_type() { - if git rev-parse --show-toplevel 2>/dev/null ; then - VCS_TYPE=git - elif [ -d ".svn" ] ; then - #find topmost dir with .svn sub-dir - parent="" - grandparent="." - mydir="$(pwd)" - while [ -d "$grandparent/.svn" ]; do - parent=$grandparent - grandparent="$parent/.." - done +# Set REPOBASE to the top of the repository +# Set VCS_TYPE to 'git', 'hg', 'svn' or 'unknown' +if git rev-parse --show-toplevel >/dev/null 2>&1 ; then + VCS_TYPE=git + REPOBASE=$(git rev-parse --show-toplevel) +elif [ -d ".svn" ] ; then + # Find topmost dir with .svn sub-dir + parent="" + grandparent="." + while [ -d "$grandparent/.svn" ]; do + parent=$grandparent + grandparent="$parent/.." + done - if [ ! -z "$parent" ]; then - cd "$parent" - pwd - else - exit 1 - fi - cd "$mydir" - VCS_TYPE=svn - elif hg root 2>/dev/null ; then - # NOTE: hg has to be tested last because it always "succeeds". - VCS_TYPE=hg - else - # We aren't in a repo at all. Assume the cwd is the root - # of the tree. - echo . - VCS_TYPE=unknown - fi - export VCS_TYPE - # FIXME: Verify this function by checking for .hg or .git - # after determining what we believe to be the answer. -} + REPOBASE=$(cd "$parent" ; pwd) + VCS_TYPE=svn +elif hg root >/dev/null 2>&1 ; then + # NOTE: hg has to be tested last because it always "succeeds". + VCS_TYPE=hg + REPOBASE=$(hg root 2>/dev/null) +else + # We aren't in a repo at all. Assume the cwd is the root + # of the tree. + VCS_TYPE=unknown + REPOBASE="$(pwd)" +fi +export VCS_TYPE +# FIXME: Verify this function by checking for .hg or .git +# after determining what we believe to be the answer. -REPOBASE=$(_determine_vcs_base_and_type) KEYRINGDIR="$REPOBASE/$BLACKBOXDATA" BB_ADMINS_FILE="blackbox-admins.txt" BB_ADMINS="${KEYRINGDIR}/${BB_ADMINS_FILE}" @@ -91,7 +82,6 @@ function fail_if_not_exists() { # Exit we we aren't in a VCS repo. function fail_if_not_in_repo() { - _determine_vcs_base_and_type if [[ $VCS_TYPE = "unknown" ]]; then echo "ERROR: This must be run in a VCS repo: git, hg, or svn." >&2 echo Exiting... >&2 @@ -279,10 +269,6 @@ function enumerate_subdirs() { # chdir to the base of the repo. function change_to_vcs_root() { - if [[ $REPOBASE = '' ]]; then - echo 'ERROR: _determine_vcs_base_and_type failed to set REPOBASE.' - exit 1 - fi cd "$REPOBASE" } @@ -345,18 +331,9 @@ function md5sum_file() { # Abstract the difference between git and hg: # -# Are we in git, hg, or unknown repo? -function which_vcs() { - if [[ $VCS_TYPE = '' ]]; then - _determine_vcs_base_and_type >/dev/null - fi - echo "$VCS_TYPE" -} - - # Is this file in the current repo? function is_in_vcs() { - is_in_$(which_vcs) "$@" + is_in_$VCS_TYPE "$@" } # Mercurial function is_in_hg() { @@ -410,7 +387,7 @@ function is_in_unknown() { # Add a file to the repo (but don't commit it). function vcs_add() { - vcs_add_$(which_vcs) "$@" + vcs_add_$VCS_TYPE "$@" } # Mercurial function vcs_add_hg() { @@ -436,7 +413,7 @@ function vcs_add_unknown() { # Commit a file to the repo function vcs_commit() { - vcs_commit_$(which_vcs) "$@" + vcs_commit_$VCS_TYPE "$@" } # Mercurial function vcs_commit_hg() { @@ -463,7 +440,7 @@ function vcs_commit_unknown() { # Remove file from repo, even if it was deleted locally already. # If it doesn't exist yet in the repo, it should be a no-op. function vcs_remove() { - vcs_remove_$(which_vcs) "$@" + vcs_remove_$VCS_TYPE "$@" } # Mercurial function vcs_remove_hg() { @@ -491,7 +468,7 @@ function vcs_remove_unknown() { function vcs_ignore() { local file for file in "$@"; do - vcs_ignore_$(which_vcs) "$file" + vcs_ignore_$VCS_TYPE "$file" done } # Mercurial @@ -532,7 +509,7 @@ function vcs_ignore_generic_file() { function vcs_notice() { local file for file in "$@"; do - vcs_notice_$(which_vcs) "$file" + vcs_notice_$VCS_TYPE "$file" done } # Mercurial diff --git a/bin/blackbox_deregister_file b/bin/blackbox_deregister_file index f4ea76e..c1a38fb 100755 --- a/bin/blackbox_deregister_file +++ b/bin/blackbox_deregister_file @@ -9,7 +9,6 @@ set -e blackbox_home=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd ) source "${blackbox_home}/_blackbox_common.sh" -_determine_vcs_base_and_type unencrypted_file=$(get_unencrypted_filename "$1") encrypted_file=$(get_encrypted_filename "$1") @@ -32,4 +31,4 @@ vcs_remove "$BB_FILES" vcs_commit "Removing from blackbox: ${unencrypted_file}" echo "========== UPDATING VCS: DONE" echo "Local repo updated. Please push when ready." -echo " $(which_vcs) push" +echo " $VCS_TYPE push" diff --git a/bin/blackbox_register_new_file b/bin/blackbox_register_new_file index 9bd9508..79a1f7b 100755 --- a/bin/blackbox_register_new_file +++ b/bin/blackbox_register_new_file @@ -47,4 +47,4 @@ vcs_add "$BB_FILES" "$encrypted_file" vcs_commit "registered in blackbox: ${unencrypted_file}" "$BB_FILES" "$encrypted_file" echo "========== UPDATING VCS: DONE" echo "Local repo updated. Please push when ready." -echo " $(which_vcs) push" +echo " $VCS_TYPE push" diff --git a/bin/blackbox_update_all_files b/bin/blackbox_update_all_files index 041140f..74142f3 100755 --- a/bin/blackbox_update_all_files +++ b/bin/blackbox_update_all_files @@ -60,7 +60,6 @@ while IFS= read <&99 -r unencrypted_file; do done 99<"$BB_FILES" vcs_commit 'Re-encrypted keys' -VCSCMD=$(which_vcs) echo '========== DONE.' echo 'Likely next step:' -echo " ${VCSCMD} push" +echo " $VCS_TYPE push"