#!/bin/bash # For styling/colorizing output txtbld=$(tput bold) txtblue=${txtbld}$(tput setaf 4) txtgreen=${txtbld}$(tput setaf 2) txtred=${txtbld}$(tput setaf 1) txtyellow=${txtbld}$(tput setaf 3) txtwhite=${txtbld}$(tput setaf 7) # Intro Prompt echo "${txtblue}bgit: a handy shell script for automating the standard git process" # Reset output style tput bold & tput setaf 7 # counts the number of repos numrepos=$(git remote | wc -l) # If there are no git repositories in this directory... if [ $numrepos -eq 0 ] ; then echo "${txtred}no git repositories in this directory...exiting bgit${txtwhite}" exit 1 fi # creates a list of repos and puts them in an array repoarray=($(git remote)) # Grabs all new files newfiles=$(git status --short | grep '??' | awk '{print $2}' | tr '\n' ' ') # Grabs all modified files modified=$(git status --short | grep M | awk '{print $2}' | tr '\n' ' ') # Grabs all deleted files deleted=$(git status --short | grep D | awk '{print $2}' | tr '\n' ' ') # Reports what is staged for commit # If there is anything to commit... if [[ ! -z $newfiles || ! -z $modified || ! -z $deleted ]] ; then # Let the user know what is staged for commit echo "${txtwhite}The following files are staged for commit:" # Otherwise, if there isn't anything to commit... else # Let the user know that everything is up to date echo "${txtred}everything up-to-date...exiting bgit${txtwhite}" # and exit the program exit 0 fi # Let the user know what is staged for commit if [[ $newfiles ]]; then echo "${txtgreen}ADDED: ${txtgreen}$newfiles" fi if [[ $modified ]]; then echo "${txtblue}MODIFIED: ${txtblue}$modified" fi if [[ $deleted ]]; then echo "${txtred}DELETED: ${txtred}$deleted" fi while [ true ] do # Prompts user if they'd like to commit the changes read -e -r -p "${txtwhite}commit changes?(y/n): ${txtyellow}" change # If the user chooses to commit the changes... if [[ $change == "y" || $change == "yes" ]] ; then # Grabs commit message while [ true ] do # Prompts the user to input their commit message read -e -r -p "${txtwhite}commit message: ${txtyellow}" message cmessage=("$message") # if the user inputted a commit message... if [ -n "$message" ] ; then # then break out of the while loop and continue with the commit... break # if the user did NOT input a commit message... else # tell the user to do so or to quit echo "${txtred}commit message is empty, please write a commit message" echo "${txtred}or type 'CTRL+C' to quit${txtwhite}" fi done # Reset output style tput bold & tput setaf 7 # adds the modified and new files (suppresses message anyways if no files are to be committed) if [[ $newfiles || $modified ]] ; then git config advice.addEmptyPathspec false git add $modified $newfiles ; fi # commits the user's message (multi-word supported) git commit -m "$cmessage" ; # pushes the commit to each repository for ((i = 0; i < $numrepos; i++)) ; do git push ${repoarray[i]} ; done exit 0 # If the user chooses to not the commit the changes ... elif [[ $change == "n" || $change == "no" ]] ; then # Reset output style tput bold & tput setaf 7 # Report the git status git status --short # And let the user know no changes were committed echo "${txtred}no changes committed" exit 0 # If the user chooses to quit... elif [[ $change == "q" || $change == "quit" ]] ; then exit 0 # If the user continues to just press enter... else echo "${txtred}please enter y or n or type 'q' or 'quit' or 'CTRL+C' to quit${txtwhite}" fi done