travis 1.11.1 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (156) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -3
  3. data/Rakefile +22 -20
  4. data/bin/travis +5 -3
  5. data/examples/org_overview.rb +2 -0
  6. data/examples/pro_auth.rb +3 -1
  7. data/examples/stream.rb +5 -3
  8. data/lib/travis/auto_login.rb +2 -0
  9. data/lib/travis/cli/accounts.rb +12 -9
  10. data/lib/travis/cli/api_command.rb +85 -81
  11. data/lib/travis/cli/branches.rb +8 -6
  12. data/lib/travis/cli/cache.rb +48 -44
  13. data/lib/travis/cli/cancel.rb +4 -2
  14. data/lib/travis/cli/command.rb +170 -142
  15. data/lib/travis/cli/console.rb +5 -5
  16. data/lib/travis/cli/disable.rb +4 -2
  17. data/lib/travis/cli/enable.rb +14 -12
  18. data/lib/travis/cli/encrypt.rb +57 -57
  19. data/lib/travis/cli/encrypt_file.rb +29 -18
  20. data/lib/travis/cli/endpoint.rb +9 -7
  21. data/lib/travis/cli/env.rb +13 -8
  22. data/lib/travis/cli/help.rb +10 -8
  23. data/lib/travis/cli/history.rb +19 -15
  24. data/lib/travis/cli/init.rb +27 -24
  25. data/lib/travis/cli/lint.rb +10 -8
  26. data/lib/travis/cli/login.rb +17 -11
  27. data/lib/travis/cli/logout.rb +4 -2
  28. data/lib/travis/cli/logs.rb +28 -19
  29. data/lib/travis/cli/monitor.rb +11 -8
  30. data/lib/travis/cli/open.rb +17 -14
  31. data/lib/travis/cli/parser.rb +2 -0
  32. data/lib/travis/cli/pubkey.rb +13 -11
  33. data/lib/travis/cli/raw.rb +4 -3
  34. data/lib/travis/cli/repo_command.rb +123 -112
  35. data/lib/travis/cli/report.rb +40 -33
  36. data/lib/travis/cli/repos.rb +14 -9
  37. data/lib/travis/cli/requests.rb +13 -12
  38. data/lib/travis/cli/restart.rb +4 -2
  39. data/lib/travis/cli/settings.rb +41 -35
  40. data/lib/travis/cli/setup/anynines.rb +7 -6
  41. data/lib/travis/cli/setup/appfog.rb +6 -4
  42. data/lib/travis/cli/setup/artifacts.rb +7 -5
  43. data/lib/travis/cli/setup/biicode.rb +6 -4
  44. data/lib/travis/cli/setup/cloud_66.rb +6 -4
  45. data/lib/travis/cli/setup/cloud_control.rb +8 -6
  46. data/lib/travis/cli/setup/cloud_files.rb +7 -5
  47. data/lib/travis/cli/setup/cloud_foundry.rb +9 -7
  48. data/lib/travis/cli/setup/code_deploy.rb +33 -29
  49. data/lib/travis/cli/setup/deis.rb +8 -6
  50. data/lib/travis/cli/setup/divshot.rb +20 -18
  51. data/lib/travis/cli/setup/elastic_beanstalk.rb +10 -8
  52. data/lib/travis/cli/setup/engine_yard.rb +9 -7
  53. data/lib/travis/cli/setup/gcs.rb +9 -7
  54. data/lib/travis/cli/setup/hackage.rb +6 -4
  55. data/lib/travis/cli/setup/heroku.rb +10 -4
  56. data/lib/travis/cli/setup/modulus.rb +5 -3
  57. data/lib/travis/cli/setup/ninefold.rb +7 -5
  58. data/lib/travis/cli/setup/nodejitsu.rb +6 -4
  59. data/lib/travis/cli/setup/npm.rb +6 -4
  60. data/lib/travis/cli/setup/open_shift.rb +8 -6
  61. data/lib/travis/cli/setup/opsworks.rb +24 -22
  62. data/lib/travis/cli/setup/pypi.rb +7 -5
  63. data/lib/travis/cli/setup/releases.rb +6 -6
  64. data/lib/travis/cli/setup/ruby_gems.rb +7 -5
  65. data/lib/travis/cli/setup/s3.rb +12 -8
  66. data/lib/travis/cli/setup/sauce_connect.rb +7 -5
  67. data/lib/travis/cli/setup/service.rb +36 -25
  68. data/lib/travis/cli/setup.rb +7 -3
  69. data/lib/travis/cli/show.rb +10 -8
  70. data/lib/travis/cli/sshkey.rb +31 -27
  71. data/lib/travis/cli/status.rb +5 -3
  72. data/lib/travis/cli/sync.rb +9 -7
  73. data/lib/travis/cli/token.rb +4 -2
  74. data/lib/travis/cli/version.rb +4 -3
  75. data/lib/travis/cli/whatsup.rb +10 -8
  76. data/lib/travis/cli/whoami.rb +2 -2
  77. data/lib/travis/cli.rb +39 -36
  78. data/lib/travis/client/account.rb +8 -6
  79. data/lib/travis/client/artifact.rb +16 -12
  80. data/lib/travis/client/auto_login.rb +7 -4
  81. data/lib/travis/client/broadcast.rb +2 -0
  82. data/lib/travis/client/build.rb +7 -3
  83. data/lib/travis/client/cache.rb +4 -2
  84. data/lib/travis/client/commit.rb +5 -2
  85. data/lib/travis/client/entity.rb +50 -46
  86. data/lib/travis/client/env_var.rb +13 -8
  87. data/lib/travis/client/error.rb +5 -3
  88. data/lib/travis/client/has_uuid.rb +3 -1
  89. data/lib/travis/client/job.rb +8 -3
  90. data/lib/travis/client/lint_result.rb +2 -0
  91. data/lib/travis/client/listener.rb +70 -55
  92. data/lib/travis/client/methods.rb +10 -5
  93. data/lib/travis/client/namespace.rb +20 -16
  94. data/lib/travis/client/not_loadable.rb +3 -1
  95. data/lib/travis/client/repository.rb +34 -22
  96. data/lib/travis/client/request.rb +5 -2
  97. data/lib/travis/client/restartable.rb +2 -0
  98. data/lib/travis/client/session.rb +118 -88
  99. data/lib/travis/client/settings.rb +8 -3
  100. data/lib/travis/client/singleton_setting.rb +2 -0
  101. data/lib/travis/client/ssh_key.rb +2 -0
  102. data/lib/travis/client/states.rb +8 -6
  103. data/lib/travis/client/user.rb +2 -0
  104. data/lib/travis/client/weak_entity.rb +6 -3
  105. data/lib/travis/client.rb +4 -1
  106. data/lib/travis/pro/auto_login.rb +2 -0
  107. data/lib/travis/pro.rb +2 -0
  108. data/lib/travis/tools/assets.rb +6 -3
  109. data/lib/travis/tools/completion.rb +10 -6
  110. data/lib/travis/tools/formatter.rb +20 -14
  111. data/lib/travis/tools/github.rb +59 -49
  112. data/lib/travis/tools/notification.rb +18 -13
  113. data/lib/travis/tools/safe_string.rb +4 -1
  114. data/lib/travis/tools/ssl_key.rb +5 -2
  115. data/lib/travis/tools/system.rb +11 -6
  116. data/lib/travis/version.rb +3 -1
  117. data/lib/travis.rb +3 -1
  118. data/spec/cli/api_command_spec.rb +11 -8
  119. data/spec/cli/cancel_spec.rb +2 -4
  120. data/spec/cli/encrypt_file_spec.rb +9 -7
  121. data/spec/cli/encrypt_spec.rb +19 -17
  122. data/spec/cli/endpoint_spec.rb +12 -10
  123. data/spec/cli/help_spec.rb +14 -12
  124. data/spec/cli/history_spec.rb +2 -0
  125. data/spec/cli/init_spec.rb +35 -33
  126. data/spec/cli/logs_spec.rb +2 -0
  127. data/spec/cli/open_spec.rb +6 -4
  128. data/spec/cli/repo_command_spec.rb +8 -4
  129. data/spec/cli/restart_spec.rb +2 -4
  130. data/spec/cli/setup/service_spec.rb +17 -18
  131. data/spec/cli/setup_spec.rb +2 -4
  132. data/spec/cli/show_spec.rb +4 -2
  133. data/spec/cli/status_spec.rb +7 -5
  134. data/spec/cli/token_spec.rb +7 -5
  135. data/spec/cli/version_spec.rb +2 -0
  136. data/spec/cli/whoami_spec.rb +9 -7
  137. data/spec/client/account_spec.rb +28 -20
  138. data/spec/client/auto_login_spec.rb +12 -9
  139. data/spec/client/broadcast_spec.rb +5 -3
  140. data/spec/client/build_spec.rb +28 -24
  141. data/spec/client/commit_spec.rb +17 -14
  142. data/spec/client/job_spec.rb +27 -23
  143. data/spec/client/methods_spec.rb +8 -4
  144. data/spec/client/namespace_spec.rb +8 -4
  145. data/spec/client/repository_spec.rb +33 -30
  146. data/spec/client/session_spec.rb +71 -67
  147. data/spec/client/user_spec.rb +13 -10
  148. data/spec/client_spec.rb +6 -4
  149. data/spec/pro_spec.rb +5 -3
  150. data/spec/spec_helper.rb +3 -1
  151. data/spec/support/fake_api.rb +662 -662
  152. data/spec/support/fake_github.rb +6 -3
  153. data/spec/support/helpers.rb +13 -8
  154. data/spec/travis_spec.rb +5 -3
  155. data/travis.gemspec +400 -399
  156. metadata +30 -50
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'travis/cli'
2
4
  require 'travis/tools/github'
3
5
  require 'json'
@@ -7,16 +9,17 @@ module Travis
7
9
  class Login < ApiCommand
8
10
  skip :authenticate
9
11
 
10
- description "authenticates against the API and stores the token"
12
+ description 'authenticates against the API and stores the token'
11
13
  on('-g', '--github-token TOKEN', 'identify by GitHub token')
12
- on('-T', '--auto-token', 'try to figure out who you are automatically (might send another apps token to Travis, token will not be stored)')
14
+ on('-T', '--auto-token',
15
+ 'try to figure out who you are automatically (might send another apps token to Travis, token will not be stored)')
13
16
  on('--list-github-token', 'instead of actually logging in, list found GitHub tokens')
14
17
  on('--skip-token-check', 'don\'t verify the token with github')
15
18
 
16
19
  attr_accessor :user_login
17
20
 
18
21
  def list_token
19
- github.after_tokens = proc { }
22
+ github.after_tokens = proc {}
20
23
  github.each_token do |token|
21
24
  say token
22
25
  end
@@ -26,7 +29,10 @@ module Travis
26
29
  session.access_token = nil
27
30
  github.with_token do |token|
28
31
  endpoint_config['access_token'] = github_auth(token)
29
- error("user mismatch: logged in as %p instead of %p" % [user.login, user_login]) if user_login and user.login != user_login
32
+ if user_login && (user.login != user_login)
33
+ error(format('user mismatch: logged in as %p instead of %p', user.login,
34
+ user_login))
35
+ end
30
36
  unless user.correct_scopes?
31
37
  error(
32
38
  "#{user.login} has not granted Travis CI the required permissions. " \
@@ -37,9 +43,9 @@ module Travis
37
43
  success("Successfully logged in as #{user.login}!")
38
44
  end
39
45
 
40
- unless session.access_token
41
- raise Travis::Client::GitHubLoginFailed, "all GitHub tokens given were invalid"
42
- end
46
+ return if session.access_token
47
+
48
+ raise Travis::Client::GitHubLoginFailed, 'all GitHub tokens given were invalid'
43
49
  end
44
50
 
45
51
  def run
@@ -58,15 +64,15 @@ module Travis
58
64
  g.drop_token = !list_github_token
59
65
  g.login_header = proc { login_header }
60
66
  g.debug = proc { |log| debug(log) }
61
- g.after_tokens = proc { g.explode = true and error("no suitable github token found") }
67
+ g.after_tokens = proc { g.explode = true and error('no suitable github token found') }
62
68
  end
63
69
  end
64
70
  end
65
71
 
66
72
  def login_header
67
- say "GitHub deprecated its Authorizations API exchanging a password for a token."
68
- say "Please visit https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations for more information."
69
- say "Try running with #{color("--github-token", :info)} or #{color("--auto-token", :info)} ."
73
+ say 'GitHub deprecated its Authorizations API exchanging a password for a token.'
74
+ say 'Please visit https://github.blog/2020-07-30-token-authentication-requirements-for-api-and-git-operations for more information.'
75
+ say "Try running with #{color('--github-token', :info)} or #{color('--auto-token', :info)} ."
70
76
  end
71
77
  end
72
78
  end
@@ -1,14 +1,16 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'travis/cli'
2
4
 
3
5
  module Travis
4
6
  module CLI
5
7
  class Logout < ApiCommand
6
- description "deletes the stored API token"
8
+ description 'deletes the stored API token'
7
9
 
8
10
  def run
9
11
  session.logout
10
12
  endpoint_config.delete('access_token')
11
- success("Successfully logged out!")
13
+ success('Successfully logged out!')
12
14
  end
13
15
  end
14
16
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'travis/cli'
2
4
  require 'travis/tools/safe_string'
3
5
  require 'travis/tools/system'
@@ -6,8 +8,12 @@ module Travis
6
8
  module CLI
7
9
  class Logs < RepoCommand
8
10
  attr_accessor :delete, :reason
9
- description "streams test logs"
10
- on('-d', '--delete [REASON]', 'remove logs') { |c, reason| c.delete, c.reason = true, reason }
11
+
12
+ description 'streams test logs'
13
+ on('-d', '--delete [REASON]', 'remove logs') do |c, reason|
14
+ c.delete = true
15
+ c.reason = reason
16
+ end
11
17
  on('-f', '--force', 'do not ask user to confirm deleting the logs')
12
18
  on('--[no-]stream', 'only print current logs, do not stream')
13
19
 
@@ -25,17 +31,19 @@ module Travis
25
31
 
26
32
  def delete_log(job)
27
33
  unless force?
28
- error "not deleting logs without --force" unless interactive?
29
- error "aborted" unless danger_zone? "Do you really want to delete the build log for #{color(job.inspect_info, :underline)}?"
34
+ error 'not deleting logs without --force' unless interactive?
35
+ error 'aborted' unless danger_zone? "Do you really want to delete the build log for #{color(job.inspect_info,
36
+ :underline)}?"
30
37
  end
31
38
 
32
- warn "deleting log for #{color(job.inspect_info, [:bold, :info])}"
39
+ warn "deleting log for #{color(job.inspect_info, %i[bold info])}"
33
40
  job.delete_log(reason || {})
34
41
  end
35
42
 
36
43
  def display_log(job)
37
- info "displaying logs for #{color(job.inspect_info, [:bold, :info])}"
44
+ info "displaying logs for #{color(job.inspect_info, %i[bold info])}"
38
45
  return print_log(job.log.body) unless stream?
46
+
39
47
  job.log.body { |part| print_log(part) }
40
48
  ensure
41
49
  print "\e[0m" if interactive?
@@ -47,19 +55,20 @@ module Travis
47
55
 
48
56
  private
49
57
 
50
- def job(number)
51
- number = last_build.number + number if number.start_with? '.'
52
- job = super(number) || build(number) || branch(number)
53
- job = job.jobs.first if job.respond_to? :jobs
54
- job
55
- end
58
+ def job(number)
59
+ number = last_build.number + number if number.start_with? '.'
60
+ job = super(number) || build(number) || branch(number)
61
+ job = job.jobs.first if job.respond_to? :jobs
62
+ job
63
+ end
56
64
 
57
- def check_websocket
58
- require 'websocket-native' if stream?
59
- rescue LoadError => e
60
- raise e if e.respond_to?(:path) and e.path != 'websocket-native'
61
- info "speed up log streaming by installing the websocket-native gem"
62
- end
65
+ def check_websocket
66
+ require 'websocket-native' if stream?
67
+ rescue LoadError => e
68
+ raise e if e.respond_to?(:path) && (e.path != 'websocket-native')
69
+
70
+ info 'speed up log streaming by installing the websocket-native gem'
71
+ end
63
72
  end
64
73
  end
65
- end
74
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'travis/cli'
2
4
  require 'travis/tools/notification'
3
5
 
@@ -9,10 +11,10 @@ module Travis
9
11
 
10
12
  on('-r', '--repo SLUG', 'monitor given repository (can be used more than once)') do |c, slug|
11
13
  c.repos << slug
12
- c.send(:error, "SLUG should be of the form OWNER/REPO") unless slug.split('/').compact.size == 2
14
+ c.send(:error, 'SLUG should be of the form OWNER/REPO') unless slug.split('/').compact.size == 2
13
15
  end
14
16
 
15
- types = Tools::Notification::DEFAULT.map(&:to_s).join(", ")
17
+ types = Tools::Notification::DEFAULT.map(&:to_s).join(', ')
16
18
  on('-n', '--[no-]notify [TYPE]', "send out desktop notifications (optional type: #{types})") do |c, type|
17
19
  c.setup_notification(type)
18
20
  end
@@ -75,6 +77,7 @@ module Travis
75
77
 
76
78
  def monitor?(entity)
77
79
  return true if all?
80
+
78
81
  entity.pull_request? ? pull? : push?
79
82
  end
80
83
 
@@ -84,26 +87,26 @@ module Travis
84
87
  color(entity.inspect_info, [entity.color, :bold]),
85
88
  color(entity.state, entity.color),
86
89
  color(entity.commit.subject, entity.color)
87
- ].join(" ")
90
+ ].join(' ')
88
91
  notification.notify(entity.repository.slug, [
89
92
  entity.class.name[/[^:]+$/],
90
93
  entity.number,
91
- entity.state + ":",
94
+ "#{entity.state}:",
92
95
  entity.commit.subject
93
- ].join(" "))
96
+ ].join(' '))
94
97
  end
95
98
 
96
99
  def handle_event(event)
97
100
  entity = event.job || event.build
98
101
  time = entity.finished_at || entity.started_at
99
102
  display(entity, time) if monitor? entity
100
- rescue Travis::Client::Error => error
101
- raise error if explode?
103
+ rescue Travis::Client::Error => e
104
+ raise e if explode?
102
105
  end
103
106
 
104
107
  def run
105
108
  listen(*repos) do |listener|
106
- listener.on_connect { say description, "Monitoring #{"builds for " if builds?}%s:" }
109
+ listener.on_connect { say description, "Monitoring #{'builds for ' if builds?}%s:" }
107
110
  listener.on(*events) { |e| handle_event(e) }
108
111
  end
109
112
  end
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'travis/cli'
2
4
  require 'launchy'
3
5
 
4
6
  module Travis
5
7
  module CLI
6
8
  class Open < RepoCommand
7
- description "opens a build or job in the browser"
9
+ description 'opens a build or job in the browser'
8
10
 
9
11
  on('-g', '--github', 'Open the corresponding project, compare view or pull request on GitHub')
10
12
  on('-p', '--print', 'Print out the URL instead of opening it in a browser')
@@ -12,7 +14,7 @@ module Travis
12
14
  def run(number = nil)
13
15
  url = url_for(number)
14
16
  if print?
15
- say url, "web view: %s"
17
+ say url, 'web view: %s'
16
18
  else
17
19
  Launchy.open(url)
18
20
  end
@@ -20,20 +22,21 @@ module Travis
20
22
 
21
23
  private
22
24
 
23
- def url_for(number)
24
- return repo_url unless number
25
- entity = job(number) || build(number)
26
- error "could not find job or build #{repository.slug}##{number}" unless entity
27
- github ? entity.commit.compare_url : "#{repo_url}/#{entity.class.many}/#{entity.id}"
28
- end
25
+ def url_for(number)
26
+ return repo_url unless number
29
27
 
30
- def repo_url
31
- "https://#{host}/#{slug}"
32
- end
28
+ entity = job(number) || build(number)
29
+ error "could not find job or build #{repository.slug}##{number}" unless entity
30
+ github ? entity.commit.compare_url : "#{repo_url}/#{entity.class.many}/#{entity.id}"
31
+ end
33
32
 
34
- def host
35
- github ? "github.com" : session.config['host']
36
- end
33
+ def repo_url
34
+ "https://#{host}/#{slug}"
35
+ end
36
+
37
+ def host
38
+ github ? 'github.com' : session.config['host']
39
+ end
37
40
  end
38
41
  end
39
42
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'travis/cli'
2
4
  require 'optparse'
3
5
 
@@ -1,13 +1,15 @@
1
- # encoding: utf-8
1
+ # frozen_string_literal: true
2
+
2
3
  require 'travis/cli'
3
4
 
4
5
  module Travis
5
6
  module CLI
6
7
  class Pubkey < RepoCommand
7
8
  attr_accessor :key_format
9
+
8
10
  description "prints out a repository's public key"
9
- on('-p', '--pem', 'encode in format used by pem') { |c,_| c.key_format = :pem }
10
- on('-f', '--fingerprint', 'display fingerprint') { |c,_| c.key_format = :fingerprint }
11
+ on('-p', '--pem', 'encode in format used by pem') { |c, _| c.key_format = :pem }
12
+ on('-f', '--fingerprint', 'display fingerprint') { |c, _| c.key_format = :fingerprint }
11
13
 
12
14
  def run
13
15
  error "#{key_format} format not supported by #{api_endpoint}" unless key
@@ -16,15 +18,15 @@ module Travis
16
18
 
17
19
  private
18
20
 
19
- def key
20
- key = repository.public_key
21
- case self.key_format ||= :ssh
22
- when :fingerprint then key.fingerprint
23
- when :pem then key.to_s
24
- when :ssh then key.to_ssh
25
- else raise "unknown format #{key_format}"
26
- end
21
+ def key
22
+ key = repository.public_key
23
+ case self.key_format ||= :ssh
24
+ when :fingerprint then key.fingerprint
25
+ when :pem then key.to_s
26
+ when :ssh then key.to_ssh
27
+ else raise "unknown format #{key_format}"
27
28
  end
29
+ end
28
30
  end
29
31
  end
30
32
  end
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'travis/cli'
2
- require 'pp'
3
4
 
4
5
  module Travis
5
6
  module CLI
6
7
  class Raw < ApiCommand
7
- description "makes an (authenticated) API call and prints out the result"
8
+ description 'makes an (authenticated) API call and prints out the result'
8
9
 
9
10
  skip :authenticate
10
11
  on('--[no-]json', 'display as json')
@@ -13,7 +14,7 @@ module Travis
13
14
  reply = session.get_raw(resource)
14
15
  json? ? say(reply.to_json) : pp(reply)
15
16
  rescue Travis::Client::NotFound
16
- error "resource not found"
17
+ error 'resource not found'
17
18
  end
18
19
  end
19
20
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'travis/cli'
2
4
  require 'yaml'
3
5
 
@@ -9,7 +11,7 @@ module Travis
9
11
  on('-g', '--github-token TOKEN', 'identify by GitHub token')
10
12
  on('-r', '--repo SLUG', 'repository to use (will try to detect from current git clone)') do |c, slug|
11
13
  c.slug = slug
12
- c.error "SLUG should be of the form OWNER/REPO" unless slug.split('/').compact.size == 2
14
+ c.error 'SLUG should be of the form OWNER/REPO' unless slug.split('/').compact.size == 2
13
15
  end
14
16
  on('-R', '--store-repo SLUG', 'like --repo, but remembers value for current directory') do |c, slug|
15
17
  c.slug = slug
@@ -17,12 +19,15 @@ module Travis
17
19
  end
18
20
 
19
21
  attr_accessor :slug
22
+
20
23
  abstract
21
24
 
22
25
  def setup
23
26
  setup_enterprise
24
- error "Can't figure out GitHub repo name. Ensure you're in the repo directory, or specify the repo name via the -r option (e.g. travis <command> -r <owner>/<repo>)" unless self.slug ||= find_slug
25
- error "GitHub repo name is invalid, it should be of the form 'owner/repo'" unless self.slug.include?("/")
27
+ unless self.slug ||= find_slug
28
+ error "Can't figure out GitHub repo name. Ensure you're in the repo directory, or specify the repo name via the -r option (e.g. travis <command> -r <owner>/<repo>)"
29
+ end
30
+ error "GitHub repo name is invalid, it should be of the form 'owner/repo'" unless self.slug.include?('/')
26
31
  self.api_endpoint = detect_api_endpoint
27
32
  super
28
33
  repository.load # makes sure we actually have access to the repo
@@ -36,140 +41,146 @@ module Travis
36
41
 
37
42
  private
38
43
 
39
- def build(number_or_id)
40
- return super if number_or_id.is_a? Integer
41
- repository.build(number_or_id)
42
- end
44
+ def build(number_or_id)
45
+ return super if number_or_id.is_a? Integer
43
46
 
44
- def job(number_or_id)
45
- return super if number_or_id.is_a? Integer
46
- repository.job(number_or_id)
47
- end
47
+ repository.build(number_or_id)
48
+ end
48
49
 
49
- def branch(name)
50
- repository.branch(name)
51
- end
50
+ def job(number_or_id)
51
+ return super if number_or_id.is_a? Integer
52
52
 
53
- def last_build
54
- repository.last_build or error("no build yet for #{slug}")
55
- end
53
+ repository.job(number_or_id)
54
+ end
56
55
 
57
- def detected_endpoint?
58
- !explicit_api_endpoint?
59
- end
56
+ def branch(name)
57
+ repository.branch(name)
58
+ end
60
59
 
61
- def find_slug
62
- load_slug || begin
63
- slug = detect_slug
64
- interactive? ? store_slug(slug) : slug if slug
65
- end
66
- end
60
+ def last_build
61
+ repository.last_build or error("no build yet for #{slug}")
62
+ end
63
+
64
+ def detected_endpoint?
65
+ !explicit_api_endpoint?
66
+ end
67
67
 
68
- def detect_slug
69
- git_head = `git name-rev --name-only HEAD 2>#{IO::NULL}`.chomp
70
- git_remote = `git config --get branch.#{git_head}.remote 2>#{IO::NULL}`.chomp
71
- git_remote = 'origin' if git_remote.empty?
72
- git_info = `git ls-remote --get-url #{git_remote} 2>#{IO::NULL}`.chomp
73
-
74
- if parse_remote(git_info) =~ GIT_REGEX
75
- detected_slug = $1
76
- if interactive?
77
- if agree("Detected repository as #{color(detected_slug, :info)}, is this correct? ") { |q| q.default = 'yes' }
78
- detected_slug
79
- else
80
- ask("Repository slug (owner/name): ") { |q| q.default = detected_slug }
81
- end
82
- else
83
- info "detected repository as #{color(detected_slug, :bold)}"
84
- detected_slug
85
- end
68
+ def find_slug
69
+ load_slug || begin
70
+ slug = detect_slug
71
+ if slug
72
+ interactive? ? store_slug(slug) : slug
86
73
  end
87
74
  end
75
+ end
76
+
77
+ def detect_slug
78
+ git_head = `git name-rev --name-only HEAD 2>#{IO::NULL}`.chomp
79
+ git_remote = `git config --get branch.#{git_head}.remote 2>#{IO::NULL}`.chomp
80
+ git_remote = 'origin' if git_remote.empty?
81
+ git_info = `git ls-remote --get-url #{git_remote} 2>#{IO::NULL}`.chomp
82
+
83
+ return unless parse_remote(git_info) =~ GIT_REGEX
88
84
 
89
- def parse_remote(url)
90
- if url =~ /^git@[^:]+:/
91
- path = url.split(':').last
92
- path = "/#{path}" unless path.start_with?('/')
93
- path
85
+ detected_slug = ::Regexp.last_match(1)
86
+ if interactive?
87
+ if agree("Detected repository as #{color(detected_slug, :info)}, is this correct? ") do |q|
88
+ q.default = 'yes'
89
+ end
90
+ detected_slug
94
91
  else
95
- URI.parse(url).path
92
+ ask('Repository slug (owner/name): ') { |q| q.default = detected_slug }
96
93
  end
94
+ else
95
+ info "detected repository as #{color(detected_slug, :bold)}"
96
+ detected_slug
97
97
  end
98
+ end
98
99
 
99
- def load_slug
100
- stored = `git config --get travis.slug`.chomp
101
- stored unless stored.empty?
100
+ def parse_remote(url)
101
+ if url =~ /^git@[^:]+:/
102
+ path = url.split(':').last
103
+ path = "/#{path}" unless path.start_with?('/')
104
+ path
105
+ else
106
+ URI.parse(url).path
102
107
  end
108
+ end
103
109
 
104
- def store_slug(value)
105
- `git config travis.slug #{value}` if value
106
- value
107
- end
110
+ def load_slug
111
+ stored = `git config --get travis.slug`.chomp
112
+ stored unless stored.empty?
113
+ end
108
114
 
109
- def repo_config
110
- config['repos'] ||= {}
111
- config['repos'][slug] ||= {}
112
- end
115
+ def store_slug(value)
116
+ `git config travis.slug #{value}` if value
117
+ value
118
+ end
113
119
 
114
- def detect_api_endpoint
115
- if explicit_api_endpoint? or enterprise?
116
- repo_config['endpoint'] = api_endpoint
117
- elsif ENV['TRAVIS_ENDPOINT']
118
- ENV['TRAVIS_ENDPOINT']
119
- elsif config['default_endpoint'] and config['default_endpoint'] !~ TRAVIS
120
- repo_config['endpoint'] ||= config['default_endpoint']
121
- else
122
- repo_config['endpoint'] ||= begin
123
- load_gh
124
- GH.head("/repos/#{slug}")
125
- Travis::Client::ORG_URI
126
- rescue GH::Error
127
- Travis::Client::COM_URI
128
- end
129
- end
130
- end
120
+ def repo_config
121
+ config['repos'] ||= {}
122
+ config['repos'][slug] ||= {}
123
+ end
131
124
 
132
- def travis_config
133
- @travis_config ||= begin
134
- payload = YAML.load_file(travis_yaml)
135
- payload.respond_to?(:to_hash) ? payload.to_hash : {}
125
+ def detect_api_endpoint
126
+ if explicit_api_endpoint? || enterprise?
127
+ repo_config['endpoint'] = api_endpoint
128
+ elsif ENV['TRAVIS_ENDPOINT']
129
+ ENV['TRAVIS_ENDPOINT']
130
+ elsif config['default_endpoint'] && config['default_endpoint'] !~ (TRAVIS)
131
+ repo_config['endpoint'] ||= config['default_endpoint']
132
+ else
133
+ repo_config['endpoint'] ||= begin
134
+ load_gh
135
+ GH.head("/repos/#{slug}")
136
+ Travis::Client::ORG_URI
137
+ rescue GH::Error
138
+ Travis::Client::COM_URI
136
139
  end
137
140
  end
141
+ end
138
142
 
139
- def travis_yaml(dir = Dir.pwd)
140
- path = File.expand_path('.travis.yml', dir)
141
- if File.exist? path
142
- path
143
- else
144
- parent = File.expand_path('..', dir)
145
- error "no .travis.yml found" if parent == dir
146
- travis_yaml(parent)
147
- end
143
+ def travis_config
144
+ @travis_config ||= begin
145
+ payload = YAML.load_file(travis_yaml)
146
+ payload.respond_to?(:to_hash) ? payload.to_hash : {}
148
147
  end
148
+ end
149
149
 
150
- def confirm_and_save_travis_config(confirm = true, file = travis_yaml)
151
- if confirm
152
- ans = ask [
153
- nil,
154
- color("Overwrite the config file #{travis_yaml} with the content below?", [:info, :yellow]),
155
- color("This reformats the existing file.", [:info, :red]),
156
- travis_config.to_yaml,
157
- color("(y/N)", [:info, :yellow])
158
- ].join("\n\n")
159
- proceed = ans =~ /^y/i
160
- else
161
- proceed = true
162
- end
163
-
164
- save_travis_config if proceed
150
+ def travis_yaml(dir = Dir.pwd)
151
+ path = File.expand_path('.travis.yml', dir)
152
+ if File.exist? path
153
+ path
154
+ else
155
+ parent = File.expand_path('..', dir)
156
+ error 'no .travis.yml found' if parent == dir
157
+ travis_yaml(parent)
165
158
  end
159
+ end
166
160
 
167
- def save_travis_config(file = travis_yaml)
168
- yaml = travis_config.to_yaml
169
- yaml.gsub! /^(\s+)('on'|true):/, "\\1on:"
170
- yaml.gsub! /\A---\s*\n/, ''
171
- File.write(file, yaml)
172
- end
161
+ def confirm_and_save_travis_config(confirm = true, _file = travis_yaml)
162
+ if confirm
163
+ ans = ask [
164
+ nil,
165
+ color("Overwrite the config file #{travis_yaml} with the content below?", %i[info yellow]),
166
+ color('This reformats the existing file.', %i[info red]),
167
+ travis_config.to_yaml,
168
+ color('(y/N)', %i[info yellow])
169
+ ].join("\n\n")
170
+ proceed = ans =~ /^y/i
171
+ else
172
+ proceed = true
173
+ end
174
+
175
+ save_travis_config if proceed
176
+ end
177
+
178
+ def save_travis_config(file = travis_yaml)
179
+ yaml = travis_config.to_yaml
180
+ yaml.gsub!(/^(\s+)('on'|true):/, '\\1on:')
181
+ yaml.gsub!(/\A---\s*\n/, '')
182
+ File.write(file, yaml)
183
+ end
173
184
  end
174
185
  end
175
186
  end