Есть две версии одного и того же проекта, один для 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++. Прикладные вопросы' — Кодт
Здравствуйте, 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 между двумя файлами к третьему файлу
Здравствуйте, 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 между двумя файлами к третьему файлу
Здравствуйте, iAlexander, Вы писали:
A>Добрый день всем,
A>Есть две версии одного и того же проекта, один для win, другой для linux. Различия между ними в с-коде не слишком сильные — багфиксы для конкретной ОС ( ), вставки платформозависимого кода и т.п. Исходный код, увы, не под SCM, а as is. Выполнен большой рефакторинг win-версии кода, изменения существенные, и повторять вручную те же самые действия с linux-версией не хочется.
ОФФТОП
А зачем две версии проекта? Почему не #ifdef-ы или вынос платформо-зависимого кода в папки win/lin?
Re: Применить diff между двумя файлами к третьему файлу
Здравствуйте, iAlexander, Вы писали:
A>Есть две версии одного и того же проекта, один для win, другой для linux. Различия между ними в с-коде не слишком сильные — багфиксы для конкретной ОС ( ), вставки платформозависимого кода и т.п. Исходный код, увы, не под SCM, а as is. Выполнен большой рефакторинг win-версии кода, изменения существенные, и повторять вручную те же самые действия с linux-версией не хочется.
Кстати, про отсутствие SCM (сразу не заметил) — это то, что надо исправить немедленно, на позавчера.
Собрать все известные версии и сложить их историю развития в репо.
Только после этого имеет смысл двигаться дальше, ну и всю разработку независимо от идей по мержингу принудительно загнать в SCM.
The God is real, unless declared integer.
Re[2]: Применить diff между двумя файлами к третьему файлу
N>Кстати, про отсутствие SCM (сразу не заметил) — это то, что надо исправить немедленно, на позавчера.
Ребята, насчет SCM отвечаю всем сразу. Не стал писать этого в исходном топике чтобы не засорять.
SCM нужна, полезна и т.п., согласен. Для этого проекта его нет, и достать неоткуда. Файлы linux/win идут параллельными путями, и даже разных версий. Так оно есть, и ничего поделать я тут не могу. О SCM я упомянул лишь для того, чтобы яснее обрисовать ситуацию.
Интерес топика — не в организации кода.
А только в том, как выделить diff между двумя последовательными версиями, после чего применить этот дифф к совершенно другой версии.
Re[3]: Применить diff между двумя файлами к третьему файлу
Здравствуйте, iAlexander, Вы писали:
N>>Кстати, про отсутствие SCM (сразу не заметил) — это то, что надо исправить немедленно, на позавчера.
A>Ребята, насчет SCM отвечаю всем сразу. Не стал писать этого в исходном топике чтобы не засорять. A>SCM нужна, полезна и т.п., согласен. Для этого проекта его нет, и достать неоткуда. Файлы linux/win идут параллельными путями, и даже разных версий. Так оно есть, и ничего поделать я тут не могу. О SCM я упомянул лишь для того, чтобы яснее обрисовать ситуацию.
A>Интерес топика — не в организации кода. A>А только в том, как выделить diff между двумя последовательными версиями, после чего применить этот дифф к совершенно другой версии.
Пользуюсь меркуриалом, поэтому напишу как это можно сделать в меркуриале:
1. Создаешь репозиторий.
2. Добавляешь первую версию файла в репозиторий и комитишься.
3. Заменяешь первую версию файла второй версией и снова комитишься.
4. Теперь ты можешь получить патч этого комита.
5. Создаешь новый репозиторий и добавляешь туда третью версию файла. После этого комитишься.
6. Теперь накатываешь патч полученый в пункте 4.
Люди делятся на 10 категорий: одни понимают, что такое двоичное счисление, другие — нет.
Re[4]: Применить diff между двумя файлами к третьему файлу
Здравствуйте, archerz, Вы писали:
A>Пользуюсь меркуриалом, поэтому напишу как это можно сделать в меркуриале: A>1. Создаешь репозиторий. A>2. Добавляешь первую версию файла в репозиторий и комитишься. A>3. Заменяешь первую версию файла второй версией и снова комитишься. A>4. Теперь ты можешь получить патч этого комита. A>5. Создаешь новый репозиторий и добавляешь туда третью версию файла. После этого комитишься. A>6. Теперь накатываешь патч полученый в пункте 4.
Спасибо за предложение. Только один уточняющий вопрос — патчи в меркуриале никак не привязаны к номерам строчек, при применении патча внутри там производится только контекстный поиск?
Спрашиваю, потому что с развертыванием придется повозиться, а шанс получить такой же fail как со стандартными diff/patch есть.