Create Python script to automatically resolve merge conflict in keyfreq
This commit is contained in:
		
							
								
								
									
										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) | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user