summaryrefslogtreecommitdiff
path: root/plugins/git-prompt/gitstatus.py
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/git-prompt/gitstatus.py')
-rw-r--r--plugins/git-prompt/gitstatus.py82
1 files changed, 82 insertions, 0 deletions
diff --git a/plugins/git-prompt/gitstatus.py b/plugins/git-prompt/gitstatus.py
new file mode 100644
index 000000000..ef894bff2
--- /dev/null
+++ b/plugins/git-prompt/gitstatus.py
@@ -0,0 +1,82 @@
+#!/usr/bin/env python
+# -*- coding: UTF-8 -*-
+from subprocess import Popen, PIPE
+import re
+
+# change those symbols to whatever you prefer
+symbols = {
+ 'ahead of': '↑',
+ 'behind': '↓',
+ 'staged': '♦',
+ 'changed': '‣',
+ 'untracked': '…',
+ 'clean': '⚡',
+ 'unmerged': '≠',
+ 'sha1': ':'
+}
+
+output, error = Popen(
+ ['git', 'status'], stdout=PIPE, stderr=PIPE).communicate()
+
+if error:
+ import sys
+ sys.exit(0)
+lines = output.splitlines()
+
+behead_re = re.compile(
+ r"^# Your branch is (ahead of|behind) '(.*)' by (\d+) commit")
+diverge_re = re.compile(r"^# and have (\d+) and (\d+) different")
+
+status = ''
+staged = re.compile(r'^# Changes to be committed:$', re.MULTILINE)
+changed = re.compile(r'^# Changed but not updated:$', re.MULTILINE)
+untracked = re.compile(r'^# Untracked files:$', re.MULTILINE)
+unmerged = re.compile(r'^# Unmerged paths:$', re.MULTILINE)
+
+
+def execute(*command):
+ out, err = Popen(stdout=PIPE, stderr=PIPE, *command).communicate()
+ if not err:
+ nb = len(out.splitlines())
+ else:
+ nb = '?'
+ return nb
+
+if staged.search(output):
+ nb = execute(
+ ['git', 'diff', '--staged', '--name-only', '--diff-filter=ACDMRT'])
+ status += '%s%s' % (symbols['staged'], nb)
+if unmerged.search(output):
+ nb = execute(['git', 'diff', '--staged', '--name-only', '--diff-filter=U'])
+ status += '%s%s' % (symbols['unmerged'], nb)
+if changed.search(output):
+ nb = execute(['git', 'diff', '--name-only', '--diff-filter=ACDMRT'])
+ status += '%s%s' % (symbols['changed'], nb)
+if untracked.search(output):
+ status += symbols['untracked']
+if status == '':
+ status = symbols['clean']
+
+remote = ''
+
+bline = lines[0]
+if bline.find('Not currently on any branch') != -1:
+ branch = symbols['sha1'] + Popen([
+ 'git',
+ 'rev-parse',
+ '--short',
+ 'HEAD'], stdout=PIPE).communicate()[0][:-1]
+else:
+ branch = bline.split(' ')[-1]
+ bstatusline = lines[1]
+ match = behead_re.match(bstatusline)
+ if match:
+ remote = symbols[match.groups()[0]]
+ remote += match.groups()[2]
+ elif lines[2:]:
+ div_match = diverge_re.match(lines[2])
+ if div_match:
+ remote = "{behind}{1}{ahead of}{0}".format(
+ *div_match.groups(), **symbols)
+
+print('\n'.join([branch, remote, status]))