From 0ab2c69d623b442cfcef2a3cacd50429207254af Mon Sep 17 00:00:00 2001 From: Meutel Date: Thu, 28 Apr 2016 18:51:11 +0200 Subject: [PATCH] Script to display git status in sub-directories --- show_status | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 170 insertions(+) create mode 100755 show_status diff --git a/show_status b/show_status new file mode 100755 index 0000000..73097cb --- /dev/null +++ b/show_status @@ -0,0 +1,170 @@ +#!/usr/bin/env python + +# @desc Tired of having to go into each sub dir to find out whether or +# not you did a git commit? Tire no more, just use this! +# +# @author Mike Pearce +# @since 18/05/2010 + +# Grab some libraries +import sys +import os +import glob +import commands +from optparse import OptionParser + +# Setup some stuff +dirname = './' +gitted = False +mini = True + +class bcolors: + HEADER = '\033[95m' + OKBLUE = '\033[94m' + OKGREEN = '\033[92m' + WARNING = '\033[93m' + FAIL = '\033[91m' + ENDC = '\033[0m' + + def disable(self): + self.HEADER = '' + self.OKBLUE = '' + self.OKGREEN = '' + self.WARNING = '' + self.FAIL = '' + self.ENDC = '' + +parser = OptionParser(description="\ +Show Status is awesome. If you tell it a directory to look in, it'll scan \ +through all the sub dirs looking for a .git directory. When it finds one \ +it'll look to see if there are any changes and let you know. \ +It can also push and pull to/from a remote location (like github.com) \ +(but only if there are no changes.) \ +Contact mike@mikepearce.net for any support.") +parser.add_option("-d", "--dir", + dest = "dirname", + action = "store", + help = "The directory to parse sub dirs from", + default = os.path.abspath("./")+"/" + ) + +parser.add_option("-v", "--verbose", + action = "store_true", + dest = "verbose", + default = False, + help = "Show the full detail of git status" + ) + +parser.add_option("-r", "--remote", + action = "store", + dest = "remote", + default = "", + help = "Set the remote name (remotename:branchname)" + ) + +parser.add_option("--push", + action = "store_true", + dest = "push", + default = False, + help = "Do a 'git push' if you've set a remote with -r it will push to there" + ) + +parser.add_option("-p", "--pull", + action = "store_true", + dest = "pull", + default = False, + help = "Do a 'git pull' if you've set a remote with -r it will pull from there" + ) + +# Now, parse the args +(options, args) = parser.parse_args() + +#------------------- +def show_error(error="Undefined Error!"): +#------------------- + """Writes an error to stderr""" + sys.stderr.write(error) + sys.exit(1) + + +#------------------- +# Now, onto the main event! +#------------------- +if __name__ == "__main__": + os.system('clear') + sys.stdout.write('-- Starting git status...\n') + os.environ['LANGUAGE'] = 'en_US:en'; + os.environ['LANG'] = 'en_US.UTF-8'; + + sys.stdout.write('Scanning sub directories of %s\n' %options.dirname) + + # See whats here + for infile in glob.glob( os.path.join(options.dirname, '*') ): + + #is there a .git file + if os.path.exists( os.path.join(infile, ".git") ): + + #Yay, we found one! + gitted = True + + # OK, contains a .git file. Let's descend into it + # and ask git for a status + out = commands.getoutput('cd '+ infile + '; git status') + + # Mini? + if False == options.verbose: + + j = out.find('On branch'); + k = out.find('\n', j); + branch = out[j+10:k]; + branchColor = bcolors.WARNING; + + if branch == 'master': + branchColor = bcolors.OKGREEN + + branch = "[ " + branchColor + branch.ljust(15) + bcolors.ENDC + " ]" + + if -1 != out.find('nothing'): + result = bcolors.OKGREEN + "No Changes" + bcolors.ENDC + + # Pull from the remote + if False != options.pull: + push = commands.getoutput( + 'cd '+ infile + + '; git pull '+ + ' '.join(options.remote.split(":")) + ) + result = result + " (Pulled) \n" + push + + # Push to the remote + if False != options.push: + push = commands.getoutput( + 'cd '+ infile + + '; git push '+ + ' '.join(options.remote.split(":")) + ) + result = result + " (Pushed) \n" + push + + else: + result = bcolors.FAIL + "Changes" + bcolors.ENDC + + # Write to screen + sys.stdout.write("--" + bcolors.OKBLUE + infile.ljust(55) + bcolors.ENDC + branch + " : " + result +"\n") + + else: + #Print some repo details + sys.stdout.write("\n---------------- "+ infile +" -----------------\n") + sys.stdout.write(out) + sys.stdout.write("\n---------------- "+ infile +" -----------------\n") + + # Come out of the dir and into the next + commands.getoutput('cd ../') + + + + + if False == gitted: + show_error("Error: None of those sub directories had a .git file.\n") + + sys.stdout.write("Done\n") +