Permalink
Browse files

Add HEAD feature to releases

  • Loading branch information...
1 parent 86d443a commit 70a57d258c13f18486ab0f8ffd58eafb09d35b0d @breadbeard committed Jan 23, 2012
Showing with 88 additions and 22 deletions.
  1. +2 −0 Gemfile.lock
  2. +17 −0 bin/changelog
  3. +1 −0 changelog.gemspec
  4. +17 −4 features/release.feature
  5. +18 −4 lib/changelog.rb
  6. +2 −7 lib/changelog/listing.rb
  7. +19 −6 lib/changelog/release.rb
  8. +12 −1 spec/release_spec.rb
View
@@ -3,6 +3,7 @@ PATH
specs:
changelog (0.0.1)
grit
+ highline
methadone
redcarpet
@@ -30,6 +31,7 @@ GEM
grit (2.4.1)
diff-lcs (~> 1.1)
mime-types (~> 1.15)
+ highline (1.6.9)
json (1.6.5)
methadone (0.5.1)
bundler
View
@@ -2,28 +2,45 @@
require 'optparse'
require 'methadone'
+require 'highline/import'
require 'changelog'
include Methadone::Main
main do |release|
+ # upcase head
+ release = 'HEAD' if release == 'head' || release == 'next'
+
+ # set repo path
Changelog.repo_path = File.expand_path(options[:repo])
+ # set release
rls = Changelog::Release.new(release)
+
+ if release == 'HEAD'
+ release = ask("Next release tag [last: rls.previous_tag]> ")
+ end
+
+ puts "#{Changelog::Header.new(release)}\n"
+
rls.listings.each do |listing|
puts listing
end
+
+ puts "\n"
end
options[:repo] = ".git"
description "Generate markdown formatted changelog from your git revision tags"
on("-r REPO","--repo","Path to your git repository")
+on("-m","--markdown","Output markdown formated")
arg :release, :required
arg :repo, :optional
+arg :markdown, :optional
version Changelog::VERSION
View
@@ -24,6 +24,7 @@ Gem::Specification.new do |s|
s.add_development_dependency('rdoc')
s.add_development_dependency('aruba')
s.add_development_dependency('rake','~> 0.9.2')
+ s.add_dependency('highline')
s.add_dependency('methadone')
s.add_dependency('grit')
s.add_dependency('redcarpet')
View
@@ -3,7 +3,20 @@ Feature: Output the changelog
I want to output the changelog
Scenario: Output changelog for a release tag
- When I successfully run `changelog CL.0.1.20120120.1 -r ../../spec/dot_git`
- Then the output should contain "* Fixes [ENG-6580](https://windermeresolutions.atlassian.net/browse/ENG-6580). Test JIRA tag [bd13232](https://github.com/dvantuyl/changelog/bd13232) (Dwight van Tuyl)"
- And the output should contain "* Test non-JIRA tag [ece268b](https://github.com/dvantuyl/changelog/ece268b) (Dwight van Tuyl)"
- And the output should contain "* [ENG-4744](https://windermeresolutions.atlassian.net/browse/ENG-4744): Test JIRA Tag [32cc38a](https://github.com/dvantuyl/changelog/32cc38a) (Dwight van Tuyl)"
+ When I successfully run `changelog CL.0.1.20120120.1 --markdown --repo ../../spec/dot_git`
+ Then the output should contain "[CL.0.1.20120120.1](https://github.com/dvantuyl/changelog/tree/CL.0.1.20120120.1)"
+ And the output should contain "Fixes [ENG-6580](https://windermeresolutions.atlassian.net/browse/ENG-6580). Test JIRA tag [bd13232](https://github.com/dvantuyl/changelog/bd13232)"
+ And the output should contain "Test non-JIRA tag [ece268b](https://github.com/dvantuyl/changelog/ece268b)"
+ And the output should contain "[ENG-4744](https://windermeresolutions.atlassian.net/browse/ENG-4744): Test JIRA Tag [32cc38a](https://github.com/dvantuyl/changelog/32cc38a)"
+
+
+Scenario: Output changelog for the first release tag
+ When I successfully run `changelog CL.0.1.20120120.0 --markdown --repo ../../spec/dot_git`
+ Then the output should contain "[CL.0.1.20120120.0](https://github.com/dvantuyl/changelog/tree/CL.0.1.20120120.0)"
+ And the output should contain "Fixed [ENG-6627](https://windermeresolutions.atlassian.net/browse/ENG-6627)-Initial Commit [4f4f0a5](https://github.com/dvantuyl/changelog/4f4f0a5)"
+ And the output should contain "[ENG-5091](https://windermeresolutions.atlassian.net/browse/ENG-5091): Test JIRA tag [3209c90](https://github.com/dvantuyl/changelog/3209c90)"
+
+Scenario: Output changelog for the HEAD release
+ When I run `changelog head --markdown --repo ../../spec/dot_git` interactively
+ And I type "CL.0.1.20120121.0"
+ Then the output should contain "[CL.0.1.20120121.0](https://github.com/dvantuyl/changelog/tree/CL.0.1.20120121.0)"
View
@@ -4,6 +4,7 @@
require "changelog/version"
require "changelog/release"
require "changelog/listing"
+require "changelog/header"
module Changelog
@@ -18,23 +19,36 @@ def remote_url
@remote_url ||= repo.config["remote.origin.url"]
end
+ def remote_https_owner
+ remote_url.match(/github.com\/(\w+)\//)[1]
+ end
+
+ def remote_ssh_owner
+ remote_url.match(/:(\w+)\//)[1]
+ end
+
def github?
remote_url && remote_url.match(/github\.com/)
end
def github_owner
return nil unless github?
-
- #http or ssh
- @owner ||= remote_url.match(/https/) ? remote_url.match(/github.com\/(\w+)\//)[1] : remote_url.match(/:(\w+)\//)[1]
+ @owner ||= remote_url.match(/https/) ? remote_https_owner : remote_ssh_owner
end
def github_project
return nil unless github?
-
@project ||= remote_url.match(/\/(\w+)\.git/)[1]
end
+ def github_base
+ return nil unless github?
+ @github_base ||= "https://github.com/#{github_owner}/#{github_project}"
+ end
+
+ def jira_base
+ "https://windermeresolutions.atlassian.net"
+ end
end
View
@@ -9,19 +9,14 @@ def to_s
end
def jirafy_message
- jira_base = "https://windermeresolutions.atlassian.net"
key_pattern = /([A-Z]+-\d+)/
- message.gsub(key_pattern, '[\1](' + jira_base + '/browse/\1)')
+ message.gsub(key_pattern, '[\1](' + Changelog.jira_base + '/browse/\1)')
end
def githubify_id
-
if Changelog.github?
- owner = Changelog.github_owner
- project = Changelog.github_project
-
- "[#{id_abbrev}](https://github.com/#{owner}/#{project}/#{id_abbrev})"
+ "[#{id_abbrev}](#{Changelog.github_base}/#{id_abbrev})"
else
"#{id_abbrev}"
end
View
@@ -1,26 +1,39 @@
module Changelog
class Release
+ attr_accessor :tag
+
def initialize(tag)
@tag = tag
+ raise "Tag not found" unless tag_index || is_head?
+ end
+
+ def tags
+ @tags ||= Changelog.repo.tags.map {|t| t.name}
+ end
+
+ def tag_index
+ @tag_index ||= tags.index(tag)
+ end
+
+ def is_head?
+ tag == 'HEAD'
end
def previous_tag
- @previous_tag ||= _previous_tag
+ @previous_tag ||= (previous_tag_index >= 0 ? tags[previous_tag_index] : nil)
end
- def _previous_tag
- tags = Changelog.repo.tags.map {|tag| tag.name}
- tag_index = tags.index(@tag)
- tag_index == 0 ? nil : tags[tag_index -1]
+ def previous_tag_index
+ @previous_tag_index ||= (is_head? ? tags.size - 1 : tag_index - 1)
end
def listings
@listings ||= _listings
end
def _listings
- ref = (previous_tag ? "#{previous_tag}..#{@tag}" : @tag)
+ ref = (previous_tag ? "#{previous_tag}..#{tag}" : tag)
Changelog.repo.commits(ref).map { |commit|
Listing.create(Changelog.repo, :id => commit.id)
View
@@ -3,6 +3,11 @@
module Changelog
describe Release do
+ describe ".new" do
+ it "raises exception if tag doesn't exist" do
+ lambda { Release.new('bogus') }.should raise_error
+ end
+ end
describe "#previous_tag" do
@@ -15,10 +20,16 @@ module Changelog
rls = Release.new('CL.0.1.20120120.0')
rls.previous_tag.should be_nil
end
+
+ it "returns the last tag before HEAD" do
+ rls = Release.new('HEAD')
+ rls.previous_tag.should == 'CL.0.1.20120120.1'
+ end
+
end
describe "#listings" do
-
+
it "returns the release's commit listings" do
rls = Release.new('CL.0.1.20120120.1')
rls.listings.size.should == 3

0 comments on commit 70a57d2

Please sign in to comment.