Как применить патч Perforce?

Я создал патч некоторое время назад с помощью команды p4 diff.

Однако теперь, когда я хочу применить его, я понимаю, что в Perforce нет возможности применить патч.

Так как я не использовал параметр -du, патч находится в этом непонятном формате perforce и не может применяться с patch(1). Исходные изменения были утрачены. Кроме того, этот патч имеет длину более 300 КБ, поэтому ручное редактирование на самом деле не является вариантом.

Каковы мои варианты? Существуют ли преобразователи патчей или некоторые расширения Perforce, позволяющие применять такие патчи?

Ответы

Ответ 1

Возможно, формат вывода Perforce diff изменился, но ответ @RumburaK не работал у меня.

Мне пришлось изменить его, чтобы преобразовать заголовок ==== в формат заголовка diff +++ и ---.

sed -Ee 's|==== (//.*)#[0-9]+(.*)|+++ \1\n--- \1|' < infile.txt > outfile.txt

infile.txt был сгенерирован следующей командой (где 12335 был измененным списком изменений): p4 describe -du -S 12345

outfile.txt был применен с помощью следующей команды: patch -p3 -l < outfile.txt

Ответ 2

Просто нашел ваш вопрос после сохранения некоторых моих изменений в патче и возврата их, чтобы проверить исходный код...

Предполагая, что вы используете приличный эмулятор терминала, эта однократная операция может занять до часа или около того.

Хорошо, что вы не можете столкнуться с этим на ежедневной основе, так как теперь вы, вероятно, теперь будете использовать "-du", по крайней мере, я уверен, что так и будет. Просто скопируйте и вставьте имя файла в соответствии с запросом:

$ patch -i cucu.diff 
can't find file to patch at input line 2
Perhaps you should have used the -p or --strip option?
The text leading up to this was:
--------------------------
|==== //depot/foo/boo.cpp#1 - /home/who/perforce/foo/boo.cpp ====
--------------------------
File to patch: 

<double-click!> to copy
<middle-click!> to paste

File to patch: /home/who/perforce/foo/boo.cpp <CR>

Возможно, у вас будет 100 файлов в патче... продолжайте нажимать: -)

Если вы ищете выражение subst (vim, sed):

s/.* - \(.*\) ====/+++: \1/

Но - будьте осторожны, если вы добавили источники (целые файлы, p4 добавить), их содержимое, вероятно, не будет напечатано в diff - в этом случае никто не сможет их повторно закрепить...

Ответ 3

Другой ответ: команда p4 diff2 поддерживает флаг -u для генерации различий в формате GNU diff.

От p4 help diff2:

Флаг -u использует формат GNU diff -u и отображает только файлы, которые отличаются. Имена файлов и даты указаны в синтаксисе Perforce, но выход может использоваться программой патчей.