5 December 2008

Умный экспорт из SVN с помощью консоли

Project management
Использовать svn я начал, работая в windows и соответственно в качестве клиента использовал TortoiseSVN.
В то время я был очень рад новой возможности, описанной в статье Умный экспорт из SVN при помощи TortoiseSVN.
Совсем недавно сделал то, что давно не находилось времени сделать — поставил на свой рабочий компьютер linux.
И вот незадача, ни в одном из графических клиентов, опробованных мной, не обнаружил схожей функциональности.
Мало того. Почитав svn --help не нашёл опции, дающий такой результат.
Обидно. Учитывая, что приучил уже отдел делать такие экспорты для плавного обновления проектов.
В-общем, не буду тянуть: написал на bash скрипт, реализующий сравнение и экспорт отличий между двумя ревизиями.


Код


#!/bin/bash

if [ $# -lt 2 ] ; then
 echo "usage: start_revision end_revision [project_name]"
 exit 0
fi

dir_prefix='!UPDATES/'
svn_repo='svn://<svn_host>:<svn_port>'


if [[ $3 != '' ]]
    then
        project=$svn_repo'/'$3'/'
    fi
revision_start=$1
revision_end=$2

files=`svn diff --summarize -r $revision_start:$revision_end $project | awk '{print \$2}'`
echo "svn diff --summarize -r $revision_start:$revision_end $project | awk '{print \$2}'"
declare -a filelist
i=0
for file in $files;
do
    dir=''
    filelist[$i]=`echo $file | sed -e 's/\//\n/g'`
    j=0
    declare -a items
    for item in ${filelist[$i]};
    do
        items[$j]=$item
        j=`echo $j+1 | bc`
    done

    #create dirs
    j=0
    cur_dir=''
    els_count=`echo ${#items[@]}-1 | bc`
    for ditem in ${items[@]};
    do
        if [[ $j = $els_count ]] #if lat element - it's filename
        then
            #store filename
            file_name=$ditem
            break
        fi
        cur_dir=$cur_dir$ditem'/'
        j=`echo $j+1 | bc`
    done
    dir=${dir_prefix}`date +%Y-%m-%d`'/'${revision_end}'/'$cur_dir
    mkdir -p $dir

    #export files in created dirs
    svn export -r $revision_end $project$file ./$dir$file_name

    i=`echo $i+1 | bc`
done


Настройка


Прописать хост, на котором находится svn-сервер.

Использование


  1. Набрать в директории с рабочей копией <имя скрипта> <начальная ревизия> <конечная ревизия>
  2. Либо набрать в произвольной директории <имя скрипта> <начальная ревизия> <конечная ревизия> <путь внутри репозитория>


В результате в текущей директории появится каталог !UPDATES/текущая дата/номер конечной ревизии/, в котором будут изменившиеся между этими номерами ревизий с учётом вложенности каталогов.

Пользуйтесь. =)
Tags:svnsubversionlinuxbashчастичный экспортсравнение ревизийdiff
Hubs: Project management
+24
2.2k 41
Comments 34