Saat ini saya sedang mengerjakan alat pembuat kode sumber. Untuk memastikan bahwa perubahan saya tidak memperkenalkan bug baru, diff
antara hasil dari program sebelum dan sesudah perubahan saya secara teoritis akan menjadi alat yang berharga.
Namun, ini ternyata lebih sulit daripada yang mungkin dipikirkan, karena alat menghasilkan garis di mana urutannya tidak penting (seperti import
pernyataan, deklarasi fungsi, ...) dengan cara yang dipesan secara semi-acak. Karena ini, output dari diff
berantakan dengan banyak perubahan yang sebenarnya hanya garis yang dipindahkan ke posisi lain di file yang sama.
Apakah ada cara untuk membuat diff mengabaikan gerakan ini dan hanya menampilkan garis yang benar-benar telah ditambahkan atau dihapus?
diff
alat ini dapat memisahkan perpindahan yang valid dari yang tidak valid, karena Urutan instruksi dalam kode memang penting, dan kasus-kasus di mana ini tidak benar terbatas (impor, deklarasi fungsi dan kelas, dll)?Jawaban:
Anda bisa melakukan diff sederhana, menyimpan hasilnya di suatu tempat (untuk menghindari diff lain), loop melalui garis-garis di kedua versi, lalu hapus yang dari sisi lain.
Ini melahirkan proyek terpisah untuk kode kerja. Kode.
sumber
/tmp/old
dan/tmp/new
tidak ada hasil yang berbeda yang diinginkan karena hanya ada baris yang telah dipindahkan. Namun kode ini menghasilkan hasil.Anda dapat mencoba mengurutkannya terlebih dahulu. Sesuatu seperti:
Bash (dan zsh) dapat melakukan ini dalam satu baris dengan substitusi proses
sumber
Sepertinya Anda memiliki kendali atas alat ini. Kemudian buat hasilnya dapat diprediksi: alih-alih memancarkan deklarasi dalam urutan semi-acak, gunakan (katakanlah) urutan abjad sebagai pilihan terakhir. Ini tidak hanya bermanfaat untuk menghilangkan cacat yang tidak berguna dari diffs, tetapi juga membuat keluaran alat lebih mudah dibaca dan diverifikasi untuk manusia.
sumber
Jika file terstruktur menjadi beberapa bagian, itu hanya bagian yang rusak, dan ada ekspresi reguler yang bisa Anda gunakan untuk mengenali bagian header, Anda bisa csplit file ke dalam bagian-bagian mereka dan kemudian membandingkan bagian-bagian secara berpasangan.
Sebagai contoh, saya hanya melakukan ini pada dua dump MySQL untuk membandingkannya setelah beberapa nama database mengubah huruf (dan oleh karena itu dump mendaftarkannya dalam urutan yang berbeda):
sumber