Alien-SVN
view release on metacpan or search on metacpan
src/subversion/subversion/bindings/swig/ruby/svn/commit-mailer.rb view on Meta::CPAN
make_header(encoding, bit) + "\n" + body
end
def make_body
body = ""
body << "#{@info.author}\t#{format_time(@info.date)}\n"
body << "\n"
body << " New Revision: #{@info.revision}\n"
body << "\n"
body << " Log:\n"
stripped_log = @info.log.rstrip
stripped_log << "\n" unless stripped_log.empty?
stripped_log.each_line do |line|
body << " #{line}"
end
body << "\n"
body << added_dirs
body << added_files
body << copied_dirs
body << copied_files
body << deleted_dirs
body << deleted_files
body << modified_dirs
body << modified_files
body << "\n"
body << change_info
body
end
def format_time(time)
time.strftime('%Y-%m-%d %X %z (%a, %d %b %Y)')
end
def changed_items(title, type, items)
rv = ""
unless items.empty?
rv << " #{title} #{type}:\n"
if block_given?
yield(rv, items)
else
rv << items.collect {|item| " #{item}\n"}.join('')
end
end
rv
end
def changed_files(title, files, &block)
changed_items(title, "files", files, &block)
end
def added_files
changed_files("Added", @info.added_files)
end
def deleted_files
changed_files("Removed", @info.deleted_files)
end
def modified_files
changed_files("Modified", @info.updated_files)
end
def copied_files
changed_files("Copied", @info.copied_files) do |rv, files|
rv << files.collect do |file, from_file, from_rev|
<<-INFO
#{file}
(from rev #{from_rev}, #{from_file})
INFO
end.join("")
end
end
def changed_dirs(title, files, &block)
changed_items(title, "directories", files, &block)
end
def added_dirs
changed_dirs("Added", @info.added_dirs)
end
def deleted_dirs
changed_dirs("Removed", @info.deleted_dirs)
end
def modified_dirs
changed_dirs("Modified", @info.updated_dirs)
end
def copied_dirs
changed_dirs("Copied", @info.copied_dirs) do |rv, dirs|
rv << dirs.collect do |dir, from_dir, from_rev|
" #{dir} (from rev #{from_rev}, #{from_dir})\n"
end.join("")
end
end
CHANGED_TYPE = {
:added => "Added",
:modified => "Modified",
:deleted => "Deleted",
:copied => "Copied",
:property_changed => "Property changed",
}
CHANGED_MARK = Hash.new("=")
CHANGED_MARK[:property_changed] = "_"
def change_info
result = changed_dirs_info
result = "\n#{result}" unless result.empty?
result << "\n"
diff_info.each do |key, infos|
infos.each do |desc, link|
result << "#{desc}\n"
end
end
result
end
def changed_dirs_info
rev = @info.revision
(@info.added_dirs.collect do |dir|
" Added: #{dir}\n"
end + @info.copied_dirs.collect do |dir, from_dir, from_rev|
<<-INFO
Copied: #{dir}
(from rev #{from_rev}, #{from_dir})
INFO
end + @info.deleted_dirs.collect do |dir|
<<-INFO
Deleted: #{dir}
% svn ls #{[@repository_uri, dir].compact.join("/")}@#{rev - 1}
INFO
end + @info.updated_dirs.collect do |dir|
" Modified: #{dir}\n"
end).join("\n")
end
def diff_info
@info.diffs.collect do |key, values|
[
key,
values.collect do |type, value|
args = []
rev = @info.revision
case type
when :added
command = "cat"
when :modified, :property_changed
command = "diff"
args.concat(["-r", "#{@info.revision - 1}:#{@info.revision}"])
when :deleted
command = "cat"
rev -= 1
when :copied
command = "cat"
else
raise "unknown diff type: #{value.type}"
end
command += " #{args.join(' ')}" unless args.empty?
link = [@repository_uri, key].compact.join("/")
line_info = "+#{value.added_line} -#{value.deleted_line}"
desc = <<-HEADER
#{CHANGED_TYPE[value.type]}: #{key} (#{line_info})
#{CHANGED_MARK[value.type] * 67}
HEADER
if add_diff?
desc << value.body
else
desc << <<-CONTENT
% svn #{command} #{link}@#{rev}
CONTENT
end
[desc, link]
end
]
end
end
def make_header(body_encoding, body_encoding_bit)
headers = []
headers << x_author
headers << x_revision
headers << x_repository
headers << x_id
headers << "MIME-Version: 1.0"
headers << "Content-Type: text/plain; charset=#{body_encoding}"
headers << "Content-Transfer-Encoding: #{body_encoding_bit}"
headers << "From: #{from}"
( run in 0.499 second using v1.01-cache-2.11-cpan-ceb78f64989 )