#!/bin/bash # devctl is an utility script for automating some development tasks and actions. # To find out what options are available, run it without any arguments. # Text styles RED='\033[0;31m' BOLD=$(tput bold) NORMAL=$(tput sgr0) # Docker aliases misago_run="docker-compose run --rm misago" # Define dev paths # Those are paths to dirs and files created for dev project dev_paths=( "./avatargallery" "./devproject" "./media" "./static" "./userdata" "./manage.py" ) print_dev_paths() { for x in "${dev_paths[@]}"; do echo "next element is '$x'" done } # Some commond shorthands docker_stop() { docker-compose stop } # Test required ports # We test if those ports are free before running docker port_django=8000 port_postgresql=5432 required_ports=($port_postgresql) # Commands intro() { echo "Development project:" echo echo " ${BOLD}init${NORMAL} initialize new dev project for development, do nothing if project already exists." echo " ${BOLD}clear${NORMAL} if dev project exists, delete it's files and destroy docker containers." echo " ${BOLD}rebuild${NORMAL} rebuild docker containers (uses --no-cache)." echo echo "Testing:" echo echo " ${BOLD}test${NORMAL} run tests suite." echo " ${BOLD}test module${NORMAL} run tests suite in specified python module, eg. misago.users." } invalid_option() { echo -e "Invalid option: ${RED}$1${NORMAL}" echo "Please run this script without any arguments to see the list of available options." exit 1 } # Initialize new dev project init() { for dev_path in "${dev_paths[@]}"; do if [ -e $dev_path ]; then echo -e "${RED}Error:${NORMAL} Dev project already exists, or was not deleted completely." echo echo "Please use \"clear\" option to clear any pissible remaining files and try again." exit 1 fi done for port in "${required_ports[@]}"; do nc "127.0.0.1" "$port" < /dev/null if [[ $? = "0" ]]; then echo -e "${RED}Error:${NORMAL} Port ${BOLD}$port${NORMAL} is not available." echo if [[ $port = $port_django ]]; then echo "Django application appears to already be running on http://127.0.0.1:8000" elif [[ $port = $port_postgresql ]]; then echo "PostgreSQL appears to already be running on port $port." fi exit 1 fi done } # Clear existing dev project clear() { echo -e "${RED}Warning:${NORMAL} You are going clear current development project." echo will_delete_files=false for dev_path in "${dev_paths[@]}"; do if [ -e $dev_path ]; then will_delete_files=true fi done if [[ $will_delete_files = true ]]; then echo "Following files and directories will be deleted:" for dev_path in "${dev_paths[@]}"; do if [ -e $dev_path ]; then echo " $dev_path" fi done echo fi echo "This will also stop and remove docker containers used by this project." echo echo "Enter \"y\" to confirm:" read confirmation if [[ $confirmation = "y" ]]; then for dev_path in "${dev_paths[@]}"; do if [ -e $dev_path ]; then echo "Removing $dev_path" rm -rf $dev_path fi done docker-compose stop docker-compose down exit 0 else echo "Operation canceled." exit 0 fi } # Rebuild docker containers rebuild() { docker_stop docker-compose build --no-cache exit 0 } # Run tests suite test() { $misago_run runtests.py $1 docker_stop exit 0 } # Command dispatcher if [[ $1 ]]; then if [[ $1 = "init" ]]; then init elif [[ $1 = "clear" ]]; then clear elif [[ $1 = "rebuild" ]]; then rebuild elif [[ $1 = "test" ]]; then test $2 else invalid_option $1 fi else intro fi