В этом посте хотелось бы рассказать о том, как я вышел из ситуации обновления проекта работающего с 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.


Источник статьи