Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Языки программирования (http://mangos.ytdb.ru/forumdisplay.php?f=34)
-   -   Перевод патчей под новые ревизии. (http://mangos.ytdb.ru/showthread.php?t=62)

Max 07.03.2010 04:37

Перевод патчей под новые ревизии.
 
Вложений: 4
Все изменения провожу в Notepad++. (необходимы полностью скаченные исходники Mangos'a)

Возьмем, к примеру, часть патча добавляющая auctionhousebot. В котором, у меня, возникает ошибка.
Пример: Вложение 124


У меня ошибка была в этом блоке патча, ошибка в файле mail.cpp. Это обычно показано в начале одного из блоков патча.(я выделил фиолетовым)


1. Собственно нужно убедится что есть сами исходники, программа Git и сам патч (желательно ещё и присутствие программы Compare IT! или других аналогичных)
2. Закидываем патч в корневую папку с исходниками, если патч для ядра. Кликаем правой кнопкой мыши по папке с исходниками и выбираем Git Bash Here. И в консоли вводим patch -p1 < имя_патча.patch, нажимаем Enter
3. Смотрим что у нас получилось, если в строчках присутствует FAILED или *** значит в патче есть ошибки. Git лучше оставить открытым, чтобы можно было найти ошибки.
4. Открываем патч который пропатчился с ошибками, и на основе лога ищем в нём блок который пропатчился с ошибкой. Делаем это основываясь на номере строчки или название файла которая/ый пропатчилась/ся с ошибкой.

Я ориентируюсь на основе:
(Старайтесь при возможность ориентироваться не только по одной строчке, т.к. они повторяются.)

Код:

// will delete item or place to receiver mail list
Если таких строчек много, тогда ориентируемся по предыдущим строчкам.

Теперь ищем строчку со знаком -, в патче, которую Git должен удалить или заменить. В моём случае это строчка:

Код:

-    SendMailTo(MailReceiver(receiver,receiver_guid), MailSender(MAIL_NORMAL, sender_guid), MAIL_CHECK_MASK_RETURNED, deliver_delay);
5. Заходим в папку с исходниками, заходим в папку "src/game/", находим файл на который ссылалась ошибка, и открываем с помощью Visual Studio или блокнота файл, на который Git сослался с ошибкой. У меня в примере Git сослался на файл - Mail.cpp
6. Открыв файл Mail.cpp нажимаем CTRL+F, в появившемся окне поиска вводим строчку которая до знака минуса, или предыдущую. (Тоесть, мы ищем ориентировочную строчку)

К примеру, у меня вместо заменяемой строчки стоит следующее:

Код:

    Player *receiver = sObjectMgr.GetPlayer(MAKE_NEW_GUID(receiver_guid, 0, HIGHGUID_PLAYER));
Если вы уверены, в том, что, строчка которую вы нашли, должна стоять вместо строчки из патча со знаком минуса в начале. Тогда копируйте эту строчку из файл, вместо строчки со знаком "минус", не забудьте поставить его в начале.
Пример того что должно получиться: Вложение 125

Жмём сохранить.

7. В заключении ещё одна важная вещь. Адрес изменения. На отдельном примере
Обратите внимание на цифры в адресе изменения. @@ -1168,10 +1168,10 @@ OpcodeHandler opcodeTable[NUM_MSG_TYPES]
-1168 Обозначает номер ориентировочной строчки кода. По которой Git, будет искать, и удалять не нужные строки при необходимости. 10 Это сумма, которая определяет: кол-во ориентировочных строчек в нужном файле для Git + кол-во удаляемых строчек.
+1168 Обозначает номер ориентировочной строчки кода. По которой Git, будет искать и добавлять и или изменять нужные строчки при необходимости. 10 Это сумма, которая определяет: кол-во ориентировочных строчек в нужном файле для Git + кол-во добавляемых строчек.
OpcodeHandler opcodeTable[NUM_MSG_TYPES] Название блока в исходнике, в котором происходит изменение.
Пример: Вложение 126


8. Запускаем консоль Git, как мы делали во 2 пункте, и применяем патч, лучше это делать на чистых исходниках. Если не получилось, делаем по новой.

Альтернативный способ.

Все изменения провожу в Notepad++. (необходимы полностью скаченные исходники Mangos'a)
В этом способе мы подгоняем подгоняем патч под имеющиеся исходники.

Исходный кусок кода патча для примера:


1. Собственно нужно убедится что есть сами исходники, программа Git и сам патч (желательно ещё и присутствие программы Compare IT! или других аналогичных)
2. Закидываем патч в корневую папку с исходниками, если патч для ядра. Кликаем правой кнопкой мыши по папке с исходниками и выбираем Git Bash Here. И в консоли вводим patch -p1 < имя_патча.patch, нажимаем Enter
3. Смотрим что у нас получилось, если в строчках присутствует FAILED или *** значит в патче есть ошибки. Git лучше оставить открытым, чтобы можно было найти ошибки.
4. Открываем патч. Ищем на основе результата применения патча в Git'e ищём нужный блок в котором была ошибка.
В моём примере. Начало блока вносимых изменений из патча в нужный файл исходного кода, это : diff --git a/src/game/Group.h b/src/game/Group.h
В моём примере. Конец блока вносимых изменений из патча в исходный файл нужного кода, это : #define GROUP_UPDATE_FLAGS_COUNT 20
В моём примере. Начало следующего блока вносимых изменений из патча в нужный файл исходного кода, это : diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp

5. Открываем файл, в моём примере это Group.h, и ищем строчку из патча начинающуюся со знака "-". И заменяем эти строчки на строчки которые начинаются со знака +
6. После того как вы внесли все изменения из ошибочного блока патча, удалите этот блок из патча. И продолжите дальше исправление ошибок.
Аккуратно изменяйте патч, при удалении не задевайте другие блоки.
После всех необходимых попробуйте добавить патч на чистые исходники.

P.S. Возможны краши после подгонки патчей.


Взял с rumangos.ru, а они похоже у вас. Отредактировал под Git, поправьте пожалуйста если есть ошибки. . .
Дополнил.

Max 11.03.2010 18:03

Альтернативный способ
 
Альтернативный способ.


Получилось добавить его в первый пост.

KiriX 13.03.2010 14:28

Чаще всего достаточно совершить меньше действий.
Накатываем патч, получаем (местами) reject
Не закрываем git - идём в папку пропатченных исходников и ищем файл, в котором мы словили reject.
Например, reject выпал на player.cpp. Находим два файла: player.cpp и player.cpp.rej. Открываем оба и сразу. Файл с расширением .rej содержит только ту часть кода патча, которую git не смог сам определить куда будет правильно подставить. Далее как в мануале. Только мы всегда работаем не с целиковым файлом патча, а лишь с теми, где возник редж и лишь с той его частью, которую не смог применить git автоматически.

Обновление патчей: накатили, поправили реджы, выполнили команду git diff > путь/имя_файла_патча.patch - всё готово.
Но это уже больше к командам гита относится, а не переводу патча под новые ревы...

lovepsone 01.04.2010 15:41

может этот мануал тож комуто пригодится
Исправления конфликтов
Берем патч (я показываю на патче venciles ) патчим исходники командой:
Цитата:

patch –p1 < имя патча
Смотрим где у нас произошли конфликты .Он произошел в файле ConfusedMovementGenerator.cpp. Идем в папку src/game/ и открываем файл ConfusedMovementGenerator.cpp.rej. У меня там написано
Цитата:

**************
*** 102,108 ****
if(!&unit)
return true;

- if(unit.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED | UNIT_STAT_DIED))
return true;

if( i_nextMoveTime.Passed() )
--- 102,108 ----
if(!&unit)
return true;

+ if(unit.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED | UNIT_STAT_DIED | UNIT_STAT_ON_VEHICLE))
return true;

if( i_nextMoveTime.Passed() )
Открываем файл ConfusedMovementGenerator.cpp и ищем строку
Цитата:

if(unit.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED | UNIT_STAT_DIED))
return true;
либо
Цитата:

if( i_nextMoveTime.Passed()
Теперь ручками заменяем строки в данном случай меняем строку
Цитата:

if(unit.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED | UNIT_STAT_DIED))
return true;
на
Цитата:

if(unit.hasUnitState(UNIT_STAT_ROOT | UNIT_STAT_STUNNED | UNIT_STAT_DISTRACTED | UNIT_STAT_DIED | UNIT_STAT_ON_VEHICLE))
return true;
вот и все



Автор: MangMan


Текущее время: 18:30. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS