From: Frantisek Hrbata Date: Tue, 8 Dec 2020 13:10:16 +0000 (+0100) Subject: mrlib: load commit tags from git in load_tags X-Git-Tag: v0.2~62 X-Git-Url: http://www.hrbata.com/gitweb/?a=commitdiff_plain;h=0c2e97b6dd8ec51ebc8b6a0e6d701c503ea692ca;p=gimrr.git mrlib: load commit tags from git in load_tags 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 --- diff --git a/mrlib.py b/mrlib.py index ddc96b3..3f4fc1a 100755 --- 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):