diff --git a/scripts/install_plugins.sh b/scripts/install_plugins.sh index dc2d310..144e3a0 100755 --- a/scripts/install_plugins.sh +++ b/scripts/install_plugins.sh @@ -5,32 +5,84 @@ CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" source "$CURRENT_DIR/shared_functions.sh" clone() { - local plugin=$1 - cd $SHARED_TPM_PATH && + local plugin; plugin="$1" + cd "$SHARED_TPM_PATH" && 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; 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; 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 install_plugin() { - local plugin="$1" - local plugin_name="$(shared_plugin_name "$plugin")" + local plugin; plugin="$1" + local plugin_name; plugin_name="$(shared_plugin_name "$plugin")" if plugin_already_installed "$plugin"; then # 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..430df6e 100644 --- a/scripts/shared_functions.sh +++ b/scripts/shared_functions.sh @@ -16,15 +16,31 @@ shared_get_tpm_plugins_list() { } # 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}" - echo "$plugin_name" + plugin_name="${plugin_name%.git}" + printf "%s\\n" "$plugin_name" } shared_plugin_path() { @@ -47,8 +63,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 +74,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_download_extended b/tests/expect_successful_plugin_download_extended new file mode 100755 index 0000000..e4cd43d --- /dev/null +++ b/tests/expect_successful_plugin_download_extended @@ -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_installation_extended.sh b/tests/test_plugin_installation_extended.sh new file mode 100755 index 0000000..39037a7 --- /dev/null +++ b/tests/test_plugin_installation_extended.sh @@ -0,0 +1,62 @@ +#!/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 + + #tmux; exit 0 + # opens tmux and test it with `expect` + "$CURRENT_DIR"/expect_successful_plugin_download_extended || + 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