Keyword expansion is not the default for files added to an SVN repository. And it’s done on a per file basis (with CVS we could configure an entire repository to turn on keyword expansion — .) Some svn tools and plugins allow for defaulting properties when adding new files. I’ve configured the two I use most often (eclipse and smartsvn) to the svn:keywords property for all new files:svn:keywords : Date Revision Author URL Id
You can see a file’s properties from the command line withsvn pl -v filename
Some tool (like netbeans) don’t provide for defaulting properties when adding new files. And there are probably some people (not gonna name names :^) who don’t configure their tools to default the svn:keywords property anyway. So below is a little script that’ll do it for you. The script is in ruby ‘cause Brian (who first sketched it out a few years ago for a project) wanted to do some ruby scripting.
You can run it from time to time from the command line or better yet, set up a cron job on the build server to do it once or twice a day. Our cron job does something like this:
cd ~/tmp/scratch-dir
svn checkout https://opi.svn.cvsdude.com/xyzzy
add_svn_keywords.rb
svn commit -m "Added svn:keywords property"
It’s up to you if you want to do a full checkout each time (an update would be faster.)
Here’s the script…
#!/usr/bin/ruby
#
\# Adds svn:keywords property to source files. Default to process the
\# current directory. Note: this does not commit the changes!
#
\# Usage:
\# ruby add_svn_keywords.rb [src_dir]
#
\# where
\# src_dir (Optional) The directory to process.
#
\# for example
\# ruby add_svn_keywords.rb c:/mnscu/hr/code
#
require 'find'
require 'fileutils'
include FileUtils::Verbose
require 'ftools'
require 'optparse'
\# -- functions --------------------------------------------------------------
def do_system(command)
puts command
system(command) or raise($?)
end
\# -- vars -------------------------------------------------------------------
working_dir = "."
keywords = "Date Revision Author URL Id"
usage = "Usage: ruby add_svn_keywords.rb [src_dir]"
\# -- options and svn checkout/update ----------------------------------------
opts = OptionParser.new
opts.parse(ARGV) rescue usage
unless ARGV[0].nil?
working_dir = ARGV[0]
end
\# -- svn properties ---------------------------------------------------------
num = 0
Find.find(working_dir) do |path|
if FileTest.directory?(path)
if File.basename(path) == '.svn'
# allways skip the .svn dirs
Find.prune
else
# don't bother setting properties on dirs
next
end
else # must be a file...
# quote spaces on paths that contain them (so svn wont fail)
path.gsub!(/ /, ' ')
# add keywords property to some files...
if File.file?(path) and path =~ /.(ddl|bat|sh|css|dtd|el|groovy|gsp|html|java|js|jsp|properties|sql|txt|xml)$/
keywordprop = `svn proplist --verbose #{path}`.to_a.find_all {|line| line.include? keywords }
if keywordprop.size == 0
do_system("svn propset svn:keywords "#{keywords}" #{path}")
num += 1
end
end
end
end # find
\# -- commit and cleanup -----------------------------------------------------
if num > 0
#do_system("svn commit -m "Added svn:keywords property" #{working_dir}");
puts "Added svn:keywords property to: #{num} files"
else
puts "No changes"
end
\# -- end of file ------------------------------------------------------------