gitsflow 0.6.3 → 0.8.2.alfa

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/lib/menu.rb ADDED
@@ -0,0 +1,253 @@
1
+ require 'sflow/sflow'
2
+ require 'Git/git'
3
+ require 'GitLab/gitlab'
4
+ require 'tty_integration'
5
+ class Menu
6
+ include TtyIntegration
7
+
8
+ def principal
9
+ prompt.say("\n")
10
+
11
+ result = prompt.select("\O que você gostaria de fazer?", symbols: { marker: '>' }, per_page: 10) do |menu|
12
+ menu.choice 'INICIAR uma nova BRANCH', :start_branch
13
+ menu.choice 'FINALIZAR uma BRANCH', :finish_branch
14
+ menu.choice 'ENVIAR para HOMOLOGAÇÃO', :staging_branch
15
+ menu.choice 'Fazer CODE REVIEW ', :codereview
16
+ menu.choice 'INICIAR uma RELEASE', :release_start
17
+ menu.choice 'FINALIZAR uma RELEASE', :release_finish
18
+ # menu.choice "MOVE a Issue", :staging_branch, disabled: '(Coming Soon)'
19
+ # menu.choice "List my Issues", :staging_branch, disabled: '(Coming Soon)'
20
+ menu.choice 'Configurar', :setup_variables
21
+ # menu.choice "Help", 5
22
+ menu.choice 'SAIR', :exit
23
+ end
24
+ send(result)
25
+ end
26
+
27
+ def setup_variables
28
+ system('clear')
29
+ project_name = Git.execute do
30
+ "git remote -v | head -n1 | awk '{print $2}' | sed -e 's,.*:\(.*/\)\?,,' -e 's/\.git$//'"
31
+ end
32
+ file = "#{Dir.home}/.config/gitsflow/#{project_name.gsub("\n", '')}/config.yml"
33
+ config = TTY::Config.new
34
+ config.filename = file
35
+ prompt.say("\n")
36
+ box = TTY::Box.frame align: :left, width: TTY::Screen.width, height: 15,
37
+ title: { top_left: pastel.green('Olá, seja bem-vindo!') } do
38
+ pastel.green("\nVamos configurar o GitSFlow agora.\n\n") +
39
+ pastel.white("Essa informação será salva dentro da pasta home do seu usuário. Você não precisará mais do .env
40
+ \nSe você desejar apenas ver as configurações, tecle enter até o final ou acesse o conteudo do arquivo: #{file}\nEssa informação será salva dentro da pasta home do seu usuário. Você não precisará mais do .env")
41
+ end
42
+ print box
43
+ prompt.say(pastel.cyan('Agora, entre com as informações de configuração do projeto.'))
44
+ begin
45
+ result_env = config.read(file).transform_keys(&:to_sym)
46
+ result = prompt.collect do
47
+ key(:GITLAB_PROJECT_ID).ask('GITLAB_PROJECT_ID:', required: true, default: result_env[:GITLAB_PROJECT_ID])
48
+ key(:GITLAB_TOKEN).mask('GITLAB_TOKEN:', required: true, echo: true, default: result_env[:GITLAB_TOKEN])
49
+ key(:GITLAB_URL_API).ask('GITLAB_URL_API:', required: true, default: result_env[:GITLAB_URL_API] || 'https://gitlab.com/api/v4')
50
+ key(:GITLAB_EMAIL).ask('GITLAB_EMAIL:', required: true, default: result_env[:GITLAB_EMAIL]) do |q|
51
+ q.validate(/[^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n]+/, 'Invalid email address')
52
+ end
53
+ key(:GITLAB_LISTS).ask('GITLAB_LISTS:', required: true,
54
+ default: result_env[:GITLAB_LISTS] || 'To Do,Doing,Next Release,Staging')
55
+ key(:GITLAB_NEXT_RELEASE_LIST).ask('GITLAB_NEXT_RELEASE_LIST:', required: true,
56
+ default: result_env[:GITLAB_NEXT_RELEASE_LIST] || 'Next Release')
57
+ key(:GIT_BRANCH_MASTER).ask('GIT_BRANCH_MASTER:', required: true,
58
+ default: result_env[:GIT_BRANCH_MASTER] || 'master')
59
+ key(:GIT_BRANCH_DEVELOP).ask('GIT_BRANCH_DEVELOP:', required: true,
60
+ default: result_env[:GIT_BRANCH_DEVELOP] || 'developer')
61
+ key(:GIT_BRANCHES_STAGING).ask('GIT_BRANCHES_STAGING:', required: true,
62
+ default: result_env[:GIT_BRANCHES_STAGING] || 'staging')
63
+ key(:SFLOW_TEMPLATE_RELEASE).ask('SFLOW_TEMPLATE_RELEASE:', required: true,
64
+ default: result_env[:SFLOW_TEMPLATE_RELEASE] || 'Version {version} - {date}')
65
+ key(:SFLOW_TEMPLATE_RELEASE_DATE_FORMAT).ask('SFLOW_TEMPLATE_RELEASE_DATE_FORMAT:', required: true,
66
+ default: result_env['SFLOW_TEMPLATE_RELEASE_DATE_FORMAT'] || 'Y/m/d')
67
+ end
68
+ rescue TTY::Config::ReadError => e
69
+ prompt.say(pastel.cyan("\n\nPor favor configure as variáveis .env"))
70
+ result = prompt.collect do
71
+ key(:GITLAB_PROJECT_ID).ask('GITLAB_PROJECT_ID:', required: true, default: ENV['GITLAB_PROJECT_ID'])
72
+ key(:GITLAB_TOKEN).mask('GITLAB_TOKEN:', required: true, echo: true, default: ENV['GITLAB_TOKEN'])
73
+ key(:GITLAB_URL_API).ask('GITLAB_URL_API:', required: true, default: ENV['GITLAB_URL_API'] || 'https://gitlab.com/api/v4')
74
+ key(:GITLAB_EMAIL).ask('GITLAB_EMAIL:', required: true, default: ENV['GITLAB_EMAIL']) do |q|
75
+ q.validate(/[^@ \t\r\n]+@[^@ \t\r\n]+\.[^@ \t\r\n]+/, 'Invalid email address')
76
+ end
77
+ key(:GITLAB_LISTS).ask('GITLAB_LISTS:', required: true,
78
+ default: ENV['GITLAB_LISTS'] || 'To Do,Doing,Staging,Next Release')
79
+ key(:GITLAB_NEXT_RELEASE_LIST).ask('GITLAB_NEXT_RELEASE_LIST:', required: true,
80
+ default: ENV['GITLAB_NEXT_RELEASE_LIST'] || 'Next Release')
81
+ key(:GIT_BRANCH_MASTER).ask('GIT_BRANCH_MASTER:', required: true, default: ENV['GIT_BRANCH_MASTER'] || 'master')
82
+ key(:GIT_BRANCH_DEVELOP).ask('GIT_BRANCH_DEVELOP:', required: true,
83
+ default: ENV['GIT_BRANCH_DEVELOP'] || 'developer')
84
+ key(:GIT_BRANCHES_STAGING).ask('GIT_BRANCHES_STAGING:', required: true,
85
+ default: ENV['GIT_BRANCHES_STAGING'] || 'staging')
86
+ key(:SFLOW_TEMPLATE_RELEASE).ask('SFLOW_TEMPLATE_RELEASE:', required: true,
87
+ default: ENV['SFLOW_TEMPLATE_RELEASE'] || 'Version {version} - {date}')
88
+ key(:SFLOW_TEMPLATE_RELEASE_DATE_FORMAT).ask('SFLOW_TEMPLATE_RELEASE_DATE_FORMAT:', required: true,
89
+ default: ENV['SFLOW_TEMPLATE_RELEASE_DATE_FORMAT'] || 'Y/m/d')
90
+ end
91
+ config.set(:GITLAB_PROJECT_ID, value: result[:GITLAB_PROJECT_ID])
92
+ config.set(:GITLAB_TOKEN, value: result[:GITLAB_TOKEN])
93
+ config.set(:GITLAB_URL_API, value: result[:GITLAB_URL_API])
94
+ config.set(:GITLAB_EMAIL, value: result[:GITLAB_EMAIL])
95
+ config.set(:GITLAB_LISTS, value: result[:GITLAB_LISTS])
96
+ config.set(:GITLAB_NEXT_RELEASE_LIST, value: result[:GITLAB_NEXT_RELEASE_LIST])
97
+ config.set(:GIT_BRANCH_MASTER, value: result[:GIT_BRANCH_MASTER])
98
+ config.set(:GIT_BRANCH_DEVELOP, value: result[:GIT_BRANCH_DEVELOP])
99
+ config.set(:GIT_BRANCHES_STAGING, value: result[:GIT_BRANCHES_STAGING])
100
+ config.set(:SFLOW_TEMPLATE_RELEASE, value: result[:SFLOW_TEMPLATE_RELEASE])
101
+ config.set(:SFLOW_TEMPLATE_RELEASE_DATE_FORMAT, value: result[:SFLOW_TEMPLATE_RELEASE_DATE_FORMAT])
102
+ config.write(file, force: true, create: true)
103
+ end
104
+
105
+ prompt.say(pastel.cyan("\n"))
106
+ prompt.say(pastel.cyan(file.gsub(Dir.home, '~')))
107
+ prompt.say(pastel.cyan("\n\n"))
108
+
109
+ $GITLAB_PROJECT_ID = result[:GITLAB_PROJECT_ID]
110
+ $GITLAB_TOKEN = result[:GITLAB_TOKEN]
111
+ $GITLAB_URL_API = result[:GITLAB_URL_API]
112
+ $GITLAB_EMAIL = result[:GITLAB_EMAIL]
113
+ $GITLAB_LISTS = result[:GITLAB_LISTS].split(',')
114
+ $GITLAB_NEXT_RELEASE_LIST = result[:GITLAB_NEXT_RELEASE_LIST]
115
+ $GIT_BRANCH_MASTER = result[:GIT_BRANCH_MASTER]
116
+ $GIT_BRANCH_DEVELOP = result[:GIT_BRANCH_DEVELOP]
117
+ $GIT_BRANCHES_STAGING = result[:GIT_BRANCHES_STAGING].split(',')
118
+ $SFLOW_TEMPLATE_RELEASE = result[:SFLOW_TEMPLATE_RELEASE]
119
+ $SFLOW_TEMPLATE_RELEASE_DATE_FORMAT = result[:SFLOW_TEMPLATE_RELEASE_DATE_FORMAT]
120
+
121
+ GitLab.create_labels
122
+ GitLab.create_board_lists
123
+
124
+ success('GitSFlow coonfigurado com sucesso!')
125
+
126
+ principal if prompt.yes?('Vocẽ gostaria de voltar ao menu principal?')
127
+ prompt.say(pastel.cyan('Até logo!'))
128
+ end
129
+
130
+ private
131
+
132
+ def codereview
133
+ result = choice_branch('codereview')
134
+ SFlow::SFlow.send(:codereview, result[:branch_name])
135
+ end
136
+
137
+ def release_start
138
+ SFlow::SFlow.send(:release_start)
139
+ end
140
+
141
+ def release_finish
142
+ result = choice_branch_release
143
+
144
+ SFlow::SFlow.send(:release_finish, result[:branch_name])
145
+ end
146
+
147
+ def exit
148
+ 0
149
+ end
150
+
151
+ def staging_branch
152
+ result = choice_branch('staging')
153
+ SFlow::SFlow.send(result[:action], result[:branch_name])
154
+ end
155
+
156
+ def finish_branch
157
+ result = choice_branch('finish')
158
+ SFlow::SFlow.send(result[:action], result[:branch_name])
159
+ end
160
+
161
+ def start_branch
162
+ action = prompt.select('Selecione o tipo de Branch:', symbols: { marker: '>' }) do |menu|
163
+ menu.choice 'Feature', :feature_start
164
+ menu.choice 'Bugfix', :bugfix_start
165
+ menu.choice 'Hotfix', :hotfix_start
166
+ end
167
+ parent_branch_name = nil
168
+ if prompt.yes? 'Essa branch possui alguma branch pai ou epic?'
169
+
170
+ # branchs_list = Git.execute { "git branch -r --format='%(refname)' --sort=-committerdate" }
171
+ branchs_list = Git.execute { "git ls-remote --heads --refs | awk '{print $2}'" }
172
+ branchs_list = branchs_list.gsub('refs/heads/',
173
+ '').split("\n") - ($GIT_BRANCHES_STAGING + [$GIT_BRANCH_MASTER,
174
+ $GIT_BRANCH_DEVELOP])
175
+ branchs_list.unshift('Não encontrei na lista, quero criar uma nova branch')
176
+ parent_branch_name = prompt.select('Selecione a Branch PAI:', branchs_list, symbols: { marker: '>' },
177
+ filter: true)
178
+ if parent_branch_name == 'Não encontrei na lista, quero criar uma nova branch'
179
+
180
+ prompt.say("\n")
181
+ prompt.say(pastel.cyan("Ok, vamos seguir com o cadastro da branch Pai\n"))
182
+ result_parent_branch = prompt.collect do
183
+ key(:parent_external_id_ref).ask(
184
+ 'Digite o código de identificação da Branch Pai, EX: [JiraIssueKey, TicketOtrsID]:', required: true
185
+ )
186
+ key(:parent_branch_description).ask('Descrição da branch Pai:', required: false)
187
+ end
188
+ parent_issue = SFlow::SFlow.send(action, result_parent_branch[:parent_external_id_ref].strip,
189
+ result_parent_branch[:parent_branch_description].strip)
190
+ parent_branch_name = parent_issue.description.strip.gsub('* ~default_branch ', '')
191
+ end
192
+ end
193
+ prompt.say("\n")
194
+ prompt.say(pastel.cyan("Agora, entre com as informações da branch de trabalho \n"))
195
+
196
+ result = prompt.collect do
197
+ key(:external_id_ref).ask('Digite o código de identificação da Branch, EX: [JiraIssueKey, TicketOtrsID]:',
198
+ required: true)
199
+ key(:branch_description).ask('Descrição da branch:', required: true)
200
+ end
201
+
202
+ SFlow::SFlow.send(action, result[:external_id_ref].strip, result[:branch_description].strip, parent_branch_name)
203
+ end
204
+
205
+ def choice_branch_release
206
+ branchs_list = Git.execute { "git ls-remote --heads --refs | awk '{print $2}' | grep release" }
207
+ branchs_list = branchs_list.gsub('refs/heads/',
208
+ '').split("\n") - ($GIT_BRANCHES_STAGING + [$GIT_BRANCH_MASTER,
209
+ $GIT_BRANCH_DEVELOP])
210
+ branch_name = prompt.select('Selecione a Branch:', branchs_list, symbols: { marker: '>' }, filter: true)
211
+ {
212
+ branch_name: branch_name.delete("\n")
213
+ }
214
+ end
215
+
216
+ def choice_branch(type)
217
+ action = ''
218
+ current_branch = Git.execute { 'git branch --show-current' }
219
+ branch_origin = prompt.select('Confirme a branch:', symbols: { marker: '>' }) do |menu|
220
+ menu.choice "#{current_branch}(Atual)", :current
221
+ menu.choice 'Outra', :other_branch
222
+ end
223
+
224
+ case branch_origin
225
+ when :current
226
+ if current_branch.match(%r{-feature/})
227
+ action = "feature_#{type}"
228
+ elsif current_branch.match(%r{-bugfix/})
229
+ action = "bugfix_#{type}"
230
+ elsif current_branch.match(%r{-hotfix/})
231
+ action = "hotfix_#{type}"
232
+ end
233
+ branch_name = current_branch.delete("\n")
234
+ when :other_branch
235
+ branchs_list = Git.execute { "git ls-remote --heads --refs | awk '{print $2}'" }
236
+ branchs_list = branchs_list.gsub('refs/heads/',
237
+ '').split("\n") - ($GIT_BRANCHES_STAGING + [$GIT_BRANCH_MASTER,
238
+ $GIT_BRANCH_DEVELOP])
239
+ branch_name = prompt.select('Selecione a Branch:', branchs_list, symbols: { marker: '>' }, filter: true)
240
+ if branch_name.match(%r{-feature/})
241
+ action = "feature_#{type}"
242
+ elsif branch_name.match(%r{-bugfix/})
243
+ action = "bugfix_#{type}"
244
+ elsif branch_name.match(%r{-hotfix/})
245
+ action = "hotfix_#{type}"
246
+ end
247
+ end
248
+ {
249
+ action: action,
250
+ branch_name: branch_name.delete("\n")
251
+ }
252
+ end
253
+ end