git-lint 1.4.0 → 2.0.0
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -3
- data/lib/git/lint.rb +1 -3
- data/lib/git/lint/analyzers/abstract.rb +3 -3
- data/lib/git/lint/analyzers/commit_author_name.rb +1 -1
- data/lib/git/lint/analyzers/commit_body_leading_line.rb +3 -3
- data/lib/git/lint/analyzers/commit_subject_prefix.rb +1 -1
- data/lib/git/lint/analyzers/commit_trailer_collaborator_capitalization.rb +2 -2
- data/lib/git/lint/analyzers/commit_trailer_collaborator_duplication.rb +3 -3
- data/lib/git/lint/analyzers/commit_trailer_collaborator_email.rb +2 -2
- data/lib/git/lint/analyzers/commit_trailer_collaborator_key.rb +2 -2
- data/lib/git/lint/analyzers/commit_trailer_collaborator_name.rb +2 -2
- data/lib/git/lint/branches/environments/circle_ci.rb +6 -6
- data/lib/git/lint/branches/environments/git_hub_action.rb +6 -6
- data/lib/git/lint/branches/environments/local.rb +6 -6
- data/lib/git/lint/branches/environments/netlify_ci.rb +8 -8
- data/lib/git/lint/branches/environments/travis_ci.rb +10 -10
- data/lib/git/lint/branches/feature.rb +6 -7
- data/lib/git/lint/cli.rb +9 -11
- data/lib/git/lint/collector.rb +3 -3
- data/lib/git/lint/identity.rb +1 -1
- data/lib/git/lint/parsers/trailers/collaborator.rb +2 -2
- data/lib/git/lint/reporters/branch.rb +14 -14
- data/lib/git/lint/runner.rb +5 -4
- data/lib/git/lint/validators/capitalization.rb +1 -1
- data/lib/git/lint/validators/name.rb +1 -1
- metadata +22 -11
- metadata.gz.sig +2 -2
- data/lib/git/kit/repo.rb +0 -30
- data/lib/git/lint/commits/saved.rb +0 -104
- data/lib/git/lint/commits/unsaved.rb +0 -120
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0f890a2d629a880fe71b362f043772b891e8bb6610eeafac4ce7d68f20ccc636
|
4
|
+
data.tar.gz: d8e5e33287b6e4be9787a7d1c9ee8d4bc45a7df5de993b52b732b2de56fa1981
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a019791e28fe05d1bf198d60c5b8516481e68e1658dc1749d3b4a8c355d128c1f64f472d56b76c57305e2f0d58a2cf2ca6af86fe6fbd978f020d6bc60b2233b4
|
7
|
+
data.tar.gz: a10d7d047daff9d31d88fd53a435f12445e59013bc16df30ad877d7738d12ec45acead33e916c7dd122e527b48faea066a332fbe43b454e2ffec76602089e1b0
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
@@ -1,3 +1,2 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
�Kؗ��*o4ؿ�b�wNN�����p}֎@�",�b�\�3�EN̅�L�*j��O���b}�ӅM9��ěe H�˳�P
|
1
|
+
���;��
|
2
|
+
$�#6l��H�A�ܳ?��
|
data/lib/git/lint.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "git_plus"
|
3
4
|
require "git/lint/identity"
|
4
|
-
require "git/kit/repo"
|
5
5
|
require "git/lint/refinements/strings"
|
6
6
|
require "git/lint/errors/base"
|
7
7
|
require "git/lint/errors/severity"
|
@@ -11,8 +11,6 @@ require "git/lint/validators/email"
|
|
11
11
|
require "git/lint/validators/name"
|
12
12
|
require "git/lint/validators/capitalization"
|
13
13
|
require "git/lint/parsers/trailers/collaborator"
|
14
|
-
require "git/lint/commits/saved"
|
15
|
-
require "git/lint/commits/unsaved"
|
16
14
|
require "git/lint/branches/environments/local"
|
17
15
|
require "git/lint/branches/environments/circle_ci"
|
18
16
|
require "git/lint/branches/environments/git_hub_action"
|
@@ -91,10 +91,10 @@ module Git
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
-
def
|
95
|
-
commit.
|
94
|
+
def affected_commit_trailers
|
95
|
+
commit.trailers
|
96
96
|
.each.with_object([])
|
97
|
-
.with_index(commit.
|
97
|
+
.with_index(commit.trailers_index) do |(line, lines), index|
|
98
98
|
yield if block_given?
|
99
99
|
lines << self.class.build_issue_line(index, line) if invalid_line? line
|
100
100
|
end
|
@@ -12,12 +12,12 @@ module Git
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def valid?
|
15
|
-
|
16
|
-
subject, body =
|
15
|
+
message = commit.message
|
16
|
+
subject, body = message.split "\n", 2
|
17
17
|
|
18
18
|
return true if !String(subject).empty? && String(body).strip.empty?
|
19
19
|
|
20
|
-
|
20
|
+
message.match?(/\A.+(\n\n|\#).+/m)
|
21
21
|
end
|
22
22
|
|
23
23
|
def issue
|
@@ -23,7 +23,7 @@ module Git
|
|
23
23
|
# rubocop:enable Metrics/ParameterLists
|
24
24
|
|
25
25
|
def valid?
|
26
|
-
|
26
|
+
affected_commit_trailers.empty?
|
27
27
|
end
|
28
28
|
|
29
29
|
def issue
|
@@ -31,7 +31,7 @@ module Git
|
|
31
31
|
|
32
32
|
{
|
33
33
|
hint: "Name must be capitalized.",
|
34
|
-
lines:
|
34
|
+
lines: affected_commit_trailers
|
35
35
|
}
|
36
36
|
end
|
37
37
|
|
@@ -20,7 +20,7 @@ module Git
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def valid?
|
23
|
-
|
23
|
+
affected_commit_trailers.empty?
|
24
24
|
end
|
25
25
|
|
26
26
|
def issue
|
@@ -28,7 +28,7 @@ module Git
|
|
28
28
|
|
29
29
|
{
|
30
30
|
hint: "Avoid duplication.",
|
31
|
-
lines:
|
31
|
+
lines: affected_commit_trailers
|
32
32
|
}
|
33
33
|
end
|
34
34
|
|
@@ -47,7 +47,7 @@ module Git
|
|
47
47
|
zeros = Hash.new { |new_hash, missing_key| new_hash[missing_key] = 0 }
|
48
48
|
|
49
49
|
zeros.tap do |collection|
|
50
|
-
commit.
|
50
|
+
commit.trailers.each { |line| collection[line] += 1 if parser.new(line).match? }
|
51
51
|
end
|
52
52
|
end
|
53
53
|
end
|
@@ -24,7 +24,7 @@ module Git
|
|
24
24
|
# rubocop:enable Metrics/ParameterLists
|
25
25
|
|
26
26
|
def valid?
|
27
|
-
|
27
|
+
affected_commit_trailers.empty?
|
28
28
|
end
|
29
29
|
|
30
30
|
def issue
|
@@ -32,7 +32,7 @@ module Git
|
|
32
32
|
|
33
33
|
{
|
34
34
|
hint: %(Email must follow name and use format: "<name@server.domain>".),
|
35
|
-
lines:
|
35
|
+
lines: affected_commit_trailers
|
36
36
|
}
|
37
37
|
end
|
38
38
|
|
@@ -20,7 +20,7 @@ module Git
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def valid?
|
23
|
-
|
23
|
+
affected_commit_trailers.empty?
|
24
24
|
end
|
25
25
|
|
26
26
|
def issue
|
@@ -28,7 +28,7 @@ module Git
|
|
28
28
|
|
29
29
|
{
|
30
30
|
hint: "Use format: #{filter_list.to_hint}.",
|
31
|
-
lines:
|
31
|
+
lines: affected_commit_trailers
|
32
32
|
}
|
33
33
|
end
|
34
34
|
|
@@ -25,7 +25,7 @@ module Git
|
|
25
25
|
# rubocop:enable Metrics/ParameterLists
|
26
26
|
|
27
27
|
def valid?
|
28
|
-
|
28
|
+
affected_commit_trailers.empty?
|
29
29
|
end
|
30
30
|
|
31
31
|
def issue
|
@@ -33,7 +33,7 @@ module Git
|
|
33
33
|
|
34
34
|
{
|
35
35
|
hint: "Name must follow key and consist of #{minimum} parts (minimum).",
|
36
|
-
lines:
|
36
|
+
lines: affected_commit_trailers
|
37
37
|
}
|
38
38
|
end
|
39
39
|
|
@@ -6,21 +6,21 @@ module Git
|
|
6
6
|
module Environments
|
7
7
|
# Provides Circle CI build environment feature branch information.
|
8
8
|
class CircleCI
|
9
|
-
def initialize
|
10
|
-
@
|
9
|
+
def initialize repository: GitPlus::Repository.new
|
10
|
+
@repository = repository
|
11
11
|
end
|
12
12
|
|
13
13
|
def name
|
14
|
-
"origin/#{
|
14
|
+
"origin/#{repository.branch_name}"
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
|
17
|
+
def commits
|
18
|
+
repository.commits "origin/master..#{name}"
|
19
19
|
end
|
20
20
|
|
21
21
|
private
|
22
22
|
|
23
|
-
attr_reader :
|
23
|
+
attr_reader :repository
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -6,21 +6,21 @@ module Git
|
|
6
6
|
module Environments
|
7
7
|
# Provides GitHub Action build environment feature branch information.
|
8
8
|
class GitHubAction
|
9
|
-
def initialize
|
10
|
-
@
|
9
|
+
def initialize repository: GitPlus::Repository.new
|
10
|
+
@repository = repository
|
11
11
|
end
|
12
12
|
|
13
13
|
def name
|
14
|
-
"origin/#{
|
14
|
+
"origin/#{repository.branch_name}"
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
|
17
|
+
def commits
|
18
|
+
repository.commits "origin/master..#{name}"
|
19
19
|
end
|
20
20
|
|
21
21
|
private
|
22
22
|
|
23
|
-
attr_reader :
|
23
|
+
attr_reader :repository
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -6,21 +6,21 @@ module Git
|
|
6
6
|
module Environments
|
7
7
|
# Provides local build environment feature branch information.
|
8
8
|
class Local
|
9
|
-
def initialize
|
10
|
-
@
|
9
|
+
def initialize repository: GitPlus::Repository.new
|
10
|
+
@repository = repository
|
11
11
|
end
|
12
12
|
|
13
13
|
def name
|
14
|
-
|
14
|
+
repository.branch_name
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
|
17
|
+
def commits
|
18
|
+
repository.commits "master..#{name}"
|
19
19
|
end
|
20
20
|
|
21
21
|
private
|
22
22
|
|
23
|
-
attr_reader :
|
23
|
+
attr_reader :repository
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -8,25 +8,25 @@ module Git
|
|
8
8
|
module Environments
|
9
9
|
# Provides Netlify CI build environment feature branch information.
|
10
10
|
class NetlifyCI
|
11
|
-
def initialize
|
12
|
-
@
|
13
|
-
@repo = repo
|
11
|
+
def initialize repository: GitPlus::Repository.new, shell: Open3, environment: ENV
|
12
|
+
@repository = repository
|
14
13
|
@shell = shell
|
14
|
+
@environment = environment
|
15
15
|
end
|
16
16
|
|
17
17
|
def name
|
18
18
|
environment["HEAD"]
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
shell.
|
23
|
-
shell.
|
24
|
-
|
21
|
+
def commits
|
22
|
+
shell.capture3 "git remote add -f origin #{environment["REPOSITORY_URL"]}"
|
23
|
+
shell.capture3 "git fetch origin #{name}:#{name}"
|
24
|
+
repository.commits "origin/master..origin/#{name}"
|
25
25
|
end
|
26
26
|
|
27
27
|
private
|
28
28
|
|
29
|
-
attr_reader :
|
29
|
+
attr_reader :repository, :shell, :environment
|
30
30
|
end
|
31
31
|
end
|
32
32
|
end
|
@@ -8,35 +8,35 @@ module Git
|
|
8
8
|
module Environments
|
9
9
|
# Provides Travis CI build environment feature branch information.
|
10
10
|
class TravisCI
|
11
|
-
def initialize
|
12
|
-
@
|
13
|
-
@repo = repo
|
11
|
+
def initialize repository: GitPlus::Repository.new, shell: Open3, environment: ENV
|
12
|
+
@repository = repository
|
14
13
|
@shell = shell
|
14
|
+
@environment = environment
|
15
15
|
end
|
16
16
|
|
17
17
|
def name
|
18
18
|
pull_request_branch.empty? ? ci_branch : pull_request_branch
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
21
|
+
def commits
|
22
22
|
prepare_project
|
23
|
-
|
23
|
+
repository.commits "origin/master..#{name}"
|
24
24
|
end
|
25
25
|
|
26
26
|
private
|
27
27
|
|
28
|
-
attr_reader :environment, :
|
28
|
+
attr_reader :environment, :repository, :shell
|
29
29
|
|
30
30
|
def prepare_project
|
31
31
|
slug = pull_request_slug
|
32
32
|
|
33
33
|
unless slug.empty?
|
34
|
-
shell.
|
35
|
-
shell.
|
34
|
+
shell.capture3 "git remote add -f original_branch https://github.com/#{slug}.git"
|
35
|
+
shell.capture3 "git fetch original_branch #{name}:#{name}"
|
36
36
|
end
|
37
37
|
|
38
|
-
shell.
|
39
|
-
shell.
|
38
|
+
shell.capture3 "git remote set-branches --add origin master"
|
39
|
+
shell.capture3 "git fetch"
|
40
40
|
end
|
41
41
|
|
42
42
|
def ci_branch
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "forwardable"
|
4
|
+
require "refinements/strings"
|
4
5
|
|
5
6
|
module Git
|
6
7
|
module Lint
|
@@ -9,9 +10,11 @@ module Git
|
|
9
10
|
class Feature
|
10
11
|
extend Forwardable
|
11
12
|
|
12
|
-
|
13
|
+
using ::Refinements::Strings
|
13
14
|
|
14
|
-
|
15
|
+
def_delegators :selected_environment, :name, :commits
|
16
|
+
|
17
|
+
def initialize environment: ENV, git_repo: GitPlus::Repository.new
|
15
18
|
message = "Invalid repository. Are you within a Git-enabled project?"
|
16
19
|
fail Errors::Base, message unless git_repo.exist?
|
17
20
|
|
@@ -19,10 +22,6 @@ module Git
|
|
19
22
|
@selected_environment = load_environment
|
20
23
|
end
|
21
24
|
|
22
|
-
def commits
|
23
|
-
shas.map { |sha| Commits::Saved.new sha: sha }
|
24
|
-
end
|
25
|
-
|
26
25
|
private
|
27
26
|
|
28
27
|
attr_reader :current_environment, :selected_environment
|
@@ -37,7 +36,7 @@ module Git
|
|
37
36
|
end
|
38
37
|
|
39
38
|
def key? key
|
40
|
-
current_environment
|
39
|
+
current_environment.fetch(key, "false").to_bool
|
41
40
|
end
|
42
41
|
end
|
43
42
|
end
|
data/lib/git/lint/cli.rb
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
require "thor"
|
4
4
|
require "thor/actions"
|
5
5
|
require "runcom"
|
6
|
+
require "pathname"
|
6
7
|
require "pastel"
|
7
8
|
|
8
9
|
module Git
|
@@ -60,7 +61,9 @@ module Git
|
|
60
61
|
type: :array,
|
61
62
|
default: []
|
62
63
|
def analyze
|
63
|
-
|
64
|
+
# FIX: Need to accept SHAs.
|
65
|
+
# collector = analyze_commits options.commits
|
66
|
+
collector = analyze_commits
|
64
67
|
abort if collector.errors?
|
65
68
|
rescue Errors::Base => error
|
66
69
|
abort colorizer.red("#{Identity::LABEL}: #{error.message}")
|
@@ -78,7 +81,7 @@ module Git
|
|
78
81
|
else
|
79
82
|
help "--hook"
|
80
83
|
end
|
81
|
-
rescue Errors::Base => error
|
84
|
+
rescue Errors::Base, GitPlus::Errors::Base => error
|
82
85
|
abort colorizer.red("#{Identity::LABEL}: #{error.message}")
|
83
86
|
end
|
84
87
|
|
@@ -98,21 +101,16 @@ module Git
|
|
98
101
|
|
99
102
|
attr_reader :configuration, :runner, :colorizer
|
100
103
|
|
101
|
-
def
|
102
|
-
|
103
|
-
commits.empty? ? runner.call : runner.call(commits: commits)
|
104
|
-
end
|
105
|
-
|
106
|
-
def analyze_commits shas
|
107
|
-
load_collector(shas).tap do |collector|
|
104
|
+
def analyze_commits
|
105
|
+
runner.call.tap do |collector|
|
108
106
|
reporter = Reporters::Branch.new collector: collector
|
109
107
|
say reporter.to_s
|
110
108
|
end
|
111
109
|
end
|
112
110
|
|
113
111
|
def check_commit_message path
|
114
|
-
commit =
|
115
|
-
collector = runner.call commits: commit
|
112
|
+
commit = GitPlus::Repository.new.unsaved Pathname(path)
|
113
|
+
collector = runner.call commits: [commit]
|
116
114
|
reporter = Reporters::Branch.new collector: collector
|
117
115
|
say reporter.to_s
|
118
116
|
abort if collector.errors?
|
data/lib/git/lint/collector.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require "refinements/
|
3
|
+
require "refinements/hashes"
|
4
4
|
|
5
5
|
module Git
|
6
6
|
module Lint
|
7
7
|
class Collector
|
8
|
-
using Refinements::
|
8
|
+
using ::Refinements::Hashes
|
9
9
|
|
10
10
|
def initialize
|
11
|
-
@collection = Hash.
|
11
|
+
@collection = Hash.with_default []
|
12
12
|
end
|
13
13
|
|
14
14
|
def add analyzer
|
data/lib/git/lint/identity.rb
CHANGED
@@ -5,7 +5,7 @@ module Git
|
|
5
5
|
module Parsers
|
6
6
|
module Trailers
|
7
7
|
class Collaborator
|
8
|
-
DEFAULT_KEY_PATTERN = /\ACo.*Authored.*By.*\Z/i
|
8
|
+
DEFAULT_KEY_PATTERN = /\ACo.*Authored.*By.*\Z/i
|
9
9
|
|
10
10
|
DEFAULT_MATCH_PATTERN = /
|
11
11
|
(?<key>\A.+) # Key (anchored to start of line).
|
@@ -15,7 +15,7 @@ module Git
|
|
15
15
|
(?<name_space>\s?) # Space delimiter (optional).
|
16
16
|
(?<email><.+>)? # Collaborator email (optional).
|
17
17
|
\Z # End of line.
|
18
|
-
/x
|
18
|
+
/x
|
19
19
|
|
20
20
|
def initialize text,
|
21
21
|
key_pattern: DEFAULT_KEY_PATTERN,
|
@@ -23,22 +23,30 @@ module Git
|
|
23
23
|
|
24
24
|
attr_reader :collector, :colorizer
|
25
25
|
|
26
|
+
def branch_report
|
27
|
+
return "" unless collector.issues?
|
28
|
+
|
29
|
+
"\n\n#{commit_report}".chomp
|
30
|
+
end
|
31
|
+
|
26
32
|
def commit_report
|
27
33
|
collector.to_h.reduce "" do |details, (commit, analyzers)|
|
28
34
|
details + Commit.new(commit: commit, analyzers: analyzers).to_s
|
29
35
|
end
|
30
36
|
end
|
31
37
|
|
32
|
-
def branch_report
|
33
|
-
return "" unless collector.issues?
|
34
|
-
|
35
|
-
"\n\n#{commit_report}".chomp "\n"
|
36
|
-
end
|
37
|
-
|
38
38
|
def commit_total
|
39
39
|
%(#{"commit".pluralize count: collector.total_commits} inspected)
|
40
40
|
end
|
41
41
|
|
42
|
+
def issue_totals
|
43
|
+
if collector.issues?
|
44
|
+
"#{issue_total} detected (#{warning_total}, #{error_total})"
|
45
|
+
else
|
46
|
+
colorizer.green("0 issues") + " detected"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
42
50
|
def issue_total
|
43
51
|
color = collector.errors? ? :red : :yellow
|
44
52
|
colorizer.public_send color, "issue".pluralize(count: collector.total_issues)
|
@@ -53,14 +61,6 @@ module Git
|
|
53
61
|
color = collector.errors? ? :red : :green
|
54
62
|
colorizer.public_send color, "error".pluralize(count: collector.total_errors)
|
55
63
|
end
|
56
|
-
|
57
|
-
def issue_totals
|
58
|
-
if collector.issues?
|
59
|
-
"#{issue_total} detected (#{warning_total}, #{error_total})"
|
60
|
-
else
|
61
|
-
colorizer.green("0 issues") + " detected"
|
62
|
-
end
|
63
|
-
end
|
64
64
|
end
|
65
65
|
end
|
66
66
|
end
|
data/lib/git/lint/runner.rb
CHANGED
@@ -3,19 +3,20 @@
|
|
3
3
|
module Git
|
4
4
|
module Lint
|
5
5
|
class Runner
|
6
|
-
def initialize configuration:, collector: Collector.new
|
6
|
+
def initialize configuration:, branch: Branches::Feature.new, collector: Collector.new
|
7
7
|
@configuration = configuration
|
8
|
+
@branch = branch
|
8
9
|
@collector = collector
|
9
10
|
end
|
10
11
|
|
11
|
-
def call commits:
|
12
|
-
|
12
|
+
def call commits: branch.commits
|
13
|
+
commits.map { |commit| check commit }
|
13
14
|
collector
|
14
15
|
end
|
15
16
|
|
16
17
|
private
|
17
18
|
|
18
|
-
attr_reader :configuration, :collector
|
19
|
+
attr_reader :configuration, :branch, :collector
|
19
20
|
|
20
21
|
def check commit
|
21
22
|
configuration.map { |id, settings| load_analyzer id, commit, settings }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: git-lint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brooke Kuhlmann
|
@@ -28,8 +28,22 @@ cert_chain:
|
|
28
28
|
2XV8FRa7/JimI07sPLC13eLY3xd/aYTi85Z782KIA4j0G8XEEWAX0ouBhlXPocZv
|
29
29
|
QWc=
|
30
30
|
-----END CERTIFICATE-----
|
31
|
-
date: 2020-12-
|
31
|
+
date: 2020-12-30 00:00:00.000000000 Z
|
32
32
|
dependencies:
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: git_plus
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - "~>"
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0.1'
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - "~>"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '0.1'
|
33
47
|
- !ruby/object:Gem::Dependency
|
34
48
|
name: pastel
|
35
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,28 +64,28 @@ dependencies:
|
|
50
64
|
requirements:
|
51
65
|
- - "~>"
|
52
66
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
67
|
+
version: '8.0'
|
54
68
|
type: :runtime
|
55
69
|
prerelease: false
|
56
70
|
version_requirements: !ruby/object:Gem::Requirement
|
57
71
|
requirements:
|
58
72
|
- - "~>"
|
59
73
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
74
|
+
version: '8.0'
|
61
75
|
- !ruby/object:Gem::Dependency
|
62
76
|
name: runcom
|
63
77
|
requirement: !ruby/object:Gem::Requirement
|
64
78
|
requirements:
|
65
79
|
- - "~>"
|
66
80
|
- !ruby/object:Gem::Version
|
67
|
-
version: '
|
81
|
+
version: '7.0'
|
68
82
|
type: :runtime
|
69
83
|
prerelease: false
|
70
84
|
version_requirements: !ruby/object:Gem::Requirement
|
71
85
|
requirements:
|
72
86
|
- - "~>"
|
73
87
|
- !ruby/object:Gem::Version
|
74
|
-
version: '
|
88
|
+
version: '7.0'
|
75
89
|
- !ruby/object:Gem::Dependency
|
76
90
|
name: thor
|
77
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -99,7 +113,6 @@ files:
|
|
99
113
|
- LICENSE.adoc
|
100
114
|
- README.adoc
|
101
115
|
- bin/git-lint
|
102
|
-
- lib/git/kit/repo.rb
|
103
116
|
- lib/git/lint.rb
|
104
117
|
- lib/git/lint/analyzers/abstract.rb
|
105
118
|
- lib/git/lint/analyzers/commit_author_capitalization.rb
|
@@ -131,8 +144,6 @@ files:
|
|
131
144
|
- lib/git/lint/branches/feature.rb
|
132
145
|
- lib/git/lint/cli.rb
|
133
146
|
- lib/git/lint/collector.rb
|
134
|
-
- lib/git/lint/commits/saved.rb
|
135
|
-
- lib/git/lint/commits/unsaved.rb
|
136
147
|
- lib/git/lint/errors/base.rb
|
137
148
|
- lib/git/lint/errors/severity.rb
|
138
149
|
- lib/git/lint/errors/sha.rb
|
@@ -168,14 +179,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
168
179
|
requirements:
|
169
180
|
- - "~>"
|
170
181
|
- !ruby/object:Gem::Version
|
171
|
-
version: '
|
182
|
+
version: '3.0'
|
172
183
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
173
184
|
requirements:
|
174
185
|
- - ">="
|
175
186
|
- !ruby/object:Gem::Version
|
176
187
|
version: '0'
|
177
188
|
requirements: []
|
178
|
-
rubygems_version: 3.2.
|
189
|
+
rubygems_version: 3.2.3
|
179
190
|
signing_key:
|
180
191
|
specification_version: 4
|
181
192
|
summary: A command line interface for linting Git commits.
|
metadata.gz.sig
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
�
|
2
|
-
|
1
|
+
�'p,"��/-�^'��,��q������If(-���_�CG ��Mل�r�j����-.
|
2
|
+
�Q9�d�v��Sc;�0Q<DH������n )`#��K��lN����բ��'8LRd[�P����먄�����֒$������'W�d*����W'�N����n�
|
data/lib/git/kit/repo.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Git
|
4
|
-
module Kit
|
5
|
-
class Repo
|
6
|
-
def initialize shell: Open3
|
7
|
-
@shell = shell
|
8
|
-
end
|
9
|
-
|
10
|
-
def exist?
|
11
|
-
shell.capture2e("git rev-parse --git-dir > /dev/null 2>&1")
|
12
|
-
.then { |result, status| result && status.success? }
|
13
|
-
end
|
14
|
-
|
15
|
-
def branch_name
|
16
|
-
shell.capture2e("git rev-parse --abbrev-ref HEAD | tr -d '\n'")
|
17
|
-
.then { |result, _status| result }
|
18
|
-
end
|
19
|
-
|
20
|
-
def shas start: "master", finish: branch_name
|
21
|
-
shell.capture2e(%(git log --pretty=format:"%H" #{start}..#{finish}))
|
22
|
-
.then { |result, _status| result.split "\n" }
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
attr_reader :shell
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
@@ -1,104 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "open3"
|
4
|
-
|
5
|
-
module Git
|
6
|
-
module Lint
|
7
|
-
module Commits
|
8
|
-
# Represents an existing commit.
|
9
|
-
# :reek:TooManyMethods
|
10
|
-
class Saved
|
11
|
-
using Refinements::Strings
|
12
|
-
|
13
|
-
FORMATS = {
|
14
|
-
sha: "%H",
|
15
|
-
author_name: "%an",
|
16
|
-
author_email: "%ae",
|
17
|
-
author_date_relative: "%ar",
|
18
|
-
subject: "%s",
|
19
|
-
body: "%b",
|
20
|
-
raw_body: "%B",
|
21
|
-
trailers: "%(trailers)"
|
22
|
-
}.freeze
|
23
|
-
|
24
|
-
def self.pattern
|
25
|
-
FORMATS.reduce("") { |pattern, (key, value)| pattern + "<#{key}>#{value}</#{key}>%n" }
|
26
|
-
end
|
27
|
-
|
28
|
-
def initialize sha:, shell: Open3
|
29
|
-
data, status = shell.capture2e show_command(sha)
|
30
|
-
fail Errors::SHA, sha unless status.success?
|
31
|
-
|
32
|
-
@data = data.scrub "?"
|
33
|
-
end
|
34
|
-
|
35
|
-
def == other
|
36
|
-
other.is_a?(self.class) && sha == other.sha
|
37
|
-
end
|
38
|
-
alias eql? ==
|
39
|
-
|
40
|
-
def <=> other
|
41
|
-
sha <=> other.sha
|
42
|
-
end
|
43
|
-
|
44
|
-
def hash
|
45
|
-
sha.hash
|
46
|
-
end
|
47
|
-
|
48
|
-
def body_lines
|
49
|
-
body_without_trailing_spaces
|
50
|
-
end
|
51
|
-
|
52
|
-
def body_paragraphs
|
53
|
-
body_without_trailers.split("\n\n").map(&:chomp).reject { |line| line.start_with? "#" }
|
54
|
-
end
|
55
|
-
|
56
|
-
def trailer_lines
|
57
|
-
trailers.split "\n"
|
58
|
-
end
|
59
|
-
|
60
|
-
def trailer_index
|
61
|
-
body.split("\n").index trailer_lines.first
|
62
|
-
end
|
63
|
-
|
64
|
-
def fixup?
|
65
|
-
subject.fixup?
|
66
|
-
end
|
67
|
-
|
68
|
-
def squash?
|
69
|
-
subject.squash?
|
70
|
-
end
|
71
|
-
|
72
|
-
private
|
73
|
-
|
74
|
-
attr_reader :data
|
75
|
-
|
76
|
-
def show_command sha
|
77
|
-
%(git show --stat --pretty=format:"#{self.class.pattern}" #{sha})
|
78
|
-
end
|
79
|
-
|
80
|
-
def body_without_trailing_spaces
|
81
|
-
body_without_comments.reverse.drop_while(&:empty?).reverse
|
82
|
-
end
|
83
|
-
|
84
|
-
def body_without_comments
|
85
|
-
body_without_trailers.split("\n").reject { |line| line.start_with? "#" }
|
86
|
-
end
|
87
|
-
|
88
|
-
def body_without_trailers
|
89
|
-
body.sub trailers, ""
|
90
|
-
end
|
91
|
-
|
92
|
-
def method_missing name, *arguments, &block
|
93
|
-
return super unless respond_to_missing? name
|
94
|
-
|
95
|
-
String data[%r(<#{name}>(?<content>.*?)</#{name}>)m, :content]
|
96
|
-
end
|
97
|
-
|
98
|
-
def respond_to_missing? name, include_private = false
|
99
|
-
FORMATS.key?(name.to_sym) || super
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
@@ -1,120 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require "pathname"
|
4
|
-
require "open3"
|
5
|
-
require "securerandom"
|
6
|
-
|
7
|
-
module Git
|
8
|
-
module Lint
|
9
|
-
module Commits
|
10
|
-
# Represents a partially formed, unsaved commit.
|
11
|
-
# :reek:TooManyMethods
|
12
|
-
class Unsaved
|
13
|
-
using Refinements::Strings
|
14
|
-
|
15
|
-
SUBJECT_LINE = 1
|
16
|
-
SCISSOR_PATTERN = /\#\s-+\s>8\s-+\n.+/m.freeze
|
17
|
-
|
18
|
-
attr_reader :sha, :raw_body
|
19
|
-
|
20
|
-
def initialize path:, sha: SecureRandom.hex(20), shell: Open3
|
21
|
-
fail Errors::Base, %(Invalid commit message path: "#{path}".) unless File.exist? path
|
22
|
-
|
23
|
-
@path = Pathname path
|
24
|
-
@sha = sha
|
25
|
-
@shell = shell
|
26
|
-
@raw_body = File.read(path).scrub "?"
|
27
|
-
end
|
28
|
-
|
29
|
-
def author_name
|
30
|
-
shell.capture2e("git config --get user.name").then { |result, _status| result.chomp }
|
31
|
-
end
|
32
|
-
|
33
|
-
def author_email
|
34
|
-
shell.capture2e("git config --get user.email").then { |result, _status| result.chomp }
|
35
|
-
end
|
36
|
-
|
37
|
-
def author_date_relative
|
38
|
-
"0 seconds ago"
|
39
|
-
end
|
40
|
-
|
41
|
-
def subject
|
42
|
-
String raw_body.split("\n").first
|
43
|
-
end
|
44
|
-
|
45
|
-
# :reek:FeatureEnvy
|
46
|
-
def body
|
47
|
-
raw_body.sub(SCISSOR_PATTERN, "").split("\n").drop(SUBJECT_LINE).then do |lines|
|
48
|
-
computed_body = lines.join "\n"
|
49
|
-
lines.empty? ? computed_body : "#{computed_body}\n"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def body_lines
|
54
|
-
body_without_trailing_spaces
|
55
|
-
end
|
56
|
-
|
57
|
-
# :reek:FeatureEnvy
|
58
|
-
def body_paragraphs
|
59
|
-
body_without_trailers.split("\n\n")
|
60
|
-
.map { |line| line.delete_prefix "\n" }
|
61
|
-
.map(&:chomp)
|
62
|
-
.reject { |line| line.start_with? "#" }
|
63
|
-
end
|
64
|
-
|
65
|
-
def trailers
|
66
|
-
trailers, status = shell.capture2e %(git interpret-trailers --only-trailers "#{path}")
|
67
|
-
|
68
|
-
return "" unless status.success?
|
69
|
-
|
70
|
-
trailers
|
71
|
-
end
|
72
|
-
|
73
|
-
def trailer_lines
|
74
|
-
trailers.split "\n"
|
75
|
-
end
|
76
|
-
|
77
|
-
def trailer_index
|
78
|
-
body.split("\n").index trailer_lines.first
|
79
|
-
end
|
80
|
-
|
81
|
-
def == other
|
82
|
-
other.is_a?(self.class) && raw_body == other.raw_body
|
83
|
-
end
|
84
|
-
alias eql? ==
|
85
|
-
|
86
|
-
def <=> other
|
87
|
-
raw_body <=> other.raw_body
|
88
|
-
end
|
89
|
-
|
90
|
-
def hash
|
91
|
-
raw_body.hash
|
92
|
-
end
|
93
|
-
|
94
|
-
def fixup?
|
95
|
-
subject.fixup?
|
96
|
-
end
|
97
|
-
|
98
|
-
def squash?
|
99
|
-
subject.squash?
|
100
|
-
end
|
101
|
-
|
102
|
-
private
|
103
|
-
|
104
|
-
attr_reader :path, :shell
|
105
|
-
|
106
|
-
def body_without_trailing_spaces
|
107
|
-
body_without_comments.reverse.drop_while(&:empty?).reverse
|
108
|
-
end
|
109
|
-
|
110
|
-
def body_without_comments
|
111
|
-
body_without_trailers.split("\n").reject { |line| line.start_with? "#" }
|
112
|
-
end
|
113
|
-
|
114
|
-
def body_without_trailers
|
115
|
-
body.sub trailers, ""
|
116
|
-
end
|
117
|
-
end
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|