2010-07-29 33 views
5

diff thường tạo ra đầu ra khá thất thoát. Đây là một ví dụ điển hình. Nếu chúng ta bắt đầu với điều này:Các giải pháp thay thế cho GNU diff?

class World 
    def hello 
    puts "Hello, world" 
    end 
    def goodbye 
    puts "Goodbye, world" 
    end 
end 

Thả Phương pháp thứ hai và thay đổi người đầu tiên:

class World 
    def hello 
    puts "Hello, #{self}" 
    end 
end 

diff -u sẽ là một tổng mớ hỗn độn - cho thấy hai phương pháp đã được sáp nhập:

class World 
    def hello 
- puts "Hello, world" 
- end 
- def goodbye 
- puts "Goodbye, world" 
+ puts "Hello, #{self}" 
    end 
end 

Thay vì hợp lý hơn nhiều:

class World 
    def hello 
- puts "Hello, world" 
+ puts "Hello, #{self}" 
    end 
- def goodbye 
- puts "Goodbye, world" 
- end 
end 

Đây chỉ là một ví dụ đồ chơi, do đó, sản lượng của diff vẫn có thể hiểu được - trong thực tế nó thường trở nên tồi tệ hơn rất nhiều.

Có bất kỳ giải pháp thay thế nào cho diff có thể thông minh hơn một chút không?

+1

Bạn có muốn chỉ CLI hoặc các ứng dụng đồ họa như KDIFF có phù hợp với bạn không? –

+0

Vâng tôi định nói. Kompare thực sự là một trong những khác biệt tốt nhất, IMO. Nếu bạn không phân tích cú pháp kết quả đầu ra, các khác biệt dựa trên GUI dễ dàng hơn nhiều so với sự khác biệt của CLI. – Gilead

+1

Tôi không muốn hiển thị tốt hơn cho những khác biệt xấu, tôi muốn có sự khác biệt tốt. [Có vẻ như nó có thể liên quan] (http://alfedenzo.livejournal.com/170301.html). – taw

Trả lời

1

Bạn có thể xem xét SD Smart Differencer của chúng tôi. Nó cung cấp sự khác biệt dựa trên cấu trúc của mã chứ không phải là "sự khác biệt dòng", vì vậy nó tập trung vào các yếu tố ngôn ngữ (biểu thức, câu lệnh, khối, phương pháp) và hành động chỉnh sửa (xóa, chèn, sao chép, thay thế, đổi tên).

Đó là ngôn ngữ cụ thể; nó phải được sử dụng cấu trúc ngôn ngữ như một hướng dẫn. Nó sử dụng định nghĩa ngôn ngữ rõ ràng. Tôi hoàn toàn không thể nói bạn đang sử dụng ngôn ngữ nào (Python?). Có các công cụ Smart Differencer cho nhiều langauges, bao gồm C, C++, C#, Java, Python, Fortran, COBOL, ...

+1

Ví dụ là trong Ruby. Differencer thông minh trông giống như Windows, mà không hỗ trợ cho hầu hết các ngôn ngữ tôi muốn (và những gì họ nói về tiền xử lý C ngụ ý nó thậm chí sẽ không thể khác nhiều nhất), nguồn đóng (ý tưởng rất tồi cho các công cụ phát triển), và Tôi thậm chí không chắc chắn nếu một thử nghiệm tải về để xem nếu nó hoạt động ở tất cả có sẵn. Có lẽ một số người khác sẽ thấy nó hữu ích. – taw

+0

Bạn muốn ngôn ngữ nào? Có, có những hạn chế với mã C do vị trí tùy ý của các chỉ thị tiền xử lý và các cuộc gọi macro; những điều này làm cho nó rất khó để xác định cấu trúc mã trong mã C tùy ý. Nó hiện không hoạt động với Ruby; chúng tôi đã chơi với một định nghĩa ngôn ngữ Ruby nhưng nó chưa sẵn sàng .. Vâng, nó là nguồn đóng; bạn được hoan nghênh viết một phiên bản nguồn mở.Bạn đã không nói bất kỳ điều nào trong số này là những ràng buộc trong câu hỏi của bạn. Có các phiên bản đánh giá có sẵn cho nhiều ngôn ngữ, bao gồm Java, C# và C++. Bạn có thể phải hỏi tại trang web –

1

Tôi đang làm việc trên một thuật toán khác thực hiện chính xác những gì bạn muốn, nhưng thuật toán này tôi làm việc trên không có giới hạn về số lượng nguồn cho quá trình khác biệt. Hiện tại nó đang ở giai đoạn thử nghiệm và vẫn đang được thử nghiệm và cho đến khi thử nghiệm này hoàn tất, chế độ xem nội tuyến không hoạt động. Vui lòng kiểm tra và cho tôi biết nếu và cách bạn có thể phá vỡ báo cáo khác để tôi có thể cung cấp các chỉnh sửa thích hợp.

Site: http://prettydiff.com/ (GitHub)

2

Các rfcdiff (Dự thảo Diff Tool) báo cáo này:

enter image description here

Công cụ này sử dụng GNU diff và wdiff.

Các vấn đề liên quan