Применить несколько .patch файлов

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

У меня есть каталог с файлами .patch, созданными с помощью diff.

Я хотел бы применить все эти патчи с помощью patch -p1 к другому каталогу.

Но patch принимает только один файл, если не использовать cat.

Какой будет команда для применения нескольких файлов с помощью xargs или аналогичного инструмента.

Если cat работает, почему бы не использовать его?

Чтобы использовать find и xargs:

find dirname -name <namespec> -print0 | xargs -0 -n 1 patch <patchargs>

Пример:

find src/networking -type f -name 'network*.patch' -print0 | xargs -0 -n 1 patch -p2

Предполагая, что вы используете bash/sh/zsh/etc:

cd /path/to/source
for i in /path/to/patches/*.patch; do patch -p1 < "$i"; done

Принятое решение не сработало для меня, похоже оно предполагает, что patch может принять несколько файлов патчей за один раз. Мое решение:

find /tmp/patches -type f -name '*.patch' -print0 | sort -z | xargs -t -0 -n 1 patch -p0 -i

Find: Находит файлы патчей

  • /tmp/patches: Каталог для поиска файлов патчей
  • -type f: только файлы
  • -name ‘*.patch’: файлы, оканчивающиеся на .patch
  • -print0: выводит результаты в stdout как список строк, терминированных нулевым символом

Sort: Сортирует файлы патчей, чтобы порядок сохранился (например, 001 следует перед 002)

  • -z: входные данные терминированы нулем (так как мы использовали -print0)

xargs: Вызывает patch, используя stdin как аргументы

  • -t: Печатает команду перед ее выполнением, можно удалить для уменьшения вербальности
  • -0: stdin — это список, терминированный нулем
  • -n 1: Вызывает patch для каждого 1 элемента в списке (например, вызывает patch N раз вместо того, чтобы создать список и вызвать его один раз)
  • -i: аргумент для patch, чтобы указать, что аргумент будет файлом патча

Это действительно работает (в Bash):

shopt -s globstar
for file in /path/to/patches/**/*.patch
do
    patch -p1 < "$file"
done

В Debian используется очень удобный инструмент под названием quilt для управления пакетами.

В Debian/Ubuntu установите его с помощью

sudo apt install quilt

Взгляните на этот очень хороший учебник от Шакти Каннана: Quilt Tutorial, даже если он немного устарел.

Чтобы дать общее представление, взгляните на страницу руководства quilt (1):

Quilt — это инструмент для управления большими наборами патчей, отслеживая изменения, которые вносит каждый патч. Патчи могут быть применены, отменены, обновлены и т. д. Основная философская концепция заключается в том, что основным выходным продуктом являются патчи.
С quilt вся работа происходит в пределах единого дерева каталогов. Команды могут быть вызваны из любой точки в дереве исходного кода.

Quilt управляет стеком патчей. Патчи применяются поочередно поверх базового дерева плюс все предшествующие патчи. Они могут быть подняты на вершину стека (quilt push) и сняты со стека (quilt pop).

Команды доступны для запроса содержимого файла серии (quilt series, см. ниже), содержимого стека (quilt applied, quilt previous, quilt top) и патчей, которые не применяются в данный момент (quilt next, quilt unapplied). По умолчанию большинство команд применяются к самому верхнему патчу на стеке.

Файл под названием series содержит список имен файлов патчей, который определяет порядок, в котором патчи применяются. Если нет средств для автоматической генерации файлов серии, он обычно предоставляется вместе с набором патчей. В этом файле каждое имя файла патча находится на отдельной строке. Файлы патчей идентифицируются путем имен файлов, которые являются относительными к каталогу патчей;
патчи могут находиться в подкаталогах ниже этого каталога. Строки в файле серии, которые начинаются с символа хэша (#), игнорируются.

Когда quilt добавляет, удаляет или переименовывает патчи, он автоматически обновляет файл серии. Пользователи quilt могут изменять файлы серии, пока некоторые патчи применены, если примененные патчи остаются в своем первоначальном порядке.
Разные файлы серии могут быть использованы для сбора патчей по-разному, соответствуя, например, разным ветвям разработки.

Перед тем, как патч применяется (или «поднимается на стек»), копии всех файлов, которые изменяет патч, сохраняются в каталоге .pc/patch. Патч добавляется в список в данный момент применяемых патчей (.pc/applied-patches). Позже, когда патч генерируется заново (quilt refresh), резервные копии в .pc/patch сравниваются с текущими версиями файлов в дереве исходного кода с помощью GNU diff.

В итоге можно добавить патчи в файл под названием series и управлять им несколькими способами. Можно добавлять, удалять патчи и получить список примененных патчей и т.д.

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

Применение нескольких .patch файлов к директории — задача, часто возникающая в среде ИТ, особенно в контексте разработки ПО и управления версиями. В данном случае пользователь хочет применить несколько файлов патчей, созданных с помощью команды diff, к другой директории, используя команду patch с параметром -p1. Однако возникает проблема, так как программа patch по умолчанию принимает только один файл на вход, если не использовать промежуточные решения вроде cat.

Теория:
Прежде чем углубляться в методы применения нескольких патчей, важно понять, что собой представляют файлы .patch. Это файлы, содержащие различия между двумя версиями текстового файла, и они могут включать изменения, такие как исправление багов, добавление новых функций или обновление документации. Команда patch позволяет применить эти изменения к исходному файлу, преобразуя его в новую версию согласно информации из .patch файла.

Применение патчей вручную, особенно в больших количествах, может быть трудоёмким процессом. Это делает автоматизацию с помощью скриптов и командных инструментов важной задачей в ежедневной практике ИТ-специалистов.

Пример:
Для применения нескольких .patch файлов можно использовать несколько подходов:

  1. Использование xargs и find:
    Один из способов автоматизации этого процесса — использование команд find и xargs. Этот метод позволяет найти все файлы с расширением .patch в указанной директории и передать их последовательно команде patch.

    find /tmp/patches -type f -name '*.patch' -print0 | sort -z | xargs -t -0 -n 1 patch -p0 -i

    В этой команде:

    • find ищет все файлы, соответствующие условию (завершающиеся на .patch) и выводит их с помощью null-терминированного списка (-print0).
    • sort -z предназначен для сортировки этих файлов, сохраняя порядок их применения.
    • xargs -0 -n 1 patch -p0 -i вызывает команду patch для каждого файла отдельно, обеспечивая корректность применения.
  2. Скриптовый подход с использованием for-цикла:
    Для применения патчей можно использовать оболочку, такую как bash, чтобы организовать простую автоматизацию с помощью for-цикла:

    cd /path/to/source
    for i in /path/to/patches/*.patch; do
       patch -p1 < "$i"
    done

    Этот подход выполняет переход в директорию, где нужно применить патчи, и затем перебирает каждый файл .patch, последовательно применяя его.

  3. Использование Quilt для управления патчами:
    Quilt — это инструмент, который упрощает управление большими наборами патчей. Он позволяет организовать патчи в стек, применять, отменять и обновлять их.

    Сначала нужно установить Quilt:

    sudo apt install quilt

    Затем использовать Quilt для создания и применения патчей через файл серии, который определяет порядок их применения.

Применение:
Выбор между этими методами зависит от конкретных нужд и окружения, в котором работает ИТ-специалист. Например, если количество патчей невелико и они не требуют сложного управления, подойдет использование скрипта с for-циклом. Если же требуется более гибкое средство, которое позволяет управлять сложными последовательностями изменений, Quilt может быть идеальным выбором.

В целом, цель состоит в том, чтобы автоматизировать процесс применения патчей настолько, чтобы он занимал минимальное количество времени и снижал риск ошибок, связанных с человеческим фактором. Этот подход также способствует поддержанию высокого уровня стандартов качества в процессе разработки и обслуживания кода.

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

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