git-lint 1.1.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/README.adoc +64 -15
  5. data/lib/git/lint.rb +2 -3
  6. data/lib/git/lint/analyzers/abstract.rb +3 -3
  7. data/lib/git/lint/analyzers/commit_author_name.rb +1 -1
  8. data/lib/git/lint/analyzers/commit_body_leading_line.rb +3 -3
  9. data/lib/git/lint/analyzers/commit_subject_prefix.rb +1 -1
  10. data/lib/git/lint/analyzers/commit_trailer_collaborator_capitalization.rb +2 -2
  11. data/lib/git/lint/analyzers/commit_trailer_collaborator_duplication.rb +3 -3
  12. data/lib/git/lint/analyzers/commit_trailer_collaborator_email.rb +2 -2
  13. data/lib/git/lint/analyzers/commit_trailer_collaborator_key.rb +2 -2
  14. data/lib/git/lint/analyzers/commit_trailer_collaborator_name.rb +2 -2
  15. data/lib/git/lint/branches/environments/circle_ci.rb +6 -6
  16. data/lib/git/lint/branches/environments/git_hub_action.rb +28 -0
  17. data/lib/git/lint/branches/environments/local.rb +6 -6
  18. data/lib/git/lint/branches/environments/netlify_ci.rb +8 -8
  19. data/lib/git/lint/branches/environments/travis_ci.rb +10 -10
  20. data/lib/git/lint/branches/feature.rb +7 -7
  21. data/lib/git/lint/cli.rb +9 -11
  22. data/lib/git/lint/collector.rb +2 -2
  23. data/lib/git/lint/identity.rb +1 -1
  24. data/lib/git/lint/parsers/trailers/collaborator.rb +2 -2
  25. data/lib/git/lint/reporters/branch.rb +14 -14
  26. data/lib/git/lint/runner.rb +5 -4
  27. data/lib/git/lint/validators/capitalization.rb +1 -1
  28. data/lib/git/lint/validators/name.rb +1 -1
  29. metadata +21 -191
  30. metadata.gz.sig +0 -0
  31. data/lib/git/kit/repo.rb +0 -30
  32. data/lib/git/lint/commits/saved.rb +0 -104
  33. data/lib/git/lint/commits/unsaved.rb +0 -120
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ebbb3f67f04832ff30e770db178902f8d271af160d713ece50c188601d969160
4
- data.tar.gz: '0285bce8629da448fb16fcf7fbe69ac0d3d3afcbfb3f10f140c3c35744841cfe'
3
+ metadata.gz: ba39bef55a904dc640ba7421df9016597bc826faf3263eddb5f3bff2036a00b4
4
+ data.tar.gz: 4ea42cc58c1cdb23fff6bd0625e23573b0c13831c4a75115a08fc9d751a32088
5
5
  SHA512:
6
- metadata.gz: 52130792fd09ddb40873b3a3e997ffce167e263c12d01ef07cb14f8818e442776a0f0451fdf02eec478db05b4b034adf7bba22a7f72b971b2570d5b1d27ba331
7
- data.tar.gz: 35969feb54089337530739b62e8edb23ab35c68d2ea7ea8cf348fa439a0f864c864157d0f0d0bc343c11e32546907dd89d5b64b6047cc4056fbb82e19b6a2fcf
6
+ metadata.gz: 86c24491442dc4e817693138a5b0b822137e2c0627a8c5808576bdee1128480d310269852f013eee7b25cb097ea07ffc6f7f211a2e628b2d88dd97e7f8a26f84
7
+ data.tar.gz: acfebc2a5e4f373304f553af56d01f4c6309726d1ac09b1ec1e0edb4cdf76ea3a63fa4d977f6e974b1ed92a6312a5594e18bcd67116f2fd72fd585621a8f5a5c
Binary file
data.tar.gz.sig CHANGED
Binary file
@@ -8,6 +8,8 @@
8
8
 
9
9
  [link=http://badge.fury.io/rb/git-lint]
10
10
  image::https://badge.fury.io/rb/git-lint.svg[Gem Version]
11
+ [link=https://www.alchemists.io/projects/code_quality]
12
+ image::https://img.shields.io/badge/code_style-alchemists-brightgreen.svg[Alchemists Style Guide]
11
13
  [link=https://circleci.com/gh/bkuhlmann/git-lint]
12
14
  image::https://circleci.com/gh/bkuhlmann/git-lint.svg?style=svg[Circle CI Status]
13
15
 
@@ -19,11 +21,6 @@ image::https://api.netlify.com/api/v1/badges/7e23b422-3412-4e7f-b654-65c0417a0b1
19
21
  A command line interface for linting Git commits. Ensures you maintain a clean, easy to read,
20
22
  debuggable, and maintainable project history.
21
23
 
22
- *Git Lint is the official port of the original Git Cop project that avoids references to violence or
23
- violent terminology that might make anyone feel unwelcome. The name change was necessary in order to
24
- better support the link:https://blacklivesmatter.com[Black Lives Matter] and
25
- link:https://8cantwait.org[Defund Police] movements.*
26
-
27
24
  toc::[]
28
25
 
29
26
  == Features
@@ -383,6 +380,36 @@ from `master`.
383
380
  Detection and configuration happens automatically by checking the `CIRCLECI` environment variable.
384
381
  No additional setup required!
385
382
 
383
+ ==== link:https://docs.github.com/en/free-pro-team@latest/actions[GitHub Actions]
384
+
385
+ Detection happens automatically by checking the `GITHUB_ACTIONS` environment variable as supplied by
386
+ the GitHub environment. The only configuration required is to add a `.github/workflows/git_lint.yml`
387
+ to your repository with the following contents:
388
+
389
+ [source,yaml]
390
+ ----
391
+ name: Git Lint
392
+
393
+ on: pull_request
394
+
395
+ jobs:
396
+ run:
397
+ runs-on: ubuntu-latest
398
+ container:
399
+ image: ruby:latest
400
+ steps:
401
+ - uses: actions/checkout@v2
402
+ with:
403
+ fetch-depth: '0'
404
+ ref: ${{github.head_ref}}
405
+ - name: Install
406
+ run: gem install git-lint
407
+ - name: Analyze
408
+ run: git-lint --analyze
409
+ ----
410
+
411
+ The above will ensure Git Lint runs as an additional check on each Pull Request.
412
+
386
413
  ==== link:https://www.netlify.com[Netlify CI]
387
414
 
388
415
  Detection and configuration happens automatically by checking the `NETLIFY` environment variable. No
@@ -883,14 +910,19 @@ configuration disabled.
883
910
  * Use small, atomic commits:
884
911
  ** Easier to review and provide feedback.
885
912
  ** Easier to review implementation and corresponding tests.
886
- ** Easier to document with detailed subject messages (especially when grouped together in a pull
887
- request).
913
+ ** Easier to document with detailed subjects (especially when grouped together in a pull request).
888
914
  ** Easier to reword, edit, squash, fix, or drop when interactively rebasing.
889
915
  ** Easier to combine together versus tearing apart a larger commit into smaller commits.
890
916
  * Use logically ordered commits:
891
917
  ** Each commit should tell a story and be a logical building block to the next commit.
918
+ ** Each commit should, ideally, be the implementation plus corresponding test. Avoid committing
919
+ changes that are a jumble of mixed ideas as they are hard to decipher and a huge insult not only
920
+ to the reviewer but your future self.
892
921
  ** Each commit, when reviewed in order, should be able to explain _how_ the feature or bug fix was
893
922
  completed and implemented properly.
923
+ * Keep refactored code separate from behavioral changes. This makes the review process easier
924
+ because you don't have to sift through all the line and format changes to figure out what is new
925
+ or changed.
894
926
 
895
927
  === Branches
896
928
 
@@ -924,8 +956,11 @@ configuration disabled.
924
956
 
925
957
  === Code Reviews
926
958
 
927
- There are two objectives each code review should achieve:
959
+ There are three main objectives each code review should achieve:
928
960
 
961
+ . *Joy* - The experience of working with you, receiving feedback, giving feedback, and demonstrating
962
+ a level of care influences others and encourages a collaborative environment that is fun to work
963
+ in. Use this time to build and reinforce trust amongst your fellow colleagues.
929
964
  . *Quality*: Ensures changes are of highest quality that adhere to team standards while enhancing
930
965
  the customer experience and not disrupting their workflow.
931
966
  . *Education*: Provides a chance for everyone on the team to learn more about the architecture,
@@ -935,13 +970,22 @@ There are two objectives each code review should achieve:
935
970
  In addition to the objectives above, the following guidelines are worth following:
936
971
 
937
972
  * Keep code reviews short and easy to review:
973
+ ** Review your own code first before submitting to others. By ensuring your are confident in the
974
+ overall implementation and the commits in terms of commit messages and implementation details,
975
+ you'll encourage higher quality feedback and show appreciation for the reviewer's time.
938
976
  ** Provide a high level overview that answers _why_ the code review is necessary.
939
- ** Provide a link to the issue/task that prompted the code review (if any).
977
+ ** Provide a link to the issue that prompted the code review (if any) and any additional details
978
+ worth highlighting to guide the reviewer through the process.
940
979
  ** Provide screenshots/screencasts if possible.
941
- ** Ensure commits within the code review are related to the purpose of the code review.
942
- ** Prefer code reviews at about 250 lines in order to keep the quality of the code review and defect
943
- detection high.
944
- ** Avoid working on a large issue without getting feedback first in order to not overwhelm/surprise
980
+ ** Provide any ancillary notes or points of interest worth highlighting for the reviewer.
981
+ ** Ensure commits within the code review are related to the purpose of the code review and avoid
982
+ mixing in changes that are ancillary to the primary objective of the code view. If you do have
983
+ changes outside of the scope of the current code review, open those changes up as a separate code
984
+ review instead.
985
+ ** Prefer code reviews at about 300 lines in order to keep the quality of the code review and defect
986
+ detection high. This also shows you value the reviewers time and attention away from their own
987
+ work.
988
+ ** Avoid working on a large issues without first getting feedback in order to not overwhelm/surprise
945
989
  the maintainers. More discussion up front will help ensure your work has a faster chance of
946
990
  acceptance.
947
991
  * Review and rebase code reviews quickly:
@@ -981,9 +1025,14 @@ In addition to the objectives above, the following guidelines are worth followin
981
1025
  always meant as a response to helpful feedback.
982
1026
  ** ✅ (`:white_check_mark:`) - Signifies code review approval. The author can
983
1027
  rebase onto `master` and delete the feature branch at this point.
1028
+ * Use all feedback as a chance to learn, teach, strenghen the bond of trust between you and your
1029
+ fellow colleagues, and avoid being cut by
1030
+ link:https://fs.blog/2017/04/mental-model-hanlons-razor[Hanlon's Razor].
1031
+ * Use automation to ensure code reviews are consistent, of high quality, and swift to resolve. Each
1032
+ code review can be an opportunity to identify and automate the process further.
984
1033
  * Use face-to-face communication if a code review's written discussion gets lengthy/noisy.
985
- * Create new tasks/actions if additional features are discovered during a code review to avoid
986
- delaying code review acceptance. Return to the code review once tasks have been logged.
1034
+ * Create follow-up actions if additional features are discovered during a code review to avoid
1035
+ delaying code review acceptance. Return to the code review once the new actions have been logged.
987
1036
  * The author, not the reviewer, should rebase the feature branch onto `master` upon approval.
988
1037
  * Avoid reviewing your own code review before rebasing onto `master`. Have another pair of eyes
989
1038
  review your code first.
@@ -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,10 +11,9 @@ 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"
16
+ require "git/lint/branches/environments/git_hub_action"
18
17
  require "git/lint/branches/environments/netlify_ci"
19
18
  require "git/lint/branches/environments/travis_ci"
20
19
  require "git/lint/branches/feature"
@@ -91,10 +91,10 @@ module Git
91
91
  end
92
92
  end
93
93
 
94
- def affected_commit_trailer_lines
95
- commit.trailer_lines
94
+ def affected_commit_trailers
95
+ commit.trailers
96
96
  .each.with_object([])
97
- .with_index(commit.trailer_index) do |(line, lines), index|
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
@@ -32,7 +32,7 @@ module Git
32
32
  attr_reader :validator
33
33
 
34
34
  def minimum
35
- settings.fetch :minimum
35
+ settings.fetch __method__
36
36
  end
37
37
  end
38
38
  end
@@ -12,12 +12,12 @@ module Git
12
12
  end
13
13
 
14
14
  def valid?
15
- raw_body = commit.raw_body
16
- subject, body = raw_body.split "\n", 2
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
- raw_body.match?(/\A.+(\n\n|\#).+/m)
20
+ message.match?(/\A.+(\n\n|\#).+/m)
21
21
  end
22
22
 
23
23
  def issue
@@ -34,7 +34,7 @@ module Git
34
34
  private
35
35
 
36
36
  def fixup_or_squash?
37
- commit.is_a?(Git::Lint::Commits::Unsaved) && (commit.fixup? || commit.squash?)
37
+ commit.fixup? || commit.squash?
38
38
  end
39
39
  end
40
40
  end
@@ -23,7 +23,7 @@ module Git
23
23
  # rubocop:enable Metrics/ParameterLists
24
24
 
25
25
  def valid?
26
- affected_commit_trailer_lines.empty?
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: affected_commit_trailer_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
- affected_commit_trailer_lines.empty?
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: affected_commit_trailer_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.trailer_lines.each { |line| collection[line] += 1 if parser.new(line).match? }
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
- affected_commit_trailer_lines.empty?
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: affected_commit_trailer_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
- affected_commit_trailer_lines.empty?
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: affected_commit_trailer_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
- affected_commit_trailer_lines.empty?
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: affected_commit_trailer_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 repo: Git::Kit::Repo.new
10
- @repo = repo
9
+ def initialize repository: GitPlus::Repository.new
10
+ @repository = repository
11
11
  end
12
12
 
13
13
  def name
14
- "origin/#{repo.branch_name}"
14
+ "origin/#{repository.branch_name}"
15
15
  end
16
16
 
17
- def shas
18
- repo.shas start: "origin/master", finish: name
17
+ def commits
18
+ repository.commits "origin/master..#{name}"
19
19
  end
20
20
 
21
21
  private
22
22
 
23
- attr_reader :repo
23
+ attr_reader :repository
24
24
  end
25
25
  end
26
26
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Git
4
+ module Lint
5
+ module Branches
6
+ module Environments
7
+ # Provides GitHub Action build environment feature branch information.
8
+ class GitHubAction
9
+ def initialize repository: GitPlus::Repository.new
10
+ @repository = repository
11
+ end
12
+
13
+ def name
14
+ "origin/#{repository.branch_name}"
15
+ end
16
+
17
+ def commits
18
+ repository.commits "origin/master..#{name}"
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :repository
24
+ end
25
+ end
26
+ end
27
+ end
28
+ 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 repo: Git::Kit::Repo.new
10
- @repo = repo
9
+ def initialize repository: GitPlus::Repository.new
10
+ @repository = repository
11
11
  end
12
12
 
13
13
  def name
14
- repo.branch_name
14
+ repository.branch_name
15
15
  end
16
16
 
17
- def shas
18
- repo.shas start: "master", finish: name
17
+ def commits
18
+ repository.commits "master..#{name}"
19
19
  end
20
20
 
21
21
  private
22
22
 
23
- attr_reader :repo
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 environment: ENV, repo: Git::Kit::Repo.new, shell: Open3
12
- @environment = environment
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 shas
22
- shell.capture2e "git remote add -f origin #{environment["REPOSITORY_URL"]}"
23
- shell.capture2e "git fetch origin #{name}:#{name}"
24
- repo.shas start: "origin/master", finish: "origin/#{name}"
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 :environment, :repo, :shell
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 environment: ENV, repo: Git::Kit::Repo.new, shell: Open3
12
- @environment = environment
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 shas
21
+ def commits
22
22
  prepare_project
23
- repo.shas start: "origin/master", finish: name
23
+ repository.commits "origin/master..#{name}"
24
24
  end
25
25
 
26
26
  private
27
27
 
28
- attr_reader :environment, :repo, :shell
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.capture2e "git remote add -f original_branch https://github.com/#{slug}.git"
35
- shell.capture2e "git fetch original_branch #{name}:#{name}"
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.capture2e "git remote set-branches --add origin master"
39
- shell.capture2e "git fetch"
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