#!/usr/bin/ruby -w
# Part of CVSspam
# http://www.badgers-in-foil.co.uk/projects/cvsspam/
# Copyright (c) David Holroyd
$repositorydir = ARGV.shift
$tmpdir = ENV["TMPDIR"] || "/tmp"
# try to pick a name to avoid collisions with other people's commits
$dirtemplate = "#cvsspam.#{Process.getpgrp}.#{Process.uid}"
def find_data_dir
Dir["#{$tmpdir}/#{$dirtemplate}-*"].each do |dir|
stat = File.stat(dir)
return dir if stat.owned?
end
nil
end
$datadir = find_data_dir()
if $datadir==nil
$datadir = "#{$tmpdir}/#{$dirtemplate}-#{rand(99999999)}"
Dir.mkdir($datadir, 0700)
end
$tags = nil
#raise "Created data dir #{$datadir}"
#
# Record any tag name found in 'Entries' for files being commited. This is
# required at pre-commit-time as we have no other way of dertermining what
# branch a file was on if it's been removed.
#
# If the commitinfo-tags file exists from a previous, unsuccessful commit,
# then it's possible for it to contain multiple entries for a particular file.
# The consumer of commitinfo-tags must take care to only use the last entry
# for a given filename.
def write_tag(name, file)
if $tags.nil?
$tags = File.new("#{$datadir}/commitinfo-tags", File::WRONLY|File::CREAT|File::APPEND);
return if $tags.nil?
end
$tags.puts("#{name}\t#{file}")
end
File.open("CVS/Entries") do |file|
file.each_line do |line|
next if line =~ /^D/
info = line.split(/\//)
# skip entries not commited this invocation,
if ARGV.delete(info[1]).nil?
next
end
if info[5] =~ /^T(.+)/
write_tag($1, "#{$repositorydir}/#{info[1]}")
end
end
end
$tags.close unless $tags.nil?
unless ARGV.empty?
$stderr.puts "Nothing in CVS/Entries for "+ARGV.join(", ")
end
# Record the directory currently being commited to.
#
# This script (and collect_diffs.rb) will be run just for the files in a
# single directory.
#
# A commit to files in multiple directories will therefore produce multiple
# invocations of these scripts. To send the email only when the whole commit
# is done, each run overwrites the 'lastdir' file; collect_diffs.rb will
# later inspect the value it contains to work out if it needs to generate the
# email yet.
File.open("#{$datadir}/lastdir", "w") { |file|
file.write $repositorydir
}
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>