diff --git a/scripts/install_plugins.sh b/scripts/install_plugins.sh index dc2d310..99a1ecb 100755 --- a/scripts/install_plugins.sh +++ b/scripts/install_plugins.sh @@ -10,13 +10,46 @@ clone() { GIT_TERMINAL_PROMPT=0 git clone --recursive $plugin } +install_plugin_git() { + local plugin; plugin="$1" + local branch; branch=":${1##*:}" + plugin="${1%$branch}" + clone "$plugin" || + clone "git:$plugin" + if [ "${branch}" != ":${1}" ]; then #if exists branch/revision + (cd "$SHARED_TPM_PATH"/$(shared_plugin_name "$plugin") && + git checkout -q "${branch#:}" 2>&1 >/dev/null) + fi +} + # tries cloning: # 1. plugin name directly - works if it's a valid git url # 2. expands the plugin name to point to a github repo and tries cloning again -clone_plugin() { - local plugin=$1 +install_plugin_github() { + local plugin; plugin="$1" + local branch; branch=":${1##*:}" + plugin="${1%$branch}" clone "$plugin" || clone "https://git::@github.com/$plugin" + if [ "${branch}" != ":${1}" ]; then #if exists branch/revision + (cd "$SHARED_TPM_PATH"/$(shared_plugin_name "$plugin") && + git checkout -q "${branch#:}" 2>&1 >/dev/null) + fi +} + +install_plugin_web() { + local plugin; plugin="$1" + local plugin_name="$(shared_plugin_name "$plugin")" + (cd "$SHARED_TPM_PATH" && mkdir "${plugin_name}" && + cd "${plugin_name}" && (wget --no-check-certificate "${plugin}" || + curl -k -s -O "${plugin}")) +} + +install_plugin_local() { + local plugin; plugin="$1" + local plugin_name="$(shared_plugin_name "$plugin")" + (cd "$SHARED_TPM_PATH" && mkdir "${plugin_name}" && + cd "${plugin_name}" && cp -r "${plugin}" .) } # pull new changes or clone plugin @@ -28,9 +61,29 @@ install_plugin() { # plugin is already installed echo_message "Already installed \"$plugin_name\"" else - # plugin wasn't cloned so far - clone it echo_message "Installing \"$plugin_name\"" - clone_plugin "$plugin" && + + local handler; handler="${1%%:*}:" + plugin="${1#$handler}" + + case "${handler}" in + ''|*/*) case "${1}" in + /*|~*|\$*) install_plugin_local "${1}" ;; + *) install_plugin_github "${1}" ;; + esac ;; + gh*|github*|git@github.com*) install_plugin_github "${plugin}" ;; + git:) install_plugin_git "${plugin}" ;; + file:) install_plugin_local "${plugin#//}" ;; + http:|ftp:) install_plugin_web "${1}" ;; + https:) + case "${1}" in + *github.com/*) install_plugin_github "${plugin#//github.com/}";; + *) install_plugin_web "${1}";; + esac ;; + *) set_false ;; + esac + + [ X"${?}" = X"0" ] && echo_message " \"$plugin_name\" download success" || echo_message " \"$plugin_name\" download fail" fi diff --git a/scripts/shared_functions.sh b/scripts/shared_functions.sh index efa9e89..983540f 100644 --- a/scripts/shared_functions.sh +++ b/scripts/shared_functions.sh @@ -5,25 +5,51 @@ SHARED_TPM_PATH="" # sets a "global variable" for the current file shared_set_tpm_path_constant() { - local string_path="$(tmux show-environment -g TMUX_PLUGIN_MANAGER_PATH | cut -f2 -d=)" + #local string_path="$(tmux show-environment -g TMUX_PLUGIN_MANAGER_PATH | cut -f2 -d=)" + #pipes(due to fork) are expensive, the less the better + local string_path="$(tmux show-environment -g TMUX_PLUGIN_MANAGER_PATH)"; string_path="${string_path##*=}" # NOTE: manually expanding tilde or `$HOME` variable. Avoids using `eval` as # described here http://stackoverflow.com/a/5748307/777337 - SHARED_TPM_PATH="$(echo "$string_path" | sed "s,^\$HOME,$HOME," | sed "s,^~,$HOME,")" + SHARED_TPM_PATH="$(echo "$string_path" | sed "s,^\$HOME,$HOME,;s,^~,$HOME,;")" } shared_get_tpm_plugins_list() { - tmux show-option -gqv "$tpm_plugins_variable_name" + local plugins_list + plugins_list="$(tmux show-option -gqv "$tpm_plugins_variable_name")" + if [ -z "${plugins_list}" ]; then + cat /etc/tmux.conf ~/.tmux.conf 2>/dev/null | \ + #read set -g @bundle "tmux-plugins/tmux-example-plugin" entries + awk '/set.*-g.*@[bB][uU][nN][dD][lL][eE]/ {if($1!~"^#"){gsub(/'\''/,"");gsub(/'\"'/,"");print $4}}' #recover vim syntax' + else + printf "%s\\n" "${plugins_list}" + fi } # Allowed plugin name formats: -# 1. "git://github.com/user/plugin_name.git" -# 2. "user/plugin_name" +# 1. "user/plugin_name" +# 2. "user/plugin_name:branch" +# 3. "gh:user/plugin_name" +# 4. "gh:user/plugin_name:branch" +# 5. "github:user/plugin_name" +# 6. "github:user/plugin_name:branch" +# 7. "http://github.com/user/plugin_name" +# 8. "https://github.com/user/plugin_name:branch" +# 9. "git://github.com/user/plugin_name.git" +# 10. "git://github.com/user/plugin_name.git:branch" +# 11. "git://domain.tld/plugin_name" +# 12. "git://domain.tld/plugin_name:branch" +# 13. "http://domain.tld/plugin_name" +# 14. "https://domain.tld/plugin_name" +# 15. "ftp://domain.tld/plugin_name" +# 16. "file://local/path/plugin_name" shared_plugin_name() { - local plugin="$1" - # get only the part after the last slash, e.g. "plugin_name.git" - local plugin_basename="$(basename "$plugin")" + local plugin; plugin="$1" + # get only the part after the last slash, e.g. "plugin_name.git:branch" + local plugin_basename; plugin_basename="$(basename "$plugin")" + # remove branch (if it exists) to get only "plugin_name.git" + local plugin_name; plugin_name="${plugin_basename%:*}" # remove ".git" extension (if it exists) to get only "plugin_name" - local plugin_name="${plugin_basename%.git}" + plugin_name="${plugin_name%.git}" echo "$plugin_name" } @@ -47,8 +73,8 @@ reload_tmux_environment() { plugin_already_installed() { local plugin="$1" local plugin_path="$(shared_plugin_path "$plugin")" - cd "$plugin_path" && - git remote >/dev/null 2>&1 + cd "$plugin_path" #&& unmarry from git + #git remote >/dev/null 2>&1 } end_message() { @@ -58,6 +84,11 @@ end_message() { echo_message "Done, press ENTER to continue." } +set_false() +{ + return 1 +} + # Ensures a message is displayed for 5 seconds in tmux prompt. # Does not override the 'display-time' tmux option. display_message() { diff --git a/tests/expect_successful_plugin_bundle_download b/tests/expect_successful_plugin_bundle_download new file mode 100755 index 0000000..e4cd43d --- /dev/null +++ b/tests/expect_successful_plugin_bundle_download @@ -0,0 +1,92 @@ +#!/usr/bin/env expect + +# disables script output +log_user 0 + +spawn tmux + +# Waiting for tmux to attach. If this is not done, next command, `send` will +# not work properly. +sleep 1 + +# this is tmux prefix + I +send "I" + +# cloning might take a while +set timeout 15 + +expect { + "Installing \"tmux-example-plugin\"" { +expect { + "\"tmux-example-plugin\" download success" { +expect { + "Installing \"tmux-online-status\"" { +expect { + "\"tmux-online-status\" download success" { +expect { + "Installing \"tmux-battery\"" { +expect { + "\"tmux-battery\" download success" { +expect { + "Installing \"tmux-sidebar\"" { +expect { + "\"tmux-sidebar\" download success" { +expect { + "Installing \"tmux-sensible\"" { +expect { + "\"tmux-sensible\" download success" { +expect { + "Installing \"sha1sum.txt\"" { +expect { + "\"sha1sum.txt\" download success" { +expect { + "Installing \"meta-micro\"" { +expect { + "\"meta-micro\" download success" { +expect { + "Installing \"readme.txt\"" { +expect { + "\"readme.txt\" download success" { +expect { + "Installing \"run-tests-within-vm\"" { +expect { + "\"run-tests-within-vm\" download success" { + expect { "Done, press ENTER to continue" { + send " " + }}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}} + + timeout { + puts "Plugin installation timeout (1)"; + exit 1 + } +} + +# this is tmux prefix + I +send "I" + +expect { + "Already installed \"tmux-example-plugin\"" { +expect { + "Already installed \"tmux-online-status\"" { +expect { + "Already installed \"tmux-battery\"" { +expect { + "Already installed \"tmux-sidebar\"" { +expect { + "Already installed \"tmux-sensible\"" { +expect { + "Already installed \"sha1sum.txt\"" { +expect { + "Already installed \"meta-micro\"" { +expect { + "Already installed \"readme.txt\"" { +expect { + "Already installed \"run-tests-within-vm\"" { + expect { "Done, press ENTER to continue" { exit 0 + }}}}}}}}}}}}}}}}}}} + + timeout { + puts "Plugin installation timeout (2)"; + exit 1 + } +} diff --git a/tests/test_plugin_bundle_installation.sh b/tests/test_plugin_bundle_installation.sh new file mode 100755 index 0000000..7a9617a --- /dev/null +++ b/tests/test_plugin_bundle_installation.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +source $CURRENT_DIR/helpers.sh + +test_plugin_installation() { + set_tmux_conf_helper <<- HERE + set -g @bundle "tmux-plugins/tmux-example-plugin" + set -g @Bundle "gh:tmux-plugins/tmux-online-status" + set -g @BUNDLE "github:tmux-plugins/tmux-battery" + set -g @BUNDLE "github:tmux-plugins/tmux-sidebar:master" + set -g @BUNDLE "https://github.com/tmux-plugins/tmux-sensible:3ea5b" + set -g @BUNDLE "http://ovh.net/files/sha1sum.txt" + set -g @BUNDLE "git://git.openembedded.org/meta-micro" + set -g @BUNDLE "ftp://ftp.microsoft.com/developr/readme.txt" + set -g @BUNDLE "file://$PWD/tests/run-tests-within-vm" + run-shell "$PWD/tpm" + HERE + + # opens tmux and test it with `expect` + $CURRENT_DIR/expect_successful_plugin_bundle_download || + fail_helper "Tmux plugin installation fails" + + # check plugin dir exists after download + check_dir_exists_helper "$HOME/.tmux/plugins/tmux-example-plugin/" || + fail_helper "Plugin tmux-plugins/tmux-example-plugin download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/tmux-online-status/" || + fail_helper "Plugin gh:tmux-plugins/tmux-online-status download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/tmux-battery/" || + fail_helper "Plugin github:tmux-plugins/tmux-battery download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/tmux-sidebar/" || + fail_helper "Plugin github:tmux-plugins/tmux-sidebar:master download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/tmux-sensible/" || + fail_helper "Plugin https://github.com/tmux-plugins/tmux-sensible:3ea5b download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/sha1sum.txt/" || + fail_helper "Plugin http://ovh.net/files/sha1sum.txt download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/meta-micro/" || + fail_helper "Plugin git://git.openembedded.org/meta-micro download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/readme.txt/" || + fail_helper "Plugin ftp://ftp.microsoft.com/developr/readme.txt download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/run-tests-within-vm/" || + fail_helper "Plugin file://$PWD/tests/run-tests-within-vm failed" + + teardown_helper +} + +main() { + test_plugin_installation + exit_value_helper +} +main diff --git a/tests/test_plugin_installation_extended.sh b/tests/test_plugin_installation_extended.sh new file mode 100755 index 0000000..8dbb5a4 --- /dev/null +++ b/tests/test_plugin_installation_extended.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash + +CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +source $CURRENT_DIR/helpers.sh + +test_plugin_installation() { + set_tmux_conf_helper <<- HERE + set -g @tpm_plugins " \ + tmux-plugins/tmux-example-plugin \ + gh:tmux-plugins/tmux-online-status \ + github:tmux-plugins/tmux-battery \ + github:tmux-plugins/tmux-sidebar:master \ + https://github.com/tmux-plugins/tmux-sensible:3ea5b \ + http://ovh.net/files/sha1sum.txt \ + git://git.openembedded.org/meta-micro \ + ftp://ftp.microsoft.com/developr/readme.txt \ + file://$PWD/tests/run-tests-within-vm" + run-shell "$PWD/tpm" + HERE + + # opens tmux and test it with `expect` + $CURRENT_DIR/expect_successful_plugin_bundle_download || + fail_helper "Tmux plugin installation fails" + + # check plugin dir exists after download + check_dir_exists_helper "$HOME/.tmux/plugins/tmux-example-plugin/" || + fail_helper "Plugin tmux-plugins/tmux-example-plugin download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/tmux-online-status/" || + fail_helper "Plugin gh:tmux-plugins/tmux-online-status download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/tmux-battery/" || + fail_helper "Plugin github:tmux-plugins/tmux-battery download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/tmux-sidebar/" || + fail_helper "Plugin github:tmux-plugins/tmux-sidebar:master download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/tmux-sensible/" || + fail_helper "Plugin https://github.com/tmux-plugins/tmux-sensible:3ea5b download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/sha1sum.txt/" || + fail_helper "Plugin http://ovh.net/files/sha1sum.txt download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/meta-micro/" || + fail_helper "Plugin git://git.openembedded.org/meta-micro download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/readme.txt/" || + fail_helper "Plugin ftp://ftp.microsoft.com/developr/readme.txt download failed" + + check_dir_exists_helper "$HOME/.tmux/plugins/run-tests-within-vm/" || + fail_helper "Plugin file://$PWD/tests/run-tests-within-vm failed" + + teardown_helper +} + +main() { + test_plugin_installation + exit_value_helper +} +main