tmux-fingers/scripts/health-check.sh

193 lines
5.0 KiB
Bash
Executable File

#!/usr/bin/env bash
CURRENT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
source $CURRENT_DIR/utils.sh
REQUIRED_BASH_MAJOR=4
REQUIRED_GAWK_MAJOR=4
RECOMMENDED_TMUX_MINOR=3
HELP_LINK="https://github.com/Morantron/tmux-fingers/blob/master/docs/health-check.md"
TMUX_FINGERS_ROOT="$(resolve_path "$CURRENT_DIR/..")"
health_tmp=$(fingers_tmp)
tmux_term_tmp=$(fingers_tmp)
log_messages=()
function is_tmux_ready() {
local attached_sessions="$(tmux list-sessions -F "#{session_id}:#{session_attached}" | grep ':1$' | wc -l)"
if [[ $attached_sessions -gt 0 ]]; then
echo 1
else
echo 0
fi
}
function version_major() {
echo "$1" | cut -f1 -d. | grep -Eo "[0-9]"
}
function version_minor() {
echo "$1" | cut -f2 -d. | grep -Eo "[0-9]"
}
function log_message() {
log_messages+=("$1")
}
function repeat_char() {
local char="$1"
local n_times="$2"
local i=0
local output=""
while [[ $i -lt "$n_times" ]]; do
output="$output$char"
i=$((i + 1))
done
echo "$output"
}
function right_pad() {
local str="$1"
local char="$2"
local max_length="$3"
local padding=$(($max_length - ${#str}))
if [[ padding -lt 0 ]]; then
padding=0
fi
echo "$str$(repeat_char "$char" "$padding")"
}
function dump_log() {
log_messages=("tmux-fingers health-check:" "" "${log_messages[@]}")
# pad messages
local i=0
for message in "${log_messages[@]}" ; do
log_messages[$i]=" $message "
i=$((i + 1))
done
# calculate max_length
local lengths=""
for message in "${log_messages[@]}" ; do
lengths="$lengths\n${#message}"
done
local max_length=$(echo -e "$lengths" | sort -r | head -n 1)
local horizontal_border="+$(repeat_char "-" $((max_length)))+"
# wrap messages within pipe chars
i=0
for message in "${log_messages[@]}" ; do
log_messages[$i]="|$(right_pad "$message" " " $((max_length)))|"
i=$((i + 1))
done
log_messages=($horizontal_border "${log_messages[@]}" $horizontal_border)
for message in "${log_messages[@]}" ; do
echo -e "$message" >> "$health_tmp"
done
}
function perform_health_check() {
local healthy=1
# BASH_VERSION is a global
local TMUX_VERSION=$(tmux -V | grep -Eio "([0-9]+(\.[0-9]))(?:-rc)?")
local GAWK_VERSION=""
if [[ $(program_exists "gawk") = "1" ]]; then
GAWK_VERSION=$(gawk -W version | grep -Eo "[0-9]+\.[0-9]\.[0-9]" | head -n 1)
fi
if [[ $(program_exists "gawk") = 0 ]]; then
log_message " * 'gawk' not found"
healthy=0
fi
if [[ $(version_major "$BASH_VERSION") -lt "$REQUIRED_BASH_MAJOR" ]]; then
log_message " * bash version \"$BASH_VERSION\" is too old. bash $REQUIRED_BASH_MAJOR.x+ is required."
healthy=0
fi
if [[ $(program_exists "gawk") = 1 ]] && [[ $(version_major "$GAWK_VERSION") -lt "$REQUIRED_GAWK_MAJOR" ]]; then
log_message " * gawk version \"$GAWK_VERSION\" is too old. gawk $REQUIRED_GAWK_MAJOR.x+ is required."
healthy=0
fi
if [[ $(version_major "$TMUX_VERSION") -lt $REQUIRED_TMUX_MAJOR ]]; then
log_message " * tmux version \"$TMUX_VERSION\" is too old. tmux $REQUIRED_TMUX_MAJOR.$RECOMMENDED_TMUX_MINOR+ is required."
healthy=0
fi
if [[ $(version_major "$TMUX_VERSION") -eq $REQUIRED_TMUX_MAJOR ]] && [[ $(version_minor "$TMUX_VERSION") -lt $RECOMMENDED_TMUX_MINOR ]]; then
echo " * WARNING: tmux 2.2+ is recommended"
fi
tmux run-shell -b "tmux wait-for -S tmux_term_value && echo \"\$TERM\" > $tmux_term_tmp"
tmux wait-for tmux_term_value
TMUX_TERM=$(cat "$tmux_term_tmp")
# TODO it would be better to check for 256color or true color support
if [[ "$TMUX_TERM" == "screen" ]]; then
log_message " * Wrong \$TERM value '$TMUX_TERM'. Please add this to your .tmux.conf:"
log_message ""
log_message " set -g default-terminal 'screen-256color'"
log_message " tmux source ~/.tmux.conf"
log_message ""
healthy=0
fi
if [[ $(is_dir_empty "$CURRENT_DIR/../vendor/tmux-printer") == "1" ]]; then
log_message " * Submodules not initialized properly. Please run:"
log_message ""
log_message " cd $TMUX_FINGERS_ROOT"
log_message " git submodule update --init --recursive"
log_message " tmux source ~/.tmux.conf"
log_message ""
healthy=0
fi
if [[ $(version_major "$TMUX_VERSION") -le "2" ]] && \
[[ $(version_minor "$TMUX_VERSION") -lt "6" ]] && \
[[ "$OSTYPE" == "darwin"* ]] && \
[[ $(program_exists "reattach-to-user-namespace") == "0" ]];
then
log_message " * It's recommended to install 'reattach-to-user-namespace' for better"
log_message " clipboard integration in OSX. Please run:"
log_message ""
log_message " brew install reattach-to-user-namespace"
log_message ""
healthy=0
fi
if [[ $healthy -eq 0 ]]; then
log_message ""
log_message "Follow this link for help on fixing issues:"
log_message ""
log_message " $HELP_LINK"
log_message ""
dump_log
while [[ $(is_tmux_ready) = 0 ]]; do
: # waiting for-tmux
done
cat $health_tmp
fi
sleep 0.5
rm -rf "$health_tmp"
rm -rf "$tmux_term_tmp"
}
perform_health_check