Obecnie pracuję nad narzędziem do generowania kodu źródłowego. Aby upewnić się, że moje zmiany nie wprowadzają żadnych nowych błędów, diff
teoretycznie cennym narzędziem byłoby między wyjściem programu przed i po moich zmianach.
Jednak okazuje się to trudniejsze niż mogłoby się wydawać, ponieważ narzędzie wypisuje wiersze, w których kolejność nie ma znaczenia (np. import
Instrukcje, deklaracje funkcji,…) w sposób pół losowo uporządkowany. Z tego powodu wynik diff
jest zaśmiecony wieloma zmianami, które w rzeczywistości są tylko liniami przeniesionymi do innej pozycji w tym samym pliku.
Czy istnieje sposób, aby diff ignorował te ruchy i wyświetlał tylko te wiersze, które naprawdę zostały dodane lub usunięte?
diff
narzędzie byłoby w stanie oddzielić prawidłowe przeniesienia od niepoprawnych, ponieważ kolejność instrukcji w kodzie ma znaczenie, a przypadki, w których nie jest to prawdą, są ograniczone (import, deklaracja funkcji i klas, itp.)?Odpowiedzi:
Możesz zrobić prosty diff, zapisać gdzieś wynik (aby uniknąć innego diff), zapętlić linie w obu wersjach, a następnie usunąć je z drugiej strony.
Spowodowało to powstanie osobnego projektu dla działającego kodu. Kod.
źródło
/tmp/old
i/tmp/new
żadnych różnic nie byłby pożądany, ponieważ zostały przeniesione tylko linie. Ten kod daje jednak wyniki.Najpierw możesz spróbować je posortować. Coś jak:
Bash (i zsh) może to zrobić w jednym wierszu z podstawieniem procesu
źródło
Wygląda na to, że masz kontrolę nad narzędziem. Następnie spraw, aby jego wynik był przewidywalny: zamiast emitować deklaracje w pół losowej kolejności, użyj (powiedzmy) kolejności alfabetycznej w ostateczności. Przyniesie to nie tylko korzyść polegającą na usunięciu bezużytecznego crufta z różnic, ale także na ułatwieniu odczytania i weryfikacji wyników narzędzia przez człowieka.
źródło
Jeśli plik jest podzielony na sekcje, to tylko sekcje są nie w porządku, a istnieje wyrażenie regularne, którego można użyć do rozpoznania nagłówka sekcji, możesz umieścić pliki w sekcjach i porównać sekcje w parach.
Na przykład, właśnie to zrobiłem na dwóch zrzutach MySQL, aby porównać je po zmianie wielkości nazw niektórych baz danych (dlatego zrzut pokazał je w innej kolejności):
źródło