v2gpti 1.1.9 → 1.2.0
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 +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
|
|