Ключевые слова:diff, freebsd, binary, (найти похожие документы)
From: Антон Карпов <postfix@sendmail.ru>
Newsgroups: email
Date: Mon, 19 Jan 2004 14:31:37 +0000 (UTC)
Subject: Быстрое обновление бинарных файлов с помощью xdelta
Недавно разработчики выпустили новую версию KDE, вышла новая mozilla,
обновятся и порты, неужели снова скачивать 30 с лишним мегабайт исходных
текстов браузера или новые пакеты исходных текстов оконного менеджера,
чтобы обновить рабочую среду? Система портов предполагает именно такой
подход. Но у вас в /usr/ports/distfiles/ уже есть все однажды скачанные
пакеты от kde-3.1.4, уже есть mozilla-sources-1.5.tar.bz2, и то и другое
весит весьма прилично, скачивать новые исходники либо долго (диалап),
либо дорого (adsl, прочее). В конце концов, мы же не выкачиваем /usr/src
заново, когда cvsup'ом накатываем систему до актуального
состояния. Все ведь слышали про patch и diff.
По счастью для бинарных файлов есть утилита, по функциональности
аналогичная diff , называется xdelta.
Ставим
cd /usr/ports/misc/xdelta
make install clean
Качаем нужные .xdelta-файлы. Для примера, если обновляем KDE с 3.1.4 до
3.1.5, то они лежат на http://kde.oregonstate.edu/pub/kde/stable/3.1.5/src/ или других
зеркалах. Полный пакет kdeartwork весит 13 мб, а его "бинарный
diff" - всего 900 кб, почувствуйте разницу. Если обновляется другой
пакет (mozilla, etc) то, возможно, придется поискать нужный xdelta-файл,
не все разработчики пока приняли за правило облегчать жизнь
пользователям ;-)
Патчим. Для наложения патча достаточно запустить xdelta patch
имя_файла.xdelta в каталоге, содержащем и патч, и оригинальный пакет.
Xdelta сама применит патч к нужному файлу и создаст в том же каталоге
новую версию пакета. Тут, правда, нужно быть внимательным, ибо патч
может быть применен не к сжатой версии пакета, а к tar-файлу с
исходниками. Как и есть в случае с KDE, т.е. вам сначала придется
разжать arts-1.1.4.tar.bz2 в arts-1.1.4.tar, а потом уже наложить патч.
Далее получившийся arts-1.1.5.tar нужно будет снова сжать. Полагаю, это
сделано для того, чтобы не испытывать трудностей с разной степенью
сжатия, т.к. одинаковые по названию, но сжатые с разной степенью архивы
имеют разный размер и для xdelta - разные файлы.
Для данного конкретного случая можно использовать скрипт вроде следующего:
#!/bin/sh
[ $# -lt 1 ] && (echo "usage: ./$0 file1.xelta file2.delta file3.delta ...";exit 1)
for i in $@; do
XDELTA=$i
ORIGINAL=`echo $XDELTA | cut -d - -f 1,2`.tar.bz2
NEWFILE=`echo $XDELTA | cut -d - -f 1,3 | sed -e 's/\.xdelta//g'`
UNBZIPPED=`echo $ORIGINAL | sed -e 's/\.bz2//g'`
bzip2 -d $ORIGINAL
xdelta patch $XDELTA
bzip2 $NEWFILE
rm $UNBZIPPED
done
Просто положим его в /usr/ports/distfiles/KDE, предварительно скачав в
этот каталог все xdelta-diff'ы, и запустим ./xdpatch.sh *.delta
Может случиться, что у итоговых архивов будет иная md5-сумма, нежели
указанная в distinfo соответствующего пакета, и система полезет качать
его из сети. Что ж, исправить руками distinfo все-таки быстрее, чем
качать 30 мегабайт :)