git-lint 6.2.1 → 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/README.adoc +234 -104
  4. data/git-lint.gemspec +12 -12
  5. data/lib/git/lint/analyzer.rb +8 -4
  6. data/lib/git/lint/analyzers/abstract.rb +3 -3
  7. data/lib/git/lint/analyzers/commit_author_capitalization.rb +1 -1
  8. data/lib/git/lint/analyzers/commit_body_bullet_capitalization.rb +1 -1
  9. data/lib/git/lint/analyzers/commit_body_bullet_delimiter.rb +1 -1
  10. data/lib/git/lint/analyzers/{commit_body_single_bullet.rb → commit_body_bullet_only.rb} +4 -4
  11. data/lib/git/lint/analyzers/commit_body_phrase.rb +2 -5
  12. data/lib/git/lint/analyzers/commit_body_presence.rb +3 -3
  13. data/lib/git/lint/analyzers/commit_body_tracker_shorthand.rb +2 -2
  14. data/lib/git/lint/analyzers/commit_body_word_repeat.rb +31 -0
  15. data/lib/git/lint/analyzers/commit_signature.rb +2 -2
  16. data/lib/git/lint/analyzers/commit_subject_prefix.rb +3 -3
  17. data/lib/git/lint/analyzers/commit_subject_suffix.rb +2 -2
  18. data/lib/git/lint/analyzers/commit_subject_word_repeat.rb +20 -0
  19. data/lib/git/lint/analyzers/commit_trailer_collaborator_capitalization.rb +2 -2
  20. data/lib/git/lint/analyzers/commit_trailer_collaborator_email.rb +3 -4
  21. data/lib/git/lint/analyzers/commit_trailer_collaborator_key.rb +4 -6
  22. data/lib/git/lint/analyzers/commit_trailer_collaborator_name.rb +2 -2
  23. data/lib/git/lint/analyzers/commit_trailer_format_key.rb +4 -6
  24. data/lib/git/lint/analyzers/commit_trailer_format_value.rb +4 -4
  25. data/lib/git/lint/analyzers/commit_trailer_issue_key.rb +4 -6
  26. data/lib/git/lint/analyzers/commit_trailer_issue_value.rb +4 -4
  27. data/lib/git/lint/analyzers/commit_trailer_milestone_key.rb +33 -0
  28. data/lib/git/lint/analyzers/commit_trailer_milestone_value.rb +35 -0
  29. data/lib/git/lint/analyzers/commit_trailer_order.rb +38 -0
  30. data/lib/git/lint/analyzers/commit_trailer_reviewer_key.rb +33 -0
  31. data/lib/git/lint/analyzers/commit_trailer_reviewer_value.rb +35 -0
  32. data/lib/git/lint/analyzers/commit_trailer_signer_capitalization.rb +2 -2
  33. data/lib/git/lint/analyzers/commit_trailer_signer_email.rb +3 -4
  34. data/lib/git/lint/analyzers/commit_trailer_signer_key.rb +4 -4
  35. data/lib/git/lint/analyzers/commit_trailer_signer_name.rb +2 -2
  36. data/lib/git/lint/analyzers/commit_trailer_tracker_key.rb +4 -6
  37. data/lib/git/lint/analyzers/commit_trailer_tracker_value.rb +4 -4
  38. data/lib/git/lint/commits/{systems → hosts}/circle_ci.rb +2 -2
  39. data/lib/git/lint/commits/{systems → hosts}/container.rb +2 -2
  40. data/lib/git/lint/commits/{systems → hosts}/git_hub_action.rb +2 -2
  41. data/lib/git/lint/commits/{systems → hosts}/import.rb +1 -1
  42. data/lib/git/lint/commits/{systems → hosts}/local.rb +2 -2
  43. data/lib/git/lint/commits/{systems → hosts}/netlify_ci.rb +2 -2
  44. data/lib/git/lint/commits/loader.rb +6 -6
  45. data/lib/git/lint/configuration/contract.rb +19 -11
  46. data/lib/git/lint/configuration/defaults.yml +43 -22
  47. data/lib/git/lint/configuration/model.rb +19 -11
  48. data/lib/git/lint/configuration/trailer.rb +10 -0
  49. data/lib/git/lint/container.rb +28 -6
  50. data/lib/git/lint/errors/severity.rb +6 -1
  51. data/lib/git/lint/kit/filter_list.rb +9 -4
  52. data/lib/git/lint/reporters/branch.rb +5 -5
  53. data/lib/git/lint/validators/name.rb +2 -2
  54. data/lib/git/lint/validators/repeated_word.rb +36 -0
  55. data.tar.gz.sig +0 -0
  56. metadata +40 -35
  57. metadata.gz.sig +0 -0
  58. data/lib/git/lint/analyzers/commit_body_bullet.rb +0 -34
@@ -6,25 +6,25 @@ module Git
6
6
  class Analyzer
7
7
  include Import[:configuration]
8
8
 
9
- # rubocop:todo Metrics/CollectionLiteralLength
10
9
  ANALYZERS = [
11
10
  Analyzers::CommitAuthorCapitalization,
12
11
  Analyzers::CommitAuthorEmail,
13
12
  Analyzers::CommitAuthorName,
14
- Analyzers::CommitBodyBullet,
15
13
  Analyzers::CommitBodyBulletCapitalization,
16
14
  Analyzers::CommitBodyBulletDelimiter,
15
+ Analyzers::CommitBodyBulletOnly,
17
16
  Analyzers::CommitBodyLeadingLine,
18
17
  Analyzers::CommitBodyLineLength,
19
18
  Analyzers::CommitBodyParagraphCapitalization,
20
19
  Analyzers::CommitBodyPhrase,
21
20
  Analyzers::CommitBodyPresence,
22
- Analyzers::CommitBodySingleBullet,
23
21
  Analyzers::CommitBodyTrackerShorthand,
22
+ Analyzers::CommitBodyWordRepeat,
24
23
  Analyzers::CommitSignature,
25
24
  Analyzers::CommitSubjectLength,
26
25
  Analyzers::CommitSubjectPrefix,
27
26
  Analyzers::CommitSubjectSuffix,
27
+ Analyzers::CommitSubjectWordRepeat,
28
28
  Analyzers::CommitTrailerCollaboratorCapitalization,
29
29
  Analyzers::CommitTrailerCollaboratorEmail,
30
30
  Analyzers::CommitTrailerCollaboratorKey,
@@ -34,6 +34,11 @@ module Git
34
34
  Analyzers::CommitTrailerFormatValue,
35
35
  Analyzers::CommitTrailerIssueKey,
36
36
  Analyzers::CommitTrailerIssueValue,
37
+ Analyzers::CommitTrailerMilestoneKey,
38
+ Analyzers::CommitTrailerMilestoneValue,
39
+ Analyzers::CommitTrailerOrder,
40
+ Analyzers::CommitTrailerReviewerKey,
41
+ Analyzers::CommitTrailerReviewerValue,
37
42
  Analyzers::CommitTrailerSignerCapitalization,
38
43
  Analyzers::CommitTrailerSignerEmail,
39
44
  Analyzers::CommitTrailerSignerKey,
@@ -41,7 +46,6 @@ module Git
41
46
  Analyzers::CommitTrailerTrackerKey,
42
47
  Analyzers::CommitTrailerTrackerValue
43
48
  ].freeze
44
- # rubocop:enable Metrics/CollectionLiteralLength
45
49
 
46
50
  # rubocop:disable Metrics/ParameterLists
47
51
  def initialize(
@@ -1,16 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "core"
4
- require "refinements/strings"
4
+ require "refinements/string"
5
5
 
6
6
  module Git
7
7
  module Lint
8
8
  module Analyzers
9
- # An abstract class which provides basic functionality from which all analyzers inherit from.
9
+ # An abstract class which provides basic functionality for all analyzers to inherit from.
10
10
  class Abstract
11
11
  include Import[:configuration, :environment]
12
12
 
13
- using ::Refinements::Strings
13
+ using Refinements::String
14
14
 
15
15
  LEVELS = %w[warn error].freeze
16
16
  BODY_OFFSET = 3
@@ -3,7 +3,7 @@
3
3
  module Git
4
4
  module Lint
5
5
  module Analyzers
6
- # Analyzes author for proper capitalization of author name.
6
+ # Analyzes author name for proper capitalization.
7
7
  class CommitAuthorCapitalization < Abstract
8
8
  include Import[validator: "validators.capitalization"]
9
9
 
@@ -23,7 +23,7 @@ module Git
23
23
  end
24
24
 
25
25
  def invalid_line? line
26
- line.match?(/\A\s*#{Regexp.union filter_list.to_regexp}\s[[:lower:]]+/)
26
+ line.match?(/\A\s*#{Regexp.union filter_list}\s[[:lower:]]+/)
27
27
  end
28
28
 
29
29
  private
@@ -24,7 +24,7 @@ module Git
24
24
 
25
25
  def invalid_line?(line) = line.match?(/\A\s*#{pattern}(?!(#{pattern}|\s)).+\Z/)
26
26
 
27
- def pattern = Regexp.union(filter_list.to_regexp)
27
+ def pattern = Regexp.union filter_list
28
28
  end
29
29
  end
30
30
  end
@@ -4,8 +4,8 @@ module Git
4
4
  module Lint
5
5
  module Analyzers
6
6
  # Analyzes commit bodies with only a single bullet point.
7
- class CommitBodySingleBullet < Abstract
8
- def valid? = affected_commit_body_lines.size != 1
7
+ class CommitBodyBulletOnly < Abstract
8
+ def valid? = !affected_commit_body_lines.one?
9
9
 
10
10
  def issue
11
11
  return {} if valid?
@@ -19,10 +19,10 @@ module Git
19
19
  protected
20
20
 
21
21
  def load_filter_list
22
- Kit::FilterList.new configuration.commits_body_single_bullet_includes
22
+ Kit::FilterList.new configuration.commits_body_bullet_only_includes
23
23
  end
24
24
 
25
- def invalid_line?(line) = line.match?(/\A#{Regexp.union filter_list.to_regexp}\s+/)
25
+ def invalid_line?(line) = line.match?(/\A#{Regexp.union filter_list}\s+/)
26
26
  end
27
27
  end
28
28
  end
@@ -11,7 +11,7 @@ module Git
11
11
  return {} if valid?
12
12
 
13
13
  {
14
- hint: %(Avoid: #{filter_list.to_hint}.),
14
+ hint: %(Avoid: #{filter_list.to_usage}.),
15
15
  lines: affected_commit_body_lines
16
16
  }
17
17
  end
@@ -23,10 +23,7 @@ module Git
23
23
  end
24
24
 
25
25
  def invalid_line? line
26
- line.downcase.match? Regexp.new(
27
- Regexp.union(filter_list.to_regexp).source,
28
- Regexp::IGNORECASE
29
- )
26
+ line.downcase.match? Regexp.new(Regexp.union(filter_list).source, Regexp::IGNORECASE)
30
27
  end
31
28
  end
32
29
  end
@@ -3,9 +3,9 @@
3
3
  module Git
4
4
  module Lint
5
5
  module Analyzers
6
- # Analyzes pretense of commit body.
6
+ # Analyzes presence of commit body.
7
7
  class CommitBodyPresence < Abstract
8
- using ::Refinements::Strings
8
+ using Refinements::String
9
9
 
10
10
  def valid?
11
11
  return true if commit.fixup?
@@ -19,7 +19,7 @@ module Git
19
19
  def issue
20
20
  return {} if valid?
21
21
 
22
- {hint: %(Use minimum of #{"#{minimum} line".pluralize "s", count: minimum} (non-empty).)}
22
+ {hint: %(Use minimum of #{"#{minimum} line".pluralize "s", minimum} (non-empty).)}
23
23
  end
24
24
  end
25
25
  end
@@ -11,7 +11,7 @@ module Git
11
11
  return {} if valid?
12
12
 
13
13
  {
14
- hint: "Explain issue instead of using shorthand. Avoid: #{filter_list.to_hint}.",
14
+ hint: "Explain issue instead of using shorthand. Avoid: #{filter_list.to_usage}.",
15
15
  lines: affected_commit_body_lines
16
16
  }
17
17
  end
@@ -22,7 +22,7 @@ module Git
22
22
  Kit::FilterList.new configuration.commits_body_tracker_shorthand_excludes
23
23
  end
24
24
 
25
- def invalid_line?(line) = line.match?(/.*#{Regexp.union filter_list.to_regexp}.*/)
25
+ def invalid_line?(line) = line.match?(/.*#{Regexp.union filter_list}.*/)
26
26
  end
27
27
  end
28
28
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Analyzers
6
+ # Analyzes commit body for repeated words.
7
+ class CommitBodyWordRepeat < Abstract
8
+ include Import[validator: "validators.repeated_word"]
9
+
10
+ def valid? = commit.body_lines.all? { |line| !invalid_line? line }
11
+
12
+ def issue
13
+ return {} if valid?
14
+
15
+ {
16
+ hint: "Avoid repeating these words: #{validator.call commit.body}.",
17
+ lines: affected_commit_body_lines
18
+ }
19
+ end
20
+
21
+ protected
22
+
23
+ def invalid_line? line
24
+ return false if line.start_with? "#"
25
+
26
+ !validator.call(line).empty?
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -8,10 +8,10 @@ module Git
8
8
  include Import[sanitizer: "sanitizers.signature"]
9
9
 
10
10
  def valid?
11
- sanitizer.call(commit.signature).match?(/\A#{Regexp.union filter_list.to_regexp}\Z/)
11
+ sanitizer.call(commit.signature).match?(/\A#{Regexp.union filter_list}\Z/)
12
12
  end
13
13
 
14
- def issue = valid? ? {} : {hint: %(Use: #{filter_list.to_hint}.)}
14
+ def issue = valid? ? {} : {hint: %(Use: #{filter_list.to_usage "or"}.)}
15
15
 
16
16
  protected
17
17
 
@@ -9,13 +9,13 @@ module Git
9
9
  return true if locally_prefixed?
10
10
  return true if filter_list.empty?
11
11
 
12
- commit.subject.match?(/\A#{Regexp.union filter_list.to_regexp}/)
12
+ commit.subject.match?(/\A#{Regexp.union filter_list}/)
13
13
  end
14
14
 
15
15
  def issue
16
16
  return {} if valid?
17
17
 
18
- {hint: %(Use: #{filter_list.to_hint}.)}
18
+ {hint: %(Use: #{filter_list.to_usage "or"}.)}
19
19
  end
20
20
 
21
21
  protected
@@ -26,7 +26,7 @@ module Git
26
26
  .then { |list| Kit::FilterList.new list }
27
27
  end
28
28
 
29
- def locally_prefixed? = !ci? && commit.prefix?
29
+ def locally_prefixed? = !ci? && commit.directive?
30
30
 
31
31
  def ci? = environment["CI"] == "true"
32
32
 
@@ -8,13 +8,13 @@ module Git
8
8
  def valid?
9
9
  return true if filter_list.empty?
10
10
 
11
- !commit.subject.match?(/#{Regexp.union filter_list.to_regexp}\Z/)
11
+ !commit.subject.match?(/#{Regexp.union filter_list}\Z/)
12
12
  end
13
13
 
14
14
  def issue
15
15
  return {} if valid?
16
16
 
17
- {hint: %(Avoid: #{filter_list.to_hint}.)}
17
+ {hint: %(Avoid: #{filter_list.to_usage}.)}
18
18
  end
19
19
 
20
20
  protected
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Analyzers
6
+ # Analyzes commit subject for repeated words.
7
+ class CommitSubjectWordRepeat < Abstract
8
+ include Import[validator: "validators.repeated_word"]
9
+
10
+ def valid? = validator.call(commit.subject).empty?
11
+
12
+ def issue
13
+ return {} if valid?
14
+
15
+ {hint: "Avoid repeating these words: #{validator.call commit.subject}."}
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -6,7 +6,7 @@ module Git
6
6
  # Analyzes commit trailer collaborator name capitalization.
7
7
  class CommitTrailerCollaboratorCapitalization < Abstract
8
8
  include Import[
9
- pattern: "trailers.collaborator",
9
+ setting: "trailers.collaborator",
10
10
  parser: "parsers.person",
11
11
  validator: "validators.capitalization"
12
12
  ]
@@ -26,7 +26,7 @@ module Git
26
26
 
27
27
  def invalid_line? trailer
28
28
  parser.call(trailer.value).then do |person|
29
- trailer.key.match?(pattern) && !validator.call(person.name)
29
+ trailer.key.match?(setting.pattern) && !validator.call(person.name)
30
30
  end
31
31
  end
32
32
  end
@@ -6,9 +6,8 @@ module Git
6
6
  # Analyzes commit trailer collaborator email address format.
7
7
  class CommitTrailerCollaboratorEmail < Abstract
8
8
  include Import[
9
- pattern: "trailers.collaborator",
9
+ setting: "trailers.collaborator",
10
10
  parser: "parsers.person",
11
- sanitizer: "sanitizers.email",
12
11
  validator: "validators.email"
13
12
  ]
14
13
 
@@ -26,8 +25,8 @@ module Git
26
25
  protected
27
26
 
28
27
  def invalid_line? trailer
29
- email = sanitizer.call parser.call(trailer.value).email
30
- trailer.key.match?(pattern) && !validator.call(email)
28
+ email = parser.call(trailer.value).email
29
+ trailer.key.match?(setting.pattern) && !validator.call(email)
31
30
  end
32
31
 
33
32
  private
@@ -5,7 +5,7 @@ module Git
5
5
  module Analyzers
6
6
  # Analyzes commit trailer collaborator key usage.
7
7
  class CommitTrailerCollaboratorKey < Abstract
8
- include Import[pattern: "trailers.collaborator"]
8
+ include Import[setting: "trailers.collaborator"]
9
9
 
10
10
  def valid? = affected_commit_trailers.empty?
11
11
 
@@ -13,20 +13,18 @@ module Git
13
13
  return {} if valid?
14
14
 
15
15
  {
16
- hint: "Use format: #{filter_list.to_hint}.",
16
+ hint: "Use format: #{filter_list.to_usage}.",
17
17
  lines: affected_commit_trailers
18
18
  }
19
19
  end
20
20
 
21
21
  protected
22
22
 
23
- def load_filter_list
24
- Kit::FilterList.new configuration.commits_trailer_collaborator_key_includes
25
- end
23
+ def load_filter_list = Kit::FilterList.new setting.name
26
24
 
27
25
  def invalid_line? trailer
28
26
  trailer.key.then do |key|
29
- key.match?(pattern) && !key.match?(/\A#{Regexp.union filter_list.to_regexp}\Z/)
27
+ key.match?(setting.pattern) && !key.match?(/\A#{Regexp.union filter_list}\Z/)
30
28
  end
31
29
  end
32
30
  end
@@ -6,7 +6,7 @@ module Git
6
6
  # Analyzes commit trailer collaborator name construction.
7
7
  class CommitTrailerCollaboratorName < Abstract
8
8
  include Import[
9
- pattern: "trailers.collaborator",
9
+ setting: "trailers.collaborator",
10
10
  parser: "parsers.person",
11
11
  validator: "validators.name"
12
12
  ]
@@ -26,7 +26,7 @@ module Git
26
26
 
27
27
  def invalid_line? trailer
28
28
  parser.call(trailer.value).then do |person|
29
- trailer.key.match?(pattern) && !validator.call(person.name, minimum:)
29
+ trailer.key.match?(setting.pattern) && !validator.call(person.name, minimum:)
30
30
  end
31
31
  end
32
32
 
@@ -5,7 +5,7 @@ module Git
5
5
  module Analyzers
6
6
  # Analyzes commit trailer format key usage.
7
7
  class CommitTrailerFormatKey < Abstract
8
- include Import[pattern: "trailers.format"]
8
+ include Import[setting: "trailers.format"]
9
9
 
10
10
  def valid? = affected_commit_trailers.empty?
11
11
 
@@ -13,20 +13,18 @@ module Git
13
13
  return {} if valid?
14
14
 
15
15
  {
16
- hint: "Use format: #{filter_list.to_hint}.",
16
+ hint: "Use format: #{filter_list.to_usage}.",
17
17
  lines: affected_commit_trailers
18
18
  }
19
19
  end
20
20
 
21
21
  protected
22
22
 
23
- def load_filter_list
24
- Kit::FilterList.new configuration.commits_trailer_format_key_includes
25
- end
23
+ def load_filter_list = Kit::FilterList.new setting.name
26
24
 
27
25
  def invalid_line? trailer
28
26
  trailer.key.then do |key|
29
- key.match?(pattern) && !key.match?(/\A#{Regexp.union filter_list.to_regexp}\Z/)
27
+ key.match?(setting.pattern) && !key.match?(/\A#{Regexp.union filter_list}\Z/)
30
28
  end
31
29
  end
32
30
  end
@@ -5,7 +5,7 @@ module Git
5
5
  module Analyzers
6
6
  # Analyzes commit trailer format value.
7
7
  class CommitTrailerFormatValue < Abstract
8
- include Import[pattern: "trailers.format"]
8
+ include Import[setting: "trailers.format"]
9
9
 
10
10
  def valid? = affected_commit_trailers.empty?
11
11
 
@@ -13,7 +13,7 @@ module Git
13
13
  return {} if valid?
14
14
 
15
15
  {
16
- hint: "Use format: #{filter_list.to_hint}.",
16
+ hint: "Use format: #{filter_list.to_usage "or"}.",
17
17
  lines: affected_commit_trailers
18
18
  }
19
19
  end
@@ -25,10 +25,10 @@ module Git
25
25
  end
26
26
 
27
27
  def invalid_line? trailer
28
- trailer.key.match?(pattern) && !trailer.value.match?(value_pattern)
28
+ trailer.key.match?(setting.pattern) && !trailer.value.match?(value_pattern)
29
29
  end
30
30
 
31
- def value_pattern = /\A#{Regexp.union filter_list.to_regexp}\Z/
31
+ def value_pattern = /\A#{Regexp.union filter_list}\Z/
32
32
  end
33
33
  end
34
34
  end
@@ -5,7 +5,7 @@ module Git
5
5
  module Analyzers
6
6
  # Analyzes commit trailer issue key usage.
7
7
  class CommitTrailerIssueKey < Abstract
8
- include Import[pattern: "trailers.issue"]
8
+ include Import[setting: "trailers.issue"]
9
9
 
10
10
  def valid? = affected_commit_trailers.empty?
11
11
 
@@ -13,20 +13,18 @@ module Git
13
13
  return {} if valid?
14
14
 
15
15
  {
16
- hint: "Use format: #{filter_list.to_hint}.",
16
+ hint: "Use format: #{filter_list.to_usage}.",
17
17
  lines: affected_commit_trailers
18
18
  }
19
19
  end
20
20
 
21
21
  protected
22
22
 
23
- def load_filter_list
24
- Kit::FilterList.new configuration.commits_trailer_issue_key_includes
25
- end
23
+ def load_filter_list = Kit::FilterList.new setting.name
26
24
 
27
25
  def invalid_line? trailer
28
26
  trailer.key.then do |key|
29
- key.match?(pattern) && !key.match?(/\A#{Regexp.union filter_list.to_regexp}\Z/)
27
+ key.match?(setting.pattern) && !key.match?(/\A#{Regexp.union filter_list}\Z/)
30
28
  end
31
29
  end
32
30
  end
@@ -5,7 +5,7 @@ module Git
5
5
  module Analyzers
6
6
  # Analyzes commit trailer issue value.
7
7
  class CommitTrailerIssueValue < Abstract
8
- include Import[pattern: "trailers.issue"]
8
+ include Import[setting: "trailers.issue"]
9
9
 
10
10
  def valid? = affected_commit_trailers.empty?
11
11
 
@@ -13,7 +13,7 @@ module Git
13
13
  return {} if valid?
14
14
 
15
15
  {
16
- hint: "Use format: #{filter_list.to_hint}.",
16
+ hint: "Use format: #{filter_list.to_usage}.",
17
17
  lines: affected_commit_trailers
18
18
  }
19
19
  end
@@ -25,10 +25,10 @@ module Git
25
25
  end
26
26
 
27
27
  def invalid_line? trailer
28
- trailer.key.match?(pattern) && !trailer.value.match?(value_pattern)
28
+ trailer.key.match?(setting.pattern) && !trailer.value.match?(value_pattern)
29
29
  end
30
30
 
31
- def value_pattern = /\A#{Regexp.union filter_list.to_regexp}\Z/
31
+ def value_pattern = /\A#{Regexp.union filter_list}\Z/
32
32
  end
33
33
  end
34
34
  end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Analyzers
6
+ # Analyzes commit trailer milestone key usage.
7
+ class CommitTrailerMilestoneKey < Abstract
8
+ include Import[setting: "trailers.milestone"]
9
+
10
+ def valid? = affected_commit_trailers.empty?
11
+
12
+ def issue
13
+ return {} if valid?
14
+
15
+ {
16
+ hint: "Use: #{filter_list.to_usage}.",
17
+ lines: affected_commit_trailers
18
+ }
19
+ end
20
+
21
+ protected
22
+
23
+ def load_filter_list = Kit::FilterList.new setting.name
24
+
25
+ def invalid_line? trailer
26
+ trailer.key.then do |key|
27
+ key.match?(setting.pattern) && !key.match?(/\A#{Regexp.union filter_list}\Z/)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Analyzers
6
+ # Analyzes commit trailer milestone value.
7
+ class CommitTrailerMilestoneValue < Abstract
8
+ include Import[setting: "trailers.milestone"]
9
+
10
+ def valid? = affected_commit_trailers.empty?
11
+
12
+ def issue
13
+ return {} if valid?
14
+
15
+ {
16
+ hint: "Use: #{filter_list.to_usage "or"}.",
17
+ lines: affected_commit_trailers
18
+ }
19
+ end
20
+
21
+ protected
22
+
23
+ def load_filter_list
24
+ Kit::FilterList.new configuration.commits_trailer_milestone_value_includes
25
+ end
26
+
27
+ def invalid_line? trailer
28
+ trailer.key.match?(setting.pattern) && !trailer.value.match?(value_pattern)
29
+ end
30
+
31
+ def value_pattern = /\A#{Regexp.union filter_list}\Z/
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Analyzers
6
+ # Analyzes commit trailer order value.
7
+ class CommitTrailerOrder < Abstract
8
+ def initialize(...)
9
+ super
10
+ @original_order = commit.trailers.map(&:key)
11
+ @sorted_order = original_order.sort
12
+ end
13
+
14
+ def valid? = original_order == sorted_order
15
+
16
+ def issue
17
+ return {} if valid?
18
+
19
+ {
20
+ hint: "Ensure keys are alphabetically sorted.",
21
+ lines: affected_commit_trailers
22
+ }
23
+ end
24
+
25
+ protected
26
+
27
+ def invalid_line? trailer
28
+ key = trailer.key
29
+ original_order.index(key) != sorted_order.index(key)
30
+ end
31
+
32
+ private
33
+
34
+ attr_reader :original_order, :sorted_order
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Analyzers
6
+ # Analyzes commit trailer reviwer key usage.
7
+ class CommitTrailerReviewerKey < Abstract
8
+ include Import[setting: "trailers.reviewer"]
9
+
10
+ def valid? = affected_commit_trailers.empty?
11
+
12
+ def issue
13
+ return {} if valid?
14
+
15
+ {
16
+ hint: "Use: #{filter_list.to_usage}.",
17
+ lines: affected_commit_trailers
18
+ }
19
+ end
20
+
21
+ protected
22
+
23
+ def load_filter_list = Kit::FilterList.new setting.name
24
+
25
+ def invalid_line? trailer
26
+ trailer.key.then do |key|
27
+ key.match?(setting.pattern) && !key.match?(/\A#{Regexp.union filter_list}\Z/)
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end