diff --git a/README.md b/README.md new file mode 100644 index 0000000..be7e2a5 --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +# LibXDiff + +[[Оригинальная библиотека]](http://www.xmailserver.org/xdiff-lib.html)|[[Модификация для сборки в CMake]](https://github.com/opencor/libxdiff) + +Библиотека **LibXDiff** реализует базовые, но при этом полноценные функции для создания различий/патчей как для бинарных, так и для текстовых файлов. Она использует «файлы в памяти» (memory files) как абстракцию для достижения производительности и переносимости. + +Для бинарных файлов LibXDiff реализует (с некоторыми изменениями) алгоритмы из статьи *File System Support for Delta Compression* Джошуа П. МакДональда и *Fingerprinting By Random Polynomials* Майкла О. Рабина. Для текстовых файлов библиотека следует принципам из статьи Юджина В. Майерса *An O(ND) Difference Algorithm and Its Variations*. + +Файлы в памяти представляют собой набор буферов, хранящих содержимое файла. При передаче их в функции diff/patch есть два разных требования: + +* Для **текстовых файлов** одна строка не должна пересекать границы блоков. +* Для **бинарных файлов** требуется компактное представление, то есть весь файл хранится в одном блоке. + +Функции внутри библиотеки позволяют обеспечить эти условия. Например: + +* флаг `XDL_MMF_ATOMIC` гарантирует, что запись не будет разделена между блоками; +* функции `xdl_mmfile_iscompact()`, `xdl_mmfile_compact()` и `xdl_mmfile_writeallocate()` позволяют проверить, компактен ли файл, и при необходимости создать его компактную версию. + +Для текстовых файлов результат выводится в формате **unified diff**, но без заголовков файлов, так как результат всегда относится к сравнению ровно двух файлов. +Вывод бинарных патчей — это **собственный двоичный формат**, который представляет собой набор команд *copy* и *insert*, как описано в статье МакДональда. + +Библиотека совместима почти со всеми Unix-системами (через `configure`) и также поддерживает Windows (через `nmake`-файлы). Примеры использования можно найти в подкаталоге `test` дистрибутива, там же есть регрессионный тест: он генерирует случайные данные, выполняет diff и patch, а затем сравнивает результат. + +Регрессионные тесты без ошибок работали сутками на Linux, Solaris, FreeBSD и Windows, что даёт основания считать библиотеку готовой к промышленному использованию (несмотря на её версию). diff --git a/files/xdiff.pc b/files/xdiff.pc new file mode 100644 index 0000000..624ac59 --- /dev/null +++ b/files/xdiff.pc @@ -0,0 +1,9 @@ +prefix=/usr +includedir=${prefix}/include +libdir=${prefix}/lib + +Name: xdiff +Description: LibXDiff - a library for generating file diffs/patches +Version: 0.23 +Libs: -L${libdir} -lxdiff +Cflags: -I${includedir} diff --git a/package.yml b/package.yml new file mode 100644 index 0000000..b49507a --- /dev/null +++ b/package.yml @@ -0,0 +1,22 @@ +name : libxdiff +version : 0.23 +release : 1 +source : + - https://github.com/opencor/libxdiff/archive/refs/tags/v0.23.tar.gz : 69b951c9d47873968975ba637d9cfd907f82b085b228d11dcf1f8b2afcafc9a8 +homepage : http://www.xmailserver.org/xdiff-lib.html +license : LGPL-2.1-or-later +component : system.utils +summary : The LibXDiff library implements basic and yet complete functionalities to create file differences/patches to both binary and text files. +description: | + The LibXDiff library implements basic and yet complete functionalities to create file differences/patches to both binary and text files. +setup : | + %cmake_ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DENABLE_TESTS=OFF \ + -DENABLE_TOOLS=OFF \ + -DCMAKE_INSTALL_PREFIX=/usr +build : | + %ninja_build +install : | + %ninja_install + install -Dm644 $pkgfiles/xdiff.pc -t $installdir/usr/lib/pkgconfig