parent
2a6b20cd8e
commit
281309a7b1
@ -0,0 +1,124 @@ |
||||
#!/usr/bin/env python |
||||
# -*- coding: UTF-8 -*- |
||||
|
||||
"""This module defines a Print function to use with python 2.x or 3.x., so we can use the prompt with older versions of Python too |
||||
|
||||
It's interface is that of python 3.0's print. See |
||||
http://docs.python.org/3.0/library/functions.html?highlight=print#print |
||||
|
||||
Shamelessly ripped from http://www.daniweb.com/software-development/python/code/217214/a-print-function-for-different-versions-of-python |
||||
""" |
||||
|
||||
__all__ = ["Print"] |
||||
import sys |
||||
try: |
||||
Print = eval("print") # python 3.0 case |
||||
except SyntaxError: |
||||
try: |
||||
D = dict() |
||||
exec("from __future__ import print_function\np=print", D) |
||||
Print = D["p"] # 2.6 case |
||||
del D |
||||
except SyntaxError: |
||||
del D |
||||
def Print(*args, **kwd): # 2.4, 2.5, define our own Print function |
||||
fout = kwd.get("file", sys.stdout) |
||||
w = fout.write |
||||
if args: |
||||
w(str(args[0])) |
||||
sep = kwd.get("sep", " ") |
||||
for a in args[1:]: |
||||
w(sep) |
||||
w(str(a)) |
||||
w(kwd.get("end", "\n")) |
||||
|
||||
|
||||
# change those symbols to whatever you prefer |
||||
symbols = {'ahead of': '↑·', 'behind': '↓·', 'prehash':':'} |
||||
|
||||
from subprocess import Popen, PIPE |
||||
|
||||
import sys |
||||
gitsym = Popen(['git', 'symbolic-ref', 'HEAD'], stdout=PIPE, stderr=PIPE) |
||||
branch, error = gitsym.communicate() |
||||
|
||||
error_string = error.decode('utf-8') |
||||
|
||||
if 'fatal: Not a git repository' in error_string: |
||||
sys.exit(0) |
||||
|
||||
branch = branch.decode('utf-8').strip()[11:] |
||||
|
||||
res, err = Popen(['git','diff','--name-status'], stdout=PIPE, stderr=PIPE).communicate() |
||||
err_string = err.decode('utf-8') |
||||
|
||||
if 'fatal' in err_string: |
||||
sys.exit(0) |
||||
|
||||
changed_files = [namestat[0] for namestat in res.splitlines()] |
||||
staged_files = [namestat[0] for namestat in Popen(['git','diff', '--staged','--name-status'], stdout=PIPE).communicate()[0].splitlines()] |
||||
nb_changed = len(changed_files) - changed_files.count('U') |
||||
nb_U = staged_files.count('U') |
||||
nb_staged = len(staged_files) - nb_U |
||||
staged = str(nb_staged) |
||||
conflicts = str(nb_U) |
||||
changed = str(nb_changed) |
||||
status_lines = Popen(['git','status','-s','-uall'],stdout=PIPE).communicate()[0].splitlines() |
||||
untracked_lines = [a for a in map(lambda s: s.decode('utf-8'), status_lines) if a.startswith("??")] |
||||
nb_untracked = len(untracked_lines) |
||||
untracked = str(nb_untracked) |
||||
stashes = Popen(['git','stash','list'],stdout=PIPE).communicate()[0].splitlines() |
||||
nb_stashed = len(stashes) |
||||
stashed = str(nb_stashed) |
||||
|
||||
if not nb_changed and not nb_staged and not nb_U and not nb_untracked and not nb_stashed: |
||||
clean = '1' |
||||
else: |
||||
clean = '0' |
||||
|
||||
remote = '' |
||||
|
||||
tag, tag_error = Popen(['git', 'describe', '--exact-match'], stdout=PIPE, stderr=PIPE).communicate() |
||||
|
||||
if not branch: # not on any branch |
||||
if tag: # if we are on a tag, print the tag's name |
||||
branch = tag |
||||
else: |
||||
branch = symbols['prehash']+ Popen(['git','rev-parse','--short','HEAD'], stdout=PIPE).communicate()[0].decode('utf-8')[:-1] |
||||
else: |
||||
remote_name = Popen(['git','config','branch.%s.remote' % branch], stdout=PIPE).communicate()[0].strip() |
||||
if remote_name: |
||||
merge_name = Popen(['git','config','branch.%s.merge' % branch], stdout=PIPE).communicate()[0].strip() |
||||
else: |
||||
remote_name = "origin" |
||||
merge_name = "refs/heads/%s" % branch |
||||
|
||||
if remote_name == '.': # local |
||||
remote_ref = merge_name |
||||
else: |
||||
remote_ref = 'refs/remotes/%s/%s' % (remote_name, merge_name[11:]) |
||||
revgit = Popen(['git', 'rev-list', '--left-right', '%s...HEAD' % remote_ref],stdout=PIPE, stderr=PIPE) |
||||
revlist = revgit.communicate()[0] |
||||
if revgit.poll(): # fallback to local |
||||
revlist = Popen(['git', 'rev-list', '--left-right', '%s...HEAD' % merge_name],stdout=PIPE, stderr=PIPE).communicate()[0] |
||||
behead = revlist.splitlines() |
||||
ahead = len([x for x in behead if x[0]=='>']) |
||||
behind = len(behead) - ahead |
||||
if behind: |
||||
remote += '%s%s' % (symbols['behind'], behind) |
||||
if ahead: |
||||
remote += '%s%s' % (symbols['ahead of'], ahead) |
||||
|
||||
if remote == "": |
||||
remote = '.' |
||||
|
||||
out = '\n'.join([ |
||||
str(branch), |
||||
str(remote), |
||||
staged, |
||||
conflicts, |
||||
changed, |
||||
untracked, |
||||
stashed, |
||||
clean]) |
||||
Print(out) |
||||
Loading…
Reference in new issue