| #!/usr/bin/env ruby | 
 |  | 
 | # | 
 | ###################################################################### | 
 | #    Licensed to the Apache Software Foundation (ASF) under one | 
 | #    or more contributor license agreements.  See the NOTICE file | 
 | #    distributed with this work for additional information | 
 | #    regarding copyright ownership.  The ASF licenses this file | 
 | #    to you under the Apache License, Version 2.0 (the | 
 | #    "License"); you may not use this file except in compliance | 
 | #    with the License.  You may obtain a copy of the License at | 
 | # | 
 | #      http://www.apache.org/licenses/LICENSE-2.0 | 
 | # | 
 | #    Unless required by applicable law or agreed to in writing, | 
 | #    software distributed under the License is distributed on an | 
 | #    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
 | #    KIND, either express or implied.  See the License for the | 
 | #    specific language governing permissions and limitations | 
 | #    under the License. | 
 | ###################################################################### | 
 | # | 
 |  | 
 | require "erb" | 
 | require "svn/client" | 
 |  | 
 | include ERB::Util | 
 |  | 
 | path = File.expand_path(ARGV.shift || Dir.pwd) | 
 |  | 
 | html = <<-HEADER | 
 | <?xml version="1.0" encoding="utf-8"?> | 
 | <!DOCTYPE html | 
 |     PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" | 
 |     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | 
 | <html xmlns="http://www.w3.org/1999/xhtml"> | 
 | <head> | 
 |   <style type="text/css"> | 
 | div.entry | 
 | { | 
 |   border: 1px solid red; | 
 |   border-width: 1px 0 0 1px; | 
 |   margin: 2em 2em 2em 3em; | 
 |   padding: 0 2em; | 
 | } | 
 |  | 
 | pre.message | 
 | { | 
 |   border-left: 1px solid red; | 
 |   margin: 1em 2em; | 
 |   padding-left: 1em; | 
 | } | 
 |  | 
 | div.info | 
 | { | 
 |   text-align: right; | 
 | } | 
 |  | 
 | span.info | 
 | { | 
 |   border-bottom: 1px solid red; | 
 |   padding: 0 5px 1px 1em; | 
 | } | 
 |  | 
 | span.author | 
 | { | 
 |   font-style: italic; | 
 | } | 
 |  | 
 | span.date | 
 | { | 
 |   color: #999; | 
 | } | 
 |  | 
 | li.action-A | 
 | { | 
 |   color: blue; | 
 | } | 
 |  | 
 | li.action-M | 
 | { | 
 |   color: green; | 
 | } | 
 |  | 
 | li.action-D | 
 | { | 
 |   color: red; | 
 |   text-decoration: line-through; | 
 | } | 
 |   </style> | 
 |   <title>#{h path}</title> | 
 | </head> | 
 | <body> | 
 | <h1>#{h path}</h1> | 
 | HEADER | 
 |  | 
 | ctx = Svn::Client::Context.new | 
 | ctx.log(path, "HEAD", 0, 40, true, true) do | 
 |   |changed_paths, rev, author, date, message| | 
 |  | 
 |   html << <<-ENTRY_HEADER | 
 |  | 
 | <div class="entry"> | 
 |   <h2>r#{h rev}</h2> | 
 |   <pre class="message">#{h message}</pre> | 
 |   <div class="info"> | 
 |     <span class="info"> | 
 |       by <span class="author">#{h author}</span> | 
 |       at <span class="date">#{date}</span> | 
 |     </span> | 
 |   </div> | 
 |   <div class="changed-path"> | 
 | ENTRY_HEADER | 
 |  | 
 |   changed_paths.sort.each do |path, changed_path| | 
 |     action = changed_path.action | 
 |     html << <<-ENTRY_PATH | 
 |     <ul> | 
 |       <li class="action-#{h action}"> | 
 |         <span class="action">#{h action}</span>: | 
 |         <span class="changed-path">#{h path}</span> | 
 |       </li> | 
 |     </ul> | 
 | ENTRY_PATH | 
 |   end | 
 |  | 
 |   html << <<-ENTRY_FOOTER | 
 |   </div> | 
 | </div> | 
 |  | 
 | ENTRY_FOOTER | 
 | end | 
 |  | 
 | html << <<-FOOTER | 
 | </body> | 
 | </html> | 
 | FOOTER | 
 |  | 
 | puts html |