git_reflow 0.9.2 → 0.9.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d1fb3ffd57a3b59e0bfb010c5e6b73071b3c638589fd43c76bd562610fa704f7
4
- data.tar.gz: 70bbde7b4d9210bb8a569004fe41418cbad69dabdcccd77ebb53bbff9278ad0d
3
+ metadata.gz: 7692bb55eed68ee06c7ef9e1b2fe26875e47f9bf312d1f255632adba2d67e86a
4
+ data.tar.gz: 2a84dec6c6c94bcdf9ed06c2fa6759a7a241cd3cf90330f3f4c56c82758650c8
5
5
  SHA512:
6
- metadata.gz: bdc335ec23d18619c99a2f018bed46facf8f33ec3fc9ed172220317123ebc86604f9b3a3323dcecab5b078c90177f4cb4bc39497c76b9bcdf4ed51ad824590ed
7
- data.tar.gz: 2c0beb0a11cbaece34fc1fa4fdeb3e0eccf924e4c09a6fe5af7dcae093d9428583d8b0ea0f15f677a87ad93c7f61d4526598d2c721ea123ab7fcde73debf3b5b
6
+ metadata.gz: b27fc6914668bf71637cc55cdb551e603eaa9584c4c2ff140dfc186fe942ebd50cfabab180d20a526ff322c908db7383dd68a912a432437a622e91cbc2469f3a
7
+ data.tar.gz: f4053198734d076e4e3b53385091be46fc00d4b182287db22f5bd0be93355a17fbe77cc28536ceb0c47e9a3d2a5079dcf73e7f2f255745aa931c2e15ef479d83
@@ -0,0 +1,33 @@
1
+ name: Tests
2
+
3
+ on:
4
+ push:
5
+ branches: [ master ]
6
+ pull_request:
7
+ branches: [ master ]
8
+
9
+ jobs:
10
+ test:
11
+ strategy:
12
+ fail-fast: true
13
+ matrix:
14
+ os: [ ubuntu-latest, macos-latest ]
15
+ ruby: ['2.5.8', '2.6.6', '2.7.1 ']
16
+ runs-on: ${{ matrix.os }}
17
+ steps:
18
+ - uses: actions/checkout@v2
19
+ - uses: ruby/setup-ruby@v1
20
+ with:
21
+ ruby-version: ${{ matrix.ruby }}
22
+ - uses: actions/cache@v1
23
+ with:
24
+ path: vendor/bundle
25
+ key: bundle-use-ruby-${{ matrix.os }}-${{ matrix.ruby }}-${{ hashFiles('**/Gemfile.lock') }}
26
+ restore-keys: |
27
+ bundle-use-ruby-${{ matrix.os }}-${{ matrix.ruby }}-
28
+ - name: bundle install
29
+ run: |
30
+ bundle config path vendor/bundle
31
+ bundle install --jobs 4 --retry 3
32
+ - name: Run Tests for Ruby ${{ matrix.ruby }} on ${{ matrix.os }}
33
+ run: bundle exec rake
@@ -1 +1 @@
1
- 2.5.3
1
+ 2.7.1
@@ -2,6 +2,24 @@
2
2
 
3
3
  ## [Unreleased](https://github.com/reenhanced/gitreflow/tree/HEAD)
4
4
 
5
+ [Full Changelog](https://github.com/reenhanced/gitreflow/compare/v0.9.2...v0.9.3)
6
+
7
+ **Implemented enhancements:**
8
+
9
+ - Add documention for GitReflow::Config [\#237](https://github.com/reenhanced/gitreflow/issues/237)
10
+ - Add documentation [\#157](https://github.com/reenhanced/gitreflow/issues/157)
11
+
12
+ **Closed issues:**
13
+
14
+ - GitHub authentication issues [\#193](https://github.com/reenhanced/gitreflow/issues/193)
15
+
16
+ **Merged pull requests:**
17
+
18
+ - Upgrade dependencies [\#242](https://github.com/reenhanced/gitreflow/pull/242) ([codenamev](https://github.com/codenamev))
19
+ - Creates multi-ruby-tests.yml [\#241](https://github.com/reenhanced/gitreflow/pull/241) ([codenamev](https://github.com/codenamev))
20
+ - Documention for GitReflow::Config [\#238](https://github.com/reenhanced/gitreflow/pull/238) ([PuZZleDucK](https://github.com/PuZZleDucK))
21
+ - Fixes several issues related to git-reflow setup [\#236](https://github.com/reenhanced/gitreflow/pull/236) ([codenamev](https://github.com/codenamev))
22
+
5
23
  [Full Changelog](https://github.com/reenhanced/gitreflow/compare/v0.9.1...v0.9.2)
6
24
 
7
25
  **Closed issues:**
@@ -1,99 +1,130 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- git_reflow (0.9.2)
4
+ git_reflow (0.9.3)
5
5
  bundler (>= 1.10.0)
6
+ codenamev_bitbucket_api (= 0.4.1)
6
7
  colorize (>= 0.7.0)
7
8
  github_api (= 0.18.2)
8
9
  highline
9
10
  httpclient
10
- reenhanced_bitbucket_api (= 0.3.2)
11
11
 
12
12
  GEM
13
13
  remote: https://rubygems.org/
14
14
  specs:
15
+ activesupport (6.0.3.1)
16
+ concurrent-ruby (~> 1.0, >= 1.0.2)
17
+ i18n (>= 0.7, < 2)
18
+ minitest (~> 5.1)
19
+ tzinfo (~> 1.1)
20
+ zeitwerk (~> 2.2, >= 2.2.2)
15
21
  addressable (2.7.0)
16
22
  public_suffix (>= 2.0.2, < 5.0)
17
23
  appraisal (2.2.0)
18
24
  bundler
19
25
  rake
20
26
  thor (>= 0.14.0)
21
- byebug (11.0.1)
27
+ byebug (11.1.3)
22
28
  chronic (0.10.2)
29
+ codenamev_bitbucket_api (0.4.1)
30
+ faraday (< 2.0)
31
+ faraday_middleware (< 2.0)
32
+ hashie
33
+ multi_json (< 2.0)
34
+ nokogiri (>= 1.5.2)
35
+ simple_oauth (>= 0.3.0)
23
36
  coderay (1.1.2)
24
37
  colorize (0.8.1)
38
+ concurrent-ruby (1.1.6)
25
39
  crack (0.4.3)
26
40
  safe_yaml (~> 1.0.0)
27
41
  descendants_tracker (0.0.4)
28
42
  thread_safe (~> 0.3, >= 0.3.1)
29
43
  diff-lcs (1.3)
30
- faraday (0.9.2)
44
+ faraday (0.17.3)
31
45
  multipart-post (>= 1.2, < 3)
32
- faraday_middleware (0.9.2)
33
- faraday (>= 0.7.4, < 0.10)
46
+ faraday-http-cache (2.2.0)
47
+ faraday (>= 0.8)
48
+ faraday_middleware (0.14.0)
49
+ faraday (>= 0.7.4, < 1.0)
34
50
  github_api (0.18.2)
35
51
  addressable (~> 2.4)
36
52
  descendants_tracker (~> 0.0.4)
37
53
  faraday (~> 0.8)
38
54
  hashie (~> 3.5, >= 3.5.2)
39
55
  oauth2 (~> 1.0)
40
- hashdiff (1.0.0)
56
+ github_changelog_generator (1.15.2)
57
+ activesupport
58
+ faraday-http-cache
59
+ multi_json
60
+ octokit (~> 4.6)
61
+ rainbow (>= 2.2.1)
62
+ rake (>= 10.0)
63
+ retriable (~> 3.0)
64
+ hashdiff (1.0.1)
41
65
  hashie (3.6.0)
42
- highline (2.0.2)
66
+ highline (2.0.3)
43
67
  httpclient (2.8.3)
68
+ i18n (1.8.2)
69
+ concurrent-ruby (~> 1.0)
44
70
  jwt (2.2.1)
45
- method_source (0.9.2)
71
+ method_source (1.0.0)
46
72
  mini_portile2 (2.4.0)
47
- multi_json (1.13.1)
73
+ minitest (5.14.1)
74
+ multi_json (1.14.1)
48
75
  multi_xml (0.6.0)
49
76
  multipart-post (2.1.1)
50
- nokogiri (1.10.4)
77
+ nokogiri (1.10.9)
51
78
  mini_portile2 (~> 2.4.0)
52
- oauth2 (1.4.1)
53
- faraday (>= 0.8, < 0.16.0)
79
+ oauth2 (1.4.4)
80
+ faraday (>= 0.8, < 2.0)
54
81
  jwt (>= 1.0, < 3.0)
55
82
  multi_json (~> 1.3)
56
83
  multi_xml (~> 0.5)
57
84
  rack (>= 1.2, < 3)
58
- pry (0.12.2)
59
- coderay (~> 1.1.0)
60
- method_source (~> 0.9.0)
61
- pry-byebug (3.7.0)
85
+ octokit (4.18.0)
86
+ faraday (>= 0.9)
87
+ sawyer (~> 0.8.0, >= 0.5.3)
88
+ pry (0.13.1)
89
+ coderay (~> 1.1)
90
+ method_source (~> 1.0)
91
+ pry-byebug (3.9.0)
62
92
  byebug (~> 11.0)
63
- pry (~> 0.10)
64
- public_suffix (4.0.1)
65
- rack (2.0.7)
66
- rake (12.3.3)
67
- rdoc (6.2.0)
68
- reenhanced_bitbucket_api (0.3.2)
69
- faraday (~> 0.9.0)
70
- faraday_middleware (~> 0.9.0)
71
- hashie (>= 3.2)
72
- multi_json (>= 1.7.5, < 2.0)
73
- nokogiri (>= 1.5.2)
74
- simple_oauth (>= 0.3.0)
75
- rspec (3.8.0)
76
- rspec-core (~> 3.8.0)
77
- rspec-expectations (~> 3.8.0)
78
- rspec-mocks (~> 3.8.0)
79
- rspec-core (3.8.2)
80
- rspec-support (~> 3.8.0)
81
- rspec-expectations (3.8.4)
93
+ pry (~> 0.13.0)
94
+ public_suffix (4.0.5)
95
+ rack (2.2.2)
96
+ rainbow (3.0.0)
97
+ rake (13.0.1)
98
+ rdoc (6.2.1)
99
+ retriable (3.1.2)
100
+ rspec (3.9.0)
101
+ rspec-core (~> 3.9.0)
102
+ rspec-expectations (~> 3.9.0)
103
+ rspec-mocks (~> 3.9.0)
104
+ rspec-core (3.9.2)
105
+ rspec-support (~> 3.9.3)
106
+ rspec-expectations (3.9.2)
82
107
  diff-lcs (>= 1.2.0, < 2.0)
83
- rspec-support (~> 3.8.0)
84
- rspec-mocks (3.8.1)
108
+ rspec-support (~> 3.9.0)
109
+ rspec-mocks (3.9.1)
85
110
  diff-lcs (>= 1.2.0, < 2.0)
86
- rspec-support (~> 3.8.0)
87
- rspec-support (3.8.2)
111
+ rspec-support (~> 3.9.0)
112
+ rspec-support (3.9.3)
88
113
  safe_yaml (1.0.5)
114
+ sawyer (0.8.2)
115
+ addressable (>= 2.3.5)
116
+ faraday (> 0.8, < 2.0)
89
117
  simple_oauth (0.3.1)
90
- thor (0.20.3)
118
+ thor (1.0.1)
91
119
  thread_safe (0.3.6)
92
- webmock (3.7.1)
120
+ tzinfo (1.2.7)
121
+ thread_safe (~> 0.1)
122
+ webmock (3.8.3)
93
123
  addressable (>= 2.3.6)
94
124
  crack (>= 0.3.2)
95
125
  hashdiff (>= 0.4.0, < 2.0.0)
96
126
  wwtd (1.4.0)
127
+ zeitwerk (2.3.0)
97
128
 
98
129
  PLATFORMS
99
130
  ruby
@@ -102,12 +133,13 @@ DEPENDENCIES
102
133
  appraisal (= 2.2.0)
103
134
  chronic
104
135
  git_reflow!
136
+ github_changelog_generator
105
137
  pry-byebug
106
- rake (~> 12.3)
138
+ rake (~> 13.0.1)
107
139
  rdoc
108
- rspec (~> 3.8)
140
+ rspec (~> 3.9)
109
141
  webmock
110
142
  wwtd (= 1.4)
111
143
 
112
144
  BUNDLED WITH
113
- 2.0.2
145
+ 2.1.4
data/README.md CHANGED
@@ -4,8 +4,8 @@
4
4
  </h1>
5
5
 
6
6
  <p>
7
- <a href="https://circleci.com/gh/reenhanced/git-reflow/tree/master" title="current build status">
8
- <img alt="Circle CI" src="https://circleci.com/gh/reenhanced/gitreflow.svg?style=svg&circle-token=d94825c17c7e33558dc2a82b37afad7b558e5a12">
7
+ <a href="https://actions-badge.atrox.dev/reenhanced/gitreflow/goto?ref=master" title="git workflow">
8
+ <img alt="Git workflow powered by git-reflow" src="https://img.shields.io/endpoint.svg?url=https%3A%2F%2Factions-badge.atrox.dev%2Freenhanced%2Fgitreflow%2Fbadge%3Fref%3Dmaster&style=flat">
9
9
  </a>
10
10
  <a href="https://github.com/reenhanced/gitreflow" title="git workflow">
11
11
  <img alt="Git workflow powered by git-reflow" src="https://img.shields.io/badge/git--reflow-v0.9.0-blue.svg?style=flat">
data/Rakefile CHANGED
@@ -1,8 +1,15 @@
1
1
  #!/usr/bin/env rake
2
2
  require "bundler/gem_tasks"
3
3
  require "rspec/core/rake_task"
4
+ require "github_changelog_generator/task"
4
5
 
5
6
  RSpec::Core::RakeTask.new(:spec)
6
7
 
7
- task :default => :spec
8
+ GitHubChangelogGenerator::RakeTask.new :changelog do |config|
9
+ config.user = 'reenhanced'
10
+ config.project = 'gitreflow'
11
+ config.since_tag = 'v0.9.2'
12
+ config.future_release = 'master'
13
+ end
8
14
 
15
+ task :default => :spec
@@ -1,38 +1,40 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Ensure we require the local version and not one we might have installed already
2
- require File.join([File.dirname(__FILE__),'lib','git_reflow/version.rb'])
4
+ require File.join([File.dirname(__FILE__), 'lib', 'git_reflow/version.rb'])
3
5
  Gem::Specification.new do |s|
4
- s.name = 'git_reflow'
5
- s.version = GitReflow::VERSION
6
- s.license = 'MIT'
7
- s.authors = ["Valentino Stoll", "Robert Stern", "Nicholas Hance"]
8
- s.email = ["dev@reenhanced.com"]
9
- s.homepage = "http://github.com/reenhanced/gitreflow"
10
- s.summary = "A better git process"
11
- s.description = "Git Reflow manages your git workflow."
12
- s.platform = Gem::Platform::RUBY
13
- s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
14
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
- s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
16
- s.has_rdoc = true
17
- s.bindir = "exe"
18
- s.require_paths = ["lib"]
19
- s.rdoc_options << '--title' << 'git_reflow' << '-ri'
6
+ s.name = 'git_reflow'
7
+ s.version = GitReflow::VERSION
8
+ s.license = 'MIT'
9
+ s.authors = ['Valentino Stoll', 'Robert Stern', 'Nicholas Hance']
10
+ s.email = ['dev@reenhanced.com']
11
+ s.homepage = 'http://github.com/reenhanced/gitreflow'
12
+ s.summary = 'A better git process'
13
+ s.description = 'Git Reflow manages your git workflow.'
14
+ s.platform = Gem::Platform::RUBY
15
+ s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
18
+ s.bindir = 'exe'
19
+ s.require_paths = ['lib']
20
+ s.rdoc_options << '--title' << 'git_reflow' << '-ri'
20
21
 
21
22
  s.add_development_dependency('appraisal', '2.2.0')
22
23
  s.add_development_dependency('chronic')
24
+ s.add_development_dependency('github_changelog_generator')
23
25
  s.add_development_dependency('pry-byebug')
24
- s.add_development_dependency('rake', "~> 12.3")
26
+ s.add_development_dependency('rake', '~> 13.0.1')
25
27
  s.add_development_dependency('rdoc')
26
- s.add_development_dependency('rspec', "~> 3.8")
28
+ s.add_development_dependency('rspec', '~> 3.9')
27
29
  s.add_development_dependency('webmock')
28
30
  s.add_development_dependency('wwtd', '1.4')
29
31
 
30
32
  s.add_dependency('bundler', '>= 1.10.0')
33
+ s.add_dependency('codenamev_bitbucket_api', '0.4.1')
31
34
  s.add_dependency('colorize', '>= 0.7.0')
35
+ s.add_dependency('github_api', '0.18.2')
32
36
  s.add_dependency('highline')
33
37
  s.add_dependency('httpclient')
34
- s.add_dependency('github_api', '0.18.2')
35
- s.add_dependency('reenhanced_bitbucket_api', '0.3.2')
36
38
 
37
39
  s.post_install_message = "You need to setup your GitHub OAuth token\nPlease run 'git-reflow setup'"
38
40
  end
@@ -7,6 +7,13 @@ module GitReflow
7
7
 
8
8
  module_function
9
9
 
10
+ # Gets the reqested git configuration variable.
11
+ #
12
+ # @param [String] key The key to get the value(s) for
13
+ # @option options [Boolean] :reload (false) whether to reload the value or use a cached value if available
14
+ # @option options [Boolean] :all (false) whether to return all keys for a multi-valued key
15
+ # @option options [Boolean] :local (false) whether to get the value specific to the current project
16
+ # @return the value of the git configuration
10
17
  def get(key, reload: false, all: false, local: false)
11
18
  return cached_git_config_value(key) unless reload || cached_git_config_value(key).empty?
12
19
 
@@ -19,6 +26,12 @@ module GitReflow
19
26
  cache_git_config_key(key, new_value)
20
27
  end
21
28
 
29
+ # Sets the reqested git configuration variable.
30
+ #
31
+ # @param [String] key The key to set the value for
32
+ # @param [String] value The value to set it to
33
+ # @option options [Boolean] :local (false) whether to set the value specific to the current project
34
+ # @return the value of the git configuration
22
35
  def set(key, value, local: false)
23
36
  value = value.to_s.strip
24
37
  if local
@@ -28,6 +41,12 @@ module GitReflow
28
41
  end
29
42
  end
30
43
 
44
+ # Remove values of the reqested git configuration variable.
45
+ #
46
+ # @param [String] key The key to remove
47
+ # @option options [Boolean] :value (nil) The value of the key to remove
48
+ # @option options [Boolean] :local (false) whether to remove the value specific to the current project
49
+ # @return the result of running the git command
31
50
  def unset(key, value: nil, local: false)
32
51
  value = value.nil? ? '' : "\"#{value}\""
33
52
  if local
@@ -37,6 +56,13 @@ module GitReflow
37
56
  end
38
57
  end
39
58
 
59
+ # Adds a new git configuration variable.
60
+ #
61
+ # @param [String] key The new key to set the value for
62
+ # @param [String] value The value to set it to
63
+ # @option options [Boolean] :local (false) whether to set the value specific to the current project
64
+ # @option options [Boolean] :global (false) whether to set the value globaly. if neither local or global is set gitreflow will default to using a configuration file
65
+ # @return the result of running the git command
40
66
  def add(key, value, local: false, global: false)
41
67
  if global
42
68
  GitReflow::Sandbox.run "git config --global --add #{key} \"#{value}\"", loud: false, blocking: false
@@ -84,56 +84,68 @@ module GitReflow
84
84
  end
85
85
 
86
86
  def authenticate(options = {silent: false})
87
+ self.class.user = options[:user]
88
+ if self.class.user.empty?
89
+ self.class.user = ask("Please enter your GitHub username: ")
90
+ end
91
+
87
92
  if connection and self.class.oauth_token.length > 0
88
- unless options[:silent]
89
- GitReflow.say "Your GitHub account was already setup with: "
90
- GitReflow.say "\tUser Name: #{self.class.user}"
91
- GitReflow.say "\tEndpoint: #{self.class.api_endpoint}"
92
- end
93
- else
94
93
  begin
95
- gh_user = options[:user] || ask("Please enter your GitHub username: ")
96
- gh_password = options[:password] || ask("Please enter your GitHub password (we do NOT store this): ") { |q| q.echo = false }
97
-
98
- @connection = ::Github.new do |config|
99
- config.basic_auth = "#{gh_user}:#{gh_password}"
100
- config.endpoint = GitServer::GitHub.api_endpoint
101
- config.site = GitServer::GitHub.site_url
102
- config.adapter = :net_http
94
+ connection.users.get
95
+ unless options[:silent]
96
+ GitReflow.say "Your GitHub account was already setup with: "
97
+ GitReflow.say "\tUser Name: #{self.class.user}"
98
+ GitReflow.say "\tEndpoint: #{self.class.api_endpoint}"
103
99
  end
100
+ return connection
101
+ rescue ::Github::Error::Unauthorized => e
102
+ GitReflow.logger.debug "[GitHub Error] Current oauth-token is invalid or expired..."
103
+ end
104
+ end
104
105
 
105
- @connection.connection_options = {headers: {"X-GitHub-OTP" => options[:two_factor_auth_code]}} if options[:two_factor_auth_code]
106
+ begin
107
+ gh_password = options[:password] || ask("Please enter your GitHub password (we do NOT store this): ") { |q| q.echo = false }
106
108
 
107
- previous_authorizations = @connection.oauth.all.select {|auth| auth.note == "git-reflow (#{run('hostname', loud: false).strip})" }
108
- if previous_authorizations.any?
109
- authorization = previous_authorizations.last
110
- GitReflow.say "You have previously setup git-reflow on this machine, but we can no longer find the stored token.", :error
111
- GitReflow.say "Please visit https://github.com/settings/tokens and delete the token for: git-reflow (#{run('hostname', loud: false).strip})", :notice
112
- raise "Setup could not be completed."
113
- else
114
- authorization = @connection.oauth.create scopes: ['repo'], note: "git-reflow (#{run('hostname', loud: false).strip})"
115
- end
109
+ @connection = ::Github.new do |config|
110
+ config.basic_auth = "#{self.class.user}:#{gh_password}"
111
+ config.endpoint = GitServer::GitHub.api_endpoint
112
+ config.site = GitServer::GitHub.site_url
113
+ config.adapter = :net_http
114
+ end
116
115
 
117
- self.class.oauth_token = authorization.token
116
+ @connection.connection_options = {headers: {"X-GitHub-OTP" => options[:two_factor_auth_code]}} if options[:two_factor_auth_code]
118
117
 
119
- rescue ::Github::Error::Unauthorized => e
120
- if e.inspect.to_s.include?('two-factor')
121
- begin
122
- # dummy request to trigger a 2FA SMS since a HTTP GET won't do it
123
- @connection.oauth.create scopes: ['repo'], note: "thank Github for not making this straightforward"
124
- rescue ::Github::Error::Unauthorized
125
- ensure
126
- two_factor_code = ask("Please enter your two-factor authentication code: ")
127
- self.authenticate options.merge({user: gh_user, password: gh_password, two_factor_auth_code: two_factor_code})
128
- end
129
- else
130
- GitReflow.say "Github Authentication Error: #{e.inspect}", :error
118
+ previous_authorizations = @connection.oauth.all.select {|auth| auth.note == "git-reflow (#{run('hostname', loud: false).strip})" }
119
+ if previous_authorizations.any?
120
+ authorization = previous_authorizations.last
121
+ GitReflow.say "You have previously setup git-reflow on this machine, but we can no longer find the stored token.", :error
122
+ GitReflow.say "Please visit https://github.com/settings/tokens and delete the token for: git-reflow (#{run('hostname', loud: false).strip})", :notice
123
+ raise "Setup could not be completed."
124
+ else
125
+ authorization = @connection.oauth.create scopes: ['repo'], note: "git-reflow (#{run('hostname', loud: false).strip})"
126
+ end
127
+
128
+ self.class.oauth_token = authorization.token
129
+
130
+ rescue ::Github::Error::Unauthorized => e
131
+ if e.inspect.to_s.include?('two-factor')
132
+ begin
133
+ # dummy request to trigger a 2FA SMS since a HTTP GET won't do it
134
+ @connection.oauth.create scopes: ['repo'], note: "thank Github for not making this straightforward"
135
+ rescue ::Github::Error::Unauthorized
136
+ ensure
137
+ two_factor_code = ask("Please enter your two-factor authentication code: ")
138
+ self.authenticate options.merge({user: self.class.user, password: gh_password, two_factor_auth_code: two_factor_code})
131
139
  end
132
- rescue StandardError => e
133
- raise "We were unable to authenticate with Github."
134
140
  else
135
- GitReflow.say "Your GitHub account was successfully setup!", :success
141
+ GitReflow.say "Github Authentication Error: #{e.inspect}", :error
142
+ raise "Setup could not be completed."
136
143
  end
144
+ rescue StandardError => e
145
+ raise "We were unable to authenticate with Github."
146
+ else
147
+ GitReflow.say "Your GitHub account was successfully setup!", :success
148
+
137
149
  end
138
150
 
139
151
  @connection
@@ -1,3 +1,3 @@
1
1
  module GitReflow
2
- VERSION = "0.9.2"
2
+ VERSION = "0.9.3"
3
3
  end
@@ -0,0 +1,3 @@
1
+ {
2
+ "error" : "GET https://api.github.com/authorizations: 401 Bad credentials"
3
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "login": "reenhanced",
3
+ "id": 1,
4
+ "avatar_url": "https://github.com/images/error/octocat_happy.gif",
5
+ "gravatar_id": "somehexcode",
6
+ "url": "https://api.github.com/users/reenhanced",
7
+ "name": "monalisa octocat",
8
+ "company": "GitHub",
9
+ "blog": "https://github.com/blog",
10
+ "location": "San Francisco",
11
+ "email": "octocat@github.com",
12
+ "hireable": false,
13
+ "bio": "There once was...",
14
+ "public_repos": 2,
15
+ "public_gists": 1,
16
+ "followers": 20,
17
+ "following": 0,
18
+ "html_url": "https://github.com/reenhanced",
19
+ "created_at": "2008-01-14T04:33:35Z",
20
+ "type": "User",
21
+ "total_private_repos": 100,
22
+ "owned_private_repos": 100,
23
+ "private_gists": 81,
24
+ "disk_usage": 10000,
25
+ "collaborators": 8,
26
+ "plan": {
27
+ "name": "Medium",
28
+ "space": 400,
29
+ "collaborators": 10,
30
+ "private_repos": 20
31
+ }
32
+ }
@@ -78,7 +78,7 @@ describe GitReflow::GitServer::GitHub do
78
78
  subject { github.authenticate }
79
79
 
80
80
  before do
81
- allow(GitReflow::GitServer::GitHub).to receive(:user).and_return('reenhanced')
81
+ allow(GitReflow::GitServer::GitHub).to receive(:user).and_return(user)
82
82
  allow(github_api).to receive(:oauth).and_return(github_authorizations)
83
83
  allow(github_api).to receive_message_chain(:oauth, :all).and_return([])
84
84
  allow(github).to receive(:run).with('hostname', loud: false).and_return(hostname)
@@ -151,12 +151,86 @@ describe GitReflow::GitServer::GitHub do
151
151
  body: { error: "GET https://api.github.com/authorizations: 401 Bad credentials" }
152
152
  }}
153
153
 
154
+ before do
155
+ allow(GitReflow::Config).to receive(:get).and_call_original
156
+ allow(GitReflow::Config).to receive(:get).with('github.oauth-token').and_return(oauth_token_hash[:token])
157
+ allow(Github::Client).to receive(:new).and_return(github_api)
158
+ allow(github_authorizations).to receive(:authenticated?).and_return(true)
159
+ allow(github_api.oauth).to receive(:create).with({ scopes: ['repo'], note: "git-reflow (#{hostname})" }).and_return(oauth_token_hash)
160
+
161
+ stub_request(:get, %r{/user}).
162
+ to_return(
163
+ body: Fixture.new('authentication_failure.json').to_s,
164
+ status: 401,
165
+ headers: {'content-type' => 'application/json; charset=utf-8', status: 'Unauthorized'},
166
+ )
167
+ end
168
+
169
+ it "notifies the user of successful setup" do
170
+ expect { subject }.to have_said "Your GitHub account was successfully setup!", :success
171
+ end
172
+
173
+ it "creates a new GitHub oauth token" do
174
+ expect(github_api.oauth).to receive(:create).and_return(oauth_token_hash)
175
+ subject
176
+ end
177
+
178
+ it "creates git config keys for github connections" do
179
+ expect{ subject }.to have_run_command_silently "git config -f #{GitReflow::Config::CONFIG_FILE_PATH} --replace-all github.site \"#{github_site}\"", blocking: false
180
+ expect{ subject }.to have_run_command_silently "git config -f #{GitReflow::Config::CONFIG_FILE_PATH} --replace-all github.endpoint \"#{github_api_endpoint}\"", blocking: false
181
+ expect{ subject }.to have_run_command_silently "git config -f #{GitReflow::Config::CONFIG_FILE_PATH} --replace-all github.oauth-token \"#{oauth_token_hash[:token]}\"", blocking: false
182
+ expect{ subject }.to have_run_command_silently "git config -f #{GitReflow::Config::CONFIG_FILE_PATH} --replace-all reflow.git-server \"GitHub\"", blocking: false
183
+ end
184
+
185
+ end
186
+ end
187
+
188
+ context 'already authenticated' do
189
+ let(:oauth_token) { "abc123" }
190
+
191
+ before do
192
+ allow(GitReflow::Config).to receive(:get).and_call_original
193
+ allow(GitReflow::Config).to receive(:get).with('github.oauth-token').and_return(oauth_token)
194
+ end
195
+
196
+ context "and authentication token is still valid" do
197
+ before do
198
+ stub_request(:get, %r{/user}).
199
+ to_return(
200
+ body: Fixture.new('users/user.json').to_s,
201
+ status: 200,
202
+ headers: { content_type: "application/json; charset=utf-8" }
203
+ )
204
+
205
+ allow(Github::Client).to receive(:new).and_return(github_api)
206
+ allow(github_api).to receive(:oauth).and_return(github_authorizations)
207
+ allow(github_authorizations).to receive(:authenticated?).and_return(true)
208
+ allow(github_api.oauth).to receive(:create).with({ scopes: ['repo'], note: "git-reflow (#{hostname})" }).and_return(oauth_token_hash)
209
+ end
210
+
211
+ it "resolves all missing git-reflow configurations" do
212
+ expect{ subject }.to have_run_command_silently "git config -f #{GitReflow::Config::CONFIG_FILE_PATH} --replace-all github.site \"#{github_site}\"", blocking: false
213
+ expect{ subject }.to have_run_command_silently "git config -f #{GitReflow::Config::CONFIG_FILE_PATH} --replace-all github.endpoint \"#{github_api_endpoint}\"", blocking: false
214
+ expect{ subject }.to have_run_command_silently "git config -f #{GitReflow::Config::CONFIG_FILE_PATH} --replace-all reflow.git-server \"GitHub\"", blocking: false
215
+ expect { subject }.to have_said "Your GitHub account was already setup with: "
216
+ expect { subject }.to have_said "\tUser Name: #{user}"
217
+ expect { subject }.to have_said "\tEndpoint: #{github_api_endpoint}"
218
+ end
219
+ end
220
+
221
+ context "and authentication token is expired" do
222
+ let(:unauthorized_error_response) {{
223
+ response_headers: {'content-type' => 'application/json; charset=utf-8', status: 'Unauthorized'},
224
+ method: 'GET',
225
+ status: '401',
226
+ body: { error: "GET https://api.github.com/authorizations: 401 Bad credentials" }
227
+ }}
228
+
154
229
  before do
155
230
  allow(Github::Client).to receive(:new).and_raise Github::Error::Unauthorized.new(unauthorized_error_response)
156
231
  end
157
232
 
158
- it "notifies user of invalid login details" do
159
- expect { subject }.to have_said "Github Authentication Error: #{Github::Error::Unauthorized.new(unauthorized_error_response).inspect}", :error
233
+ it "requests a new oauth token" do
160
234
  end
161
235
  end
162
236
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git_reflow
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.2
4
+ version: 0.9.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Valentino Stoll
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2019-09-10 00:00:00.000000000 Z
13
+ date: 2020-06-02 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: appraisal
@@ -40,6 +40,20 @@ dependencies:
40
40
  - - ">="
41
41
  - !ruby/object:Gem::Version
42
42
  version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: github_changelog_generator
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
43
57
  - !ruby/object:Gem::Dependency
44
58
  name: pry-byebug
45
59
  requirement: !ruby/object:Gem::Requirement
@@ -60,14 +74,14 @@ dependencies:
60
74
  requirements:
61
75
  - - "~>"
62
76
  - !ruby/object:Gem::Version
63
- version: '12.3'
77
+ version: 13.0.1
64
78
  type: :development
65
79
  prerelease: false
66
80
  version_requirements: !ruby/object:Gem::Requirement
67
81
  requirements:
68
82
  - - "~>"
69
83
  - !ruby/object:Gem::Version
70
- version: '12.3'
84
+ version: 13.0.1
71
85
  - !ruby/object:Gem::Dependency
72
86
  name: rdoc
73
87
  requirement: !ruby/object:Gem::Requirement
@@ -88,14 +102,14 @@ dependencies:
88
102
  requirements:
89
103
  - - "~>"
90
104
  - !ruby/object:Gem::Version
91
- version: '3.8'
105
+ version: '3.9'
92
106
  type: :development
93
107
  prerelease: false
94
108
  version_requirements: !ruby/object:Gem::Requirement
95
109
  requirements:
96
110
  - - "~>"
97
111
  - !ruby/object:Gem::Version
98
- version: '3.8'
112
+ version: '3.9'
99
113
  - !ruby/object:Gem::Dependency
100
114
  name: webmock
101
115
  requirement: !ruby/object:Gem::Requirement
@@ -139,75 +153,75 @@ dependencies:
139
153
  - !ruby/object:Gem::Version
140
154
  version: 1.10.0
141
155
  - !ruby/object:Gem::Dependency
142
- name: colorize
156
+ name: codenamev_bitbucket_api
143
157
  requirement: !ruby/object:Gem::Requirement
144
158
  requirements:
145
- - - ">="
159
+ - - '='
146
160
  - !ruby/object:Gem::Version
147
- version: 0.7.0
161
+ version: 0.4.1
148
162
  type: :runtime
149
163
  prerelease: false
150
164
  version_requirements: !ruby/object:Gem::Requirement
151
165
  requirements:
152
- - - ">="
166
+ - - '='
153
167
  - !ruby/object:Gem::Version
154
- version: 0.7.0
168
+ version: 0.4.1
155
169
  - !ruby/object:Gem::Dependency
156
- name: highline
170
+ name: colorize
157
171
  requirement: !ruby/object:Gem::Requirement
158
172
  requirements:
159
173
  - - ">="
160
174
  - !ruby/object:Gem::Version
161
- version: '0'
175
+ version: 0.7.0
162
176
  type: :runtime
163
177
  prerelease: false
164
178
  version_requirements: !ruby/object:Gem::Requirement
165
179
  requirements:
166
180
  - - ">="
167
181
  - !ruby/object:Gem::Version
168
- version: '0'
182
+ version: 0.7.0
169
183
  - !ruby/object:Gem::Dependency
170
- name: httpclient
184
+ name: github_api
171
185
  requirement: !ruby/object:Gem::Requirement
172
186
  requirements:
173
- - - ">="
187
+ - - '='
174
188
  - !ruby/object:Gem::Version
175
- version: '0'
189
+ version: 0.18.2
176
190
  type: :runtime
177
191
  prerelease: false
178
192
  version_requirements: !ruby/object:Gem::Requirement
179
193
  requirements:
180
- - - ">="
194
+ - - '='
181
195
  - !ruby/object:Gem::Version
182
- version: '0'
196
+ version: 0.18.2
183
197
  - !ruby/object:Gem::Dependency
184
- name: github_api
198
+ name: highline
185
199
  requirement: !ruby/object:Gem::Requirement
186
200
  requirements:
187
- - - '='
201
+ - - ">="
188
202
  - !ruby/object:Gem::Version
189
- version: 0.18.2
203
+ version: '0'
190
204
  type: :runtime
191
205
  prerelease: false
192
206
  version_requirements: !ruby/object:Gem::Requirement
193
207
  requirements:
194
- - - '='
208
+ - - ">="
195
209
  - !ruby/object:Gem::Version
196
- version: 0.18.2
210
+ version: '0'
197
211
  - !ruby/object:Gem::Dependency
198
- name: reenhanced_bitbucket_api
212
+ name: httpclient
199
213
  requirement: !ruby/object:Gem::Requirement
200
214
  requirements:
201
- - - '='
215
+ - - ">="
202
216
  - !ruby/object:Gem::Version
203
- version: 0.3.2
217
+ version: '0'
204
218
  type: :runtime
205
219
  prerelease: false
206
220
  version_requirements: !ruby/object:Gem::Requirement
207
221
  requirements:
208
- - - '='
222
+ - - ">="
209
223
  - !ruby/object:Gem::Version
210
- version: 0.3.2
224
+ version: '0'
211
225
  description: Git Reflow manages your git workflow.
212
226
  email:
213
227
  - dev@reenhanced.com
@@ -216,6 +230,7 @@ executables:
216
230
  extensions: []
217
231
  extra_rdoc_files: []
218
232
  files:
233
+ - ".github/workflows/multi-ruby-tests.yml"
219
234
  - ".gitignore"
220
235
  - ".rubocop.yml"
221
236
  - ".ruby-version"
@@ -230,7 +245,6 @@ files:
230
245
  - _config.yml
231
246
  - bin/console
232
247
  - bin/setup
233
- - circle.yml
234
248
  - exe/git-reflow
235
249
  - git_reflow.gemspec
236
250
  - lib/git_reflow.rb
@@ -255,6 +269,7 @@ files:
255
269
  - lib/git_reflow/workflow.rb
256
270
  - lib/git_reflow/workflows/FlatMergeWorkflow
257
271
  - lib/git_reflow/workflows/core.rb
272
+ - spec/fixtures/authentication_failure.json
258
273
  - spec/fixtures/awesome_workflow.rb
259
274
  - spec/fixtures/git/git_config
260
275
  - spec/fixtures/issues/comment.json.erb
@@ -276,6 +291,7 @@ files:
276
291
  - spec/fixtures/repositories/commit.json.erb
277
292
  - spec/fixtures/repositories/commits.json.erb
278
293
  - spec/fixtures/repositories/statuses.json
294
+ - spec/fixtures/users/user.json
279
295
  - spec/lib/git_reflow/config_spec.rb
280
296
  - spec/lib/git_reflow/git_helpers_spec.rb
281
297
  - spec/lib/git_reflow/git_server/bit_bucket_spec.rb
@@ -319,11 +335,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
319
335
  - !ruby/object:Gem::Version
320
336
  version: '0'
321
337
  requirements: []
322
- rubygems_version: 3.0.6
338
+ rubygems_version: 3.1.2
323
339
  signing_key:
324
340
  specification_version: 4
325
341
  summary: A better git process
326
342
  test_files:
343
+ - spec/fixtures/authentication_failure.json
327
344
  - spec/fixtures/awesome_workflow.rb
328
345
  - spec/fixtures/git/git_config
329
346
  - spec/fixtures/issues/comment.json.erb
@@ -345,6 +362,7 @@ test_files:
345
362
  - spec/fixtures/repositories/commit.json.erb
346
363
  - spec/fixtures/repositories/commits.json.erb
347
364
  - spec/fixtures/repositories/statuses.json
365
+ - spec/fixtures/users/user.json
348
366
  - spec/lib/git_reflow/config_spec.rb
349
367
  - spec/lib/git_reflow/git_helpers_spec.rb
350
368
  - spec/lib/git_reflow/git_server/bit_bucket_spec.rb
data/circle.yml DELETED
@@ -1,26 +0,0 @@
1
- dependencies:
2
- cache_directories:
3
- - '~/.rvm/rubies'
4
- - 'vendor'
5
-
6
- override:
7
- - >
8
- case $CIRCLE_NODE_INDEX in
9
- 0)
10
- rvm-exec 2.3.8 gem install bundler
11
- rvm-exec 2.3.8 bash -c "bundle check --path=vendor/bundle_2.3 || bundle install --path=vendor/bundle_2.3"
12
- ;;
13
- 1)
14
- rvm-exec 2.4.5 gem install bundler
15
- rvm-exec 2.4.5 bash -c "bundle check --path=vendor/bundle_2.4 || bundle install --path=vendor/bundle_2.4"
16
- ;;
17
- 2)
18
- rvm-exec ruby-head gem install bundler
19
- rvm-exec ruby-head bash -c "bundle check --path=vendor/bundle_head || bundle install --path=vendor/bundle_head"
20
- ;;
21
- esac
22
-
23
- test:
24
- override:
25
- - case $CIRCLE_NODE_INDEX in 0) rvm-exec 2.3.8 bundle exec rake ;; 1) rvm-exec 2.4.5 bundle exec rake ;; 2) rvm-exec ruby-head bundle exec rake ;; esac:
26
- parallel: true