diff --git a/hosts b/hosts index 4d313cd..9a77e03 100755 --- a/hosts +++ b/hosts @@ -485,7 +485,10 @@ _verify_write_permissions() { then if ((_AUTO_SUDO)) then - sudo "${_ME}" "${_CMD}" "${_COMMAND_PARAMETERS[@]:-}" + local _my_path + _my_path="$(cd "$(dirname "$0")"; pwd)/${_ME}" + + sudo "${_my_path}" "${_CMD}" "${_COMMAND_PARAMETERS[@]:-}" exit $? else _die printf \ @@ -713,12 +716,12 @@ add() { if [[ -z "${_ip:-}" ]] then - "${_ME}" help add + help add exit 1 elif [[ -z "${_hostname:-}" ]] then printf "Please include a hostname\\n" - "${_ME}" help add + help add exit 1 elif grep \ -e "^${_ip}\\t${_hostname}$" \ @@ -794,28 +797,52 @@ backups() { printf "Backed up to %s--backup-%s\n" "${HOSTS_PATH}" "${_timestamp}" ;; compare) - if [[ -z "${1:-}" ]] + local _filename + local _use_diff=0 + + for __arg in "${@:-}" + do + case "${__arg}" in + --diff) + _use_diff=1 + ;; + *) + if [[ -z "${_filename:-}" ]] + then + _filename="${__arg}" + fi + ;; + esac + done + + if [[ -z "${_filename:-}" ]] then - "$_ME" help backups + help backups exit 1 - elif [[ ! -e "${_hosts_dirname}/${1}" ]] + elif [[ ! -e "${_hosts_dirname}/${_filename}" ]] then - printf "Backup not found: %s\n" "${1:-}" + printf "Backup not found: %s\n" "${_filename:-}" exit 1 fi local _difftool="diff" - if command -v git &>/dev/null + + if ! ((_use_diff)) then - _difftool="$(git config --get merge.tool)" + if command -v git &>/dev/null + then + local _git_merge_tool + _git_merge_tool="$(git config --get merge.tool)" + [[ -n "${_git_merge_tool}" ]] && _difftool="${_git_merge_tool}" + fi fi - "${_difftool}" "${HOSTS_PATH}" "${_hosts_dirname}/${1}" + "${_difftool}" "${HOSTS_PATH}" "${_hosts_dirname}/${_filename}" ;; delete) if [[ -z "${1:-}" ]] then - "$_ME" help backups + help backups exit 1 fi @@ -834,7 +861,7 @@ backups() { restore) if [[ -z "${1:-}" ]] then - "$_ME" help backups + help backups exit 1 elif [[ ! -e "${_hosts_dirname}/${1}" ]] then @@ -846,7 +873,7 @@ backups() { if [[ "${2:-}" != "--skip-backup" ]] then - "${_ME}" backups create + backups create fi cat "${_hosts_dirname}/${1}" > "${HOSTS_PATH}" && @@ -855,7 +882,7 @@ backups() { show) if [[ -z "${1:-}" ]] then - "$_ME" help backups + help backups exit 1 elif [[ ! -e "${_hosts_dirname}/${1}" ]] then @@ -909,16 +936,16 @@ block() { if [[ -z "${1:-}" ]] then - "${_ME}" help block + help block exit 1 fi for __hostname in "${@}" do - "${_ME}" add 127.0.0.1 "${__hostname}" + add 127.0.0.1 "${__hostname}" # block IPv6 - "${_ME}" add "fe80::1%lo0" "${__hostname}" - "${_ME}" add "::1" "${__hostname}" + add "fe80::1%lo0" "${__hostname}" + add "::1" "${__hostname}" done } @@ -939,7 +966,7 @@ disable() { if [[ -z "${_search_string:-}" ]] then - "${_ME}" help disable + help disable exit 1 else _debug printf "disable() \${_search_string}: %s\\n" "${_search_string}" @@ -993,7 +1020,7 @@ Description: List all disabled records. This is an alias for \`hosts list disabled\`. HEREDOC disabled() { - "${_ME}" list disabled + list disabled } # ------------------------------------------------------------------------ edit @@ -1033,7 +1060,7 @@ enable() { if [[ -z "${_search_string:-}" ]] then - "${_ME}" help enable + help enable exit 1 else _debug printf "enable() \${_search_string}: %s\\n" "${_search_string}" @@ -1087,7 +1114,7 @@ Description: List all enabled records. This is an alias for \`hosts list enabled\`. HEREDOC enabled() { - "${_ME}" list enabled + list enabled } # ------------------------------------------------------------------------ file @@ -1130,7 +1157,7 @@ list() { then grep -v -e '^$' -e '^\s*\#' "${HOSTS_PATH}" else - "${_ME}" show "${1}" + show "${1}" fi else # NOTE: use separate expressions since using a | for the or results in @@ -1172,7 +1199,7 @@ remove() { _debug printf "remove() \${1}: %s\\n" "${1:-}" _debug printf "remove() \${2}: %s\\n" "${2:-}" - for __arg in "${_COMMAND_ARGV[@]:-}" + for __arg in "${@:-}" do case "${__arg}" in --force) @@ -1184,23 +1211,22 @@ remove() { esac done - _debug printf "remove() \${arguments[0]}: %s\\n" "${_arguments[0]:-}" - _debug printf "remove() \${arguments[1]}: %s\\n" "${_arguments[1]:-}" - _debug printf "remove() \${arguments[2]}: %s\\n" "${_arguments[2]:-}" + _debug printf "remove() \${arguments[1]}: %s\\n" "${_arguments[0]:-}" + _debug printf "remove() \${arguments[2]}: %s\\n" "${_arguments[1]:-}" - if [[ -z "${_arguments[1]:-}" ]] + if [[ -z "${_arguments[0]:-}" ]] then - "${_ME}" help remove + help remove exit 1 - elif [[ -n "${_arguments[2]:-}" ]] + elif [[ -n "${_arguments[1]:-}" ]] then - _search_ip="${_arguments[1]}" - _search_hostname="${_arguments[2]}" + _search_ip="${_arguments[0]}" + _search_hostname="${_arguments[1]}" _is_search_pair=1 _debug printf "remove() \${_is_search_pair}: %s\\n" "${_is_search_pair}" else - _search_string="${_arguments[1]:-}" + _search_string="${_arguments[0]:-}" _debug printf "remove() \${_search_string}: %s\\n" "${_search_string}" fi @@ -1302,7 +1328,7 @@ HEREDOC search() { if _blank "${_COMMAND_ARGV[1]:-}" then - "${_ME}" help "search" + help "search" return 1 fi @@ -1342,7 +1368,7 @@ show() { printf "%s\\n" "${_disabled_records}" fi else - "${_ME}" help show + help show exit 1 fi } @@ -1361,16 +1387,16 @@ unblock() { if [[ -z "${1:-}" ]] then - "${_ME}" help unblock + help unblock exit 1 fi for __hostname in "${@}" do - "${_ME}" remove 127.0.0.1 "${__hostname}" --force + remove 127.0.0.1 "${__hostname}" --force # unblock IPv6 - "${_ME}" remove "fe80::1%lo0" "${__hostname}" --force - "${_ME}" remove "::1" "${__hostname}" --force + remove "fe80::1%lo0" "${__hostname}" --force + remove "::1" "${__hostname}" --force done } diff --git a/test/backups.bats b/test/backups.bats index 675cde6..d4430ac 100755 --- a/test/backups.bats +++ b/test/backups.bats @@ -75,18 +75,34 @@ No backups found. Create a new backup: # `hosts backups compare` ##################################################### -@test "\`backups compare\` with valid backup exits with status 0 and prints." { +@test "\`backups compare\` with valid backup exits with status 1 and prints." { { run "${_HOSTS}" backups create _backup_path="$(echo "${output}" | sed -e 's/.*\(\/tmp.*\)/\1/')" _backup_basename="$(basename "${_backup_path}")" + run "${_HOSTS}" add 0.0.0.0 example.com } - run "${_HOSTS}" backups show "${_backup_basename}" + run "${_HOSTS}" backups compare "${_backup_basename}" --diff printf "\${output}: '%s'\\n" "${output}" - printf "\${lines[6]}: '%s'\\n" "${lines[6]}" - [[ ${status} -eq 0 ]] - [[ "${lines[6]}" == '127.0.0.1 localhost' ]] + printf "\${lines[1]}: '%s'\\n" "${lines[1]}" + [[ ${status} -eq 1 ]] + [[ "${lines[1]}" == '< 0.0.0.0 example.com' ]] +} + +@test "\`backups compare\` with missing backup exits with status 1" { + { + run "${_HOSTS}" backups create + _backup_path="$(echo "${output}" | sed -e 's/.*\(\/tmp.*\)/\1/')" + _backup_basename="$(basename "${_backup_path}")" + run "${_HOSTS}" add 0.0.0.0 example.com + } + + run "${_HOSTS}" backups compare --diff + printf "\${status}: %s\\n" "${status}" + printf "\${output}: '%s'\\n" "${output}" + [[ ${status} -eq 1 ]] + [[ "${lines[0]}" =~ 'Usage' ]] } @test "\`backups compare\` with invalid backup exits with status 1" { @@ -94,9 +110,10 @@ No backups found. Create a new backup: run "${_HOSTS}" backups create _backup_path="$(echo "${output}" | sed -e 's/.*\(\/tmp.*\)/\1/')" _backup_basename="$(basename "${_backup_path}")" + run "${_HOSTS}" add 0.0.0.0 example.com } - run "${_HOSTS}" backups compare "invalid-backup-name" + run "${_HOSTS}" backups compare "invalid-backup-name" --diff printf "\${status}: %s\\n" "${status}" printf "\${output}: '%s'\\n" "${output}" [[ ${status} -eq 1 ]] diff --git a/test/fixtures/bin/hosts b/test/fixtures/bin/hosts new file mode 100755 index 0000000..f1f641a --- /dev/null +++ b/test/fixtures/bin/hosts @@ -0,0 +1 @@ +#!/usr/bin/env bash diff --git a/test/test_helper.bash b/test/test_helper.bash index 3e802c8..ccad9c0 100644 --- a/test/test_helper.bash +++ b/test/test_helper.bash @@ -18,6 +18,10 @@ setup() { cat "${BATS_TEST_DIRNAME}/fixtures/hosts" > "${_HOSTS_TEMP_PATH}" export HOSTS_PATH="${_HOSTS_TEMP_PATH}" + + # Use empty `hosts` script in environment to avoid depending on `hosts` + # being available in `$PATH`. + export PATH="${BATS_TEST_DIRNAME}/fixtures/bin:${PATH}" } teardown() {