Product SiteDocumentation Site

11.2. Patchutils

Для удобной работы с патчами существует отдельный набор утилит patchutils.

11.2.1. Combinediff

Утилита combinediff объединяет патчи в единый блок, при этом по возможности объединяя последовательные действия.
Рассмотрим работу этой утилиты на примере объединения последовательных патчей:
@user
[user@VM calend-patches]$ cal
    Август 2025
Пн Вт Ср Чт Пт Сб Вс
            1  2  3
4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

[user@VM calend-patches]$ cal > base
[user@VM calend-patches]$ sed -i.start "s/ 2/%II/g" base
[user@VM calend-patches]$ sed -i.middle "s/II/2/g" base
[user@VM calend-patches]$ cat base.start base.middle base
    Август 2025
Пн Вт Ср Чт Пт Сб Вс
            1  2  3
4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

    Август%II025
Пн Вт Ср Чт Пт Сб Вс
            1 %II  3
4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19%II0%II1%II2%II3%II4
25%II6%II7%II8%II9 30 31

    Август%2025
Пн Вт Ср Чт Пт Сб Вс
            1 %2  3
4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19%20%21%22%23%24
25%26%27%28%29 30 31

[user@VM calend-patches]$ diff -u base.start base.middle > 1st.patch
[user@VM calend-patches]$ diff -u base.middle base > 2nd.patch
В описании патчей кроме самих изменений также фиксируются имена сравниваемых файлов. Это необходимо, поскольку patch умеет применять патчи к итоговому файлу, указанному в его output-namefile. В случае combinediff указание разных имён будет определяться как одновременное применение изменений к разным файлам, а не последовательное к одному. Поэтому поменяем input-filename и output-filename на одинаковые и применим утилиту:
@user
[user@VM calend-patches]$ vim 1st.patch
[user@VM calend-patches]$ vim 2nd.patch
[user@VM calend-patches]$ cat 1st.patch
--- base        2025-08-02 14:33:55.057478757 +0300
+++ base        2025-08-02 14:35:16.045334090 +0300
@@ -1,8 +1,8 @@
-     Август 2025
+     Август%II025
Пн Вт Ср Чт Пт Сб Вс
-             1  2  3
+             1 %II  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
-18 19 20 21 22 23 24
-25 26 27 28 29 30 31
+18 19%II0%II1%II2%II3%II4
+25%II6%II7%II8%II9 30 31

[user@VM calend-patches]$ cat 2nd.patch
--- base        2025-08-02 14:35:16.045334090 +0300
+++ base        2025-08-02 14:35:37.973294915 +0300
@@ -1,8 +1,8 @@
-     Август%II025
+     Август%2025
Пн Вт Ср Чт Пт Сб Вс
-             1 %II  3
+             1 %2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
-18 19%II0%II1%II2%II3%II4
-25%II6%II7%II8%II9 30 31
+18 19%20%21%22%23%24
+25%26%27%28%29 30 31

[user@VM calend-patches]$ combinediff 1st.patch 2nd.patch > all.patch
[user@VM calend-patches]$ cat all.patch
diff -u base base
--- base        2025-08-02 14:35:16.045334090 +0300
+++ base        2025-08-02 14:35:37.973294915 +0300
@@ -1,8 +1,8 @@
-     Август 2025
+     Август%2025
Пн Вт Ср Чт Пт Сб Вс
-             1  2  3
+             1 %2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
-18 19 20 21 22 23 24
-25 26 27 28 29 30 31
+18 19%20%21%22%23%24
+25%26%27%28%29 30 31

[user@VM calend-patches]$
Как видно из примера, последовательное изменение файла «склеилось» в единое изменение.