diff --git a/tools/op.sh b/tools/op.sh index bbc4ded445acda..111a06e81c0487 100755 --- a/tools/op.sh +++ b/tools/op.sh @@ -2,6 +2,8 @@ RED='\033[0;31m' GREEN='\033[0;32m' +UNDERLINE='\033[4m' +BOLD='\033[1m' NC='\033[0m' function op_first_install() { @@ -12,7 +14,7 @@ function op_first_install() { if [ "$(uname)" == "Darwin" ] && [ $SHELL == "/bin/bash" ]; then RC_FILE="$HOME/.bash_profile" fi - printf "\nalias op='source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )/op.sh" \"\$@\"'\n" >> $RC_FILE + op_run_command printf "\nalias op='source "$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )/op.sh" \"\$@\"'\n" >> $RC_FILE echo -e " ↳ [${GREEN}✔${NC}] op installed successfully. Open a new shell to use it.\n" ) @@ -21,14 +23,25 @@ function op_first_install() { # be default, assume openpilot dir is in current directory OPENPILOT_ROOT=$(pwd) function op_check_openpilot_dir() { - (set -e + while [[ "$OPENPILOT_ROOT" != '/' ]]; + do + if find "$OPENPILOT_ROOT/launch_openpilot.sh" -maxdepth 1 -mindepth 1 &> /dev/null; then + return 0 + fi + OPENPILOT_ROOT="$(readlink -f "$OPENPILOT_ROOT/"..)" + done - if [ ! -f "$OPENPILOT_ROOT/launch_openpilot.sh" ]; then - echo "openpilot directory not found!" - return 1 - fi + echo "openpilot directory not found! Make sure that you are inside openpilot" + echo "directory or specify one with the --dir option!" + return 1 +} - ) +function op_run_command() { + CMD="$@" + echo -e "${BOLD}Running:${NC} $CMD" + if [[ -z "$DRY" ]]; then + $CMD + fi } function op_check_git() { @@ -118,7 +131,7 @@ function op_check_python() { # this must be run in the same shell as the user calling "op" function op_venv() { op_check_openpilot_dir || return 1 - source $OPENPILOT_ROOT/.venv/bin/activate || (echo -e "\nCan't activate venv. Have you ran 'op install' ?" && return 1) + op_run_command source $OPENPILOT_ROOT/.venv/bin/activate || (echo -e "\nCan't activate venv. Have you ran 'op install' ?" && return 1) } function op_check() { @@ -138,7 +151,8 @@ function op_run() { op_venv cd $OPENPILOT_ROOT - $OPENPILOT_ROOT/launch_openpilot.sh + + op_run_command $OPENPILOT_ROOT/launch_openpilot.sh ) } @@ -170,7 +184,7 @@ function op_build() { op_venv cd $OPENPILOT_ROOT - scons $@ || echo -e "\nBuild failed. Have you ran 'op install' ?" + op_run_command scons $@ ) } @@ -181,7 +195,28 @@ function op_juggle() { op_venv cd $OPENPILOT_ROOT - $OPENPILOT_ROOT/tools/plotjuggler/juggle.py $@ + op_run_command $OPENPILOT_ROOT/tools/plotjuggler/juggle.py $@ + + ) +} + +function op_linter() { + (set -e + + op_venv + cd $OPENPILOT_ROOT + + op_run_command pre-commit run --all $@ + + ) +} + +function op_replay() { + (set -e + op_check_openpilot_dir + cd $OPENPILOT_ROOT + + op_run_command $OPENPILOT_ROOT/tools/replay/replay $@ ) } @@ -189,24 +224,37 @@ function op_juggle() { function op_default() { echo "An openpilot helper" echo "" - echo -e "\e[4mUsage:\e[0m op [OPTIONS] " + echo -e "${BOLD}${UNDERLINE}Description:${NC}" + echo " op is your entry point for all things related to openpilot development." + echo " op is only a wrapper for scripts, tools and commands already existing." + echo " op will always show you what it will run on your system." + echo "" + echo " op will try to find your openpilot directory in the following order:" + echo " 1: use the directory specified with the --dir option" + echo " 2: use the current working directory" + echo " 3: go up the file tree non-recursively" + echo "" + echo -e "${BOLD}${UNDERLINE}Usage:${NC} op [OPTIONS] " echo "" - echo -e "\e[4mCommands:\e[0m" - echo " venv Activate the virtual environment" - echo " check Check system requirements (git, os, python) to start using openpilot" - echo " install Install requirements to use openpilot" - echo " build Build openpilot" - echo " run Run openpilot" - echo " juggle Run Plotjuggler" - echo " help Show this message" - echo " --install Install this tool system wide" + echo -e "${BOLD}${UNDERLINE}Commands:${NC}" + echo -e " ${BOLD}venv${NC} Activate the virtual environment" + echo -e " ${BOLD}check${NC} Check system requirements (git, os, python) to start using openpilot" + echo -e " ${BOLD}install${NC} Install requirements to use openpilot" + echo -e " ${BOLD}build${NC} Build openpilot" + echo -e " ${BOLD}run${NC} Run openpilot" + echo -e " ${BOLD}juggle${NC} Run Plotjuggler" + echo -e " ${BOLD}replay${NC} Run replay" + echo -e " ${BOLD}linter${NC} Run all the pre-commit checks" + echo -e " ${BOLD}help${NC} Show this message" + echo -e " ${BOLD}--install${NC} Install this tool system wide" echo "" - echo -e "\e[4mOptions:\e[0m" - echo " -d, --dir" + echo -e "${BOLD}${UNDERLINE}Options:${NC}" + echo -e " ${BOLD}-d, --dir${NC}" echo " Specify the openpilot directory you want to use" - echo " Default to the current working directory" + echo -e " ${BOLD}--dry${NC}" + echo " Don't actually run anything, just print what would be" echo "" - echo -e "\e[4mExamples:\e[0m" + echo -e "${BOLD}${UNDERLINE}Examples:${NC}" echo " op --dir /tmp/openpilot check" echo " Run the check command on openpilot located in /tmp/openpilot" echo "" @@ -224,6 +272,7 @@ function _op() { # parse Options case $1 in -d | --dir ) shift 1; OPENPILOT_ROOT="$1"; shift 1 ;; + --dry ) shift 1; DRY="1" ;; esac # parse Commands @@ -234,6 +283,8 @@ function _op() { build ) shift 1; op_build "$@" ;; run ) shift 1; op_run "$@" ;; juggle ) shift 1; op_juggle "$@" ;; + linter ) shift 1; op_linter "$@" ;; + replay ) shift 1; op_replay "$@" ;; --install ) shift 1; op_first_install "$@" ;; * ) op_default "$@" ;; esac @@ -255,3 +306,8 @@ unset -f op_check_python unset -f op_check_os unset -f op_first_install unset -f op_default +unset -f op_run_command +unset -f op_linter +unset -f op_replay +unset DRY +unset OPENPILOT_ROOT