概要
svnでは,リポジトリに対するファイルの追加・削除は,ユーザが明示的に指定する.これを自動的におこないたい.すなわち,あるディレクトリ以下のファイルについて,追加されたファイルは勝手にリポジトリに追加し,消されたファイルは勝手にリポジトリから削除したいことがある.
これをおこなうrubyスクリプトを書いた.使い方は次の通り.
$ スクリプト名 ディレクトリ
引数で指定したディレクトリ以下のファイルを,自動的に同期する.
スクリプトを以下に示す.
#!/usr/bin/ruby
#
class Svn
def initialize()
@del = []
@add = []
end
def update()
system('svn update')
# puts 'svn update'
end
def status()
=begin
M:modify
!:deleted (not registered)
?:added (not registered)
=end
`svn status`.split(/\n/).each{|l|
/^(.)\s+(.*)$/ =~ l
case $1
when '!' #deleted
@del.push($2)
when '?' #added
@add.push($2)
end
}
end
def add_del()
@add.each {|file|
system("svn add #{file}")
# puts "svn add #{file}"
}
@del.each {|file|
system("svn rm #{file}")
# puts "svn rm #{file}"
}
end
def commit()
msg = "commit by #{$0} at #{ENV['USER']}@#{ENV['HOST']}"
system("svn commit -m '#{msg}'")
# puts "svn commit -m '#{msg}'"
end
def sync()
update()
status()
if @del.size != 0 || @add.size != 0
puts "del:#{@del.size} add:#{@add.size}"
add_del()
commit()
end
end
end
class Main
def initialize()
@svndir = ARGV[0]
@svn = Svn.new()
if @svndir == nil
usage
end
if ! FileTest.exist? @svndir
puts "#{@svndir} is not exist"
exit 1
end
Dir.chdir(@svndir)
if(! FileTest.exist? '.svn')
print "#{@svndir} is not svn working copy\n"
exit 1
end
end
def sync()
@svn.sync()
end
def usage()
print <<EOS
svn-sync [svn-dir]
EOS
exit 0
end
end
main = Main.new
main.sync