В этом посте хотелось бы рассказать о том, как я вышел из ситуации обновления проекта работающего с svn на сервере через FTP. На FTP нельзя выполнять команды, в частности svn update, а заливать каждый раз проект целиком бывает слишком накладно, особенно если проект большой, поэтому я попробовал максимально всё автоматизировать с помощью bash-скрипта.
Прежде всего, нужно получить список файлов, изменившихся в проекте от последнего обновления на сервере, т. е. нужно знать его номер ревизии. Для этого при каждом обновлении проекта на сервере будет создаваться или обновляться специальный файл, с номером ревизии находящейся там, и проверяться при каждом обновлении.
revision=1;
wget ftp://$ftp_user:$ftp_password@$ftp_host$ftp_root/.ftpsvn 2> /dev/null
source .ftpsvn
rm .ftpsvn
Далее нужно выпарсить из svn info номер текущей ревизии, и получить список файлов изменившихся между полученными ревизиями с помощью svn log. Файлы могут быть добавлены, обновлены или удалены, о чем говорит их быква A, M или D соответственно в логе svn.
lastRevision=$(svn info | sed -ne 's/^Редакция': //p');
files=$(svn log -vqr$lastRevision:$revision | egrep '^\ +[M|A]' | uniq | awk '{print $2};');
После получения списка файлов, для обновления на сервере, нужно скопировать их во временную директорию, сохраняя структуру папок. В цикле с помощью команды dirname можно узнать из полного пути к файлу — структуру папок в которой он лежит, и с помощью mkdir -p рекурсивно создать её и скопировать туда нужный файл.
for file in $files; do
file=${file/#\/trunk/""}
mkdir -p $(dirname $tmpDir$file);
cp $path$file $tmpDir$file;
done
Далее нужно соединиться с ftp и перенести туда все файлы из временной папки и файл с номером текущей ревизии. Для переноса файлов используется команда mirror -R, которую можно использовать вместе с lftp для переноса файлов на ftp.
lftp ${ftp_user}:${ftp_password}@${ftp_host} < mirror -R $tmpDir $ftp_root;
quit
EOF
После можно удалить временную папку и вывести уведомление об окончании обновления проекта.
rm -rf $tmpDir;
echo Done!;
Сам скрипт можно взять здесь, и пример конфига settings.properties здесь. Для использования нужно просто настроить конфиг и запустить скрипт./ftpsvn.sh.