Применить diff между двумя файлами к третьему файлу
От: iAlexander Россия  
Дата: 20.03.12 15:47
Оценка:
Добрый день всем,

Есть две версии одного и того же проекта, один для win, другой для linux. Различия между ними в с-коде не слишком сильные — багфиксы для конкретной ОС ( ), вставки платформозависимого кода и т.п. Исходный код, увы, не под SCM, а as is. Выполнен большой рефакторинг win-версии кода, изменения существенные, и повторять вручную те же самые действия с linux-версией не хочется.
Можно ли на основании различий оригинального и модифицированного win-кода модифицировать linux-код аналогичным образом?
Иными словами результат diff -c win/source.c.orig win/source.c > source.diff применить к файлу linux/source.c аля patch?
Как можно было бы применять такой патч к другому файлу? — а основываясь лишь на контексте, ибо номера строчек, естественно, будут разниться для win- и linux- версий кода.

У diff есть опция контекстной замены, однако в лоб воспользоваться не удалось:
diff -c win/source.c.orig win/source.c > source.diff
patch -c -o lin/source.c lin/source.c.orig source.diff
Ошибки типа Hunk #80 FAILED at 3299...

Это типовой сценарий мержа изменений из одной ветки репозитория в другую, вот только нет никакой информации из системы контроля версий.
Учитывая большой объем изменений win-кода и сильной построчной схожести основного кода win и linux версий, хотел бы бОльшую часть изменений произвести автоматически, при этом конечно не ожидая 100% рабочего кода после выполнения такого мержа.

Есть ли способ?


22.03.12 01:37: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
diff patch branch
Re: Применить diff между двумя файлами к третьему файлу
От: chemey  
Дата: 20.03.12 16:03
Оценка: 2 (1)
Здравствуйте, iAlexander, Вы писали:

A>Можно ли на основании различий оригинального и модифицированного win-кода модифицировать linux-код аналогичным образом?

A>Иными словами результат diff -c win/source.c.orig win/source.c > source.diff применить к файлу linux/source.c аля patch?
A>Как можно было бы применять такой патч к другому файлу? — а основываясь лишь на контексте, ибо номера строчек, естественно, будут разниться для win- и linux- версий кода.

Собственно, diff и patch.
Можно попробовать взрослые варианты (трехсторонний мёрж), но для этого надо иметь "общего предка". Это исходный код до расхождения на ветки (т.е. до того, как в нем поигрались под линуксом и виндой).

Ковырять в сторону инструментов diff3, kdiff3.
diff3 даст тебе дифф-файл и в нем отметит конфликты — правим их руками и получаем готовый патч.
В kdiff3, если я правильно помню, можно сразу интерактивненько смержить.

A>У diff есть опция контекстной замены, однако в лоб воспользоваться не удалось:

A>diff -c win/source.c.orig win/source.c > source.diff
A>patch -c -o lin/source.c lin/source.c.orig source.diff
A>Ошибки типа Hunk #80 FAILED at 3299...

Если нет общего предка — можно поиграться с sdiff (интерактивный мерж). Но с большим проектом придется поколупаться.
Бзззззззжжжжж
Re: Применить diff между двумя файлами к третьему файлу
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 20.03.12 16:23
Оценка: +2
Здравствуйте, iAlexander, Вы писали:

A>Иными словами результат diff -c win/source.c.orig win/source.c > source.diff применить к файлу linux/source.c аля patch?

A>Как можно было бы применять такой патч к другому файлу? — а основываясь лишь на контексте, ибо номера строчек, естественно, будут разниться для win- и linux- версий кода.

В принципе он и так по контексту работает.

А метод — взять какую-нибудь взрослую SCM типа git, bazaar, darcs, сделать в ней две ветки и смержить их, попробовав разные методы. Может, какой-то хорошо сработает.
The God is real, unless declared integer.
Re: Применить diff между двумя файлами к третьему файлу
От: enji  
Дата: 21.03.12 06:52
Оценка:
Здравствуйте, iAlexander, Вы писали:

A>Добрый день всем,


A>Есть две версии одного и того же проекта, один для win, другой для linux. Различия между ними в с-коде не слишком сильные — багфиксы для конкретной ОС ( ), вставки платформозависимого кода и т.п. Исходный код, увы, не под SCM, а as is. Выполнен большой рефакторинг win-версии кода, изменения существенные, и повторять вручную те же самые действия с linux-версией не хочется.


ОФФТОП

А зачем две версии проекта? Почему не #ifdef-ы или вынос платформо-зависимого кода в папки win/lin?
Re: Применить diff между двумя файлами к третьему файлу
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 21.03.12 06:56
Оценка:
Здравствуйте, iAlexander, Вы писали:

A>Есть две версии одного и того же проекта, один для win, другой для linux. Различия между ними в с-коде не слишком сильные — багфиксы для конкретной ОС ( ), вставки платформозависимого кода и т.п. Исходный код, увы, не под SCM, а as is. Выполнен большой рефакторинг win-версии кода, изменения существенные, и повторять вручную те же самые действия с linux-версией не хочется.


Кстати, про отсутствие SCM (сразу не заметил) — это то, что надо исправить немедленно, на позавчера.
Собрать все известные версии и сложить их историю развития в репо.

Только после этого имеет смысл двигаться дальше, ну и всю разработку независимо от идей по мержингу принудительно загнать в SCM.
The God is real, unless declared integer.
Re[2]: Применить diff между двумя файлами к третьему файлу
От: iAlexander Россия  
Дата: 21.03.12 11:17
Оценка:
N>Кстати, про отсутствие SCM (сразу не заметил) — это то, что надо исправить немедленно, на позавчера.

Ребята, насчет SCM отвечаю всем сразу. Не стал писать этого в исходном топике чтобы не засорять.
SCM нужна, полезна и т.п., согласен. Для этого проекта его нет, и достать неоткуда. Файлы linux/win идут параллельными путями, и даже разных версий. Так оно есть, и ничего поделать я тут не могу. О SCM я упомянул лишь для того, чтобы яснее обрисовать ситуацию.

Интерес топика — не в организации кода.
А только в том, как выделить diff между двумя последовательными версиями, после чего применить этот дифф к совершенно другой версии.
Re[3]: Применить diff между двумя файлами к третьему файлу
От: archerz Россия  
Дата: 22.03.12 18:14
Оценка:
Здравствуйте, iAlexander, Вы писали:

N>>Кстати, про отсутствие SCM (сразу не заметил) — это то, что надо исправить немедленно, на позавчера.


A>Ребята, насчет SCM отвечаю всем сразу. Не стал писать этого в исходном топике чтобы не засорять.

A>SCM нужна, полезна и т.п., согласен. Для этого проекта его нет, и достать неоткуда. Файлы linux/win идут параллельными путями, и даже разных версий. Так оно есть, и ничего поделать я тут не могу. О SCM я упомянул лишь для того, чтобы яснее обрисовать ситуацию.

A>Интерес топика — не в организации кода.

A>А только в том, как выделить diff между двумя последовательными версиями, после чего применить этот дифф к совершенно другой версии.


Пользуюсь меркуриалом, поэтому напишу как это можно сделать в меркуриале:
1. Создаешь репозиторий.
2. Добавляешь первую версию файла в репозиторий и комитишься.
3. Заменяешь первую версию файла второй версией и снова комитишься.
4. Теперь ты можешь получить патч этого комита.
5. Создаешь новый репозиторий и добавляешь туда третью версию файла. После этого комитишься.
6. Теперь накатываешь патч полученый в пункте 4.
Люди делятся на 10 категорий: одни понимают, что такое двоичное счисление, другие — нет.
Re[4]: Применить diff между двумя файлами к третьему файлу
От: iAlexander Россия  
Дата: 26.03.12 09:27
Оценка:
Здравствуйте, archerz, Вы писали:

A>Пользуюсь меркуриалом, поэтому напишу как это можно сделать в меркуриале:

A>1. Создаешь репозиторий.
A>2. Добавляешь первую версию файла в репозиторий и комитишься.
A>3. Заменяешь первую версию файла второй версией и снова комитишься.
A>4. Теперь ты можешь получить патч этого комита.
A>5. Создаешь новый репозиторий и добавляешь туда третью версию файла. После этого комитишься.
A>6. Теперь накатываешь патч полученый в пункте 4.

Спасибо за предложение. Только один уточняющий вопрос — патчи в меркуриале никак не привязаны к номерам строчек, при применении патча внутри там производится только контекстный поиск?
Спрашиваю, потому что с развертыванием придется повозиться, а шанс получить такой же fail как со стандартными diff/patch есть.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.