2010-11-09 2 views
4

Для целей проверки кода после изменения существующего исходного файла мы просматриваем только строки кода, которые были изменены в этих исходных файлах.
После того, как я вношу изменения в исходные файлы в репозитории, я должен сообщить строки кода, которые были изменены в исходном файле, прежде чем мы сделаем наши обзоры с одноранговым кодом.Получите номера строк различий в двух файлах при выполнении diff для двух файлов в Windows

Я могу видеть визуальный diff с помощью WinMerge, и я доволен тем, что он делает для меня, но единственным требованием для моих сотрудников является просто знать имя файла и номера строк, которые должны быть обзор.

Есть ли способ получить только номера строк измененного файла? Типы файлов будет текстовые исходные файлы, такие как JavaScript, Java, XML, XSL и т.д.

Образец files--

Foo (новая версия):

a 
b 
c 
d 
e 
f 
g 
h 
i 
j 
k 

Foo (старый версия):

a 
b 
C 
d 
h 
i 
k 

выход Я ищу:

foo: 3, 5-7, 10-11 

ИЛИ

foo: 
3 
5-7 
10-11 

Я уверен, что какая-то программа позволяет это сделать. Я просто не могу найти его. Какие-либо предложения? В настоящее время я использую WinMerge, но любая программа, которая работает в Windows, будет в порядке со мной. Было бы предпочтительнее, если программное обеспечение является открытым исходным кодом или бесплатным.

EDIT: GNU DiffUtils близок к тому, что я хочу, но не точно соответствует моим потребностям. Глядя на параметры командной строки, я вижу «-q» (или «--brief») в качестве упрощенного разграничения, но это просто. Выхода:

C:\Program Files\GnuWin32\bin>diff.exe -q foo1.txt foo2.txt 
Files foo1.txt and foo2.txt differ 

Нормальный выход дифф:

C:\Program Files\GnuWin32\bin>diff.exe foo1.txt foo2.txt 
3c3 
<  c 
--- 
>  C 
5,7d4 
<  e 
<  f 
<  g 
10,11c7 
<  j 
<  k 
--- 
>  k 
\ No newline at end of file 

дифф -u выход:

C:\Program Files\GnuWin32\bin>diff.exe -u foo1.txt foo2.txt 
--- foo1.txt 2010-11-09 15:47:12.447916000 -0600 
+++ foo2.txt 2010-11-09 15:47:36.129954700 -0600 
@@ -1,11 +1,7 @@ 
    a 
    b 
- c 
+ C 
    d 
- e 
- f 
- g 
    h 
    i 
- j 
- k 
+ k 
\ No newline at end of file 

Я ищу что-то более информативное, чем различия -q, но менее информативное, чем diff -u и diff. Какие-то разные ниндзя, которые знают разные варианты, чтобы это разрешить?

Я всегда буду сравнивать новый, недавно измененный файл с более старым. Мне нужны только то, что нужно пересмотреть в новом файле.

+0

Люди обычно используют «унифицированный» дифференциальный выход 'diff -u'. Вы также можете указать, сколько строк контекста включить. Кроме того, похоже, что фильтрация строк, начинающихся с цифр без нормального вывода, будет действительно близка к тому, что вы хотели. –

ответ

3

GNU DiffUtils - с открытым исходным кодом, бесплатно и имеет a Windows port.

+0

Я принимаю этот ответ, хотя я ищу более подробный контроль над выходом. – Zoot

1

Не знаю, что такое Windows-родной метод, но я использую функцию сравнения файлов Textpad для этого, и это очень хорошо.

1

Windows родной. Наш SD Smart Differencer производит дельта не по строкам, а по структурам программ и точнее в строке/столбце/столбце и типе объекта программы, который был отредактирован. Он сравнивается путем анализа исходного текста и использования структуры кода для сравнения. Дельты описываются с точки зрения действий, представляющих интерес для программистов: «Вставить», «Заменить», «Удалить», «Заменить».

Вот пример:

действия редактирования
Java~Java1_5 SmartDifferencer Version 1.1.1 
Copyright (C) 2009 Semantic Designs, Inc; All Rights Reserved; SD Confidential 
Powered by DMS (R) Software Reengineering Toolkit 
*** Parsing file C:/DMS/Domains/Java/Java1_5/Analyzers/SmartDifferencer/Tests/diff1_before.java ... 
*** Parsing file C:/DMS/Domains/Java/Java1_5/Analyzers/SmartDifferencer/Tests/diff1_after.java ... 
*** Creating suffix tree ... 
*** Determining maximal pairs ... 
*** Sorting maximal pairs ... 
*** Determining differences ... 
*** Printing edits ... 
a12.5 I s12.5-12.57:field_declaration 
a179.9 I s185.9-185.71:executable_statement 
a193.5 I s201.9-203.9:executable_statement 
a272.13 I t279.13-280.33f267.13-268.30[267.17'lineNum'~>279.17'endLineNum',268.17'columnNum'~>280.17'endColumnNum']:statement_sequence_member,statement_sequence_member 
a340.68 I s352.68-352.68:',' s352.70-352.70:INTEGER s352.71-352.71:',' s352.73-352.73:INTEGER 
a423.13 I t436.13-509.38f450.17-518.35[482.17'hlevel'~>468.13'endLineNum',518.17'hname'~>509.13'endColumnNum']:executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement,executable_statement 
a423.84 I s513.84-513.84:',' s513.86-513.95:IDENTIFIER s513.96-513.96:',' s513.98-513.109:IDENTIFIER 
s424.13-424.59:expression_statement S s514.25-514.47:expression_statement 
s429.13-429.64:local_variable_declaration S s515.25-515.87:local_variable_declaration 
s430.13-430.71:executable_statement f431.13-431.69[431.13'lineString'~>79.9'config',431.26'lineString'~>79.18'config',431.47'indexOfSpace'~>79.35'end_index']t79.9-79.56:executable_statement s432.13-432.51:executable_statement D a516.25 
a433.13 I s516.25-519.25:executable_statement n433.13-439.13:executable_statement s433.13-433.14:'if' s433.16-433.16:'(' s433.17-433.30:relational_expression s433.31-433.31:')' s433.33-433.45:executable_statement s434.13-434.16:'else' n434.18-439.13:block s434.18-434.18:'{' n435.17-438.49:statement_sequence f435.17-435.71[435.17'lineString'~>79.9'config',435.28'lineString'~>79.18'config',435.49'indexOfSpace'~>79.35'end_index']t79.9-79.56:executable_statement s436.17-436.28:executable_statement s437.17-437.51:executable_statement s438.17-438.49:executable_statement s439.13-439.13:'}' D a516.25 
a442.13 I s520.25-520.54:executable_statement 

Высокого уровня являются «I», «S», «R» и «D», с подробной информацией о том, что было добавлено, вставленный или удалены на левой стороне или правыми сторонами символа I/S/R/D с точностью до строки. Например, в строке 12 столбца 5 декларация поля была «Я» nserted, как раз в строке 12 из столбца 5 в столбец 57. В строке 272 блок кода был «I» nserted из строк 279-280 с идентификатор lineNum заменяется на endLineNum. На строке 424 во втором файле оператор выражения был «S», замещенный одним изначально из строки 514. Более подробная информация на веб-сайте.

Вы можете легко удалить лишние детали (например, следующие символы: "и внутри []), если вы хотите что-то вроде Perl.

+0

Спасибо за предложение, но я не хочу писать сценарий Perl, чтобы получить номера строк. – Zoot

2

Сохранить первый файл в x.txt и второй, как y.txt

Затем запустите:

дифф -i --unchanged-линейный формат = "¥" --new-линия- format = ":% dn:% L" y.txt x.txt | perl -pe 's/¥/\ n/g' | perl -pe '$ count ++; if ($ _! ~/^ \ n $ /) {print "$ count \ t";} '

+1

Неплохо, некромант! Если бы я только знал это три года назад, я мог бы использовать это. Вероятно, вы должны включить инструкции о том, как установить perl для окон, а также;) – Zoot

+0

Спасибо, это действительно очень полезная информация о различиях и недостатках (действительно, были убиты вас -l или -line-номера?) Позор вам использовать это много иероглифов и бензопилы, чтобы нарезать форму. Это очень помогло мне –

 Смежные вопросы

  • Нет связанных вопросов^_^