codeowners-checker 1.0.5 → 1.1.1
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 +4 -4
- data/README.md +6 -2
- data/codeowners-checker.gemspec +1 -0
- data/lib/codeowners/checker/group/pattern.rb +9 -10
- data/lib/codeowners/checker/owners_list.rb +12 -4
- data/lib/codeowners/checker/version.rb +1 -1
- data/lib/codeowners/cli/base.rb +2 -0
- data/lib/codeowners/cli/config.rb +8 -2
- data/lib/codeowners/cli/owners_list_handler.rb +9 -7
- data/lib/codeowners/cli/warner.rb +27 -0
- data/lib/codeowners/config.rb +25 -1
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d9d7332bd9c20b04f99d88d0d91ba7430e64ea45af0720f3b96b66aab535bd6
|
4
|
+
data.tar.gz: 52a7866ebda6380f924c18f80ab689e6cd5416f5ea0da8e96b6ea09e1645eca3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 89a86ecabad2150b1f1f17f202ef70226d071754bd689d349ef412c23d1423446600648f79d7ec1f8508b1a432b154a156d9e9261008c93168de6633f79109f0
|
7
|
+
data.tar.gz: 554ee80bdb5cad8eada8b850dcca17c147511bbbddd114bc03a2ee3d79f28a5e68fd9543a599887e606bf050e519038f9c69a0c5f27eb7e97b10c542ddc0ce49
|
data/README.md
CHANGED
@@ -33,7 +33,11 @@ Example OWNERS:
|
|
33
33
|
GitHub credentials are taken from the following environment variables. You might want to put them into your .bashrc or equivalent:
|
34
34
|
|
35
35
|
$ export GITHUB_TOKEN='your GitHub PAT' # your personal access token from GitHub
|
36
|
-
|
36
|
+
|
37
|
+
The Github organization used to retrieve the groups/teams is automatically set according to the git remote URL. You can check and change this value using:
|
38
|
+
|
39
|
+
$ codeowners-checker config list
|
40
|
+
$ codeowners-checker config organization <organization>
|
37
41
|
|
38
42
|
You can generate your PAT in [Settings -> Developer settings -> Personal access tokens on GitHub](https://github.com/settings/tokens) and `read:org` scope is **required**.
|
39
43
|
|
@@ -187,7 +191,7 @@ Or you can filter any owner as a parameter:
|
|
187
191
|
|
188
192
|
## Development
|
189
193
|
|
190
|
-
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
194
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `bundle exec rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
191
195
|
|
192
196
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
193
197
|
|
data/codeowners-checker.gemspec
CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
|
|
23
23
|
spec.add_dependency 'fuzzy_match', '~> 2.1'
|
24
24
|
spec.add_dependency 'git', '~> 1.5'
|
25
25
|
spec.add_dependency 'json', '~> 2.1'
|
26
|
+
spec.add_dependency 'pathspec', '~> 0.2.0'
|
26
27
|
spec.add_dependency 'rest-client', '~> 2.1'
|
27
28
|
spec.add_dependency 'thor', '~> 0.20.3'
|
28
29
|
spec.add_development_dependency 'bundler', '~> 1.16'
|
@@ -2,6 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative 'line'
|
4
4
|
require_relative '../owner'
|
5
|
+
require 'pathspec'
|
5
6
|
|
6
7
|
module Codeowners
|
7
8
|
class Checker
|
@@ -10,7 +11,7 @@ module Codeowners
|
|
10
11
|
# Parse the line into pattern, owners and whitespaces.
|
11
12
|
class Pattern < Line
|
12
13
|
attr_accessor :owners, :whitespace
|
13
|
-
attr_reader :pattern
|
14
|
+
attr_reader :pattern, :spec
|
14
15
|
|
15
16
|
def self.match?(line)
|
16
17
|
_pattern, *owners = line.split(/\s+/)
|
@@ -35,24 +36,18 @@ module Codeowners
|
|
35
36
|
def parse(line)
|
36
37
|
@pattern, *@owners = line.split(/\s+/)
|
37
38
|
@whitespace = line.split('@').first.count(' ') - 1
|
39
|
+
@spec = parse_spec(@pattern)
|
38
40
|
end
|
39
41
|
|
40
42
|
def match_file?(file)
|
41
|
-
|
42
|
-
end
|
43
|
-
|
44
|
-
def fn_options
|
45
|
-
if pattern.include?('**')
|
46
|
-
File::FNM_DOTMATCH
|
47
|
-
else
|
48
|
-
File::FNM_DOTMATCH | File::FNM_PATHNAME
|
49
|
-
end
|
43
|
+
spec.match file
|
50
44
|
end
|
51
45
|
|
52
46
|
def pattern=(new_pattern)
|
53
47
|
@whitespace += @pattern.size - new_pattern.size
|
54
48
|
@whitespace = 1 if @whitespace < 1
|
55
49
|
|
50
|
+
@spec = parse_spec(new_pattern)
|
56
51
|
@pattern = new_pattern
|
57
52
|
end
|
58
53
|
|
@@ -68,6 +63,10 @@ module Codeowners
|
|
68
63
|
def to_s
|
69
64
|
to_file(preserve_whitespaces: false)
|
70
65
|
end
|
66
|
+
|
67
|
+
def parse_spec(pattern)
|
68
|
+
PathSpec.from_lines(pattern)
|
69
|
+
end
|
71
70
|
end
|
72
71
|
end
|
73
72
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require_relative 'file_as_array'
|
4
|
+
require_relative '../config'
|
4
5
|
|
5
6
|
module Codeowners
|
6
7
|
class Checker
|
@@ -9,10 +10,17 @@ module Codeowners
|
|
9
10
|
attr_accessor :validate_owners, :filename
|
10
11
|
attr_writer :owners
|
11
12
|
|
12
|
-
def initialize(repo)
|
13
|
+
def initialize(repo, _config = nil)
|
13
14
|
@validate_owners = true
|
14
15
|
# doing gsub here ensures the files are always in the same directory
|
15
16
|
@filename = CodeOwners.filename(repo).gsub('CODEOWNERS', 'OWNERS')
|
17
|
+
@config ||= Codeowners::Config.new
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.persist!(repo, owners, config = nil)
|
21
|
+
owner_list = new(repo, config)
|
22
|
+
owner_list.owners = owners
|
23
|
+
owner_list.persist!
|
16
24
|
end
|
17
25
|
|
18
26
|
def persist!
|
@@ -30,7 +38,7 @@ module Codeowners
|
|
30
38
|
|
31
39
|
@owners ||=
|
32
40
|
if github_credentials_exist?
|
33
|
-
Codeowners::GithubFetcher.get_owners(
|
41
|
+
Codeowners::GithubFetcher.get_owners(@config.default_organization, ENV['GITHUB_TOKEN'])
|
34
42
|
else
|
35
43
|
FileAsArray.new(@filename).content
|
36
44
|
end
|
@@ -38,8 +46,8 @@ module Codeowners
|
|
38
46
|
|
39
47
|
def github_credentials_exist?
|
40
48
|
token = ENV['GITHUB_TOKEN']
|
41
|
-
organization =
|
42
|
-
token && organization
|
49
|
+
organization = @config.default_organization
|
50
|
+
token && !organization.empty?
|
43
51
|
end
|
44
52
|
|
45
53
|
def invalid_owners(codeowners)
|
data/lib/codeowners/cli/base.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require 'thor'
|
4
4
|
|
5
5
|
require_relative '../config'
|
6
|
+
require_relative 'warner'
|
6
7
|
|
7
8
|
module Codeowners
|
8
9
|
module Cli
|
@@ -13,6 +14,7 @@ module Codeowners
|
|
13
14
|
def initialize(args = [], options = {}, config = {})
|
14
15
|
super
|
15
16
|
@config ||= config[:config] || default_config
|
17
|
+
Warner.check_warnings
|
16
18
|
end
|
17
19
|
|
18
20
|
private
|
@@ -8,10 +8,10 @@ module Codeowners
|
|
8
8
|
class Config < Base
|
9
9
|
default_task :list
|
10
10
|
|
11
|
-
desc 'list', 'List the default
|
11
|
+
desc 'list', 'List the default values configured in the config file'
|
12
12
|
def list
|
13
13
|
puts(config.to_h.map { |name, value| "#{name}: #{value.inspect}" })
|
14
|
-
help_stderr if config.default_owner.empty?
|
14
|
+
help_stderr if config.default_owner.empty? || config.default_organization.empty?
|
15
15
|
end
|
16
16
|
|
17
17
|
desc 'owner <name>', 'Configure a default owner name'
|
@@ -19,6 +19,12 @@ module Codeowners
|
|
19
19
|
config.default_owner = name
|
20
20
|
puts "Default owner configured to #{name}"
|
21
21
|
end
|
22
|
+
|
23
|
+
desc 'organization <name>', 'Configure a default organization name'
|
24
|
+
def organization(name)
|
25
|
+
config.default_organization = name
|
26
|
+
puts "Default organization configured to #{name}"
|
27
|
+
end
|
22
28
|
end
|
23
29
|
end
|
24
30
|
end
|
@@ -8,22 +8,24 @@ module Codeowners
|
|
8
8
|
class OwnersListHandler < Base
|
9
9
|
default_task :fetch
|
10
10
|
|
11
|
+
FETCH_OWNER_MESSAGE = 'Fetching owners list from GitHub ...'
|
12
|
+
ASK_GITHUB_ORGANIZATION = 'GitHub organization (e.g. github): '
|
13
|
+
ASK_GITHUB_TOKEN = 'Enter GitHub token: '
|
14
|
+
|
11
15
|
desc 'fetch [REPO]', 'Fetches .github/OWNERS based on github organization'
|
12
16
|
def fetch(repo = '.')
|
13
17
|
@repo = repo
|
14
18
|
owners = owners_from_github
|
15
|
-
|
16
|
-
owners_list.owners = owners
|
17
|
-
owners_list.persist!
|
19
|
+
Checker::OwnersList.persist!(repo, owners)
|
18
20
|
end
|
19
21
|
|
20
22
|
no_commands do
|
21
23
|
def owners_from_github
|
22
|
-
organization =
|
23
|
-
organization
|
24
|
+
organization = config.default_organization
|
25
|
+
organization = ask(ASK_GITHUB_ORGANIZATION) if organization.empty?
|
24
26
|
token = ENV['GITHUB_TOKEN']
|
25
|
-
token ||= ask(
|
26
|
-
puts
|
27
|
+
token ||= ask(ASK_GITHUB_TOKEN, echo: false)
|
28
|
+
puts FETCH_OWNER_MESSAGE
|
27
29
|
Codeowners::GithubFetcher.get_owners(organization, token)
|
28
30
|
end
|
29
31
|
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Codeowners
|
4
|
+
module Cli
|
5
|
+
# Checks and prints deprecation warnings.
|
6
|
+
module Warner
|
7
|
+
class << self
|
8
|
+
def check_warnings
|
9
|
+
check_github_env
|
10
|
+
end
|
11
|
+
|
12
|
+
def warn(msg)
|
13
|
+
puts "[WARNING] #{msg}"
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
|
18
|
+
def check_github_env
|
19
|
+
return if ENV['GITHUB_ORGANIZATION'].nil? || ENV['GITHUB_ORGANIZATION'].empty?
|
20
|
+
|
21
|
+
warn 'Usage of GITHUB_ORGANIZATION ENV variable has been deprecated.'\
|
22
|
+
'Run `codeowners-checker config organization #{organization}` instead.'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
data/lib/codeowners/config.rb
CHANGED
@@ -40,10 +40,34 @@ module Codeowners
|
|
40
40
|
@git.config('user.owner', name)
|
41
41
|
end
|
42
42
|
|
43
|
+
def default_organization
|
44
|
+
config_org = @git.config('user.organization')
|
45
|
+
return config_org.strip unless config_org.nil? || config_org.strip.empty?
|
46
|
+
|
47
|
+
parse_organization_from_origin || ''
|
48
|
+
end
|
49
|
+
|
50
|
+
def default_organization=(name)
|
51
|
+
@git.config('user.organization', name)
|
52
|
+
end
|
53
|
+
|
43
54
|
def to_h
|
44
55
|
{
|
45
|
-
default_owner: default_owner
|
56
|
+
default_owner: default_owner,
|
57
|
+
default_organization: default_organization
|
46
58
|
}
|
47
59
|
end
|
60
|
+
|
61
|
+
protected
|
62
|
+
|
63
|
+
def parse_organization_from_origin
|
64
|
+
origin_url = @git.config('remote.origin.url')
|
65
|
+
return if origin_url.nil? || origin_url.strip.empty?
|
66
|
+
|
67
|
+
org_regexp = origin_url.match(%r{^https?://.+?/(?<org>.+?)/|:(?<org>.+?)/})
|
68
|
+
return if org_regexp.nil? || org_regexp[:org].strip.empty?
|
69
|
+
|
70
|
+
org_regexp[:org].strip
|
71
|
+
end
|
48
72
|
end
|
49
73
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: codeowners-checker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jônatas Davi Paganini
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date:
|
13
|
+
date: 2020-02-03 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: fuzzy_match
|
@@ -54,6 +54,20 @@ dependencies:
|
|
54
54
|
- - "~>"
|
55
55
|
- !ruby/object:Gem::Version
|
56
56
|
version: '2.1'
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: pathspec
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - "~>"
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 0.2.0
|
64
|
+
type: :runtime
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - "~>"
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 0.2.0
|
57
71
|
- !ruby/object:Gem::Dependency
|
58
72
|
name: rest-client
|
59
73
|
requirement: !ruby/object:Gem::Requirement
|
@@ -247,6 +261,7 @@ files:
|
|
247
261
|
- lib/codeowners/cli/main.rb
|
248
262
|
- lib/codeowners/cli/owners_list_handler.rb
|
249
263
|
- lib/codeowners/cli/suggest_file_from_pattern.rb
|
264
|
+
- lib/codeowners/cli/warner.rb
|
250
265
|
- lib/codeowners/cli/wizards.rb
|
251
266
|
- lib/codeowners/cli/wizards/new_file_wizard.rb
|
252
267
|
- lib/codeowners/cli/wizards/new_owner_wizard.rb
|