Следующий скрипт улучшает мою ситуацию, обнаруживая «почти совершенно разные» последовательности в diff и считая их совершенно разными. Поиск лучших решений.
#!/usr/bin/python
import sys
(mbefore, pbefore, mid, mafter) = ([], [], [], [])
def flush():
for x in (mbefore, pbefore, mid, mafter):
sys.stdout.write(''.join(x))
del x[:]
for line in sys.stdin:
if line[0] == '-':
if mid:
mafter.append(line)
else:
flush()
mbefore.append(line)
elif line[0] == '+':
if mafter:
mbefore.append('-' + mid[0][1:])
pbefore.append('+' + mid[0][1:])
mbefore += mafter
pbefore.append(line)
del mafter[:]
del mid[:]
elif not mid and mbefore:
pbefore.append(line)
else:
flush()
sys.stdout.write(line)
elif line[0] == ' ':
if pbefore and not mid:
mid.append(line)
else:
flush()
sys.stdout.write(line)
else:
flush()
sys.stdout.write(line)
flush()
Вы можете реализовать свой подход, направив вывод diff -u
на:
perl -0777 -pe '1 while s{^-.*\n\K((?:\+.*\n)+) ((.*\n)(?:-.*\n)+)}
{-$2$1+$3}mg'
Теперь я не уверен, что не показывать одинокие общие линии всегда помогает с разборчивостью. Сравните например:
--- A 2018-10-01 09:37:37.606642955 +0200
+++ B 2018-10-01 09:37:40.405675295 +0200
@@ -1,8 +1,11 @@
int fib(int n) {
- if (n <= 1) {
- return n;
+ int i, t1 = 0, t2 = 1;
+ for (i = 0; i < n; ++i) {
+ int next = t1 + t2;
+ t1 = t2;
+ t2 = next;
}
- /* assinging foo */
+ /* assigning foo */
foo = (bar ? bar : complicated_stuff(*a.asd.qwe|(FLAG1|FLAG2)));
- return fib(n-1) + fib(n-2);
+ return t1;
с выводом на него кода perl
:
--- A 2018-10-01 09:37:37.606642955 +0200
+++ B 2018-10-01 09:37:40.405675295 +0200
@@ -1,8 +1,11 @@
int fib(int n) {
- if (n <= 1) {
- return n;
- }
- /* assinging foo */
- foo = (bar ? bar : complicated_stuff(*a.asd.qwe|(FLAG1|FLAG2)));
- return fib(n-1) + fib(n-2);
+ int i, t1 = 0, t2 = 1;
+ for (i = 0; i < n; ++i) {
+ int next = t1 + t2;
+ t1 = t2;
+ t2 = next;
+ }
+ /* assigning foo */
+ foo = (bar ? bar : complicated_stuff(*a.asd.qwe|(FLAG1|FLAG2)));
+ return t1;
Я нахожу более полезным, что diff
показывает мне, что эта сложная линия не изменилась. В расширенной версии у вас возникнет соблазн найти разницу между ними.
Вы можете заменить ((.*\n)
на ((.{0,20}\n)
, чтобы учитывать только короткие одинокие общие строки (или (((?:\h*\H){0,10}\h*\n)
, чтобы учитывать только количество не -пробелов ).