git-pivotal 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +14 -0
- data/VERSION +1 -1
- data/bin/git-pick +1 -1
- data/git-pivotal.gemspec +3 -2
- data/lib/commands/pick.rb +46 -65
- data/lib/pivotal/base.rb +6 -3
- data/readme.markdown +5 -7
- data/spec/commands/pick_spec.rb +61 -2
- data/spec/pivotal/base_spec.rb +2 -2
- metadata +3 -2
data/CHANGELOG
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
v 0.1.3
|
2
|
+
- Fixed bug preventing command line args from being properly interpretted
|
3
|
+
|
4
|
+
v 0.1.2
|
5
|
+
- Fixed bug introduced in v 0.1.1 which prevented git pick from completing
|
6
|
+
|
7
|
+
v 0.1.1
|
8
|
+
- Updated git pick to tell Pivotal who owns the picked feature
|
9
|
+
- Improved Pivotal Tracker framework write ability
|
10
|
+
|
11
|
+
v 0.1.0
|
12
|
+
- Initial release
|
13
|
+
- Basic framework for reading from Pivotal Tracker
|
14
|
+
- git pick utility
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.2
|
data/bin/git-pick
CHANGED
data/git-pivotal.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{git-pivotal}
|
8
|
-
s.version = "0.1.
|
8
|
+
s.version = "0.1.2"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Jeff Tucker"]
|
12
|
-
s.date = %q{2010-01-
|
12
|
+
s.date = %q{2010-01-30}
|
13
13
|
s.default_executable = %q{git-pick}
|
14
14
|
s.description = %q{A collection of git utilities to ease integration with Pivotal Tracker}
|
15
15
|
s.email = %q{jeff@trydionel.com}
|
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
]
|
20
20
|
s.files = [
|
21
21
|
".gitignore",
|
22
|
+
"CHANGELOG",
|
22
23
|
"LICENSE",
|
23
24
|
"Rakefile",
|
24
25
|
"VERSION",
|
data/lib/commands/pick.rb
CHANGED
@@ -2,7 +2,7 @@ require 'optparse'
|
|
2
2
|
|
3
3
|
class Pick
|
4
4
|
|
5
|
-
attr_accessor :
|
5
|
+
attr_accessor :options
|
6
6
|
|
7
7
|
def initialize(*args)
|
8
8
|
@options = {}
|
@@ -10,23 +10,53 @@ class Pick
|
|
10
10
|
parse_argv(*args)
|
11
11
|
end
|
12
12
|
|
13
|
-
def run
|
14
|
-
|
13
|
+
def run!
|
14
|
+
unless options[:api_token] && options[:project_id]
|
15
|
+
puts "Pivotal Tracker API Token and Project ID are required"
|
16
|
+
return 1
|
17
|
+
end
|
18
|
+
|
19
|
+
puts "Retrieving latest stories from Pivotal Tracker..."
|
20
|
+
api = Pivotal::Api.new(:api_token => options[:api_token])
|
21
|
+
|
22
|
+
project = api.projects.find(:id => options[:project_id])
|
23
|
+
story = project.stories.find(:conditions => { :story_type => :feature, :current_state => :unstarted }, :limit => 1).first
|
15
24
|
|
16
|
-
story
|
17
|
-
|
18
|
-
|
25
|
+
unless story
|
26
|
+
puts "No stories available!"
|
27
|
+
return 0
|
28
|
+
end
|
29
|
+
|
30
|
+
puts "Story: #{story.name}"
|
31
|
+
puts "URL: #{story.url}"
|
32
|
+
|
33
|
+
suffix = "feature"
|
34
|
+
unless options[:quiet]
|
35
|
+
print "Enter branch name (will be prepended by #{story.id}) [feature]: "
|
36
|
+
suffix = gets.chomp
|
37
|
+
|
38
|
+
suffix = "feature" if suffix == ""
|
39
|
+
end
|
40
|
+
|
41
|
+
puts "Creating branch..."
|
42
|
+
branch = "#{story.id}-#{suffix}"
|
43
|
+
create_branch branch
|
44
|
+
|
45
|
+
puts "Updating story status in Pivotal Tracker..."
|
46
|
+
story.start!(:owned_by => options[:full_name])
|
47
|
+
|
48
|
+
return 0
|
19
49
|
end
|
20
50
|
|
21
51
|
private
|
22
52
|
|
23
53
|
def sys(cmd)
|
24
|
-
puts cmd if
|
54
|
+
puts cmd if options[:verbose]
|
25
55
|
system cmd
|
26
56
|
end
|
27
57
|
|
28
58
|
def get(cmd)
|
29
|
-
puts cmd if
|
59
|
+
puts cmd if options[:verbose]
|
30
60
|
`#{cmd}`
|
31
61
|
end
|
32
62
|
|
@@ -35,56 +65,27 @@ private
|
|
35
65
|
id = get("git config --get pivotal.project-id").strip
|
36
66
|
name = get("git config --get pivotal.full-name").strip
|
37
67
|
|
38
|
-
|
39
|
-
|
40
|
-
|
68
|
+
options[:api_token] = token if token
|
69
|
+
options[:project_id] = id if id
|
70
|
+
options[:full_name] = name if name
|
41
71
|
end
|
42
72
|
|
43
73
|
def parse_argv(*args)
|
44
74
|
OptionParser.new do |opts|
|
45
75
|
opts.banner = "Usage: git pick [options]"
|
46
|
-
opts.on("-k", "--api-key=", "Pivotal Tracker API key") { |k|
|
47
|
-
opts.on("-p", "--project-id=", "Pivotal Trakcer project id") { |p|
|
48
|
-
opts.on("-n", "--full-name=", "Pivotal Trakcer full name") { |n|
|
49
|
-
opts.on("-q", "--quiet", "Quiet, no-interaction mode") { |q|
|
50
|
-
opts.on("-v", "--[no-]verbose", "Run verbosely") { |v|
|
76
|
+
opts.on("-k", "--api-key=", "Pivotal Tracker API key") { |k| options[:api_token] = k }
|
77
|
+
opts.on("-p", "--project-id=", "Pivotal Trakcer project id") { |p| options[:project_id] = p }
|
78
|
+
opts.on("-n", "--full-name=", "Pivotal Trakcer full name") { |n| options[:full_name] = n }
|
79
|
+
opts.on("-q", "--quiet", "Quiet, no-interaction mode") { |q| options[:quiet] = q }
|
80
|
+
opts.on("-v", "--[no-]verbose", "Run verbosely") { |v| options[:verbose] = v }
|
51
81
|
opts.on_tail("-h", "--help", "This usage guide") { puts opts; exit 0 }
|
52
82
|
end.parse!(args)
|
53
83
|
end
|
54
84
|
|
55
|
-
def connect_to_pivotal
|
56
|
-
unless @options[:api_token] && @options[:project_id]
|
57
|
-
puts "Pivotal Tracker API Token and Project ID are required"
|
58
|
-
exit 0
|
59
|
-
end
|
60
|
-
|
61
|
-
puts "Retrieving latest stories from Pivotal Tracker..."
|
62
|
-
@api = Pivotal::Api.new(:api_token => @options[:api_token])
|
63
|
-
end
|
64
|
-
|
65
85
|
def agrees?(selection)
|
66
86
|
selection =~ /y/i || selection == ""
|
67
87
|
end
|
68
88
|
|
69
|
-
def find_story
|
70
|
-
project = @api.projects.find(:id => @options[:project_id])
|
71
|
-
story = project.stories.find(:conditions => { :story_type => :feature, :current_state => :unstarted }, :limit => 1).first
|
72
|
-
|
73
|
-
unless story
|
74
|
-
puts "No stories available!"
|
75
|
-
exit 0
|
76
|
-
end
|
77
|
-
|
78
|
-
puts "Story: #{story.name}"
|
79
|
-
puts "URL: #{story.url}"
|
80
|
-
print "Accept this story? (Yn): "
|
81
|
-
selection = gets.chomp
|
82
|
-
|
83
|
-
exit 0 if !agrees?(selection)
|
84
|
-
|
85
|
-
story
|
86
|
-
end
|
87
|
-
|
88
89
|
def create_branch(branch)
|
89
90
|
unless branch_exists?(branch)
|
90
91
|
puts "Creating #{branch} branch..."
|
@@ -96,24 +97,4 @@ private
|
|
96
97
|
!get("git branch").match(branch).nil?
|
97
98
|
end
|
98
99
|
|
99
|
-
def build_feature_branch(story)
|
100
|
-
branch = "feature-#{story.id}"
|
101
|
-
|
102
|
-
puts "Suggested branch name: #{branch}"
|
103
|
-
print "Accept this name? (Yn): "
|
104
|
-
selection = gets.chomp
|
105
|
-
|
106
|
-
unless agrees?(selection)
|
107
|
-
print "Enter new name (will be prepended by #{story.id}): "
|
108
|
-
branch = "#{story.id}-" + gets.chomp
|
109
|
-
end
|
110
|
-
|
111
|
-
create_branch branch
|
112
|
-
end
|
113
|
-
|
114
|
-
def start_story(story)
|
115
|
-
puts "Updating story status in Pivotal Tracker..."
|
116
|
-
story.start!(:owned_by => @options[:full_name])
|
117
|
-
end
|
118
|
-
|
119
100
|
end
|
data/lib/pivotal/base.rb
CHANGED
@@ -30,6 +30,7 @@ module Pivotal
|
|
30
30
|
|
31
31
|
def update_attributes(options = {})
|
32
32
|
@xml = resource.put generate_xml(options)
|
33
|
+
return self
|
33
34
|
end
|
34
35
|
|
35
36
|
class << self
|
@@ -46,11 +47,13 @@ module Pivotal
|
|
46
47
|
|
47
48
|
def generate_xml(options = {})
|
48
49
|
builder = Builder::XmlMarkup.new
|
49
|
-
|
50
|
-
|
50
|
+
builder.__send__ self.class.name_as_xml_attribute do
|
51
|
+
allowed_keys(options).each do |key, value|
|
52
|
+
builder.__send__(key, value.to_s)
|
53
|
+
end
|
51
54
|
end
|
52
55
|
|
53
|
-
builder
|
56
|
+
builder.target!
|
54
57
|
end
|
55
58
|
|
56
59
|
def allowed_keys(options = {})
|
data/readme.markdown
CHANGED
@@ -13,12 +13,10 @@ This selects the top-most available feature from your Pivotal Tracker, and offer
|
|
13
13
|
Collecting latest stories from Pivotal Tracker...
|
14
14
|
Story: Test git pivotal
|
15
15
|
URL: http://www.pivotaltracker.com/story/show/1234567
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
Updating story status in Pivotal Tracker...
|
21
|
-
2 git-pick:feature-1234567 %
|
16
|
+
Enter branch name (will be prepended by 1234567) [feature]: testing
|
17
|
+
Creating branch...
|
18
|
+
Creating 1234567-testing branch...
|
19
|
+
2 git-pick:1234567-testing %
|
22
20
|
|
23
21
|
##Installation
|
24
22
|
To install git-pivotal, simply run
|
@@ -43,5 +41,5 @@ This is <del>some seriously</del> alpha software. Several things on the ol' tod
|
|
43
41
|
* <del>Create a general Pivotal::Base#update_attributes method</del>
|
44
42
|
* <del>`git pick` doesn't update the story to indicate who claimed it</del>
|
45
43
|
* Add command to close/finish currently 'picked' feature
|
46
|
-
* Reduce verbosity of `git pick
|
44
|
+
* <del>Reduce verbosity of `git pick`</del>
|
47
45
|
* More that I can't recall at the moment
|
data/spec/commands/pick_spec.rb
CHANGED
@@ -1,7 +1,66 @@
|
|
1
|
+
require 'spec_helper'
|
1
2
|
require 'commands/pick'
|
2
3
|
|
3
4
|
describe Pick do
|
4
|
-
|
5
|
-
|
5
|
+
|
6
|
+
before(:each) do
|
7
|
+
# stub out git config requests
|
8
|
+
Pick.any_instance.expects(:get).times(3).with { |v| v =~ /git config/}.returns("")
|
6
9
|
end
|
10
|
+
|
11
|
+
it "should set the api key with the -k option" do
|
12
|
+
@pick = Pick.new("-k", "1234")
|
13
|
+
@pick.options[:api_token].should == "1234"
|
14
|
+
end
|
15
|
+
|
16
|
+
it "should set the api key with the --api-token= option" do
|
17
|
+
@pick = Pick.new("--api-key=1234")
|
18
|
+
@pick.options[:api_token].should == "1234"
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should set the project id with the -p option" do
|
22
|
+
@pick = Pick.new("-p", "1")
|
23
|
+
@pick.options[:project_id].should == "1"
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should set the project id with the --project-id= option" do
|
27
|
+
@pick = Pick.new("--project-id=1")
|
28
|
+
@pick.options[:project_id].should == "1"
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should set the full name with the -n option" do
|
32
|
+
@pick = Pick.new("-n", "Jeff Tucker")
|
33
|
+
@pick.options[:full_name].should == "Jeff Tucker"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should set the full name with the --full-name= option" do
|
37
|
+
@pick = Pick.new("--full-name=Jeff Tucker")
|
38
|
+
@pick.options[:full_name].should == "Jeff Tucker"
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should set the quiet flag with the -q option" do
|
42
|
+
@pick = Pick.new("-q")
|
43
|
+
@pick.options[:quiet].should be_true
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should set the quiet flag with the --quiet option" do
|
47
|
+
@pick = Pick.new("--quiet")
|
48
|
+
@pick.options[:quiet].should be_true
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should set the verbose flag with the -v option" do
|
52
|
+
@pick = Pick.new("-v")
|
53
|
+
@pick.options[:verbose].should be_true
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should set the verbose flag with the --verbose option" do
|
57
|
+
@pick = Pick.new("--verbose")
|
58
|
+
@pick.options[:verbose].should be_true
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should unset the verbose flag with the --no-verbose option" do
|
62
|
+
@pick = Pick.new("--no-verbose")
|
63
|
+
@pick.options[:verbose].should be_false
|
64
|
+
end
|
65
|
+
|
7
66
|
end
|
data/spec/pivotal/base_spec.rb
CHANGED
@@ -36,7 +36,7 @@ describe Pivotal::Base do
|
|
36
36
|
describe "updating the remote resource" do
|
37
37
|
|
38
38
|
before(:each) do
|
39
|
-
@xml = "<
|
39
|
+
@xml = "<api><current_state>started</current_state></api>"
|
40
40
|
@base.resource.expects(:put).with(@xml).returns(@xml)
|
41
41
|
end
|
42
42
|
|
@@ -49,7 +49,7 @@ describe Pivotal::Base do
|
|
49
49
|
end
|
50
50
|
|
51
51
|
it "should not update attributes which don't exist on the remote model" do
|
52
|
-
@base.update_attributes(:unknown_attribute => true)
|
52
|
+
@base.update_attributes(:current_state => :started, :unknown_attribute => true)
|
53
53
|
end
|
54
54
|
|
55
55
|
it "should update the stored xml with the new remote model" do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-pivotal
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeff Tucker
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2010-01-
|
12
|
+
date: 2010-01-30 00:00:00 -05:00
|
13
13
|
default_executable: git-pick
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -62,6 +62,7 @@ extra_rdoc_files:
|
|
62
62
|
- LICENSE
|
63
63
|
files:
|
64
64
|
- .gitignore
|
65
|
+
- CHANGELOG
|
65
66
|
- LICENSE
|
66
67
|
- Rakefile
|
67
68
|
- VERSION
|