Author: gertv
Date: Sat Dec 19 20:11:34 2009
New Revision: 892502
URL: http://svn.apache.org/viewvc?rev=892502&view=rev
Log:
Adding a script to generate release notes from the svn commit logs
Added:
servicemix/scripts/release-notes.rb (with props)
Added: servicemix/scripts/release-notes.rb
URL:
http://svn.apache.org/viewvc/servicemix/scripts/release-notes.rb?rev=892502&view=auto
==============================================================================
--- servicemix/scripts/release-notes.rb (added)
+++ servicemix/scripts/release-notes.rb Sat Dec 19 20:11:34 2009
@@ -0,0 +1,152 @@
+#!/usr/bin/ruby
+
+require 'net/http'
+require 'rexml/document'
+require 'rss/0.9'
+require 'tempfile'
+require 'uri'
+require 'yaml'
+
+include REXML
+
+ISSUE_NUMBER=/[A-Z]{1}[A-Z0-9]{1,7}-[0-9]{1,4}/
+
+class Issue
+
+ attr_accessor :issue, :category, :description
+ def initialize(url)
+ @issue = id(url)
+ @links = [url]
+ end
+
+ def to_wiki
+ links = @links.map { |url| "[#{id(url)}|#{url}]" }.join("/")
+ "#{links} - #...@description}"
+ end
+
+ def id(url)
+ url.scan(ISSUE_NUMBER)[0]
+ end
+
+ def <=>(other)
+ return (@issue <=> other.issue)
+ end
+
+ def ==(other)
+ @issue == other.issue
+ end
+
+ def hash
+ @issue.hash
+ end
+
+ def eql?(other)
+ self == other
+ end
+
+end
+
+
+class ReleaseNotes
+
+ def initialize(version)
+ @version = version
+ @issues = Array.new
+ end
+
+ def read_svn(revision)
+ temp_file = Tempfile.new('release_notes')
+ system("svn log -r #{revision}:HEAD > #{temp_file.path}")
+
+ IO.foreach(temp_file.path) { |line|
+ line.scan(ISSUE_NUMBER).uniq.each { |id|
+
readRssFeed("http://issues.apache.org/activemq/si/jira.issueviews:issue-xml/#{id}/#{id}.xml")
{ |issue,item|
+ @issues << issue unless nil == issue
+ }
+ }
+ }
+ end
+
+ def readRssFeed(url)
+ response = Net::HTTP.get_response(URI.parse(url))
+ if (response.code == '302') then
+ response = Net::HTTP.get_response(URI.parse(response['Location']))
+ end
+
+ begin
+ response.value(); # this raises an HTTP error if status != 2xx
+ doc = Document.new(response.body)
+
+ XPath.each(doc, "//item") do |item|
+ issue = Issue.new(XPath.first(item, "link/text()").to_s)
+ issue.category = XPath.first(item, "type/text()").to_s
+ issue.description = XPath.first(item,
"title/text()").to_s.gsub(/\[\(?[A-Z0-9]{2,7}-[0-9]{1,4}\)?\]/, "").strip
+ yield issue, item
+ end
+ rescue Exception => e
+ puts "Error while reading #{url}: #{e}"
+ yield nil, nil
+ end
+ end
+
+ def to_wiki
+ puts
+ puts "h3. {excerpt}Release notes - #...@version}{excerpt}"
+
+ categories = @issues.map { |issue| issue.category }.uniq.sort
+ categories.each { |category|
+ puts
+ puts "h4. #{category}"
+ @issues.uniq.select { |issue| issue.category == category }.sort.each {
|issue|
+ puts "* #{issue.to_wiki}"
+ }
+ }
+ end
+
+end
+
+class Project
+
+ def initialize
+ @versions = Array.new
+
+ trunk = svn_info(".")['URL']
+ @tags = trunk.sub(/\/trunk/, "/tags/").sub(/https/, "http")
+
+
+ response = Net::HTTP.get_response(URI.parse(@tags))
+
+ response.value(); # this raises an HTTP error if status != 2xx
+ response.body.scan(/<ul>[<>.="'\/\-\w\s]*<\/ul>/) { |ul|
+ doc = Document.new(ul)
+ XPath.each(doc, "//li/a/text()") do |version|
+ @versions << version.to_s
+ end
+ }
+ end
+
+ def current_release
+ @versions.last.gsub(/\//, "")
+ end
+
+ def previous_release_revision
+ tag = @tags + @[email protected] - 2]
+ svn_info(tag)['Last Changed Rev']
+ end
+
+ def svn_info(url)
+ temp_file = Tempfile.new('svn_info')
+ system("svn info #{url} > #{temp_file.path}")
+
+ YAML::load(temp_file.open)
+ end
+
+end
+
+project = Project.new
+puts "Release notes for version #{project.current_release}"
+puts "Reading commit logs from revision #{project.previous_release_revision}"
+
+notes = ReleaseNotes.new(project.current_release)
+notes.read_svn(project.previous_release_revision)
+notes.to_wiki
Propchange: servicemix/scripts/release-notes.rb
------------------------------------------------------------------------------
svn:executable = *