Create Python script to automatically resolve merge conflict in keyfreq
This commit is contained in:
parent
bfca543ede
commit
80a665a3fb
75
keyfreq-conflict-resolve.py
Normal file
75
keyfreq-conflict-resolve.py
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
# git show :stage:filename
|
||||||
|
# common ancestor: 1
|
||||||
|
# HEAD: 2
|
||||||
|
# MERGE_HEAD: 3
|
||||||
|
|
||||||
|
import re
|
||||||
|
from subprocess import Popen, PIPE
|
||||||
|
import sys
|
||||||
|
|
||||||
|
BASE = 1
|
||||||
|
HEAD = 2
|
||||||
|
MERGE_HEAD = 3
|
||||||
|
FINAL = 0
|
||||||
|
|
||||||
|
outputs = {}
|
||||||
|
|
||||||
|
for stage in (BASE, HEAD, MERGE_HEAD):
|
||||||
|
p = Popen(['git', 'show', f':{stage}:keyfreq'], stdout=PIPE, stderr=PIPE)
|
||||||
|
output, err = p.communicate()
|
||||||
|
|
||||||
|
if p.returncode:
|
||||||
|
print(output)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
outputs[stage] = {}
|
||||||
|
|
||||||
|
if b'"' in output:
|
||||||
|
raise ValueError(f'There is a " in the output of stage {stage}')
|
||||||
|
|
||||||
|
output = output.decode('utf-8')[1:-1].split('\n')
|
||||||
|
|
||||||
|
for line in output:
|
||||||
|
line = line.strip()
|
||||||
|
|
||||||
|
if not line:
|
||||||
|
continue
|
||||||
|
|
||||||
|
m = re.match(r'^\(\(([^) ]+) .\ ([^) ]+)\) \. ([0-9]+)\)$', line)
|
||||||
|
|
||||||
|
if not m:
|
||||||
|
raise ValueError(f'Invalid cons cell: {line}')
|
||||||
|
|
||||||
|
mode, command, count = m.groups()
|
||||||
|
count = int(count)
|
||||||
|
|
||||||
|
outputs[stage].setdefault(mode, {})
|
||||||
|
outputs[stage][mode][command] = count
|
||||||
|
|
||||||
|
|
||||||
|
outputs[FINAL] = {}
|
||||||
|
|
||||||
|
for stage in (BASE, HEAD, MERGE_HEAD):
|
||||||
|
for mode in outputs[stage]:
|
||||||
|
outputs[FINAL][mode] = {}
|
||||||
|
|
||||||
|
for command, count in outputs[stage][mode].items():
|
||||||
|
base_mode = outputs[BASE].get(mode, {})
|
||||||
|
base_count = base_mode.get(command, 0)
|
||||||
|
this_count = outputs[stage][mode][command]
|
||||||
|
|
||||||
|
outputs[FINAL][mode].setdefault(command, base_count)
|
||||||
|
|
||||||
|
if stage != BASE:
|
||||||
|
outputs[FINAL][mode][command] += this_count - base_count
|
||||||
|
|
||||||
|
output = '('
|
||||||
|
for mode in outputs[FINAL]:
|
||||||
|
for command, count in outputs[FINAL][mode].items():
|
||||||
|
output += f'(({mode} . {command}) . {count})\n'
|
||||||
|
|
||||||
|
output = output[:-1] + ')'
|
||||||
|
|
||||||
|
with open('keyfreq', 'w') as f:
|
||||||
|
f.write(output)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user