v2gpti 0.2.0.3 → 0.2.0.4
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.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: eb7fe1c58e20da7e1d498fca6800378197b4314a
|
4
|
+
data.tar.gz: b5746858ddfffd3fca9fb1c442ae54c8e32432ac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 30613ae7a32c8d67e49f8e26f484d273594c63a5e65bbdaf35f1fe46d800bfe6fe2ce7b92e126e0fa561f411ab6e5f2d00132f2c6730b5ed65edc9fda736c5a8
|
7
|
+
data.tar.gz: 88c18c003d1aca06435a64d90291345f1b300ed41bba0de774fae8ded0f0e80030243fce1c00d011c885a2af026fa97a05517fcf53562b8311ed784c0876588d
|
data/bin/git-deliver
ADDED
@@ -0,0 +1,197 @@
|
|
1
|
+
# Git Pivotal Tracker Integration
|
2
|
+
# Copyright (c) 2013 the original author or authors.
|
3
|
+
#
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
#
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
#
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
require 'git-pivotal-tracker-integration/command/base'
|
17
|
+
require 'git-pivotal-tracker-integration/command/command'
|
18
|
+
require 'git-pivotal-tracker-integration/util/git'
|
19
|
+
require 'git-pivotal-tracker-integration/util/story'
|
20
|
+
require 'pivotal-tracker'
|
21
|
+
|
22
|
+
# The class that encapsulates starting a Pivotal Tracker Story
|
23
|
+
class GitPivotalTrackerIntegration::Command::Deliver < GitPivotalTrackerIntegration::Command::Base
|
24
|
+
|
25
|
+
# Starts a Pivotal Tracker story by doing the following steps:
|
26
|
+
# * Create a branch
|
27
|
+
# * Add default commit hook
|
28
|
+
# * Start the story on Pivotal Tracker
|
29
|
+
#
|
30
|
+
# @param [String, nil] filter a filter for selecting the story to start. This
|
31
|
+
# filter can be either:
|
32
|
+
# * a story id
|
33
|
+
# * a story type (feature, bug, chore)
|
34
|
+
# * +nil+
|
35
|
+
# @return [void]
|
36
|
+
def run(filter)
|
37
|
+
self.check_branch
|
38
|
+
story = GitPivotalTrackerIntegration::Util::Story.select_release @project
|
39
|
+
|
40
|
+
GitPivotalTrackerIntegration::Util::Story.pretty_print story
|
41
|
+
|
42
|
+
current_branch = GitPivotalTrackerIntegration::Util::Git.branch_name
|
43
|
+
|
44
|
+
GitPivotalTrackerIntegration::Util::Shell.exec "git checkout QA"
|
45
|
+
if (GitPivotalTrackerIntegration::Util::Shell.exec "git merge -s recursive --strategy-option theirs develop")
|
46
|
+
puts "Merged 'develop' in to 'QA'"
|
47
|
+
else
|
48
|
+
abort "FAILED to merge 'develop' in to 'QA'"
|
49
|
+
end
|
50
|
+
|
51
|
+
puts "storyNAME:#{story.name}"
|
52
|
+
|
53
|
+
build_number = story.name.dup
|
54
|
+
build_number[0] = ""
|
55
|
+
puts "storyNAME:#{story.name}"
|
56
|
+
puts "build_number:#{build_number}"
|
57
|
+
project_directory = ((GitPivotalTrackerIntegration::Util::Shell.exec 'find . -name "*.xcodeproj" 2>/dev/null').split /\/(?=[^\/]*$)/)[0]
|
58
|
+
working_directory = (GitPivotalTrackerIntegration::Util::Shell.exec "pwd").chop
|
59
|
+
puts "working_directory:#{working_directory}*"
|
60
|
+
|
61
|
+
# cd to the project_directory
|
62
|
+
Dir.chdir(project_directory)
|
63
|
+
|
64
|
+
# set build number and project number in project file
|
65
|
+
GitPivotalTrackerIntegration::Util::Shell.exec "pwd"
|
66
|
+
puts GitPivotalTrackerIntegration::Util::Shell.exec "xcrun agvtool new-version -all #{build_number}", false
|
67
|
+
puts GitPivotalTrackerIntegration::Util::Shell.exec "xcrun agvtool new-marketing-version SNAPSHOT"
|
68
|
+
|
69
|
+
# cd back to the working_directory
|
70
|
+
Dir.chdir(working_directory)
|
71
|
+
|
72
|
+
# Create a new build commit, push to QA, checkout develop
|
73
|
+
GitPivotalTrackerIntegration::Util::Git.create_commit( "Update build number to #{build_number} for delivery to QA", story)
|
74
|
+
puts GitPivotalTrackerIntegration::Util::Shell.exec "git push"
|
75
|
+
puts GitPivotalTrackerIntegration::Util::Shell.exec "git checkout develop"
|
76
|
+
|
77
|
+
i_stories = included_stories @project, story
|
78
|
+
deliver_stories i_stories, story
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
def check_branch
|
83
|
+
|
84
|
+
current_branch = GitPivotalTrackerIntegration::Util::Git.branch_name
|
85
|
+
|
86
|
+
suggested_branch = "develop"
|
87
|
+
|
88
|
+
if !suggested_branch.nil? && suggested_branch.length !=0 && current_branch != suggested_branch
|
89
|
+
should_chage_branch = ask("Your currently checked out branch is '#{current_branch}'. Do you want to checkout '#{suggested_branch}' before starting?(Y/n)")
|
90
|
+
if should_chage_branch != "n"
|
91
|
+
print "Checking out branch '#{suggested_branch}'...\n\n"
|
92
|
+
GitPivotalTrackerIntegration::Util::Shell.exec "git checkout #{suggested_branch}"
|
93
|
+
GitPivotalTrackerIntegration::Util::Shell.exec 'git pull'
|
94
|
+
|
95
|
+
else
|
96
|
+
abort "You must be on the #{suggested_branch} branch to run this command."
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
CANDIDATE_STATES = %w(finished unstarted).freeze
|
106
|
+
CANDIDATE_TYPES = %w(bug chore feature release)
|
107
|
+
|
108
|
+
def deliver_stories(stories, build_story)
|
109
|
+
all_stories = stories.dup
|
110
|
+
all_stories << build_story
|
111
|
+
all_stories.each {|story|
|
112
|
+
puts "story class:#{story.class}"
|
113
|
+
s_labels_string = story.labels
|
114
|
+
s_labels = ""
|
115
|
+
if (s_labels_string)
|
116
|
+
s_labels = s_labels_string.split(",")
|
117
|
+
s_labels << build_story.name
|
118
|
+
s_labels_string = s_labels.uniq.join(",")
|
119
|
+
else
|
120
|
+
s_labels_string = build_story.name
|
121
|
+
end
|
122
|
+
|
123
|
+
puts "labels:#{s_labels_string}"
|
124
|
+
story.update(:labels => s_labels_string)
|
125
|
+
if (story.story_type == "feature") || (story.story_type == "bug")
|
126
|
+
story.update(:current_state => "delivered")
|
127
|
+
elsif (story.story_type == "chore")
|
128
|
+
story.update(:current_state => "accepted")
|
129
|
+
end
|
130
|
+
}
|
131
|
+
end
|
132
|
+
|
133
|
+
def included_stories(project, build_story)
|
134
|
+
|
135
|
+
criteria = {
|
136
|
+
:current_state => CANDIDATE_STATES,
|
137
|
+
:limit => 1000,
|
138
|
+
:story_type => CANDIDATE_TYPES
|
139
|
+
}
|
140
|
+
|
141
|
+
|
142
|
+
candidates = project.stories.all criteria
|
143
|
+
|
144
|
+
# only include stories that have been estimated
|
145
|
+
estimated_candidates = Array.new
|
146
|
+
val_is_valid = true
|
147
|
+
puts "Included stories:\n"
|
148
|
+
candidates.each {|val|
|
149
|
+
val_is_valid = true
|
150
|
+
if (val.id == build_story.id)
|
151
|
+
break
|
152
|
+
end
|
153
|
+
if (val.current_state != "finished")
|
154
|
+
val_is_valid = false
|
155
|
+
end
|
156
|
+
if (val.story_type == "release")
|
157
|
+
val_is_valid = false
|
158
|
+
end
|
159
|
+
if val_is_valid
|
160
|
+
# puts "val_is_valid:#{val_is_valid}"
|
161
|
+
estimated_candidates << val
|
162
|
+
puts "#{val.id}"
|
163
|
+
|
164
|
+
end
|
165
|
+
}
|
166
|
+
candidates = estimated_candidates
|
167
|
+
end
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
def development_branch_name(story)
|
172
|
+
prefix = "#{story.id}-"
|
173
|
+
story_name = "#{story.name.gsub(/[^0-9a-z\\s]/i, '_')}"
|
174
|
+
if(story_name.length > 30)
|
175
|
+
suggested_suffix = story_name[0..27]
|
176
|
+
suggested_suffix << "__"
|
177
|
+
else
|
178
|
+
suggested_suffix = story_name
|
179
|
+
end
|
180
|
+
branch_name = "#{prefix}" + ask("Enter branch name (#{story.id}-<#{suggested_suffix}>): ")
|
181
|
+
puts
|
182
|
+
if branch_name == "#{prefix}"
|
183
|
+
branch_name << suggested_suffix
|
184
|
+
end
|
185
|
+
branch_name.gsub(/[^0-9a-z\\s\-]/i, '_')
|
186
|
+
end
|
187
|
+
|
188
|
+
def start_on_tracker(story)
|
189
|
+
print 'Starting story on Pivotal Tracker... '
|
190
|
+
story.update(
|
191
|
+
:current_state => 'started',
|
192
|
+
:owned_by => GitPivotalTrackerIntegration::Util::Git.get_config('user.name')
|
193
|
+
)
|
194
|
+
puts 'OK'
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
@@ -53,7 +53,7 @@ class GitPivotalTrackerIntegration::Util::Story
|
|
53
53
|
# * +nil+: offers the user a selection of stories of all types
|
54
54
|
# @param [Fixnum] limit The number maximum number of stories the user can choose from
|
55
55
|
# @return [PivotalTracker::Story] The Pivotal Tracker story selected by the user
|
56
|
-
def self.select_story(project, filter = nil, limit =
|
56
|
+
def self.select_story(project, filter = nil, limit = 12)
|
57
57
|
if filter =~ /[[:digit:]]/
|
58
58
|
story = project.stories.find filter.to_i
|
59
59
|
else
|
@@ -63,6 +63,21 @@ class GitPivotalTrackerIntegration::Util::Story
|
|
63
63
|
story
|
64
64
|
end
|
65
65
|
|
66
|
+
def self.select_release(project, filter = 'b', limit = 10)
|
67
|
+
if filter =~ /[[:digit:]]/
|
68
|
+
story = project.stories.find filter.to_i
|
69
|
+
if story.(story_type != "release")
|
70
|
+
story = nil
|
71
|
+
puts "Specified story##{filter} is not a valid release story"
|
72
|
+
abort 'FAIL'
|
73
|
+
end
|
74
|
+
else
|
75
|
+
story = find_story project, filter, limit
|
76
|
+
end
|
77
|
+
|
78
|
+
story
|
79
|
+
end
|
80
|
+
|
66
81
|
private
|
67
82
|
|
68
83
|
CANDIDATE_STATES = %w(rejected unstarted unscheduled).freeze
|
@@ -94,6 +109,10 @@ class GitPivotalTrackerIntegration::Util::Story
|
|
94
109
|
end
|
95
110
|
|
96
111
|
def self.find_story(project, type, limit)
|
112
|
+
if (type == "b" || type == "v")
|
113
|
+
release_type = type
|
114
|
+
type = "release"
|
115
|
+
end
|
97
116
|
criteria = {
|
98
117
|
:current_state => CANDIDATE_STATES,
|
99
118
|
:limit => limit
|
@@ -106,11 +125,25 @@ class GitPivotalTrackerIntegration::Util::Story
|
|
106
125
|
|
107
126
|
# only include stories that have been estimated
|
108
127
|
estimated_candidates = Array.new
|
128
|
+
val_is_valid = true
|
109
129
|
candidates.each {|val|
|
110
|
-
|
111
|
-
if
|
112
|
-
|
130
|
+
val_is_valid = true
|
131
|
+
if (val.story_type == "feature" )
|
132
|
+
# puts "#{val.story_type} #{val.name}.estimate:#{val.estimate} "
|
133
|
+
if (val.estimate < 0)
|
134
|
+
# puts "#{val.estimate} < 0"
|
135
|
+
val_is_valid = false
|
136
|
+
end
|
137
|
+
elsif (val.story_type == "release")
|
138
|
+
if (val.name[0] != release_type)
|
139
|
+
val_is_valid = false
|
140
|
+
end
|
113
141
|
end
|
142
|
+
|
143
|
+
if val_is_valid
|
144
|
+
# puts "val_is_valid:#{val_is_valid}"
|
145
|
+
estimated_candidates << val
|
146
|
+
end
|
114
147
|
}
|
115
148
|
candidates = estimated_candidates
|
116
149
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: v2gpti
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.0.
|
4
|
+
version: 0.2.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Hale
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-05-
|
12
|
+
date: 2014-05-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: highline
|
@@ -141,6 +141,7 @@ description: Provides a set of additional Git commands to help developers when w
|
|
141
141
|
with Pivotal Tracker
|
142
142
|
email: jeff@xxxxxxxxx.com
|
143
143
|
executables:
|
144
|
+
- git-deliver
|
144
145
|
- git-finish
|
145
146
|
- git-release
|
146
147
|
- git-start
|
@@ -150,12 +151,14 @@ files:
|
|
150
151
|
- LICENSE
|
151
152
|
- NOTICE
|
152
153
|
- README.md
|
154
|
+
- bin/git-deliver
|
153
155
|
- bin/git-finish
|
154
156
|
- bin/git-release
|
155
157
|
- bin/git-start
|
156
158
|
- lib/git-pivotal-tracker-integration/command/base.rb
|
157
159
|
- lib/git-pivotal-tracker-integration/command/command.rb
|
158
160
|
- lib/git-pivotal-tracker-integration/command/configuration.rb
|
161
|
+
- lib/git-pivotal-tracker-integration/command/deliver.rb
|
159
162
|
- lib/git-pivotal-tracker-integration/command/finish.rb
|
160
163
|
- lib/git-pivotal-tracker-integration/command/prepare-commit-msg.sh
|
161
164
|
- lib/git-pivotal-tracker-integration/command/release.rb
|