Что значит ‘patch unexpectedly ends in middle of line’?

Вопрос или проблема

Вот вывод моей команды patch:

Hunk #11 объединен на 4184,4190.
Hunk #12 объединен на 4444.
Hunk #13 объединен на 4944.
Hunk #14 НЕ ОБЪЕДИНЕН на 5106-5116.
Hunk #15 объединен на 5290.
Hunk #16 объединен на 5448.
patch неожиданно заканчивается посреди строки
Hunk #17 объединен на 5608,5611.

Команда была

patch -d ~/SOME_DIR -p1 --merge --verbose -u

Патч был создан с помощью git:

git --git-dir ~/SOME_DIR/.git diff -U8 bb1ee538982957b421a4c0e78f30428e73c9a072 HEAD -- malloc.c

Что значит patch неожиданно заканчивается посреди строки и является ли это проблемой? Это относится к hunk 16 или 17? На что мне стоит обратить внимание в файле патча, чтобы выяснить, что вызывает это?

Сообщение относится к Hunk 16.

Это обсуждение на GitHub вероятно связано с вашей проблемой.

Оно касается сообщений patch неожиданно заканчивается посреди строки из-за проблем CRLF (возврат каретки, перевод строки), когда с patch используются сгенерированные git различия.

Чтобы процитировать вывод:

[..] git может быть очень разборчивым в отношении концов строк. Вы на Windows или нет? В любом случае, вам, вероятно, стоит настроить autocrlf в конфигурации git. Если вы на Windows, вам нужно “true”, если вы на Mac или Linux, вы должны использовать “input” [..]

В статье Работа с окончаниями строк GitHub подробно объясняет вышеупомянутое утверждение.

Если вы не используете git (комментарий @maxslepzig касался использования patch в контексте git), попробуйте добавить возврат каретки в конце вашего файла. Я так сделал, и patch принял мой патч.

Чтобы добавить к этому очень старому обсуждению:

Проблема, которая приводит к предупреждению, отмеченному OP, обычно вызвана проблемами с окончаниями строк.

patch требует завершающий символ новой строки (LF), чтобы определить конец файла (и предупреждает о едином различии, которое могло быть случайно усечено)

  1. Добавьте правильный перевод строки, не открывая файл для редактирования (что может изменить ваши окончания строк или удалить завершающие строки/пробелы в зависимости от настроек вашего редактора), можно сделать что-то простое, например:

    echo -e "\n" >> YOURPATCHFILE

    Это добавляет символ новой строки в конец файла без внесения каких-либо других изменений.

  2. Если ваш файл патча уже странный или вы хотите одновременно рассмотреть несколько возможных исправлений, вы можете исправить многие проблемы с кодировкой (в ASCII), включая окончания строк (CR или CRLF на LF):

    dos2unix -k YOURPATCHFILE

    Вам, возможно, придется установить бинарный файл dos2unix из менеджера пакетов вашей ОС; т.е.

    • На базе Debian/Ubuntu: sudo apt install dos2unix
    • Fedora/RHEL/CentOS: sudo yum install dos2unix
    • MacOS (с помощью brew): brew install dos2unix

С моей стороны проблема и решение были немного другими. Я использовал git bash на версии Windows из phpstorm, чтобы выполнить команду git diff.

По неизвестной причине созданный .patch файл был закодирован в UTF-16LE. Я проверил конфигурацию git, и никакая конфигурация не указывала, чтобы использовать эту кодировку.

Выполнение этих команд ничего не дало:

git config --global core.quotepath false          # Предотвращает проблемы с кодировкой в путях
git config --global i18n.commitEncoding utf-8     # Устанавливает кодировку сообщения коммита в UTF-8
git config --global i18n.logOutputEncoding utf-8  # Устанавливает кодировку вывода журнала в UTF-8

У меня не было другого выбора, кроме как конвертировать .patch файл в UTF-8 после его создания.

Ответ или решение

Сообщение "patch unexpectedly ends in middle of line" является предупреждением, с которым могут столкнуться разработчики, использующие утилиту patch. Эта ошибка указывает на то, что файл патча, который вы пытаетесь применить, заканчивается неожиданным образом, не имея ожидаемого символа перевода строки (LF) в конце последней строки или между строками. Давайте подробнее разберем, что это означает и как с этим справляться.

Причины появления ошибки

  1. Неправильные окончания строк: Утилита patch воспринимает текстовые файлы, основываясь на специальных символах, обозначающих конец строки. Если файл патча использует символы возврата каретки (CRLF), ожидаемые утилитой patch символы перевода строки (LF) могут вызывать проблемы, особенно если патч был создан в операционной системе Windows и используется на Unix-подобной системе (или наоборот).

  2. Отсутствие перевода строки в конце файла: Утилита patch ожидает, что каждый хунк будет правильно завершен и будет содержать символ перевода строки в конце. Если файл патча не содержит его в конце, возникает данное предупреждение.

Как определить, какая секция вызвала проблему

Сообщение "patch unexpectedly ends in middle of line" относится к хуну 16 и указывает на то, что patch не смог корректно завершить данный хун, потому что обнаружил, что последний кусок содержимого не соответствует ожидаемому формату.

Решение проблемы

  1. Проверка кодировки и окончаний строк: Убедитесь, что файл патча правильно закодирован и использует LF в качестве символа окончания строки. Если вы работаете в Windows, это может стать причиной проблемы. Настройка параметра core.autocrlf в конфигурации Git может помочь:

    git config --global core.autocrlf true  # для Windows
    git config --global core.autocrlf input # для Linux и macOS
  2. Добавление перевода строки в конец файла патча: Вы можете добавить символ перевода строки в конец файла без его открытия в текстовом редакторе:

    echo -e "\n" >> YOURPATCHFILE
  3. Использование утилиты dos2unix: Если файл уже содержит неправильные окончания строк, конвертация его с помощью утилиты dos2unix может помочь преобразовать завершение строк в требуемый формат:

    dos2unix YOURPATCHFILE

    Убедитесь, что вы установили эту утилиту через пакетный менеджер вашей операционной системы, если она еще не установлена.

  4. Проверка кодировки файла: Убедитесь, что файл патча закодирован в UTF-8. Если он случайно был создан в UTF-16 или другом формате, используйте инструменты для конвертации:

    iconv -f UTF-16 -t UTF-8 YOURPATCHFILE > CONVERTEDPATCHFILE

Заключение

Проблема "patch unexpectedly ends in middle of line" обычно связана с неправильными окончаниями строк и отсутствием перевода строки в конце файла. Она может быть решена простыми манипуляциями с файлами и настройками Git. Правильная конфигурация окружения и использование соответствующих инструментов для обработки текстовых файлов помогут избежать подобных ситуаций в будущем.

Оцените материал
Добавить комментарий

Капча загружается...