mrlib: load commit tags from git in load_tags
authorFrantisek Hrbata <frantisek@hrbata.com>
Tue, 8 Dec 2020 13:10:16 +0000 (14:10 +0100)
committerFrantisek Hrbata <frantisek@hrbata.com>
Tue, 8 Dec 2020 13:10:16 +0000 (14:10 +0100)
Originally commit info, like subject, was stored as a tag and created
by git-mr-create. It looks like that calling git one more time does not
have such performance impact, so let's just load all the data from git.

Signed-off-by: Frantisek Hrbata <frantisek@hrbata.com>
mrlib.py

index ddc96b39732ef1a07a277a66e27ae10c2663432c..3f4fc1a16f843e97ea79bacdc9d889c5f15a8727 100755 (executable)
--- a/mrlib.py
+++ b/mrlib.py
@@ -192,7 +192,7 @@ def load_tags(mrs, refs=None, users=None, commits=True, squash=False):
     if not refs:
         refs = load_refs()
 
-    revs = filter_revs(refs, mrs=mrs, users=users, types=["tags"])
+    revs = filter_revs(refs, mrs=mrs, users=users, types=["tags", "mr"])
     if not revs:
         return tags
 
@@ -230,16 +230,51 @@ def load_tags(mrs, refs=None, users=None, commits=True, squash=False):
 
         add_tag(tags, mr, commit, tag, user, value)
 
-        if tag == "at":
-            value = datetime.datetime.utcfromtimestamp(int(value))
-            add_tag(tags, mr, commit, "ai", user, value.isoformat())
-            add_tag(tags, mr, commit, "ad", user, str(value))
-
         if tag == "AT":
             value = datetime.datetime.utcfromtimestamp(int(value))
             add_tag(tags, mr, commit, "AI", user, value.isoformat())
             add_tag(tags, mr, commit, "AD", user, str(value))
 
+    if not commits or squash:
+        return tags
+
+    commit2mr = dict()
+    mr2user = dict()
+    for mr in mrs:
+        ctags = get_commit_tags(tags, mr, rev_zero)
+        if not ctags:
+            continue
+
+        user = get_tag_value(ctags, "A")
+        mr2user[mr] = user
+
+        commits = get_tag_value(ctags, "C").split()
+        for commit in commits:
+            if not commit in commit2mr:
+                commit2mr[commit] = list()
+            commit2mr[commit].append(mr)
+            add_tag(tags, mr, commit, "m", user, mr)
+            add_tag(tags, mr, commit, "h", user, commit)
+
+    fmt = "%H s %s%n%H an %an%n%H ae %ae%n%H at %at"
+    stdin = "\n".join(commit2mr)
+    rv, out, err = run(["git", "show", "--no-patch", "--format={}".format(fmt), "--stdin"], stdin=stdin)
+    for line in out.split("\n"):
+        if not line:
+            continue
+
+        commit,tag,value = line.split(None, 2)
+        for mr in commit2mr[commit]:
+            user = mr2user[mr]
+            add_tag(tags, mr, commit, tag, user, value)
+
+            if tag != "at":
+                continue
+
+            dt = datetime.datetime.utcfromtimestamp(int(value))
+            add_tag(tags, mr, commit, "ai", user, dt.isoformat())
+            add_tag(tags, mr, commit, "ad", user, str(dt))
+
     return tags
 
 def store_user_tags(tags, mr, user, fd):