Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #89, МАЙ 2006 г.

Ловушки для капризных программ

Крис Касперски

Хакер, номер #089, стр. 089-106-3


[пошаговая инструкция молодого бойца]

Исходные тексты обычно распространяются в архивах, упакованных популярными архиваторами типа gzip или bzip2, реже — в виде CVS-дерева. Система Управления Параллельными Версиями (Concurrent Version System) — одна из самых популярных, позволяющая нескольким программистам работать над одним проектом. Она не только отслеживает изменения, синхронизуя файлы всех участников, но и разграничивает привилегии, кто и куда может писать. Анонимные пользователи, не участвующие в проекте, имеют доступ "только чтение".

Чтобы начать работать с CVS-деревом, необходимо залогиниться на удаленную систему под anonymous'ом (CVS-клиент в подавляющем большинстве *nix-дистрибутивов уже установлен), а затем выполнить cvs-команду checkout для получения исходного кода (в данном случае - эмулятора Bochs):

$ cvs -d:pserver:anonymous@cvs.bochs.sourceforge.net:/cvsroot/bochs login

(Logging in to anonymous@cvs.bochs.sourceforge.net)

CVS password: (there is no password, just press Enter)

$ cvs -z3 -d:pserver:anonymous@cvs.bochs.sf.net:/cvsroot/bochs checkout bochs

cvs server: Updating bochs

U bochs/.bochsrc

U bochs/.conf.AIX.4.3.1

U bochs/.conf.beos-x86-R4

U bochs/.conf.macos

U bochs/patches/patch.seg-limit-real

Даже на выделенных линиях вся процедура может занять уйму времени, так как файлы передаются в слабо сжатом состоянии (особенно, если используется метод pserver, а не ext, с компрессией ssh), а докачка поддерживается лишь частично: файлы, скачанные целиком, при неожиданном разрыве связи повторно не передаются, но незаконченные файлы начинают скачиваться сначала. При частых разрывах связи это создает жуткий напряг.

Так какой же тогда смысл возиться с CVS? Не проще ли (быстрее, дешевле) воспользоваться готовым архивом? Однозначного ответа вопрос не имеет. Начнем с того, что некоторые программы распространяются только через CVS. Архив, если и выкладывается, зачастую содержит не все файлы или не обновляется месяцами. С другой стороны, при выходе новой версии весь архив приходится перекачивать от начала до конца (а это опять мегабайты), в то время как CVS-клиент забирает только реально измененные файлы, что существенно экономит трафик.

[патч патчу рознь]

Большинство программистов создают патчи с помощью утилиты diff (см. man diff), получившей свое название в результате сокращения английского слова difference – разница. Эта штука построчно сравнивает файлы, отображая только реальные изменения. Знак "-", стоящий впереди, означает, что данная строка была удалена, а "+" – добавлена. Имя файла предваряется тройным "---"/"+++" и, как правило, все изменения дистрибутива для удобства собраны в одном diff'e. Файлы изменений обычно имеют расширение ".diff" или ".patch", но даже без расширения их легко отождествить визуально. Пример создания патча:

Назад на стр. 089-106-2  Содержание  Вперед на стр. 089-106-4