Menu

Документация

Salat Production
ENGLISH »RUSSIAN«

Recursive Patch Maker (RPM) - утилита предназначенная для создания бинарных патчей. С ее помощью вы сможете с легкостью сопоставить две версии файлов и записать разницу между ними для последующего обновления. Особенно это актуально при больших объемах данных, когда необходимо заменить/перекачать крупный файл, к примеру 2Гб, тогда как изменений в его исходниках по факту буквально на несколько килобайт.

Данная утилита является полностью консольной и как понятно из заголовка основана на другой утилите под названием xDelta.

Естественно существуют программы для осуществления операции по созданию патча из директории, однако 99% из них имеют убогий и неудобный интерфейс с нечитабельными настройками. Ко всему прочему добрая часть из них не предоставляет возможности собрать свой инсталлятор, что в свою очередь ведет к ограничению вариативности.

Чем же так хорош RPM?

  1. Основан на проверенных утилитах xdelta, bincomp, freearc.
  2. Создает и применяет рекурсивные «заплатки».
  3. Простая, понятная и минималистичная настройка параметров.
  4. Последующее использование с Inno компилятором.

Структура приложения
- modules
-- modules\arc.exe (модуль freearc, предназначен для архивации)
-- modules\arc.sfx (расширение freearc, для создания sfx архивов)
-- modules\bincomp.exe (утиль для проверки различий между файлами)
-- modules\xdelta3.exe (последняя стабильная версия 3.0.11)
- builder.exe
- config.ini (конфигурационный файл для билдера)
- patcher.exe

Использование билдера
Ниже представлена дефолтная конфигурация для билдера. Разберем ее параметры по порядку.

[COMPARING]
Original — Папка с исходными/оригинальными файлами
Modified — Папка с измененными файлами, которые должны быть получены после применения патча

[FLTERS]
excludefolders — Папки которые будут исключены из списка патчей ["FolderName", "FolderName\Subfolder"]
excludefiles — Файлы которые будут исключены из списка патча ["FileName.exe", "*Name", "Name*", "*Name*"]
excludeexts — Файлы с расширениями которые будут исключены из списка патча ["*.dll", "*.txt"]

[FILENAMES]
missedfolder — Название директории в которой будут храниться отсутствующие файлы из мод. папки
patchfolder — Название директории в которой будут храниться созданные файлы патчей
fileslist — Название файла с списком путей модифицированной папки (это просто текстовый файл. имя и расширение может быть абсолютно любыми)

[COMPRESSION]
compressing — Параметр отвечающий за вкл или откл компрессии с помощью Freearc
arcpass — Пароль архива (пустой по дефолту)

; Comparing folders
[COMPARING]
original=C:\Windows
modified=D:\Windows

; Add `*` as any symbol and any length. Leave empty [] if you dont need any rules.
; To exclude folders or subfolders ["FolderName", "FolderName\Subfolder"]
; To exclude files by full name ["FileName.exe"], by a part of name ["*Name", "Name*", "*Name*"]
; To exclude files with specific extension ["*.dll", "*.txt"]
[FILTERS]
excludefolders=[]
excludefiles=[]
excludeexts=[]

; Update folder, Patch folder, Files list
[FILENAMES]
missedfolder=rpm_update
patchfolder=rpm_patch
fileslist=fileslist.info

; Enable/Disable archiving [0|1]
; You cant use special chars in password(!@#$%^&*()+{}[]><?|\/:; etc.)
[COMPRESSION]
compressing=0
arcpass=

Использование патчера

В следующем листинге перечислены доступные на данный момент внешние передаваемые параметры.

-t — Заголовок отображаемый в консоли и последующих блоках внутри скрипта *
-n — Название директории в которой будет производится применение патчей
-p — Название директории в которую будет распаковываться архив с патчами
-u — Название директории в которую будет распаковываться архив с обновлениями
-l — Название файла с списком путей
-s — Пропуск этапа ручного подтверждения обновления
-psw — Пароль, если был задан в конфиге

  • Использование кириллических символов возможно, но нежелательно
  • Дефисы передаваемые в параметрах будут заменены на пробелы ( -t My-Patch-Name => -t My Patch Name )
  • Параметры содержащие пробельные символы заключайте в кавычки ( "My Application Title" )
 -t [title]:string (default: Recursive Patch Maker)
 -n [patched folder name]:string (default: rpm_new)
 -p [patch folder name]:string (default: rpm_patch)
 -u [update folder name]:string (default: rpm_update)
 -l [file with pathes list]:string (default: fileslist.info)
 -s [skip confirmation stage]:bool (default: false)
 -psw [archive password]:string (default: null)

Скрипт Inno Setup

В следующем листинге представлен самый простой скрипт для Inno, позволяющий создать установочный визард.
В дефайнах для удобства заданы переменные, которые изменяются в соответствии с создаваемым патчем. Для их работы обязательно должен быть включен препроцессор.
Все они разбиты на отдельные сорсы, однако возможно использование и из директории (Source: {#rpmPath}{#updFolder }*;)

appID — ID созданного ранее в Inno Setup визарда (опционально)
appName — Название приложения
version — Версия
rpmPath — Путь до папки с утилитой RPM
updFolder — Название папки с патчем, созданной RPM
patcherName — Название исполняемого файла (по умолчанию patcher.exe)
updName — Название exe архива с обновлением
patchName — Название exe архива с патчем
fileListName — Название файла с списком путей
parameters — Параметры для RPM патчера

#define appID '36E6CAF2-C966-44E3-A0FB-339CC862C640'
#define appName 'Demo Patcher'
#define version '0.0.1'
#define rpmPath 'С:\RPM [build 1.0.0]'
#define updFolder '20151107.53638'
#define patcherName 'patcher'
#define updName 'rpm_update'
#define patchName 'rpm_patch'
#define fileListName 'fileslist.info'
#define parameters '-t "Заголовок"'

[Setup]
AppID={{{#appID}}
AppName={#appName} - Update {#version}
AppVersion={#version}
DefaultDirName={pf}\{#appName}
OutputDir=D:\
OutputBaseFilename=-01-{#appName}-{#version}
SolidCompression=true
UsePreviousAppDir=true
AppendDefaultDirName=false
DirExistsWarning=false
Uninstallable=false
Compression=lzma2/Ultra64
InternalCompressLevel=Ultra64

[Files]
Source: {#rpmPath}\{#patcherName}.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall;
Source: {#rpmPath}\modules\xdelta3.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall;
Source: {#rpmPath}\{#updFolder}\{#updName}.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall;
Source: {#rpmPath}\{#updFolder}\{#patchName}.exe; DestDir: {app}; Flags: ignoreversion deleteafterinstall;
Source: {#rpmPath}\{#updFolder}\{#fileListName}; DestDir: {app}; Flags: ignoreversion deleteafterinstall;

[Run]
Filename: {app}\{#patcherName}.exe; Parameters: "{#parameters}"; WorkingDir: {app}; StatusMsg: Updating..;

MongoDB Logo MongoDB