Вы не сможете создать один двоичный патч, который может применяться к нескольким версиям программы, поэтому следующий сценарий будет невозможен:
org+p1
/ \
+ p1 +p2 <-- note, p2 is the same patch both places
/ \
original org+p1+p2
\ /
+ p2 +p1 <-- ie. the p2 on this line is the same as the one above
\ /
org+p2
Вместо этого у вас будет такой сценарий:
org v.2
/ \
+p1 +p4 <-- note, different patches now
/ \
org v.1 org v.4
\ /
+p2 +p3
\ /
org v.3
Вы должны легко увидеть, насколько это сложно, если вы хотите, чтобы ваши пользователи могли выбрать исправления, которые они хотят применить. Да, это можно сделать с помощью текстовых файлов, в конце концов, именно так ветвления и слияния работают с большинством инструментов контроля версий, но они работают на основе того, что вы можете вставлять и удалять файлы в файлах, не подвергая риску остальную часть файла, и это не работает с исполняемым файлом.
Примечание : особый случай - это исправления, которые заменяют байты, но не вставляют и не удаляют что-либо из файла. До тех пор, пока несколько таких исправлений не пересекаются, можно будет выбрать те, которые вы хотите применить. Однако такие патчи очень редки.
Вы должны, как вы уже намекали в своем вопросе, работать с последовательной временной шкалой, возможно, с отдельными исправлениями к существующим версиям, так что вы можете иметь вместо этого:
+-- most up to date version
|
v
org v.1 org v.3 org v.4
\ / \ /
+p1 +p2 +p3 +p4
\ / \ /
org v.2 org v.4
\
+p1.1
\
org v.2 hotfix 1
Что касается реального кода, у меня есть реализация diff / patch, но она, вероятно, далека от оптимальной. В настоящее время требуется много времени для создания файлов исправлений для любого значительного файла. Патчи довольно маленькие, но я осмелюсь сказать, что другие алгоритмы будут производить лучшие патчи. Примеры тестов с bsdiff и bspatch производят небольшие патчи.
Однако, код здесь , если вы хотите поиграть с ним. Это часть большой библиотеки классов, и я не могу вспомнить, сколько из нее (остальной части библиотеки) вам нужно для компиляции только бинарных классов патчей, но это все есть. Класс, который вы хотите использовать, это Delta2 класс.