Что такое git patch и как выстрелить им себе в ногу
Вероятно, если вы ни разу не сталкивались с процессом применения изменений в опенсурс-разработке, то вы и никогда не сталкивались и с git patch. Собственно, что такое этот git patch? Вкратце, это специальный формат текстового файла, который отображает изменения в коде между двумя коммитами. Например, изменения, внесённые разрабом относительно ветки master. Зачем это нужно, когда есть git merge, пул реквесты и т. д.? Ну... Не знаю, насколько это хорошая практика, но много опенсурсных проектов (в частности, Linux) принимают от контрибьюторов изменения по почте 😊. В некоторых случаях это из-за их олдовости, а в других, я полагаю, это единственный доступный способ для владельцев репозитория работать с контрибьюторами. Но так или иначе, git patch'и идеально подходят для того, чтобы их отправлять по мылу. Выглядят они как-то так.
Теперь к нашей истории. Как видно из примера патча сверху, в него входит также и описание патча. И недавно произошёл один забавный случай, связанный как раз с этим описанием. Некий Орестис Флорос завёл в гитхабе пулреквест для i3 (оконный менеджер). Меинтейнер принял его и в виде гит патча забрал себе для того, чтобы вставить в другой репозиторий и сформировать debian пакет приложения. После того, как он применил патч, он заметил, что некоторые операции в приложении теперь занимают на несколько секунд дольше.
Дебаг показал, что помимо валидных изменений, которые и должны были примениться после патча, были применены также изменения, которые были в описании патча. А в описании было что-то типа: «Эти изменения я протестил так» и git diff изменений, которые автор вносил для тестирования своих правок, и в которых как раз был sleep(1), из-за которого в некоторых местах и появлялись непонятные паузы.
То есть ещё раз. Были применены изменения, которых не было в коммитах пулреквеста (!), но которые были в его описании и имели формат git diff. Дело в том, что в патче любой текст формата git diff будет рассматриваться как валидные изменения и будет применён. И не важно, в какой последовательности будут идти дифы и обычный текст, который будет принят за обычные комментарии.
Post #85
120

- 🤔 3