понедельник, 14 января 2008 г.

SVN и копирование проекта

Системы контроля версий вещь крайне полезная для работы в команде (и не только). В нашей компании используется svn. Под контролем обычно находятся не только исходные файлы, но и всяческие ресурсы, что создаёт определённые неудобства при подготовке версий для мэйлстоунов. Приходится копировавть папку с ресусрсами, а потом удалять все служебные svn-файлы. Дабы немного упростить себе жизнь, я написал небольшой скрипт на Tcl для копирования с исключением папок .svn.


#переменные для подсчёта количества
#файлов и директорий
set files_count 0
set dirs_count 0

proc copy_files {dir_name parent_dir} {
global files_count
global dirs_count
set target $parent_dir/[file tail $dir_name]
puts "d $target => $target"
file mkdir $target
#получаем список фалов в директории
set files [glob -nocomplain -types f $dir_name/*]
#получаем список поддиректорий в директории
set dirs [glob -nocomplain -types d $dir_name/*]

incr dirs_count

#копируем файлы
foreach f $files {
puts "\tf $f => $target/[file tail $f]"
incr files_count
file copy -force $f $target
}
#рекурсивно обрабатываем все
#поддиректории кроме .svn
foreach d $dirs {
if {[string match -nocase */.svn $d] } {
continue
}
copy_files $d $target
}
}

#проверяем наличие параметров
if { $argc != 2 } {
puts "Script usage:"
puts "no_svn_copy.tcl source destination"
return
}

set src_dir [lindex $argv 0]
set target_dir [lindex $argv 1]
#нормализуем пути, чтобы и source и destination
#могли содержать как '\', так и '/'
set src_dir [file normalize $src_dir]
set target_dir [file normalize $target_dir]

#провевряем существование директории-источника
if { [file isdirectory $src_dir] == 0 } {
puts "Source dir not exists"
return
}
puts "Copyng $src_dir => $target_dir\n"
#вызываем рекурсивную функцию копирования
copy_files $src_dir $target_dir

puts "$dirs_count dirs, $files_count files"

Комментариев нет: