浏览代码

Show tag name when detached status if possible

Kentaro Wada 8 年之前
父节点
当前提交
c4ba3065a1
共有 1 个文件被更改,包括 24 次插入2 次删除
  1. 24 2
      plugins/git-prompt/gitstatus.py

+ 24 - 2
plugins/git-prompt/gitstatus.py

@@ -3,9 +3,31 @@ from __future__ import print_function
 
 import sys
 import re
+import shlex
 from subprocess import Popen, PIPE, check_output
 
 
+def get_tagname_or_hash():
+    """return tagname if exists else hash"""
+    cmd = 'git log -1 --format="%h%d"'
+    output = check_output(shlex.split(cmd)).decode('utf-8').strip()
+    hash_, tagname = None, None
+    # get hash
+    m = re.search('\(.*\)$', output)
+    if m:
+        hash_ = output[:m.start()-1]
+    # get tagname
+    m = re.search('tag: .*[,\)]', output)
+    if m:
+        tagname = 'tags/' + output[m.start()+len('tag: '): m.end()-1]
+
+    if tagname:
+        return tagname
+    elif hash_:
+        return hash_
+    return None
+
+
 # `git status --porcelain --branch` can collect all information
 # branch, remote_branch, untracked, staged, changed, conflicts, ahead, behind
 po = Popen(['git', 'status', '--porcelain', '--branch'], stdout=PIPE, stderr=PIPE)
@@ -21,8 +43,8 @@ for st in status:
     if st[0] == '#' and st[1] == '#':
         if re.search('Initial commit on', st[2]):
             branch = st[2].split(' ')[-1]
-        elif re.search('no branch', st[2]):
-            branch = check_output(['git', 'rev-parse', '--short', 'HEAD']).decode('utf-8').strip()
+        elif re.search('no branch', st[2]):  # detached status
+            branch = get_tagname_or_hash()
         elif len(st[2].strip().split('...')) == 1:
             branch = st[2].strip()
         else: