Делаем svn log
для указанных ревизий с указанием измененных файлов.
Получается список файлов измененных не между ревизиями, а "включительно", включая
изменения, сделанные в первой и в последней ревизии.
Список изменений получаем в виде XML и пропускаем через небольшое XSLT преобразование,
чтобы получить обычный текстовый список измененных файлов. В качестве XSLT-процессора
используется Xalan. Этот этап можно заменить другим способом разбора вывода
svn log
, например воспользоваться egrep
или awk
,
кому что ближе.
Каждый файл выводится отдельно командой svn cat
. Перед выводом создается
каталог для размещения файла. Если файл нулевого размера - он удаляется (это не файл, а
каталог, созданный в репозитории, по выводу svn log
нельзя отличить его
от файла).
Файл /home/gelin/bin/svn-get
:
#!/bin/sh SVN_REPOS="file:///home/gelin/svn" XSL="/home/gelin/etc/svn/log2files.xsl" REPOS_PATH=$1 FROM_REV=$2 TO_REV=$3 shift if [ -$2- == -- ] then echo Usage: svn-get PATH_IN_REPOSITORY FROM_REVISION TO_REVISION exit fi LOG_CMD="svn log -v -q $SVN_REPOS/$REPOS_PATH --revision $FROM_REV:$TO_REV --xml" echo $LOG_CMD for file in `$LOG_CMD | xalan -XSL $XSL 2>/dev/null | uniq` do echo $file mkdir -p `dirname .${file}` svn cat ${SVN_REPOS}${file} --revision $TO_REV > .${file} # if file is zero-length then delete it, it's not a file, it's a directory created in repository if [ -e .${file} -a ! -s .${file} ] then rm .${file} fi done
Простое XSLT-преобразование. Файл /home/gelin/etc/svn/log2files.xsl
:
<?xml version="1.0" encoding="utf-8"?> <!-- (c) 2006, Denis Nelubin transforms SVN log in XML format to list of changed files between revisions --> <xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text"/> <xsl:template match="//path[@action = 'A'] | //path[@action = 'M']"> <xsl:value-of select="."/><xsl:text> </xsl:text> </xsl:template> <xsl:template match="*"> <xsl:apply-templates/> </xsl:template> <xsl:template match="text()|@*"/> </xsl:transform>