prima-twig 1.3.12 → 1.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ee850d8f1758403046d477cc4ce10bdaf51db7e918368167897844e11357916d
4
- data.tar.gz: 8f1ce14ef9d4bc84b3a6e030b5c35fae07f67b8f5fc2a20279c3fe28585c1abc
3
+ metadata.gz: 36b2647c0d787e05e4726384e7d903655414b2322e32c7128b5b5563a1f9998b
4
+ data.tar.gz: 38e784f34f9c5f31ff38fec6122b470790d2bd4fd951654bb4bf94bd59c89afd
5
5
  SHA512:
6
- metadata.gz: 4dc31461b061808a1aca8de021d2a0fc2a968e3e3b9ff3fdb424958e7a51bbc176949ce0747ad8a4572f1379b64c463d0f6d6e010551ff0de77d59857c6c5a57
7
- data.tar.gz: 9c059713c0f9d2041483d7fce7ba0d203a6df731569efd3ba00a9f291e1c2f20aeab89f5ca58b042c7b089604b3049d8fd7f862c8c2b79c2038f3ad2ed75daf7
6
+ metadata.gz: 2a9ab6426078797290b15720588a2c9e4414ac27d0039b898d27595fb01e87d5364d7cca364b140573f7b6bb368e591486c05f5204fe846033fa20deaf5a398b
7
+ data.tar.gz: b7a763e003c0eb3f894f94cb518ec0b6a863cc30badbce30178542c6268555c1f2f9d6cc1d5fad66609078183f5996357f317865ce82d9e0753b8149348babf8
data/lib/command.rb CHANGED
@@ -3,17 +3,6 @@ require 'English'
3
3
  require 'optparse'
4
4
 
5
5
  module Command
6
- # executes command and exits if status != 0
7
- def exec_step(command, output = nil)
8
- if output
9
- puts output
10
- else
11
- puts 'exec > '.green + command.to_s.yellow
12
- end
13
- `#{command}`
14
- exit($CHILD_STATUS.exitstatus) unless $CHILD_STATUS.exitstatus.zero?
15
- end
16
-
17
6
  def output(msg)
18
7
  puts 'twig binaries > '.black + msg
19
8
  end
@@ -58,10 +47,6 @@ module Command
58
47
  end
59
48
  end
60
49
 
61
- def stop_unless(check, msg, command = '')
62
- stop_if !check, msg, command
63
- end
64
-
65
50
  # executes command and returns properly colored output
66
51
  def execute_command(cmd)
67
52
  output "Executing #{cmd}".yellow
@@ -1,17 +1,7 @@
1
1
  require 'aws-sdk-autoscaling'
2
- require 'aws-sdk-batch'
3
2
  require 'aws-sdk-cloudformation'
4
- require 'aws-sdk-cloudfront'
5
- require 'aws-sdk-ec2'
6
- require 'aws-sdk-ecs'
7
- require 'aws-sdk-elasticloadbalancingv2'
8
- require 'aws-sdk-s3'
9
3
  require 'colorize'
10
4
  module PrimaAwsClient
11
- def s3_client
12
- @s3 ||= Aws::S3::Client.new
13
- end
14
-
15
5
  def cf_client
16
6
  @cf ||= Aws::CloudFormation::Client.new
17
7
  end
@@ -20,64 +10,6 @@ module PrimaAwsClient
20
10
  @asg ||= Aws::AutoScaling::Client.new
21
11
  end
22
12
 
23
- def ec2_client
24
- @ec2 ||= Aws::EC2::Client.new
25
- end
26
-
27
- def alb_client
28
- @alb ||= Aws::ElasticLoadBalancingV2::Client.new
29
- end
30
-
31
- def ecs_client
32
- @ecs ||= Aws::ECS::Client.new
33
- end
34
-
35
- def stack_list
36
- stacks = []
37
- next_token = ''
38
- loop do
39
- print '.'.yellow; STDOUT.flush
40
- options = next_token != '' ? { next_token: next_token } : {}
41
- begin
42
- resp = cf_client.describe_stacks(options)
43
- rescue Aws::CloudFormation::Errors::Throttling => e
44
- output 'Throttling, retrying in 15 seconds'.red
45
- sleep 15
46
- resp = cf_client.describe_stacks(options)
47
- end
48
- stacks += resp.stacks
49
- break unless resp.next_token
50
-
51
- next_token = resp.next_token
52
- end
53
- puts '.'.yellow; STDOUT.flush
54
- stacks.keep_if { |stack| stack.stack_name.include? '-qa-' }
55
- stacks
56
- end
57
-
58
- def cluster_list
59
- stacks = []
60
- next_token = ''
61
- loop do
62
- print '.'.yellow; STDOUT.flush
63
- options = next_token != '' ? { next_token: next_token } : {}
64
- begin
65
- resp = cf_client.describe_stacks(options)
66
- rescue Aws::CloudFormation::Errors::Throttling => e
67
- output 'Throttling, retrying in 15 seconds'.red
68
- sleep 15
69
- resp = cf_client.describe_stacks(options)
70
- end
71
- stacks += resp.stacks
72
- break unless resp.next_token
73
-
74
- next_token = resp.next_token
75
- end
76
- puts '.'.yellow; STDOUT.flush
77
- stacks.keep_if { |stack| stack.stack_name.include? 'ecs-cluster-qa-' }
78
- stacks
79
- end
80
-
81
13
  def list_exports
82
14
  exports = []
83
15
  next_token = ''
@@ -100,29 +32,6 @@ module PrimaAwsClient
100
32
  exports
101
33
  end
102
34
 
103
- def create_stack(stack_name, stack_body, parameters = [], tags = [], role = nil)
104
- cf_args = {
105
- stack_name: stack_name,
106
- template_body: stack_body,
107
- parameters: parameters,
108
- tags: tags,
109
- capabilities: ['CAPABILITY_IAM'],
110
- on_failure: 'ROLLBACK'
111
- }
112
-
113
- cf_args.merge!(role_arn: role) unless role.nil?
114
-
115
- begin
116
- cf_client.create_stack(cf_args)
117
- rescue Aws::CloudFormation::Errors::Throttling, Aws::CloudFormation::Errors::LimitExcedeedException => e
118
- output 'Throttling, retrying in 15 seconds'.red
119
- sleep 15
120
- create_stack(stack_name, stack_body, parameters = [], tags = [])
121
- else
122
- output "CloudFormation stack #{stack_name} creation started".green
123
- end
124
- end
125
-
126
35
  def update_stack(stack_name, template_body, parameters = [], tags = [], role = nil)
127
36
  cf_args = {
128
37
  stack_name: stack_name,
@@ -147,30 +56,6 @@ module PrimaAwsClient
147
56
  end
148
57
  end
149
58
 
150
- def update_stack_url(stack_name, template_url, parameters = [], tags = [], role = nil)
151
- cf_args = {
152
- stack_name: stack_name,
153
- template_url: template_url,
154
- parameters: parameters,
155
- tags: tags,
156
- capabilities: ['CAPABILITY_IAM']
157
- }
158
-
159
- cf_args.merge!(role_arn: role) unless role.nil?
160
-
161
- begin
162
- cf_client.update_stack(cf_args)
163
- rescue Aws::CloudFormation::Errors::Throttling => e
164
- output 'Throttling, retrying in 15 seconds'.red
165
- sleep 15
166
- update_stack_url(stack_name, template_url, parameters = [], tags = [])
167
- rescue Aws::CloudFormation::Errors::ValidationError => e
168
- raise e
169
- else
170
- output "CloudFormation stack #{stack_name} update started".green
171
- end
172
- end
173
-
174
59
  def update_stack_reuse_template(stack_name, parameters = [], tags = [], role = nil)
175
60
  cf_args = {
176
61
  stack_name: stack_name,
@@ -195,30 +80,6 @@ module PrimaAwsClient
195
80
  end
196
81
  end
197
82
 
198
- def stack_exists?(stack_name)
199
- cf_client.describe_stacks(stack_name: stack_name)
200
- rescue Aws::CloudFormation::Errors::Throttling => e
201
- output 'Throttling, retrying in 15 seconds'.red
202
- sleep 15
203
- stack_exists?(stack_name)
204
- rescue Aws::CloudFormation::Errors::ValidationError => e
205
- return false if e.message.include? 'does not exist'
206
-
207
- raise e
208
- else
209
- true
210
- end
211
-
212
- def delete_stack(stack_name)
213
- cf_client.delete_stack(stack_name: stack_name)
214
- rescue Aws::CloudFormation::Errors::Throttling => e
215
- output 'Throttling, retrying in 15 seconds'.red
216
- sleep 15
217
- delete_stack(stack_name)
218
- else
219
- output "Stack #{stack_name} shutdown succesfully\n".green
220
- end
221
-
222
83
  def wait_for_stack_ready(stack_name, failed_statuses = %w[CREATE_FAILED ROLLBACK_IN_PROGRESS ROLLBACK_FAILED DELETE_IN_PROGRESS DELETE_FAILED DELETE_COMPLETE UPDATE_ROLLBACK_FAILED UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS])
223
84
  ready = false
224
85
  sleep_seconds = 13
@@ -237,35 +98,6 @@ module PrimaAwsClient
237
98
  output "\nStack #{stack_name} ready!\n".green
238
99
  end
239
100
 
240
- def wait_for_stack_removal(stack_name)
241
- ready = false
242
- sleep_seconds = 13
243
- sleep 10
244
- output "Waiting for stack #{stack_name}...\n".yellow
245
- until ready
246
- ready = true if stack_deleted?(stack_name)
247
- seconds_elapsed = 0
248
- loop do
249
- break if seconds_elapsed >= sleep_seconds
250
-
251
- print '.'.yellow; STDOUT.flush
252
- sleep 1
253
- seconds_elapsed += 1
254
- end
255
- end
256
- output "\nStack #{stack_name} eliminato!\n".green
257
- end
258
-
259
- def get_stack_tags(name)
260
- resp = cf_client.describe_stacks(stack_name: name)
261
- rescue Aws::CloudFormation::Errors::Throttling => e
262
- output 'Throttling, retrying in 15 seconds'.red
263
- sleep 15
264
- get_stack_tags(name)
265
- else
266
- resp.stacks[0].tags
267
- end
268
-
269
101
  def get_stack_parameters(name)
270
102
  resp = cf_client.describe_stacks(stack_name: name)
271
103
  rescue Aws::CloudFormation::Errors::Throttling => e
@@ -286,16 +118,6 @@ module PrimaAwsClient
286
118
  resp.stacks[0].outputs
287
119
  end
288
120
 
289
- def get_stack_template(name)
290
- resp = cf_client.get_template(stack_name: name)
291
- rescue Aws::CloudFormation::Errors::Throttling => e
292
- output 'Throttling, retrying in 15 seconds'.red
293
- sleep 15
294
- get_stack_template(name)
295
- else
296
- resp.template_body
297
- end
298
-
299
121
  def stack_ready?(stack_name, failed_statuses = %w[CREATE_FAILED ROLLBACK_IN_PROGRESS ROLLBACK_FAILED DELETE_IN_PROGRESS DELETE_FAILED DELETE_COMPLETE UPDATE_ROLLBACK_FAILED UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS])
300
122
  begin
301
123
  resp = cf_client.describe_stacks(
@@ -311,105 +133,6 @@ module PrimaAwsClient
311
133
  %w[CREATE_COMPLETE UPDATE_COMPLETE UPDATE_ROLLBACK_COMPLETE ROLLBACK_COMPLETE].include? stack_status
312
134
  end
313
135
 
314
- def stack_deleted?(stack_name, failed_statuses = %w[ROLLBACK_IN_PROGRESS ROLLBACK_FAILED DELETE_FAILED UPDATE_ROLLBACK_FAILED UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS])
315
- begin
316
- resp = cf_client.describe_stacks(
317
- stack_name: stack_name
318
- )
319
- stack_status = resp.stacks[0].stack_status
320
- rescue Aws::CloudFormation::Errors::Throttling => e
321
- print 'Throttling'.red; STDOUT.flush
322
- return false
323
- rescue Aws::CloudFormation::Errors::ValidationError => e
324
- print 'Stack deleted'
325
- return true
326
- end
327
- raise "The stack #{stack_name} errored out" if failed_statuses.include? stack_status
328
-
329
- ['DELETE_COMPLETE'].include? stack_status
330
- end
331
-
332
- def artifact_exists?(bucket, path)
333
- resp = s3_client.list_objects(
334
- bucket: bucket,
335
- max_keys: 1,
336
- prefix: path
337
- )
338
- !resp.contents.empty?
339
- end
340
-
341
- def upload_artifact(source_path, destination_path, bucket_name_override = nil)
342
- output "Uploading artifact (#{(File.size(source_path).to_f / 2**20).round(2)} MiB)\n".yellow
343
- s3 = Aws::S3::Resource.new
344
- s3_bucket = !bucket_name_override.nil? ? bucket_name_override : @s3_bucket
345
- puts s3_bucket
346
- obj = s3.bucket(s3_bucket).object(destination_path)
347
- obj.upload_file(source_path)
348
-
349
- output "#{s3_bucket}/#{destination_path} upload success!\n".green
350
- end
351
-
352
- def wait_for_artifact(bucket, path)
353
- ready = artifact_exists?(bucket, path)
354
- sleep_seconds = 13
355
- output "Wating that artifact #{path} becomes ready...\n".yellow
356
- retries = 0
357
- until ready
358
- ready = true if artifact_exists?(bucket, path)
359
- seconds_elapsed = 0
360
- loop do
361
- break if seconds_elapsed >= sleep_seconds
362
-
363
- print '.'.yellow; STDOUT.flush
364
- sleep 1
365
- seconds_elapsed += 1
366
- end
367
- retries += 1
368
- if retries > 150
369
- output "\n Artifact #{path} timed out\n".red
370
- exit
371
- end
372
- end
373
- output "\nArtifact #{path} created!\n".green
374
- end
375
-
376
- def list_import_stacks(export_name)
377
- stacks = []
378
- next_token = ''
379
- loop do
380
- print '.'.yellow; STDOUT.flush
381
- options = next_token != '' ? { export_name: export_name, next_token: next_token } : { export_name: export_name }
382
- begin
383
- resp = cf_client.list_imports(options)
384
- rescue Aws::CloudFormation::Errors::Throttling => e
385
- output 'Throttling, retrying in 15 seconds'.red
386
- sleep 15
387
- resp = cf_client.list_imports(options)
388
- end
389
- stacks += resp.imports
390
- break unless resp.next_token
391
-
392
- next_token = resp.next_token
393
- end
394
- stacks
395
- end
396
-
397
- def describe_stack_resource(cluster_stack_name, logical_resource_id)
398
- resp = cf_client.describe_stack_resource({ stack_name: cluster_stack_name, logical_resource_id: logical_resource_id })
399
- rescue Aws::CloudFormation::Errors::Throttling => e
400
- output 'Throttling, retrying in 15 seconds'.red
401
- sleep 15
402
- resp = describe_stack_resource(cluster_stack_name, logical_resource_id)
403
- end
404
-
405
- def describe_instances(instance_ids)
406
- resp = ec2_client.describe_instances({ instance_ids: instance_ids })
407
- rescue Aws::CloudFormation::Errors::Throttling => e
408
- output 'Throttling, retrying in 15 seconds'.red
409
- sleep 15
410
- resp = describe_instances(instance_ids)
411
- end
412
-
413
136
  def describe_auto_scaling_groups(auto_scaling_group_names, max_records)
414
137
  resp = asg_client.describe_auto_scaling_groups({
415
138
  auto_scaling_group_names: auto_scaling_group_names,
@@ -421,57 +144,8 @@ module PrimaAwsClient
421
144
  resp = describe_auto_scaling_groups(auto_scaling_group_names, max_records)
422
145
  end
423
146
 
424
- def describe_load_balancers(load_balancer_arns)
425
- resp = alb_client.describe_load_balancers({ load_balancer_arns: load_balancer_arns })
426
- rescue Aws::ElasticLoadBalancingV2::Errors::Throttling => e
427
- output 'Throttling, retrying in 15 seconds'.red
428
- sleep 15
429
- resp = describe_load_balancers(load_balancer_arns)
430
- end
431
-
432
- def update_ecs_service(cluster, service, deployment_configuration)
433
- resp = ecs_client.update_service(
434
- cluster: cluster,
435
- service: service,
436
- deployment_configuration: deployment_configuration
437
- )
438
- rescue Aws::CloudFormation::Errors::Throttling => e
439
- output 'Throttling, retrying in 15 seconds'.red
440
- sleep 15
441
- resp = update_ecs_service(cluster, service, deployment_configuration)
442
- end
443
-
444
- def describe_ecs_tasks(cluster, tasks)
445
- resp = ecs_client.describe_tasks({
446
- cluster: cluster,
447
- tasks: tasks
448
- })
449
- rescue Aws::CloudFormation::Errors::Throttling => e
450
- output 'Throttling, retrying in 15 seconds'.red
451
- sleep 15
452
- resp = describe_ecs_tasks(cluster, tasks)
453
- end
454
-
455
- def run_ecs_task(cluster, task_definition, overrides, count)
456
- resp = ecs_client.run_task({
457
- cluster: cluster,
458
- task_definition: task_definition,
459
- overrides: overrides,
460
- count: count
461
- })
462
- rescue Aws::CloudFormation::Errors::Throttling => e
463
- output 'Throttling, retrying in 15 seconds'.red
464
- sleep 15
465
- resp = run_ecs_task(cluster, task_definition, overrides, count)
466
- end
467
-
468
147
  def get_autoscaling_capacity(asg_name)
469
148
  resp = asg_client.describe_auto_scaling_groups(auto_scaling_group_names: [asg_name])
470
149
  resp.auto_scaling_groups[0].desired_capacity
471
150
  end
472
-
473
- def get_spotfleet_capacity(fleet_arn)
474
- resp = ec2_client.describe_spot_fleet_requests(spot_fleet_request_ids: [fleet_arn])
475
- resp.spot_fleet_request_configs[0].spot_fleet_request_config.target_capacity
476
- end
477
151
  end
data/lib/prima_twig.rb CHANGED
@@ -1,288 +1,26 @@
1
1
  require_relative 'command.rb'
2
2
  require 'twig'
3
- require 'octokit'
4
- require 'yaml'
5
3
  require 'rugged'
6
4
  require 'highline/import'
7
5
  require 'aws-sdk-core'
8
- require 'rubyflare'
9
6
 
10
7
  class Prima
11
- CONFIG_KEYS=['github', 'cloudflare_email', 'cloudflare_apikey']
12
- attr_reader :gh, :twig, :config, :rugged
8
+ attr_reader :twig, :rugged
13
9
 
14
10
  def initialize
15
11
  @twig = Twig.new(:read_options => true, :max_days_old => 30)
16
- unless has_config?
17
- if File.exist?('../prima/twig.yml')
18
- `cp ../prima/twig.yml .`
19
- elsif File.exist?('/tmp/twig.yml')
20
- `cp /tmp/twig.yml .`
21
- else
22
- generate_config
23
- end
24
- if File.exist?('./projects/prima')
25
- `git submodule init && git submodule update`
26
- end
27
- end
28
- unless has_latest_config?
29
- update_config
30
- end
31
- @config = YAML.load_file 'twig.yml'
32
12
  @rugged = Rugged::Repository.new('.')
33
13
  create_clients
34
14
  end
35
15
 
36
- def has_config?
37
- File.exist? 'twig.yml'
38
- end
39
-
40
- def has_latest_config?
41
- existing_config = YAML.load_file 'twig.yml'
42
- CONFIG_KEYS.each do |k|
43
- unless existing_config.has_key? k
44
- return false
45
- end
46
- end
47
- end
48
-
49
- def generate_config
50
- puts 'Progetto non inizializzato'.red
51
- puts 'Creazione del file di configurazione'.yellow
52
- conf = {}
53
- CONFIG_KEYS.each do |k|
54
- token = ask "#{k} token: "
55
- conf[k] = token
56
- end
57
- write_config conf
58
- end
59
-
60
- def update_config
61
- puts 'Mancano alcuni parametri nella tua configurazione'.yellow
62
- existing_config = YAML.load_file 'twig.yml'
63
- CONFIG_KEYS.each do |k|
64
- unless existing_config.has_key? k
65
- token = ask "#{k} token: "
66
- existing_config[k] = token
67
- end
68
- end
69
- write_config existing_config
70
- end
71
-
72
- def write_config(conf = {})
73
- File.open('twig.yml', 'w') { |file|
74
- file.write conf.to_yaml
75
- puts 'File di configurazione aggiornato'.green
76
- }
77
- end
78
-
79
16
  def create_clients
80
- @gh = Octokit::Client.new(:access_token => @config['github'])
81
17
  Aws.config.update({
82
18
  region: 'eu-west-1'
83
19
  })
84
20
  end
85
21
 
86
- def disabled_branches
87
- %w(master dev)
88
- end
89
-
90
- def deployable_branches
91
- %w(dev)
92
- end
93
-
94
- def is_a_valid_branch?
95
- not disabled_branches.include? current_branch_name
96
- end
97
-
98
- def is_a_deployable_branch?
99
- deployable_branches.include? current_branch_name
100
- end
101
-
102
- def index_diff
103
- @rugged.index.diff
104
- end
105
-
106
- def is_clean?
107
- index_diff.count === 0
108
- end
109
-
110
- def repo_name
111
- `git config --get remote.origin.url`.split(':').last.chomp.chomp('.git')
112
- end
113
-
114
- def repo_user
115
- repo_url.chomp.split(':').last.split('/').first
116
- end
117
-
118
- def current_branch_ref
119
- repo = repo_user
120
- "#{repo}:#{current_branch_name}"
121
- end
122
-
123
- def clean_branch_name(branch_name)
124
- branch_name.gsub! /[^a-zA-Z0-9\-_]/, '_'
125
- branch_name.gsub! /_+/, '_'
126
- branch_name.downcase
127
- end
128
-
129
- def repo_has_modified_files?
130
- modified = false
131
- @rugged.status do |file, status_data|
132
- if status_data.first != :ignored
133
- puts "#{file}: #{status_data.inspect}"
134
- modified = true
135
- break
136
- end
137
- end
138
- modified
139
- end
140
-
141
22
  # proxy di tutti i metodi a rugged
142
23
  def method_missing(method)
143
24
  @rugged.send method
144
25
  end
145
-
146
- def current_branch_name
147
- @twig.current_branch_name
148
- end
149
-
150
- def get_pr_url
151
- pr = get_pr
152
- if pr.nil?
153
- nil
154
- else
155
- pr.html_url
156
- end
157
- end
158
-
159
- def get_pr
160
- prs = @gh.pulls repo_name, { head: current_branch_ref }
161
- if prs.length > 0
162
- prs[0]
163
- else
164
- nil
165
- end
166
- end
167
-
168
- def is_already_a_pr?
169
- not get_pr_url.nil?
170
- end
171
-
172
- def is_issue_in_review?(issue)
173
- issue_has_label?(issue, Prima::LABEL_REVIEW)
174
- end
175
-
176
- def issue_has_label?(issue, label)
177
- labels = @gh.labels_for_issue 'primait/board', issue.to_i
178
- not labels.find_index{ |l| l.name == label }.nil?
179
- end
180
-
181
- def put_issue_in_review(issue)
182
- update_issue_with_label(issue, Prima::LABEL_REVIEW)
183
- gh.remove_label 'primait/board', issue, Prima::LABEL_WIP
184
- end
185
-
186
- def get_property(name)
187
- @twig.get_branch_property current_branch_name, name
188
- end
189
-
190
- def has_property?(name)
191
- not @twig.get_branch_property(current_branch_name, name).nil?
192
- end
193
-
194
- def update_issue_with_label(issue, label)
195
- unless issue_has_label?(issue, label)
196
- gh.add_labels_to_an_issue 'primait/board', issue, [ label ]
197
- end
198
- end
199
-
200
- def delete_label_from_issue(issue_number, label)
201
- if issue_has_label?(issue_number, label)
202
- @gh.remove_label 'primait/board', issue_number, label
203
- end
204
- end
205
-
206
- def user_login
207
- user = @gh.user
208
- user.login
209
- end
210
-
211
- def assign_issue_to_me(issue)
212
- detailed_issue = get_issue issue
213
- assignees = [user_login]
214
- detailed_issue.assignees.each do |assignee|
215
- assignees << assignee.login
216
- end
217
- @gh.update_issue('primait/board', issue, :assignees => assignees)
218
- end
219
-
220
- def assign_pull_request_to_me(pr_number)
221
- @gh.update_pull_request(repo_name, pr_number, :assignee => user_login)
222
- end
223
-
224
- def list_issues
225
- results = @gh.list_issues 'primait/board', state: :open, :per_page => 20, :page => 1
226
- unless @gh.last_response.rels[:last].nil?
227
- number_of_pages = @gh.last_response.rels[:last].href.match(/page=(\d+)/)[1]
228
- for i in 2..number_of_pages.to_i
229
- results.concat @gh.list_issues('primait/board', state: :open, :per_page => 20, :page => i)
230
- end
231
- end
232
- results
233
- end
234
-
235
- def update_pr(pr_number, options = {})
236
- @gh.update_pull_request repo_name, pr_number, options
237
- end
238
-
239
- def get_issue(issue_number)
240
- @gh.issue 'primait/board', issue_number
241
- end
242
-
243
- def get_pr_commits(pr_number)
244
- @gh.pull_request_commits repo_name, pr_number
245
- end
246
-
247
- def create_pull_request(base_branch, head, title, body = '')
248
- @gh.create_pull_request repo_name, base_branch, head, title, body
249
- end
250
-
251
- def merge_pull_request(pr, commit_message='')
252
- raise "Invalid Pull Request" unless pr
253
- pr_number = pr[:number]
254
- @gh.merge_pull_request(repo_name, pr_number, commit_message)
255
- end
256
-
257
- def close_issue(issue_number)
258
- @gh.close_issue(repo_name, issue_number)
259
- end
260
-
261
- def repo_url
262
- `git config remote.origin.url`
263
- end
264
-
265
- def create_release(tag_name, options = {})
266
- @gh.create_release repo_name, tag_name, options
267
- end
268
-
269
- def yesno(prompt = 'Continue?', default = true)
270
- a = ''
271
- s = default ? '[Y/n]' : '[y/N]'
272
- d = default ? 'y' : 'n'
273
- until %w[y n].include? a
274
- a = ask("#{prompt} #{s} ") { |q| q.limit = 1; q.case = :downcase }
275
- a = d if a.length == 0
276
- end
277
- a == 'y'
278
- end
279
-
280
- def reduce_size(str, len)
281
- out_str = str
282
- if str.size > len
283
- out_str = str[0..(len-1)]
284
- out_str << '...'
285
- end
286
- out_str
287
- end
288
26
  end