v2gpti 1.1.9 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/git-deliver +1 -1
- data/bin/git-finish +1 -1
- data/bin/git-newbug +1 -1
- data/bin/git-newfeature +1 -1
- data/bin/git-qa +1 -1
- data/bin/git-release +1 -1
- data/bin/git-report +1 -1
- data/bin/git-start +1 -1
- data/bin/git-uat +1 -1
- data/config_template +16 -0
- data/lib/git-pivotal-tracker-integration/command/base.rb +235 -322
- data/lib/git-pivotal-tracker-integration/command/configuration.rb +183 -109
- data/lib/git-pivotal-tracker-integration/command/deliver.rb +145 -200
- data/lib/git-pivotal-tracker-integration/command/finish.rb +70 -63
- data/lib/git-pivotal-tracker-integration/command/newbug.rb +36 -39
- data/lib/git-pivotal-tracker-integration/command/newfeature.rb +43 -42
- data/lib/git-pivotal-tracker-integration/command/release.rb +171 -203
- data/lib/git-pivotal-tracker-integration/command/report.rb +33 -36
- data/lib/git-pivotal-tracker-integration/command/start.rb +74 -78
- data/lib/git-pivotal-tracker-integration/util/git.rb +202 -204
- data/lib/git-pivotal-tracker-integration/util/shell.rb +19 -16
- data/lib/git-pivotal-tracker-integration/util/story.rb +155 -177
- data/lib/git-pivotal-tracker-integration/version-update/gradle.rb +44 -40
- data/lib/git-pivotal-tracker-integration.rb +44 -0
- data/spec/git-pivotal-tracker-integration/command/configuration_spec.rb +1 -2
- data/spec/git-pivotal-tracker-integration/command/finish_spec.rb +1 -1
- data/spec/git-pivotal-tracker-integration/command/release_spec.rb +1 -1
- data/spec/git-pivotal-tracker-integration/command/start_spec.rb +1 -1
- data/spec/git-pivotal-tracker-integration/util/story_spec.rb +21 -32
- data/tracker_api/lib/tracker_api/client.rb +241 -0
- data/tracker_api/lib/tracker_api/endpoints/activity.rb +38 -0
- data/tracker_api/lib/tracker_api/endpoints/comments.rb +27 -0
- data/tracker_api/lib/tracker_api/endpoints/epic.rb +17 -0
- data/tracker_api/lib/tracker_api/endpoints/epics.rb +20 -0
- data/tracker_api/lib/tracker_api/endpoints/file_attachment.rb +18 -0
- data/tracker_api/lib/tracker_api/endpoints/iterations.rb +20 -0
- data/tracker_api/lib/tracker_api/endpoints/me.rb +17 -0
- data/tracker_api/lib/tracker_api/endpoints/memberships.rb +20 -0
- data/tracker_api/lib/tracker_api/endpoints/notifications.rb +20 -0
- data/tracker_api/lib/tracker_api/endpoints/project.rb +17 -0
- data/tracker_api/lib/tracker_api/endpoints/projects.rb +18 -0
- data/tracker_api/lib/tracker_api/endpoints/stories.rb +20 -0
- data/tracker_api/lib/tracker_api/endpoints/story.rb +37 -0
- data/tracker_api/lib/tracker_api/endpoints/tasks.rb +20 -0
- data/tracker_api/lib/tracker_api/error.rb +18 -0
- data/tracker_api/lib/tracker_api/logger.rb +31 -0
- data/tracker_api/lib/tracker_api/resources/account.rb +18 -0
- data/tracker_api/lib/tracker_api/resources/activity.rb +24 -0
- data/tracker_api/lib/tracker_api/resources/base.rb +71 -0
- data/tracker_api/lib/tracker_api/resources/change.rb +15 -0
- data/tracker_api/lib/tracker_api/resources/comment.rb +20 -0
- data/tracker_api/lib/tracker_api/resources/epic.rb +17 -0
- data/tracker_api/lib/tracker_api/resources/file_attachment.rb +23 -0
- data/tracker_api/lib/tracker_api/resources/iteration.rb +24 -0
- data/tracker_api/lib/tracker_api/resources/label.rb +14 -0
- data/tracker_api/lib/tracker_api/resources/me.rb +21 -0
- data/tracker_api/lib/tracker_api/resources/membership_summary.rb +15 -0
- data/tracker_api/lib/tracker_api/resources/notification.rb +26 -0
- data/tracker_api/lib/tracker_api/resources/person.rb +14 -0
- data/tracker_api/lib/tracker_api/resources/primary_resource.rb +13 -0
- data/tracker_api/lib/tracker_api/resources/project.rb +131 -0
- data/tracker_api/lib/tracker_api/resources/project_membership.rb +16 -0
- data/tracker_api/lib/tracker_api/resources/story.rb +102 -0
- data/tracker_api/lib/tracker_api/resources/task.rb +16 -0
- data/tracker_api/lib/tracker_api/resources/time_zone.rb +13 -0
- data/tracker_api/lib/tracker_api/version.rb +3 -0
- data/tracker_api/lib/tracker_api.rb +60 -0
- metadata +202 -53
- data/lib/git-pivotal-tracker-integration/command/command.rb +0 -20
- data/lib/git-pivotal-tracker-integration/util/util.rb +0 -20
- data/lib/git-pivotal-tracker-integration/version-update/version_update.rb +0 -20
- data/lib/git_pivotal_tracker_integration.rb +0 -18
@@ -13,24 +13,27 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
|
-
|
16
|
+
module GitPivotalTrackerIntegration
|
17
|
+
module Util
|
17
18
|
|
18
|
-
# Utilities for dealing with the shell
|
19
|
-
class
|
19
|
+
# Utilities for dealing with the shell
|
20
|
+
class Shell
|
20
21
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
22
|
+
# Executes a command
|
23
|
+
#
|
24
|
+
# @param [String] command the command to execute
|
25
|
+
# @param [Boolean] abort_on_failure whether to +Kernel#abort+ with +FAIL+ as
|
26
|
+
# the message when the command's +Status#existstatus+ is not +0+
|
27
|
+
# @return [String] the result of the command
|
28
|
+
def self.exec(command, abort_on_failure = true)
|
29
|
+
result = `#{command}`
|
30
|
+
if $?.exitstatus != 0 && abort_on_failure
|
31
|
+
abort "FAIL on command:#{command}"
|
32
|
+
end
|
32
33
|
|
33
|
-
|
34
|
-
|
34
|
+
result
|
35
|
+
end
|
35
36
|
|
37
|
+
end
|
38
|
+
end
|
36
39
|
end
|
@@ -13,219 +13,197 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
puts
|
44
|
-
end
|
16
|
+
module GitPivotalTrackerIntegration
|
17
|
+
module Util
|
18
|
+
|
19
|
+
# Utilities for dealing with +PivotalTracker::Story+s
|
20
|
+
class Story
|
21
|
+
|
22
|
+
CANDIDATE_STATES = %w(rejected unstarted unscheduled).freeze
|
23
|
+
LABEL_DESCRIPTION = 'Description'.freeze
|
24
|
+
LABEL_TITLE = 'Title'.freeze
|
25
|
+
LABEL_WIDTH = (LABEL_DESCRIPTION.length + 2).freeze
|
26
|
+
CONTENT_WIDTH = (HighLine.new.output_cols - LABEL_WIDTH).freeze
|
27
|
+
|
28
|
+
# Print a human readable version of a story. This pretty prints the title,
|
29
|
+
# description, and notes for the story.
|
30
|
+
#
|
31
|
+
# @param [PivotalTracker::Story] story the story to pretty print
|
32
|
+
# @return [void]
|
33
|
+
def self.pretty_print(story)
|
34
|
+
print_label LABEL_TITLE
|
35
|
+
print_value story.name
|
36
|
+
|
37
|
+
description = story.description
|
38
|
+
if !description.nil? && !description.empty?
|
39
|
+
print_label 'Description'
|
40
|
+
print_value description
|
41
|
+
end
|
45
42
|
|
43
|
+
story.comments.sort_by{ |comment| comment.updated_at }.each_with_index do |comment, index|
|
44
|
+
print_label "Note #{index + 1}"
|
45
|
+
print_value comment.text
|
46
|
+
end
|
46
47
|
|
47
|
-
|
48
|
-
|
49
|
-
# @param [PivotalTracker::Project] project the project to select stories from
|
50
|
-
# @param [String, nil] filter a filter for selecting the story to start. This
|
51
|
-
# filter can be either:
|
52
|
-
# * a story id: selects the story represented by the id
|
53
|
-
# * a story type (feature, bug, chore): offers the user a selection of stories of the given type
|
54
|
-
# * +nil+: offers the user a selection of stories of all types
|
55
|
-
# @param [Fixnum] limit The number maximum number of stories the user can choose from
|
56
|
-
# @return [PivotalTracker::Story] The Pivotal Tracker story selected by the user
|
57
|
-
def self.select_story(project, filter = nil, limit = 12)
|
58
|
-
if filter =~ /[[:digit:]]/
|
59
|
-
story = project.stories.find filter.to_i
|
60
|
-
else
|
61
|
-
story = find_story project, filter, limit
|
62
|
-
end
|
48
|
+
puts
|
49
|
+
end
|
63
50
|
|
64
|
-
story
|
65
|
-
end
|
66
51
|
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
52
|
+
# Selects a Pivotal Tracker story by doing the following steps:
|
53
|
+
#
|
54
|
+
# @param [PivotalTracker::Project] project the project to select stories from
|
55
|
+
# @param [String, nil] filter a filter for selecting the story to start. This
|
56
|
+
# filter can be either:
|
57
|
+
# * a story id: selects the story represented by the id
|
58
|
+
# * a story type (feature, bug, chore): offers the user a selection of stories of the given type
|
59
|
+
# * +nil+: offers the user a selection of stories of all types
|
60
|
+
# @param [Fixnum] limit The number maximum number of stories the user can choose from
|
61
|
+
# @return [PivotalTracker::Story] The Pivotal Tracker story selected by the user
|
62
|
+
def self.select_story(project, filter = nil, limit = 5)
|
71
63
|
story = nil
|
72
|
-
$LOG.fatal("Specified story##{filter} is not a valid release story")
|
73
|
-
puts "Specified story##{filter} is not a valid release story"
|
74
|
-
abort 'FAIL'
|
75
|
-
end
|
76
|
-
else
|
77
|
-
story = find_story project, filter, limit
|
78
|
-
end
|
79
64
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
65
|
+
if filter =~ /[[:digit:]]/
|
66
|
+
story = project.story filter.to_i
|
67
|
+
else
|
68
|
+
# story type from (feature, bug, chore)
|
69
|
+
# state from (rejected unstarted unscheduled)
|
70
|
+
# if story type is "feature", then retrieve only estimated ones.
|
71
|
+
criteria = "current_state:#{CANDIDATE_STATES.join(',')}"
|
72
|
+
|
73
|
+
if %w(feature bug chore).include?(filter)
|
74
|
+
criteria << " type:#{filter}"
|
75
|
+
criteria << " -estimate:-1" if filter == "feature"
|
76
|
+
else
|
77
|
+
criteria << " type:feature,bug,chore"
|
78
|
+
end
|
84
79
|
|
85
|
-
|
80
|
+
candidates = project.stories(filter: criteria, limit: limit)
|
81
|
+
#limit is not working as expected. Need to find the reason. For now handle via ruby
|
82
|
+
candidates = candidates[0...5]
|
83
|
+
story = choose_story(candidates) unless candidates.empty?
|
84
|
+
end
|
86
85
|
|
87
|
-
|
86
|
+
story
|
87
|
+
end
|
88
88
|
|
89
|
-
|
89
|
+
def self.select_release(project, filter = 'b', limit = 10)
|
90
|
+
if filter =~ /[[:digit:]]/
|
91
|
+
story = project.story filter.to_i
|
92
|
+
if story.story_type != "release"
|
93
|
+
$LOG.fatal("Specified story##{filter} is not a valid release story")
|
94
|
+
puts "Specified story##{filter} is not a valid release story"
|
95
|
+
abort 'FAIL'
|
96
|
+
end
|
97
|
+
else
|
98
|
+
story = find_release_story project, filter, limit
|
99
|
+
end
|
90
100
|
|
91
|
-
|
101
|
+
story
|
102
|
+
end
|
92
103
|
|
93
|
-
|
104
|
+
private
|
94
105
|
|
95
|
-
|
96
|
-
|
97
|
-
|
106
|
+
def self.print_label(label)
|
107
|
+
print "%#{LABEL_WIDTH}s" % ["#{label}: "]
|
108
|
+
end
|
98
109
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
else
|
103
|
-
value.scan(/\S.{0,#{CONTENT_WIDTH - 2}}\S(?=\s|$)|\S+/).each_with_index do |line, index|
|
104
|
-
if index == 0
|
105
|
-
puts line
|
110
|
+
def self.print_value(value)
|
111
|
+
if value.nil? || value.empty?
|
112
|
+
puts ''
|
106
113
|
else
|
107
|
-
|
114
|
+
value.scan(/\S.{0,#{CONTENT_WIDTH - 2}}\S(?=\s|$)|\S+/).each_with_index do |line, index|
|
115
|
+
if index == 0
|
116
|
+
puts line
|
117
|
+
else
|
118
|
+
puts "%#{LABEL_WIDTH}s%s" % ['', line]
|
119
|
+
end
|
120
|
+
end
|
108
121
|
end
|
109
122
|
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def self.find_story(project, type, limit)
|
114
|
-
if (type == "b" || type == "v")
|
115
|
-
release_type = type
|
116
|
-
type = "release"
|
117
|
-
end
|
118
|
-
criteria = {
|
119
|
-
:current_state => CANDIDATE_STATES,
|
120
|
-
:limit => limit
|
121
|
-
}
|
122
|
-
if type
|
123
|
-
criteria[:story_type] = type
|
124
|
-
end
|
125
123
|
|
126
|
-
|
124
|
+
def self.choose_story(candidates, type = nil)
|
125
|
+
choose do |menu|
|
126
|
+
puts "\nUnestimated features can not be started.\n\n" if type != "release"
|
127
127
|
|
128
|
-
|
129
|
-
estimated_candidates = Array.new
|
130
|
-
val_is_valid = true
|
128
|
+
menu.prompt = 'Choose a story to start: '
|
131
129
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
# puts "#{val.story_type} #{val.name}.estimate:#{val.estimate} "
|
136
|
-
if (val.estimate < 0)
|
137
|
-
# puts "#{val.estimate} < 0"
|
138
|
-
val_is_valid = false
|
130
|
+
candidates.each do |story|
|
131
|
+
name = type ? story.name : '%-7s %s' % [story.story_type.upcase, story.name]
|
132
|
+
menu.choice(name) { story }
|
139
133
|
end
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
label_string = "";
|
144
|
-
end
|
145
|
-
if (val.name[0] != release_type) || (label_string.include? val.name)
|
146
|
-
val_is_valid = false
|
134
|
+
menu.choice('Quit') do
|
135
|
+
say "Thank you for using v2gpti"
|
136
|
+
exit 0
|
147
137
|
end
|
148
138
|
end
|
139
|
+
end
|
149
140
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
candidates = estimated_candidates
|
141
|
+
# story type is release with story name starting with "v"/"b" or story labels includes story name.
|
142
|
+
# state from (rejected unstarted unscheduled)
|
143
|
+
# sort stories based on version (version number part of the story name) and pick the latest one.
|
144
|
+
def self.find_release_story(project, type, limit)
|
145
|
+
release_type = (type == "b") ? "build" : "version"
|
156
146
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
puts "\nUnestimated features can not be started.\n\n"
|
161
|
-
end
|
147
|
+
criteria = "type:release"
|
148
|
+
criteria << " current_state:#{CANDIDATE_STATES.join(',')}"
|
149
|
+
criteria << " name:/#{type}*/" #story name starts with b or v
|
162
150
|
|
163
|
-
|
151
|
+
candidates = project.stories(filter: criteria, limit: limit)
|
164
152
|
|
165
|
-
candidates.
|
166
|
-
|
167
|
-
|
153
|
+
candidates = candidates.select do |story|
|
154
|
+
labels = story.labels.map(&:name)
|
155
|
+
!labels.include?(story.name)
|
168
156
|
end
|
169
|
-
|
170
|
-
|
171
|
-
|
157
|
+
|
158
|
+
unless candidates.empty?
|
159
|
+
story = choose_story(candidates, "release")
|
160
|
+
else
|
161
|
+
puts "There are no available release stories."
|
162
|
+
last_release = last_release_story(project, type)
|
163
|
+
|
164
|
+
if last_release
|
165
|
+
puts " The last #{release_type} release was #{last_release.name}."
|
166
|
+
next_release_number = set_next_release_number(last_release, release_type)
|
167
|
+
else
|
168
|
+
next_release_number = ask("To create a new #{release_type}, enter a name for the new release story:")
|
169
|
+
end
|
170
|
+
puts "New #{release_type} release number is: #{next_release_number}"
|
171
|
+
story = self.create_new_release(project, next_release_number)
|
172
172
|
end
|
173
|
-
end
|
174
173
|
|
175
|
-
|
176
|
-
else
|
177
|
-
if type == "release"
|
178
|
-
last_release = last_release_story(project, release_type)
|
179
|
-
last_release_number = last_release.name if !last_release.nil?
|
180
|
-
last_release_type_string = (release_type == "b") ? "build" : "version"
|
181
|
-
puts "There are no available release stories."
|
182
|
-
puts " The last #{last_release_type_string} release was #{last_release_number}." if !last_release.nil?
|
183
|
-
next_release_number = set_next_release_number(last_release, release_type, last_release_number) if !last_release.nil?
|
184
|
-
next_release_number = ask("To create a new #{last_release_type_string}, enter a name for the new release story:") if last_release.nil?
|
185
|
-
puts "New #{last_release_type_string} release number is: #{next_release_number}"
|
186
|
-
story = self.create_new_release(project, next_release_number)
|
187
|
-
else
|
188
|
-
puts
|
174
|
+
story
|
189
175
|
end
|
190
|
-
end
|
191
176
|
|
177
|
+
# sort stories based on version (version number part of the story name) and pick the latest one.
|
178
|
+
def self.last_release_story (project, type)
|
192
179
|
|
180
|
+
candidates = project.stories filter: "type:release name:/#{type}*/"
|
181
|
+
candidates = candidates.select do |story|
|
182
|
+
labels = story.labels.map(&:name)
|
183
|
+
!labels.include?(story.name)
|
184
|
+
end
|
185
|
+
candidates.sort! { |x,y| Gem::Version.new(y.name[1 .. -1]) <=> Gem::Version.new(x.name[1 .. -1]) }
|
193
186
|
|
194
|
-
|
195
|
-
|
187
|
+
candidates.first
|
188
|
+
end
|
196
189
|
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
190
|
+
def self.set_next_release_number(last_release, release_type)
|
191
|
+
if release_type == "b"
|
192
|
+
return last_release.name.next # just increment the last number
|
193
|
+
end
|
194
|
+
if release_type == "v"
|
195
|
+
version_split = last_release.name.split(/\./)
|
196
|
+
last_incremented_number=version_split.last.next
|
197
|
+
version_split.pop
|
198
|
+
version_split.push(last_incremented_number)
|
199
|
+
return version_split.join(".")
|
200
|
+
end
|
201
|
+
end
|
201
202
|
|
202
|
-
|
203
|
-
|
204
|
-
|
203
|
+
def self.create_new_release (project, next_release_number)
|
204
|
+
project.create_story(:story_type => 'release', :current_state => 'unstarted', :name => next_release_number)
|
205
|
+
end
|
205
206
|
|
206
|
-
candidates.first
|
207
|
-
end
|
208
|
-
|
209
|
-
def self.set_next_release_number(last_release, release_type, last_release_number)
|
210
|
-
if release_type == "b"
|
211
|
-
return last_release_number.next
|
212
|
-
end
|
213
|
-
if release_type == "v"
|
214
|
-
version_split = last_release_number.split(/\./)
|
215
|
-
last_incremented_number=version_split.last.next
|
216
|
-
version_split.pop
|
217
|
-
version_split.push(last_incremented_number)
|
218
|
-
return version_split.join(".")
|
219
207
|
end
|
220
208
|
end
|
221
|
-
|
222
|
-
def self.create_new_release (project, next_release_number)
|
223
|
-
new_story = PivotalTracker::Story.new
|
224
|
-
new_story.project_id = project.id
|
225
|
-
new_story.story_type = "release"
|
226
|
-
new_story.current_state = "unstarted"
|
227
|
-
new_story.name = next_release_number
|
228
|
-
|
229
|
-
uploaded_story = new_story.create
|
230
|
-
end
|
231
209
|
end
|
@@ -13,52 +13,56 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
|
-
|
16
|
+
module GitPivotalTrackerIntegration
|
17
|
+
module VersionUpdate
|
17
18
|
|
18
|
-
# A version updater for dealing with _typical_ Gradle projects. This updater
|
19
|
-
# assumes that the version of the current project is stored within a
|
20
|
-
# +gradle.properties+ file in the root of the repository. This properties
|
21
|
-
# file should have an entry with a key of +version+ and version number as the key.
|
22
|
-
class
|
19
|
+
# A version updater for dealing with _typical_ Gradle projects. This updater
|
20
|
+
# assumes that the version of the current project is stored within a
|
21
|
+
# +gradle.properties+ file in the root of the repository. This properties
|
22
|
+
# file should have an entry with a key of +version+ and version number as the key.
|
23
|
+
class Gradle
|
23
24
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
# Creates an instance of this updater
|
26
|
+
#
|
27
|
+
# @param [String] root The root of the repository
|
28
|
+
def initialize(root)
|
29
|
+
@gradle_file = File.expand_path 'app/build.gradle', root
|
30
|
+
end
|
29
31
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
# Update the version of the project
|
33
|
+
#
|
34
|
+
# @param [String] new_version the version to update the project to
|
35
|
+
# @return [void]
|
36
|
+
def update_dev_version(new_version)
|
37
|
+
update_version('DEV', 'SNAPSHOT', new_version)
|
34
38
|
end
|
35
|
-
@version = groups[0] ? groups[0][0]: nil
|
36
|
-
end
|
37
|
-
end
|
38
39
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
# initialization, +false+ otherwise
|
43
|
-
def supports?
|
44
|
-
!@version.nil?
|
45
|
-
end
|
40
|
+
def update_qa_version(new_version)
|
41
|
+
update_version('QA', 'SNAPSHOT', new_version)
|
42
|
+
end
|
46
43
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
def current_version
|
51
|
-
@version
|
52
|
-
end
|
44
|
+
def update_uat_version(new_version)
|
45
|
+
update_version('UAT', new_version, new_version)
|
46
|
+
end
|
53
47
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
48
|
+
def update_prod_version(new_version)
|
49
|
+
update_version('PROD', new_version, new_version)
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def update_version(version_type, new_name, new_version)
|
55
|
+
content = File.read(@gradle_file)
|
56
|
+
new_content = content.gsub(/productFlavors.*?#{version_type}.*?versionCode( )*=?( )*(.*?)versionName( )*=?( )*(.*?\s)/m) do |match|
|
57
|
+
version_code = $3.strip
|
58
|
+
version_name = $6.strip
|
59
|
+
match.gsub(version_code, new_version).gsub(version_name, "\"#{new_name}\"")
|
60
|
+
end
|
61
|
+
|
62
|
+
File.open(@gradle_file, 'w') { |file| file.write(new_content) }
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
63
66
|
|
67
|
+
end
|
64
68
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
|
2
|
+
# dependencies
|
3
|
+
require 'rubygems'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'time'
|
6
|
+
require 'highline/import'
|
7
|
+
require 'parseconfig'
|
8
|
+
require 'logger'
|
9
|
+
require 'os'
|
10
|
+
|
11
|
+
ROOT_PATH = File.dirname(File.expand_path(__FILE__))
|
12
|
+
TRACKER_API_HOME = "#{ROOT_PATH}/../tracker_api"
|
13
|
+
|
14
|
+
$LOAD_PATH << "#{TRACKER_API_HOME}/lib"
|
15
|
+
|
16
|
+
require "#{TRACKER_API_HOME}/lib/tracker_api"
|
17
|
+
|
18
|
+
|
19
|
+
module GitPivotalTrackerIntegration
|
20
|
+
module Command
|
21
|
+
autoload :Base, 'git-pivotal-tracker-integration/command/base'
|
22
|
+
autoload :Configuration, 'git-pivotal-tracker-integration/command/configuration'
|
23
|
+
autoload :Deliver, 'git-pivotal-tracker-integration/command/deliver'
|
24
|
+
autoload :Finish, 'git-pivotal-tracker-integration/command/finish'
|
25
|
+
autoload :Newbug, 'git-pivotal-tracker-integration/command/newbug'
|
26
|
+
autoload :Newfeature, 'git-pivotal-tracker-integration/command/newfeature'
|
27
|
+
autoload :Release, 'git-pivotal-tracker-integration/command/release'
|
28
|
+
autoload :Report, 'git-pivotal-tracker-integration/command/report'
|
29
|
+
autoload :Start, 'git-pivotal-tracker-integration/command/start'
|
30
|
+
end
|
31
|
+
|
32
|
+
module Util
|
33
|
+
autoload :Git, 'git-pivotal-tracker-integration/util/git'
|
34
|
+
autoload :Shell, 'git-pivotal-tracker-integration/util/shell'
|
35
|
+
autoload :Story, 'git-pivotal-tracker-integration/util/story'
|
36
|
+
end
|
37
|
+
|
38
|
+
module VersionUpdate
|
39
|
+
autoload :Gradle, 'git-pivotal-tracker-integration/version-update/gradle'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
autoload :Toggl, 'git-pivotal-tracker-integration/util/togglV8'
|
44
|
+
autoload :TogglException, 'git-pivotal-tracker-integration/util/togglV8'
|
@@ -16,7 +16,6 @@
|
|
16
16
|
require 'spec_helper'
|
17
17
|
require 'git-pivotal-tracker-integration/command/configuration'
|
18
18
|
require 'git-pivotal-tracker-integration/util/git'
|
19
|
-
require 'pivotal-tracker'
|
20
19
|
|
21
20
|
describe GitPivotalTrackerIntegration::Command::Configuration do
|
22
21
|
|
@@ -37,7 +36,7 @@ describe GitPivotalTrackerIntegration::Command::Configuration do
|
|
37
36
|
it 'should prompt the user for the API token if it is not configured' do
|
38
37
|
GitPivotalTrackerIntegration::Util::Git.should_receive(:get_config).with('pivotal.api-token', :inherited).and_return('')
|
39
38
|
@configuration.should_receive(:ask).and_return('test_api_token')
|
40
|
-
GitPivotalTrackerIntegration::Util::Git.should_receive(:set_config).with("pivotal.project-id", anything())
|
39
|
+
GitPivotalTrackerIntegration::Util::Git.should_receive(:set_config).with("pivotal.project-id", anything())
|
41
40
|
GitPivotalTrackerIntegration::Util::Git.should_receive(:set_config).with('pivotal.api-token', 'test_api_token', :global)
|
42
41
|
|
43
42
|
api_token = @configuration.api_token
|
@@ -17,7 +17,7 @@ require 'spec_helper'
|
|
17
17
|
require 'git-pivotal-tracker-integration/command/configuration'
|
18
18
|
require 'git-pivotal-tracker-integration/command/finish'
|
19
19
|
require 'git-pivotal-tracker-integration/util/git'
|
20
|
-
|
20
|
+
|
21
21
|
|
22
22
|
describe GitPivotalTrackerIntegration::Command::Finish do
|
23
23
|
|
@@ -18,7 +18,7 @@ require 'git-pivotal-tracker-integration/command/configuration'
|
|
18
18
|
require 'git-pivotal-tracker-integration/command/release'
|
19
19
|
require 'git-pivotal-tracker-integration/util/git'
|
20
20
|
require 'git-pivotal-tracker-integration/util/story'
|
21
|
-
|
21
|
+
|
22
22
|
|
23
23
|
describe GitPivotalTrackerIntegration::Command::Release do
|
24
24
|
|
@@ -18,7 +18,7 @@ require 'git-pivotal-tracker-integration/command/configuration'
|
|
18
18
|
require 'git-pivotal-tracker-integration/command/start'
|
19
19
|
require 'git-pivotal-tracker-integration/util/git'
|
20
20
|
require 'git-pivotal-tracker-integration/util/story'
|
21
|
-
|
21
|
+
|
22
22
|
|
23
23
|
describe GitPivotalTrackerIntegration::Command::Start do
|
24
24
|
|