diff --git a/logdif.py b/logdif.py new file mode 100644 index 0000000..1a790f2 --- /dev/null +++ b/logdif.py @@ -0,0 +1,102 @@ +"""compare commits of logs in different branches + +selecting the time range is based on file 'sync_branches' +which should be in the branch where logdif.py is running +""" + +import sys +from subprocess import check_output + +branches = sys.argv[1:] + +commits = {} +log_no = {} +log_title = {} +cursor = {} + +since_info = [] + +with open("sync_branches") as f: + # a file containing + # YYYY-mm-dd + # for each date the branches are synced + for line in f: + if line.strip(): + info = line.split() + if set(branches) & set(info[1:]) == set(branches): + since_info.append(info[0]) + +gitlog = ['git', 'log', '--oneline'] +if since_info: + since = sorted(since_info)[-1] + print(f'commits since {since}') + gitlog.append(f'--since-as-filter={sorted(since_info)[-1]}') +else: + print(f'no info for {branches} found in file sync_branches') + +for br in branches: + cursor[br] = 0 + output = check_output(gitlog + [br]) + log_title[br] = bytitle = {} + log_no[br] = byno = [] + no = 0 + for line in output.decode('utf-8').split('\n'): + if line: + hash, title = line.split(' ', 1) + bytitle.setdefault(title, []).append([(no, hash)]) + byno.append([hash, title]) + no += 1 + + +# find matches +for br, byno in log_no.items(): + for no, line in enumerate(byno): + commits.setdefault(line[1], {}).setdefault(br, []).append((no, line)) + +ordered = {} +for title, info in commits.items(): + # sort the info dict by value + ordered[title] = {b: v for v, b in sorted((v, b) for b, v in info.items())} + +commits = ordered + +cnt = [0] + +def print_commit(line): + if not line[1]: + return # title cleared: this line is already printed + # print and mark line as already printed + info = commits[line[1]] + output = [] + title = line[1] + for br in log_no: + infolist = info.get(br) + if infolist: + no, iline = infolist.pop(0) + if not infolist: + info.pop(br) + output.append(f'{no:3}:{iline[0]}') + iline[1] = '' # clear title + else: + output.append(' ' * 11) + print(' '.join(output), title) + cnt[0] += 1 + if cnt[0] % 50 == 0: + input(f' {br0:11s} {br1:11s}') + + +(br0, log0), (br1, log1) = list(log_no.items()) +no1 = 0 +for no0, line0 in enumerate(log0): + if line0[1]: # line not yet printed + infodict = commits[line0[1]] + if len(infodict) > 1: # found a match + info0 = infodict[br1] + # loop over commits in br1 until matched no + no1end = info0[0][0] + if no1end > no0: + for n in range(no0, no1end): + line1 = log1[n] + print_commit(line1) + no1 = no1end + print_commit(line0) diff --git a/sync_branches b/sync_branches new file mode 100644 index 0000000..2c4cdf5 --- /dev/null +++ b/sync_branches @@ -0,0 +1,2 @@ +2024-01-29 wip develop +