gitsflow 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.travis.yml +7 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/Gemfile.lock +44 -0
- data/LICENSE.txt +21 -0
- data/README.md +98 -0
- data/Rakefile +6 -0
- data/bin/sflow +6 -0
- data/gitsflow.gemspec +37 -0
- data/lib/Git/git.rb +82 -0
- data/lib/GitLab/comment.rb +20 -0
- data/lib/GitLab/gitlab.rb +67 -0
- data/lib/GitLab/issue.rb +143 -0
- data/lib/GitLab/list.rb +22 -0
- data/lib/GitLab/merge_request.rb +82 -0
- data/lib/GitLab/user.rb +20 -0
- data/lib/config.rb +16 -0
- data/lib/sflow.rb +569 -0
- data/lib/string.rb +42 -0
- data/src/common/images/get_token.gif +0 -0
- metadata +150 -0
@@ -0,0 +1,82 @@
|
|
1
|
+
class GitLab::MergeRequest
|
2
|
+
@options = {}
|
3
|
+
attr_accessor :source_branch, :target_branch, :title, :options, :assignee_id, :labels, :issue_iid, :obj_gitlab, :type, :description
|
4
|
+
@labels = []
|
5
|
+
def initialize(params = {})
|
6
|
+
@source_branch = params[:source_branch]
|
7
|
+
@target_branch = params[:target_branch]
|
8
|
+
@title = params[:title]
|
9
|
+
@labels = params[:labels]
|
10
|
+
@issue_iid = params[:issue_iid]
|
11
|
+
@type = params[:type]
|
12
|
+
@description = params[:description]
|
13
|
+
@options = params[:options]
|
14
|
+
end
|
15
|
+
|
16
|
+
def create
|
17
|
+
print "Create Merge Request: ".yellow
|
18
|
+
print "#{@source_branch} into #{@target_branch}\n\n".green
|
19
|
+
assignee_id = GitLab::User.me["id"]
|
20
|
+
if type != 'hotfix'
|
21
|
+
users = GitLab::User.all
|
22
|
+
print "Users list:\n\n".yellow
|
23
|
+
print "----------------------------\n".blue
|
24
|
+
print "#{"0".ljust(10)} - Empty\n".blue
|
25
|
+
users.each do |user|
|
26
|
+
print "#{user['id'].to_s.ljust(10)} - #{user['name']}\n".blue
|
27
|
+
end
|
28
|
+
print "----------------------------\n".blue
|
29
|
+
print "Choice user ID for assignee:\n".yellow
|
30
|
+
assignee_id = STDIN.gets.chomp
|
31
|
+
print "\n#{assignee_id}, "
|
32
|
+
print "ok!\n".green
|
33
|
+
end
|
34
|
+
|
35
|
+
url = "projects/#{$GITLAB_PROJECT_ID}/merge_requests"
|
36
|
+
|
37
|
+
labels = ['merge_request']
|
38
|
+
labels << type if type
|
39
|
+
@obj_gitlab = GitLab.request_post(url, {
|
40
|
+
source_branch: @source_branch,
|
41
|
+
target_branch: @target_branch,
|
42
|
+
title: @title,
|
43
|
+
labels: labels.join(','),
|
44
|
+
description: @description,
|
45
|
+
assignee_id: assignee_id.to_i
|
46
|
+
})
|
47
|
+
|
48
|
+
print "Merge request created with success!\n\n".green
|
49
|
+
end
|
50
|
+
|
51
|
+
|
52
|
+
def create_code_review
|
53
|
+
print "Create merge request for code review: ".yellow
|
54
|
+
print "#{@source_branch} into #{@target_branch}\n\n".green
|
55
|
+
users = GitLab::User.all
|
56
|
+
print "Users list:\n\n".yellow
|
57
|
+
print "----------------------------\n".blue
|
58
|
+
print "#{"0".ljust(10)} - Empty\n".blue
|
59
|
+
users.each do |user|
|
60
|
+
print "#{user['id'].to_s.ljust(10)} - #{user['name']}\n".blue
|
61
|
+
end
|
62
|
+
print "----------------------------\n".blue
|
63
|
+
print "Choice user ID for assignee code review:\n".yellow
|
64
|
+
assignee_id = STDIN.gets.chomp
|
65
|
+
print "\n#{assignee_id}, "
|
66
|
+
print "ok!\n".green
|
67
|
+
|
68
|
+
url = "projects/#{$GITLAB_PROJECT_ID}/merge_requests"
|
69
|
+
title = "WIP: ##{@issue_iid} - Code review #{@source_branch}"
|
70
|
+
@obj_gitlab = GitLab.request_post(url, {
|
71
|
+
source_branch: @source_branch,
|
72
|
+
target_branch: @target_branch,
|
73
|
+
title: title,
|
74
|
+
labels: @labels,
|
75
|
+
assignee_id: assignee_id.to_i
|
76
|
+
})
|
77
|
+
|
78
|
+
print "Merge request for Code Review created with success!\n\n".green
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
end
|
data/lib/GitLab/user.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
class GitLab::User
|
2
|
+
attr_accessor :id, :email, :name
|
3
|
+
|
4
|
+
def initialize(params = {})
|
5
|
+
@name = params[:name]
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.me
|
9
|
+
GitLab.request_get("projects/#{$GITLAB_PROJECT_ID}/users?search=#{$GITLAB_EMAIL}")[0]
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.all
|
13
|
+
GitLab.request_get("projects/#{$GITLAB_PROJECT_ID}/users")
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
end
|
data/lib/config.rb
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
|
2
|
+
begin
|
3
|
+
require 'dotenv'
|
4
|
+
Dotenv.load(File.join( Dir.pwd, ".env"))
|
5
|
+
rescue LoadError
|
6
|
+
# Gem loads as it should
|
7
|
+
end
|
8
|
+
$GITLAB_PROJECT_ID = ENV['GITLAB_PROJECT_ID']
|
9
|
+
$GITLAB_TOKEN = ENV['GITLAB_TOKEN']
|
10
|
+
$GITLAB_URL_API = ENV['GITLAB_URL_API']
|
11
|
+
$GITLAB_EMAIL = ENV['GITLAB_EMAIL'] == "" ? Open3.popen3("git config --local user.email") { |i, o| o.read }.chomp : ENV['GITLAB_EMAIL']
|
12
|
+
$GITLAB_LISTS = ENV['GITLAB_LISTS'].split(',') rescue nil
|
13
|
+
$GITLAB_NEXT_RELEASE_LIST = ENV['GITLAB_NEXT_RELEASE_LIST']
|
14
|
+
$GIT_BRANCH_MASTER= ENV["GIT_BRANCH_MASTER"]
|
15
|
+
$GIT_BRANCH_DEVELOP= ENV["GIT_BRANCH_DEVELOP"]
|
16
|
+
$GIT_BRANCHES_STAGING= ENV["GIT_BRANCHES_STAGING"].split(',') rescue nil
|
data/lib/sflow.rb
ADDED
@@ -0,0 +1,569 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
begin
|
3
|
+
require 'pry'
|
4
|
+
rescue LoadError
|
5
|
+
# Gem loads as it should
|
6
|
+
end
|
7
|
+
|
8
|
+
require 'net/http'
|
9
|
+
|
10
|
+
require "open3"
|
11
|
+
require 'uri'
|
12
|
+
load 'config.rb'
|
13
|
+
load 'string.rb'
|
14
|
+
load 'GitLab/gitlab.rb'
|
15
|
+
load 'Git/git.rb'
|
16
|
+
|
17
|
+
# require './lib/gitlab/issue.rb'
|
18
|
+
# require './lib/gitlab/merge_request.rb'
|
19
|
+
class SFlow
|
20
|
+
VERSION = "0.4.3"
|
21
|
+
$TYPE = ARGV[0]
|
22
|
+
$ACTION = ARGV[1]
|
23
|
+
|
24
|
+
$PARAM1 = ARGV[2]
|
25
|
+
$PARAM2 = ARGV[3..-1]&.join(' ')
|
26
|
+
|
27
|
+
def self.call
|
28
|
+
begin
|
29
|
+
print "Loading...\n".yellow
|
30
|
+
validates if !['config_', 'help_'].include? ("#{$TYPE}_#{$ACTION}")
|
31
|
+
#
|
32
|
+
send("#{$TYPE}_#{$ACTION}")
|
33
|
+
rescue => e
|
34
|
+
set_error e
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
38
|
+
def self.feature_start
|
39
|
+
title = $PARAM2 == "" ? $PARAM1 : $PARAM2
|
40
|
+
issue = GitLab::Issue.new(title: title, labels: ['feature'])
|
41
|
+
issue.create
|
42
|
+
branch = "#{issue.iid}-feature/#{$PARAM1}"
|
43
|
+
self.start(branch, issue)
|
44
|
+
end
|
45
|
+
|
46
|
+
|
47
|
+
def self.bugfix_start
|
48
|
+
title = $PARAM2 == "" ? $PARAM1 : $PARAM2
|
49
|
+
issue = GitLab::Issue.new(title: title, labels: ['bugfix'])
|
50
|
+
issue.create
|
51
|
+
branch = "#{issue.iid}-bugfix/#{$PARAM1}"
|
52
|
+
self.start(branch, issue)
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.hotfix_start
|
56
|
+
title = $PARAM2 == "" ? $PARAM1 : $PARAM2
|
57
|
+
issue = GitLab::Issue.new(title: title, labels: ['hotfix', 'production'])
|
58
|
+
issue.create
|
59
|
+
branch = "#{issue.iid}-hotfix/#{$PARAM1}"
|
60
|
+
self.start(branch, issue, $GIT_BRANCH_MASTER)
|
61
|
+
end
|
62
|
+
|
63
|
+
def self.feature_finish
|
64
|
+
self.feature_reintegration
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.feature_reintegration
|
68
|
+
if (!$PARAM1.match(/\-feature\//))
|
69
|
+
raise "This branch is not a feature"
|
70
|
+
end
|
71
|
+
self.reintegration 'feature'
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.bugfix_reintegration
|
75
|
+
if (!$PARAM1.match(/\-bugfix\//))
|
76
|
+
raise "This branch is not a bugfix"
|
77
|
+
end
|
78
|
+
self.reintegration 'bugfix'
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.bugfix_finish
|
82
|
+
self.bugfix_reintegration
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.hotfix_reintegration
|
86
|
+
if (!$PARAM1.match(/\-hotfix\//))
|
87
|
+
raise "This branch is not a hotfix"
|
88
|
+
end
|
89
|
+
self.reintegration 'hotfix'
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.hotfix_finish
|
93
|
+
self.hotfix_reintegration
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.feature_codereview
|
97
|
+
if (!$PARAM1.match(/\-feature\//))
|
98
|
+
raise "This branch is not a feature"
|
99
|
+
end
|
100
|
+
self.codereview()
|
101
|
+
end
|
102
|
+
|
103
|
+
def self.bugfix_codereview
|
104
|
+
if (!$PARAM1.match(/\-bugfix\//))
|
105
|
+
raise "This branch is not a bugfix"
|
106
|
+
end
|
107
|
+
self.codereview()
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.bugfix_staging
|
111
|
+
self.feature_staging
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.feature_staging
|
115
|
+
branch = $PARAM1
|
116
|
+
issue = GitLab::Issue.find_by_branch(branch)
|
117
|
+
|
118
|
+
print "Staging branches list:\n\n".yellow
|
119
|
+
print "----------------------------\n".blue
|
120
|
+
$GIT_BRANCHES_STAGING.each_with_index do |staging, index|
|
121
|
+
print "#{index} - #{staging}\n".blue
|
122
|
+
end
|
123
|
+
print "----------------------------\n".blue
|
124
|
+
print "Choice number of target branch:\n".yellow
|
125
|
+
target_branch_id = STDIN.gets.chomp
|
126
|
+
print "\n#{target_branch_id}, "
|
127
|
+
target_branch = $GIT_BRANCHES_STAGING[target_branch_id.to_i]
|
128
|
+
if !$GIT_BRANCHES_STAGING.include?(target_branch)
|
129
|
+
raise "option invalid!"
|
130
|
+
end
|
131
|
+
print "ok!\n".green
|
132
|
+
|
133
|
+
|
134
|
+
print "\nAttention: \n".yellow.bg_red
|
135
|
+
print "Do you want clean first the target branch or only merge?\n\n".yellow
|
136
|
+
print "----------------------------\n".blue
|
137
|
+
print "0 - Clean it first, then do merge #{branch} into #{target_branch}\n".blue
|
138
|
+
print "1 - Only Merge: Merge #{branch} into #{target_branch}\n".blue
|
139
|
+
print "----------------------------\n".blue
|
140
|
+
print "Choice number of target branch:\n".yellow
|
141
|
+
option_merge = STDIN.gets.chomp
|
142
|
+
print "\n#{option_merge}, "
|
143
|
+
print "ok!\n".green
|
144
|
+
|
145
|
+
if option_merge == "0"
|
146
|
+
Git.reset_hard branch, target_branch
|
147
|
+
elsif option_merge == "1"
|
148
|
+
Git.merge branch, target_branch
|
149
|
+
else
|
150
|
+
raise "Wrong choice"
|
151
|
+
end
|
152
|
+
new_labels = [target_branch, 'Staging']
|
153
|
+
remove_labels = $GITLAB_LISTS
|
154
|
+
old_labels = issue.obj_gitlab["labels"]
|
155
|
+
old_labels.delete_if{|label| remove_labels.include? label}
|
156
|
+
issue.labels = (old_labels + new_labels).uniq
|
157
|
+
issue.update
|
158
|
+
|
159
|
+
self.codereview
|
160
|
+
end
|
161
|
+
|
162
|
+
def self.release_start
|
163
|
+
version = $PARAM1
|
164
|
+
if !version
|
165
|
+
raise "param 'VERSION' not found"
|
166
|
+
end
|
167
|
+
issues = GitLab::Issue.from_list($GITLAB_NEXT_RELEASE_LIST).select{|i| !i.labels.include? 'ready_to_deploy'}
|
168
|
+
issues_total = issues.size
|
169
|
+
|
170
|
+
if issues_total == 0
|
171
|
+
raise "Not exist issues ready for start release version"
|
172
|
+
end
|
173
|
+
|
174
|
+
issues_urgent = issues.select{|i| i.labels.include? 'urgent'}
|
175
|
+
issues_urgent_total = issues_urgent.size
|
176
|
+
issue_title = "Release version #{version}\n"
|
177
|
+
|
178
|
+
issue_release = GitLab::Issue.find_by(title: issue_title) rescue nil
|
179
|
+
|
180
|
+
if issue_release
|
181
|
+
print "This issue already exists, do you want to continue using it? (y/n):".yellow.bg_red
|
182
|
+
|
183
|
+
print"\n If you choose 'n', a new issue will be created!\n"
|
184
|
+
print "\n"
|
185
|
+
option = STDIN.gets.chomp
|
186
|
+
else
|
187
|
+
option = 'n'
|
188
|
+
end
|
189
|
+
|
190
|
+
if option == 'n'
|
191
|
+
issue_release = GitLab::Issue.new(title: issue_title)
|
192
|
+
issue_release.create
|
193
|
+
end
|
194
|
+
|
195
|
+
new_labels = []
|
196
|
+
changelogs = []
|
197
|
+
|
198
|
+
release_branch = "#{issue_release.iid}-release/#{version}"
|
199
|
+
print "Creating release version #{version}\n"
|
200
|
+
|
201
|
+
begin
|
202
|
+
|
203
|
+
Git.delete_branch(release_branch)
|
204
|
+
Git.checkout 'develop'
|
205
|
+
Git.new_branch release_branch
|
206
|
+
|
207
|
+
print "Issue(s) title(s): \n".yellow
|
208
|
+
issues.each do |issue|
|
209
|
+
print " -> #{issue.title}\n"
|
210
|
+
end
|
211
|
+
print "\n"
|
212
|
+
|
213
|
+
# if issues_urgent_total > 0
|
214
|
+
print "Attention!".yellow.bg_red
|
215
|
+
print "\n\nChoose an option for merge:\n".yellow
|
216
|
+
print "----------------------------\n".blue
|
217
|
+
print "#{"0".ljust(10)} - Only #{issues_urgent_total} hotfix/urgent issues\n".blue if issues_urgent_total > 0
|
218
|
+
print "#{"1".ljust(10)} - All #{issues_total} issues\n".blue
|
219
|
+
print "----------------------------\n".blue
|
220
|
+
print "Choice a number:\n".yellow
|
221
|
+
option = STDIN.gets.chomp
|
222
|
+
# else
|
223
|
+
# option = "1"
|
224
|
+
# end
|
225
|
+
|
226
|
+
case option
|
227
|
+
when "0"
|
228
|
+
print "Issue(s) title(s): \n"
|
229
|
+
issues_urgent.each do |issue|
|
230
|
+
print " -> #{issue.title}\n"
|
231
|
+
end
|
232
|
+
|
233
|
+
issues_urgent.each do |issue|
|
234
|
+
|
235
|
+
Git.merge(issue.branch, release_branch)
|
236
|
+
changelogs << "* ~changelog #{issue.msg_changelog} \n"
|
237
|
+
new_labels << 'hotfix'
|
238
|
+
|
239
|
+
end
|
240
|
+
issues = issues_urgent
|
241
|
+
when "1"
|
242
|
+
type = 'other'
|
243
|
+
print "Next release has total (#{issues_total}) issues.\n\n".yellow
|
244
|
+
print "Issue(s) title(s): \n".yellow
|
245
|
+
issues.each do |issue|
|
246
|
+
print " -> #{issue.title}\n"
|
247
|
+
end
|
248
|
+
issues.each do |issue|
|
249
|
+
Git.merge(issue.branch, release_branch)
|
250
|
+
changelogs << "* ~changelog #{issue.msg_changelog} \n"
|
251
|
+
|
252
|
+
end
|
253
|
+
else
|
254
|
+
raise "option invalid!"
|
255
|
+
end
|
256
|
+
print "Changelog messages:\n\n".yellow
|
257
|
+
version_header = "Release version #{version}\n"
|
258
|
+
print version_header.blue
|
259
|
+
msgs_changelog = []
|
260
|
+
changelogs.each do |clog|
|
261
|
+
msg_changelog = "#{clog.strip.chomp.gsub('* ~changelog ', ' - ')}\n"
|
262
|
+
msgs_changelog << msg_changelog
|
263
|
+
print msg_changelog.light_blue
|
264
|
+
end
|
265
|
+
print "\nSetting changelog message in CHANGELOG\n".yellow
|
266
|
+
sleep 2
|
267
|
+
|
268
|
+
system('touch CHANGELOG')
|
269
|
+
file_changelog = IO.read 'CHANGELOG'
|
270
|
+
IO.write 'CHANGELOG', version_header + msgs_changelog.join('') + file_changelog
|
271
|
+
|
272
|
+
system('git add CHANGELOG')
|
273
|
+
system("git commit -m 'update CHANGELOG version #{version}'")
|
274
|
+
Git.push release_branch
|
275
|
+
|
276
|
+
issue_release.description = "#{changelogs.join("")}\n * #{issues.map{|i| "##{i.iid},"}.join(' ')}"
|
277
|
+
|
278
|
+
issue_release.labels = ['ready_to_deploy', 'Next Release']
|
279
|
+
issue_release.set_default_branch(release_branch)
|
280
|
+
issue_release.update
|
281
|
+
issues.each do |issue|
|
282
|
+
issue.labels = (issue.labels + new_labels).uniq
|
283
|
+
issue.close
|
284
|
+
end
|
285
|
+
print "\nYou are on branch: #{release_branch}\n".yellow
|
286
|
+
print "\nRelease #{version} created with success!\n\n".yellow
|
287
|
+
|
288
|
+
|
289
|
+
rescue => exception
|
290
|
+
Git.delete_branch(release_branch)
|
291
|
+
|
292
|
+
raise exception.message
|
293
|
+
end
|
294
|
+
|
295
|
+
end
|
296
|
+
|
297
|
+
def self.release_finish
|
298
|
+
version = $PARAM1
|
299
|
+
if !version
|
300
|
+
raise "param 'VERSION' not found"
|
301
|
+
end
|
302
|
+
new_labels = []
|
303
|
+
|
304
|
+
release_branch = "-release/#{version}"
|
305
|
+
issue_release = GitLab::Issue.find_by_branch(release_branch)
|
306
|
+
|
307
|
+
Git.merge issue_release.branch, 'develop'
|
308
|
+
Git.push 'develop'
|
309
|
+
|
310
|
+
|
311
|
+
type = issue_release.labels.include?('hotfix') ? 'hotfix' : nil
|
312
|
+
mr_master = GitLab::MergeRequest.new(
|
313
|
+
source_branch: issue_release.branch,
|
314
|
+
target_branch: $GIT_BRANCH_MASTER,
|
315
|
+
issue_iid: issue_release.iid,
|
316
|
+
title: "Reintegration release #{version}: #{issue_release.branch} into master",
|
317
|
+
description: "Closes ##{issue_release.iid}",
|
318
|
+
type: type
|
319
|
+
)
|
320
|
+
mr_master.create
|
321
|
+
|
322
|
+
# end
|
323
|
+
# mr_develop = GitLab::MergeRequest.new(
|
324
|
+
# source_branch: issue_release.branch,
|
325
|
+
# target_branch: 'develop',
|
326
|
+
# issue_iid: issue_release.iid,
|
327
|
+
# title: "##{issue_release.iid} - #{version} - Reintegration #{issue_release.branch} into develop",
|
328
|
+
# type: 'hotfix'
|
329
|
+
# )
|
330
|
+
# mr_develop.create
|
331
|
+
|
332
|
+
|
333
|
+
|
334
|
+
# remove_labels = [$GITLAB_NEXT_RELEASE_LIST]
|
335
|
+
remove_labels = []
|
336
|
+
old_labels = issue_release.obj_gitlab["labels"] + ['merge_request']
|
337
|
+
old_labels.delete_if{|label| remove_labels.include? label}
|
338
|
+
issue_release.labels = (old_labels + new_labels).uniq
|
339
|
+
issue_release.update
|
340
|
+
print "\nRelease #{version} finished with success!\n\n".yellow
|
341
|
+
|
342
|
+
|
343
|
+
end
|
344
|
+
|
345
|
+
|
346
|
+
def self.uninstall_
|
347
|
+
puts "\n\Uninstall git alias\n\n".yellow
|
348
|
+
print " \u{1F611} git sflow alias"
|
349
|
+
print " (removing...) \r".yellow
|
350
|
+
sleep 2
|
351
|
+
system('git config --local --unset alias.sflow')
|
352
|
+
print " \u{1F601}\ git sflow alias"
|
353
|
+
print " (removed) \u{2714} ".green
|
354
|
+
print "\n\n"
|
355
|
+
print "Bye Bye"
|
356
|
+
print "\n\n"
|
357
|
+
|
358
|
+
end
|
359
|
+
|
360
|
+
def self.install_
|
361
|
+
puts "\n\nInstalling git alias\n\n".yellow
|
362
|
+
print " \u{1F611} git sflow alias"
|
363
|
+
print " (instaling...) \r".yellow
|
364
|
+
GitLab.create_labels
|
365
|
+
sleep 2
|
366
|
+
system("git config --local alias.sflow '!sh -c \" sflow $1 $2 $3 $4\" - '")
|
367
|
+
print " \u{1F601}\ git sflow alias"
|
368
|
+
print " (instaled) \u{2714} ".green
|
369
|
+
print "\n\n"
|
370
|
+
print "git sflow help\n\n"
|
371
|
+
print "git sflow config\n\n"
|
372
|
+
print "GitSFlow installed with success!\n\n".green
|
373
|
+
# self.help_
|
374
|
+
# self.config_
|
375
|
+
|
376
|
+
end
|
377
|
+
|
378
|
+
|
379
|
+
def self.push_origin
|
380
|
+
branch = $PARAM1
|
381
|
+
log_messages = Git.log_last_changes branch
|
382
|
+
issue = GitLab::Issue.find_by_branch branch
|
383
|
+
Git.push branch
|
384
|
+
if (log_messages != "")
|
385
|
+
print "Send messages commit for issue\n".yellow
|
386
|
+
issue.add_comment(log_messages)
|
387
|
+
end
|
388
|
+
|
389
|
+
remove_labels = $GIT_BRANCHES_STAGING + ['Staging', $GITLAB_NEXT_RELEASE_LIST]
|
390
|
+
old_labels = issue.obj_gitlab["labels"]
|
391
|
+
old_labels.delete_if{|label| remove_labels.include? label}
|
392
|
+
|
393
|
+
issue.labels = old_labels + ['Doing']
|
394
|
+
issue.update
|
395
|
+
print "Success!\n\n".yellow
|
396
|
+
end
|
397
|
+
|
398
|
+
private
|
399
|
+
|
400
|
+
def self.config_
|
401
|
+
print "\n\---------- Configuration ---------- \n".light_blue
|
402
|
+
print "\nsflow config \nor\ngit sflow config \n\n".light_blue
|
403
|
+
|
404
|
+
print "\In your project create or update file .env with variables below:\n\n"
|
405
|
+
print "GITLAB_PROJECT_ID=\n".pink
|
406
|
+
print "GITLAB_TOKEN=\n".pink
|
407
|
+
print "GITLAB_URL_API=\n".pink
|
408
|
+
print "GITLAB_EMAIL=\n".pink
|
409
|
+
print "GITLAB_LISTS=To Do,Doing,Next Release,Staging\n".pink
|
410
|
+
print "GITLAB_NEXT_RELEASE_LIST=Next Release\n".pink
|
411
|
+
print "GIT_BRANCH_MASTER=master\n".pink
|
412
|
+
print "GIT_BRANCH_DEVELOP=develop\n".pink
|
413
|
+
print "GIT_BRANCHES_STAGING=staging_1,staging_2\n".pink
|
414
|
+
|
415
|
+
end
|
416
|
+
|
417
|
+
def self.set_error(e)
|
418
|
+
print "\n\n"
|
419
|
+
print "Error!".yellow.bg_red
|
420
|
+
print "\n"
|
421
|
+
print "#{e.message}".yellow.bg_red
|
422
|
+
print "\n\n"
|
423
|
+
print "#{e.backtrace}".yellow.bg_red
|
424
|
+
print "\n\n"
|
425
|
+
end
|
426
|
+
|
427
|
+
def self.validates
|
428
|
+
print "Running validations... \n\n".yellow
|
429
|
+
if !$GITLAB_PROJECT_ID || !$GITLAB_TOKEN || !$GITLAB_URL_API ||
|
430
|
+
!$GIT_BRANCH_MASTER || !$GIT_BRANCH_DEVELOP || !$GITLAB_LISTS || !$GITLAB_NEXT_RELEASE_LIST
|
431
|
+
print "Variables not configured\n".yellow
|
432
|
+
raise "Run `sflow config` for help"
|
433
|
+
end
|
434
|
+
|
435
|
+
if !$TYPE && !$ACTION
|
436
|
+
print "Command invalid!\n".yellow
|
437
|
+
raise "Run `sflow help` for help"
|
438
|
+
end
|
439
|
+
branchs_validations = $GIT_BRANCHES_STAGING + [$GIT_BRANCH_MASTER, $GIT_BRANCH_DEVELOP]
|
440
|
+
Git.exist_branch?(branchs_validations.join(' ')) rescue raise "You need to create branches #{branchs_validations.join(', ')}"
|
441
|
+
|
442
|
+
end
|
443
|
+
|
444
|
+
def self.help_
|
445
|
+
print "\n\n---------- Help ---------- \n".light_blue
|
446
|
+
print "\nsflow help\nor\ngit sflow help\n\n".light_blue
|
447
|
+
print "1 - git sflow feature start FEATURE DESCRIPTION \n".yellow
|
448
|
+
print "2 - git sflow feature [reintegration|finish] FEATURE_BRANCH\n".yellow
|
449
|
+
print "3 - git sflow feature codereview BRANCH\n".yellow
|
450
|
+
print "4 - git sflow feature staging SOURCE_BRANCH\n".yellow
|
451
|
+
print "5 - git sflow bugfix start BUGFIX DESCRIPTION\n".yellow
|
452
|
+
print "6 - git sflow bugfix [reintegration|finish] BUGFIX_BRANCH\n".yellow
|
453
|
+
print "7 - git sflow bugfix codereview BUGFIX_BRANCH\n".yellow
|
454
|
+
print "8 - git sflow bugfix staging BUGFIX_BRANCH\n".yellow
|
455
|
+
print "9 - git sflow hotfix start HOTFIX DESCRIPTION\n".yellow
|
456
|
+
print "10 - git sflow hotfix [reintegration|finish] HOTFIX_BRANCH\n".yellow
|
457
|
+
print "11 - git sflow release start RELEASE\n".yellow
|
458
|
+
print "12 - git sflow release finish RELEASE\n".yellow
|
459
|
+
print "13 - git sflow push origin BRANCH\n".yellow
|
460
|
+
|
461
|
+
choice = -1
|
462
|
+
question = "Choice a number for show a example or 0 for exit:\n\n".light_blue
|
463
|
+
print question
|
464
|
+
choice = STDIN.gets.chomp
|
465
|
+
print ""
|
466
|
+
case choice
|
467
|
+
when '1'
|
468
|
+
print "-> git sflow feature start Ticket#9999 'Ticket#9999 - Create new...'\n\n"
|
469
|
+
when '2'
|
470
|
+
print "-> git sflow feature reintegration 11-feature/Ticket#9999\n\n"
|
471
|
+
when '3'
|
472
|
+
print "-> git sflow feature codereview 11-feature/Ticket#9999\n\n"
|
473
|
+
when '4'
|
474
|
+
print "-> git sflow feature staging 11-feature/Ticket#9999\n\n"
|
475
|
+
when '5'
|
476
|
+
print "-> git sflow bugfix start Ticket#9999 'Ticket#9999 Bug ...'\n\n"
|
477
|
+
when '6'
|
478
|
+
print "-> git sflow bugfix finish 12-bugfix/Ticket#9999'\n\n"
|
479
|
+
when '7'
|
480
|
+
print "-> git sflow bugfix codereview 12-bugfix/Ticket#9999\n"
|
481
|
+
when '8'
|
482
|
+
print "-> git sflow bugfix staging 12-bugfix/Ticket#9999\n"
|
483
|
+
when '9'
|
484
|
+
print "-> git sflow hotfix start Ticket#9999 'Ticket#9999 Bug at production in...'\n\n"
|
485
|
+
when '10'
|
486
|
+
print "-> git sflow hotfix reintegration Ticket#9999'\n\n"
|
487
|
+
when '11'
|
488
|
+
print "-> git sflow release start v5.5.99'\n\n"
|
489
|
+
when '12'
|
490
|
+
print "-> git sflow release finish v5.5.99'\n\n"
|
491
|
+
when '13'
|
492
|
+
print "-> git sflow push BRANCH\n\n"
|
493
|
+
when '0'
|
494
|
+
else
|
495
|
+
end
|
496
|
+
print "See you soon!".green
|
497
|
+
print "\n\n"
|
498
|
+
|
499
|
+
|
500
|
+
end
|
501
|
+
|
502
|
+
def self.reintegration type = "feature"
|
503
|
+
# Git.fetch ref_branch
|
504
|
+
# Git.checkout ref_branch
|
505
|
+
# Git.pull ref_branch
|
506
|
+
source_branch = $PARAM1
|
507
|
+
issue = GitLab::Issue.find_by_branch(source_branch)
|
508
|
+
print "Title: #{issue.title}\n\n"
|
509
|
+
print "Changelog message:\n--> ".yellow
|
510
|
+
message_changelog = STDIN.gets.chomp
|
511
|
+
print "\n ok!\n\n".green
|
512
|
+
new_labels = []
|
513
|
+
if (type == 'hotfix')
|
514
|
+
!source_branch.match('hotfix') rescue raise "invalid branch!"
|
515
|
+
new_labels << 'hotfix'
|
516
|
+
new_labels << 'urgent'
|
517
|
+
else
|
518
|
+
(!source_branch.match('feature') && !source_branch.match('bugfix')) rescue raise "invalid branch!"
|
519
|
+
end
|
520
|
+
remove_labels = $GIT_BRANCHES_STAGING + $GITLAB_LISTS + ['Staging']
|
521
|
+
new_labels << 'changelog'
|
522
|
+
new_labels << $GITLAB_NEXT_RELEASE_LIST
|
523
|
+
old_labels = issue.obj_gitlab["labels"]
|
524
|
+
old_labels.delete_if{|label| remove_labels.include? label}
|
525
|
+
issue.labels = (old_labels + new_labels).uniq
|
526
|
+
issue.description.gsub!(/\* \~changelog .*\n?/,'')
|
527
|
+
issue.description = "#{issue.description} \n* ~changelog #{message_changelog}"
|
528
|
+
print "Setting changelog: ".yellow
|
529
|
+
print "#{message_changelog}\n".green
|
530
|
+
print "Moving issue to list: ".yellow
|
531
|
+
print "#{$GITLAB_NEXT_RELEASE_LIST}\n".green
|
532
|
+
issue.update
|
533
|
+
|
534
|
+
end
|
535
|
+
|
536
|
+
def self.start branch, issue, ref_branch = "develop"
|
537
|
+
Git.fetch ref_branch
|
538
|
+
Git.checkout ref_branch
|
539
|
+
Git.pull ref_branch
|
540
|
+
|
541
|
+
description = "* ~default_branch #{branch}"
|
542
|
+
|
543
|
+
issue.description = description
|
544
|
+
issue.update
|
545
|
+
|
546
|
+
Git.new_branch branch
|
547
|
+
Git.push branch
|
548
|
+
|
549
|
+
print "\nYou are on branch: #{branch}\n\n".yellow
|
550
|
+
end
|
551
|
+
|
552
|
+
def self.codereview
|
553
|
+
Git.fetch "develop"
|
554
|
+
Git.checkout "develop"
|
555
|
+
Git.pull "develop"
|
556
|
+
source_branch = $PARAM1
|
557
|
+
issue = GitLab::Issue.find_by_branch(source_branch)
|
558
|
+
# issue.move
|
559
|
+
mr = GitLab::MergeRequest.new(
|
560
|
+
source_branch: source_branch,
|
561
|
+
target_branch: 'develop',
|
562
|
+
issue_iid: issue.iid
|
563
|
+
)
|
564
|
+
mr.create_code_review
|
565
|
+
issue.labels = (issue.obj_gitlab["labels"] + ['code_review']).uniq
|
566
|
+
issue.update
|
567
|
+
end
|
568
|
+
end
|
569
|
+
|