Làm thế nào để bỏ qua các dòng di chuyển trong một khác


11

Tôi hiện đang làm việc trên một công cụ tạo mã nguồn. Để đảm bảo rằng các thay đổi của tôi không giới thiệu bất kỳ lỗi mới nào, diffgiữa đầu ra của chương trình trước và sau các thay đổi của tôi về mặt lý thuyết sẽ là một công cụ có giá trị.

Tuy nhiên, điều này hóa ra khó hơn người ta có thể nghĩ, bởi vì công cụ này đưa ra các dòng mà thứ tự không quan trọng (như các importcâu lệnh, khai báo hàm, hàm) theo cách được đặt bán ngẫu nhiên. Bởi vì điều này, đầu ra của diffbị lộn xộn với nhiều thay đổi mà trên thực tế chỉ có các dòng được di chuyển đến một vị trí khác trong cùng một tệp.

Có cách nào để làm cho diff bỏ qua các di chuyển này và chỉ xuất ra các dòng đã thực sự được thêm hoặc xóa?


Có lẽ việc thay đổi công cụ của bạn để tạo các hàm và nhập khai báo theo thứ tự cụ thể (ví dụ: từ vựng, nếu có thể theo ngôn ngữ của bạn) sẽ dễ dàng hơn?
Daniel Beck

@Daniel Beck: Xem bình luận của tôi cho câu trả lời của Gilles bên dưới.
dnadlinger

Chủ đề cũ, nhưng để tóm tắt các bình luận bên dưới, làm thế nào diffcông cụ này có thể tách các bước hợp lệ khỏi các bước không hợp lệ, vì thứ tự các lệnh trong mã vấn đề và các trường hợp không đúng là giới hạn (nhập, khai báo hàm và lớp, Vân vân.) ?
Joël

@ Joël: Câu trả lời đơn giản là tôi biết rằng các thay đổi của trình tạo mà tôi phải kiểm tra sẽ không đưa ra bất kỳ lỗi nào liên quan đến việc thay đổi thứ tự các dòng. Tất nhiên, bạn cần một công cụ dựa trên trình phân tích cú pháp cho ngôn ngữ đích để tránh các lỗi giả trong trường hợp chung (hoặc đơn giản là bộ kiểm tra toàn diện cho trình tạo của bạn), nhưng đây được cho là một kiểm tra nhanh một lần để xem lại mã.
dnadlinger

Câu trả lời:


2

Bạn có thể thực hiện một khác biệt đơn giản, lưu trữ kết quả ở đâu đó (để tránh khác khác), lặp qua các dòng trong một trong hai phiên bản, sau đó loại bỏ các kết quả từ phía bên kia.

Điều này sinh ra một dự án riêng cho mã làm việc. Mật mã.


Tôi không chắc chắn những gì cần phải làm chính xác, nhưng dường như nó không tạo ra kết quả mong muốn. Theo tôi hiểu câu hỏi, từ hai ví dụ trong mã /tmp/old/tmp/newkhông có kết quả khác nào sẽ được mong muốn vì chỉ có các dòng được di chuyển xung quanh. Mã này tuy nhiên không tạo ra kết quả.
Ilari Kajaste

Đã sửa mã.
l0b0

Tôi đã không kiểm tra câu trả lời khi tôi hoàn thành quá trình hợp nhất được đề cập ở trên một thời gian dài trước đây, nhưng nhìn thoáng qua mã, nó trông như thể nó có thể hoạt động.
dnadlinger

4

Bạn có thể thử sắp xếp trước. Cái gì đó như:

sort file-a > s-file-a
sort file-b > s-file-b
diff s-file-a s-file-b

Bash (và zsh) có thể làm điều này trong một dòng với sự thay thế quá trình

diff <(sort file-a) <(sort file-b)

Đây có thể là một lựa chọn, nhưng diffs tạo ra sẽ không thể rất hữu ích sau đó, bởi vì tôi sẽ mất tất cả số dòng và bối cảnh thông tin ...
dnadlinger

Ngay cả khi tôi vẫn hy vọng có một giải pháp tốt hơn, tôi vẫn tiếp tục với phương pháp này để xác minh hàng loạt thay đổi mà tôi đã thực hiện.
dnadlinger

2
Tôi có thể thấy trước điều này sẽ bỏ lỡ một số thay đổi. Đôi khi vấn đề đặt hàng, đôi khi không. Bạn loại bỏ tất cả bối cảnh.
Rich Homolka

Đối với một công cụ tái cấu trúc đặt hàng nơi tôi muốn đảm bảo mọi thứ vẫn tồn tại, đây chính xác là những gì tôi cần.
ntrrobng

0

Có vẻ như bạn có quyền kiểm soát công cụ. Sau đó làm cho đầu ra của nó có thể dự đoán được: thay vì phát ra các khai báo theo thứ tự bán ngẫu nhiên, hãy sử dụng (nói) thứ tự chữ cái như là phương sách cuối cùng. Điều này sẽ không chỉ có lợi ích trong việc loại bỏ hành trình vô dụng khỏi các khác biệt, mà còn giúp cho đầu ra của công cụ dễ đọc và xác minh hơn đối với con người.


Xin lỗi, nhưng câu trả lời này hoàn toàn không giúp tôi - nếu nó quá dễ, tôi sẽ thay đổi nó ngay lập tức. Hơn nữa, tôi hiện đang sáp nhập thay đổi từ một dự án máy phát điện ban đầu được chia hai từ, vì vậy thêm một ví dụ khá sâu rộng thay đổi sẽ làm phức tạp quá trình mà thậm chí nhiều hơn ...
dnadlinger

0

Nếu tệp được cấu trúc thành các phần, thì đó chỉ là các phần không theo thứ tự và tồn tại một biểu thức chính quy mà bạn có thể sử dụng để nhận ra tiêu đề của phần, bạn có thể tách các tệp thành các phần của chúng và sau đó so sánh các phần theo từng cặp.

Chẳng hạn, tôi chỉ thực hiện điều này trên hai bãi chứa MySQL để so sánh chúng sau khi một số tên cơ sở dữ liệu đã thay đổi trường hợp (và do đó bãi chứa liệt kê chúng theo thứ tự khác):

csplit all-07sep2015-11:19:12.sql '/Current Database/-1' '{*}'  # split the dump made before the change, creating files xx00, xx01, ...
csplit -f yy all-07sep2015-12:26:12.sql '/Current Database/-1' '{*}' # split the dump made after the change, creating files yy00, yy01, ...
fgrep 'Current Database' xx?? yy?? | perl -lne 'BEGIN{my %foo}; /(^....).*`(.*)`/ and push(@{$foo{lc($2)}}, $1); END {printf("diff -di %s %s\n", @{$_}) for values %foo}' | sh -x | less  # match the pairs and compare them with diff
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.