From 8c0860588dc2d44a6edba4ee10a9c55e70e1f24f Mon Sep 17 00:00:00 2001 From: John D Pell Date: Fri, 10 Sep 2021 23:15:49 -0700 Subject: [PATCH 1/3] themes/base: don't invoke svn if possible If we are specifically in the situation #1612, then check for a working `svn` command. If we're not in that situation, then don't waste time on it. --- test/fixtures/svn/broken/xcrun | 0 test/fixtures/svn/working/xcrun | 0 themes/base.theme.bash | 2 +- 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100755 test/fixtures/svn/broken/xcrun create mode 100755 test/fixtures/svn/working/xcrun diff --git a/test/fixtures/svn/broken/xcrun b/test/fixtures/svn/broken/xcrun new file mode 100755 index 00000000..e69de29b diff --git a/test/fixtures/svn/working/xcrun b/test/fixtures/svn/working/xcrun new file mode 100755 index 00000000..e69de29b diff --git a/themes/base.theme.bash b/themes/base.theme.bash index 4d6a1b7f..e39dd121 100644 --- a/themes/base.theme.bash +++ b/themes/base.theme.bash @@ -92,7 +92,7 @@ SVN_EXE=$(which svn 2> /dev/null || true) # Check for broken SVN exe that is caused by some versions of Xcode. # See https://github.com/Bash-it/bash-it/issues/1612 for more details. -if [[ -x "$SVN_EXE" ]]; then +if [[ -x "$SVN_EXE" && -x "${SVN_EXE%/*}/xcrun" ]]; then if ! "$SVN_EXE" --version > /dev/null 2>&1; then # Unset the SVN exe variable so that SVN commands are avoided. SVN_EXE="" From 9c1dbbcf12a59fc5a8c7c4389e283b4e2c02c477 Mon Sep 17 00:00:00 2001 From: John D Pell Date: Thu, 29 Jul 2021 00:21:18 -0700 Subject: [PATCH 2/3] lib/scmhelpers: reorder SCM detection waterfall This reduces the need to invoke subprocesses --- themes/base.theme.bash | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/themes/base.theme.bash b/themes/base.theme.bash index e39dd121..51c34e2e 100644 --- a/themes/base.theme.bash +++ b/themes/base.theme.bash @@ -104,18 +104,18 @@ function scm { SCM=$SCM_NONE elif [[ -f .git/HEAD ]] && [[ -x "$GIT_EXE" ]]; then SCM=$SCM_GIT - elif [[ -x "$GIT_EXE" ]] && [[ -n "$(git rev-parse --is-inside-work-tree 2> /dev/null)" ]]; then - SCM=$SCM_GIT - elif [[ -x "$P4_EXE" ]] && [[ -n "$(p4 set P4CLIENT 2> /dev/null)" ]]; then - SCM=$SCM_P4 elif [[ -d .hg ]] && [[ -x "$HG_EXE" ]]; then SCM=$SCM_HG - elif [[ -x "$HG_EXE" ]] && [[ -n "$(hg root 2> /dev/null)" ]]; then - SCM=$SCM_HG elif [[ -d .svn ]] && [[ -x "$SVN_EXE" ]]; then SCM=$SCM_SVN + elif [[ -x "$GIT_EXE" ]] && [[ -n "$(git rev-parse --is-inside-work-tree 2> /dev/null)" ]]; then + SCM=$SCM_GIT + elif [[ -x "$HG_EXE" ]] && [[ -n "$(hg root 2> /dev/null)" ]]; then + SCM=$SCM_HG elif [[ -x "$SVN_EXE" ]] && [[ -n "$(svn info --show-item wc-root 2> /dev/null)" ]]; then SCM=$SCM_SVN + elif [[ -x "$P4_EXE" ]] && [[ -n "$(p4 set P4CLIENT 2> /dev/null)" ]]; then + SCM=$SCM_P4 else SCM=$SCM_NONE fi From 476fcb4325837b10bb17a68eb886ac18a909e7c4 Mon Sep 17 00:00:00 2001 From: John D Pell Date: Sat, 11 Sep 2021 09:59:04 -0700 Subject: [PATCH 3/3] lib/theme: new `_bash_it_appearance_scm_init()` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Wrap init code in a function and call the function immediately. Several plugins do this, and it allows us to more easily implement a hooks-based system in the future. Alsö, avoid external binary `which`. Use built-in `type -P` instead. Uppercase `-P` forces a path search to avoid hashed matches and functions/aliases and whatnot. --- test/themes/base.theme.svn.bats | 23 ++++++++++++----------- themes/base.theme.bash | 30 +++++++++++++++++++----------- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/test/themes/base.theme.svn.bats b/test/themes/base.theme.svn.bats index f2866c8d..d1c2c311 100644 --- a/test/themes/base.theme.svn.bats +++ b/test/themes/base.theme.svn.bats @@ -7,7 +7,6 @@ load ../../lib/log cite _about _param _example _group _author _version load ../../lib/helpers -load ../../themes/base.theme function local_setup { setup_test_fixture @@ -23,6 +22,8 @@ function local_setup { fi export OLD_PATH="$PATH" + + load ../../themes/base.theme } function local_teardown { @@ -56,8 +57,8 @@ function setup_svn_path { setup_svn_path "$BASH_IT/test/fixtures/svn/working" - # Load the base theme again so that the working SVN script is detected - load ../../themes/base.theme + # Init the base theme again so that the working SVN script is detected + _bash_it_appearance_scm_init scm # Make sure that the SVN command is used @@ -73,8 +74,8 @@ function setup_svn_path { setup_svn_path "$BASH_IT/test/fixtures/svn/working" - # Load the base theme again so that the working SVN script is detected - load ../../themes/base.theme + # init the base theme again so that the working SVN script is detected + _bash_it_appearance_scm_init scm # Make sure that the SVN command is used @@ -89,8 +90,8 @@ function setup_svn_path { setup_svn_path "$BASH_IT/test/fixtures/svn/working" - # Load the base theme again so that the working SVN script is detected - load ../../themes/base.theme + # Init the base theme again so that the working SVN script is detected + _bash_it_appearance_scm_init scm # Make sure that no SVN command is used @@ -103,8 +104,8 @@ function setup_svn_path { setup_svn_path "$BASH_IT/test/fixtures/svn/broken" - # Load the base theme again so that the broken SVN script is detected - load ../../themes/base.theme + # Init the base theme again so that the broken SVN script is detected + _bash_it_appearance_scm_init scm # Make sure that no SVN command is not used @@ -120,8 +121,8 @@ function setup_svn_path { setup_svn_path "$BASH_IT/test/fixtures/svn/broken" - # Load the base theme again so that the broken SVN script is detected - load ../../themes/base.theme + # Init the base theme again so that the broken SVN script is detected + _bash_it_appearance_scm_init scm # Make sure that no SVN command is used diff --git a/themes/base.theme.bash b/themes/base.theme.bash index 51c34e2e..5cc791b4 100644 --- a/themes/base.theme.bash +++ b/themes/base.theme.bash @@ -85,19 +85,27 @@ RBENV_THEME_PROMPT_SUFFIX='|' RBFU_THEME_PROMPT_PREFIX=' |' RBFU_THEME_PROMPT_SUFFIX='|' -GIT_EXE=$(which git 2> /dev/null || true) -P4_EXE=$(which p4 2> /dev/null || true) -HG_EXE=$(which hg 2> /dev/null || true) -SVN_EXE=$(which svn 2> /dev/null || true) +: "${GIT_EXE:=$SCM_GIT}" +: "${P4_EXE:=$SCM_P4}" +: "${HG_EXE:=$SCM_HG}" +: "${SVN_EXE:=$SCM_SVN}" -# Check for broken SVN exe that is caused by some versions of Xcode. -# See https://github.com/Bash-it/bash-it/issues/1612 for more details. -if [[ -x "$SVN_EXE" && -x "${SVN_EXE%/*}/xcrun" ]]; then - if ! "$SVN_EXE" --version > /dev/null 2>&1; then - # Unset the SVN exe variable so that SVN commands are avoided. - SVN_EXE="" +function _bash_it_appearance_scm_init() { + GIT_EXE="$(type -P $SCM_GIT || true)" + P4_EXE="$(type -P $SCM_P4 || true)" + HG_EXE="$(type -P $SCM_HG || true)" + SVN_EXE="$(type -P $SCM_SVN || true)" + + # Check for broken SVN exe that is caused by some versions of Xcode. + # See https://github.com/Bash-it/bash-it/issues/1612 for more details. + if [[ -x "$SVN_EXE" && -x "${SVN_EXE%/*}/xcrun" ]]; then + if ! "$SVN_EXE" --version > /dev/null 2>&1; then + # Unset the SVN exe variable so that SVN commands are avoided. + SVN_EXE="" + fi fi -fi +} +_bash_it_appearance_scm_init function scm { if [[ "$SCM_CHECK" = false ]]; then