PDA

Просмотр полной версии : Перевод патчей под новые ревизии.


Max
07.03.2010, 04:37
Все изменения провожу в 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)
В этом способе мы подгоняем подгоняем патч под имеющиеся исходники.

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


diff --git a/src/game/Group.h b/src/game/Group.h
index 3024438..88eda30 100644
--- a/src/game/Group.h
+++ b/src/game/Group.h
@@ -92,7 +92,8 @@ enum GroupUpdateFlags
GROUP_UPDATE_FLAG_PET_AURAS = 0x00040000, // uint64 mask, for each bit set uint32 spellid + uint8 unk, pet auras...
GROUP_UPDATE_FLAG_VEHICLE_SEAT = 0x00080000, // uint32 vehicle_seat_id (index from VehicleSeat.dbc)
GROUP_UPDATE_PET = 0x0007FC00, // all pet flags
- GROUP_UPDATE_FULL = 0x0007FFFF, // all known flags
+ GROUP_UPDATE_VEHICLE = 0x000FFC00, // all vehicle flags
+ GROUP_UPDATE_FULL = 0x000FFFFF, // all known flags
};

#define GROUP_UPDATE_FLAGS_COUNT 20
diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp



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
Альтернативный способ.

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

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


diff --git a/src/game/Group.h b/src/game/Group.h
index 3024438..88eda30 100644
--- a/src/game/Group.h
+++ b/src/game/Group.h
@@ -92,7 +92,8 @@ enum GroupUpdateFlags
GROUP_UPDATE_FLAG_PET_AURAS = 0x00040000, // uint64 mask, for each bit set uint32 spellid + uint8 unk, pet auras...
GROUP_UPDATE_FLAG_VEHICLE_SEAT = 0x00080000, // uint32 vehicle_seat_id (index from VehicleSeat.dbc)
GROUP_UPDATE_PET = 0x0007FC00, // all pet flags
- GROUP_UPDATE_FULL = 0x0007FFFF, // all known flags
+ GROUP_UPDATE_VEHICLE = 0x000FFC00, // all vehicle flags
+ GROUP_UPDATE_FULL = 0x000FFFFF, // all known flags
};

#define GROUP_UPDATE_FLAGS_COUNT 20
diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp



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. Возможны краши после подгонки патчей.


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

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