git-lint 1.1.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/LICENSE.adoc +1 -1
- data/README.adoc +82 -30
- data/lib/git/lint.rb +2 -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_bullet_delimiter.rb +5 -1
- data/lib/git/lint/analyzers/commit_body_leading_line.rb +4 -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 +28 -0
- 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 +7 -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 +21 -191
- 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
Binary file
|
data/LICENSE.adoc
CHANGED
@@ -150,7 +150,7 @@ additional liability.
|
|
150
150
|
|
151
151
|
END OF TERMS AND CONDITIONS
|
152
152
|
|
153
|
-
Copyright link:https://www.alchemists.io[
|
153
|
+
Copyright 2020 link:https://www.alchemists.io/team/brooke_kuhlmann[Brooke Kuhlmann].
|
154
154
|
|
155
155
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
|
156
156
|
compliance with the License. You may obtain a link:https://www.apache.org/licenses/LICENSE-2.0[copy]
|
data/README.adoc
CHANGED
@@ -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
|
|
@@ -45,8 +47,6 @@ image::https://www.alchemists.io/images/screencasts/git_lint/cover.svg[Screencas
|
|
45
47
|
|
46
48
|
== Setup
|
47
49
|
|
48
|
-
=== Production
|
49
|
-
|
50
50
|
To install, run:
|
51
51
|
|
52
52
|
[source,bash]
|
@@ -54,24 +54,6 @@ To install, run:
|
|
54
54
|
gem install git-lint
|
55
55
|
----
|
56
56
|
|
57
|
-
=== Development
|
58
|
-
|
59
|
-
To contribute, run:
|
60
|
-
|
61
|
-
[source,bash]
|
62
|
-
----
|
63
|
-
git clone https://github.com/bkuhlmann/git-lint.git
|
64
|
-
cd git-lint
|
65
|
-
bin/setup
|
66
|
-
----
|
67
|
-
|
68
|
-
You can also use the IRB console for direct access to all objects:
|
69
|
-
|
70
|
-
[source,bash]
|
71
|
-
----
|
72
|
-
bin/console
|
73
|
-
----
|
74
|
-
|
75
57
|
== Usage
|
76
58
|
|
77
59
|
=== Command Line Interface (CLI)
|
@@ -403,6 +385,36 @@ from `master`.
|
|
403
385
|
Detection and configuration happens automatically by checking the `CIRCLECI` environment variable.
|
404
386
|
No additional setup required!
|
405
387
|
|
388
|
+
==== link:https://docs.github.com/en/free-pro-team@latest/actions[GitHub Actions]
|
389
|
+
|
390
|
+
Detection happens automatically by checking the `GITHUB_ACTIONS` environment variable as supplied by
|
391
|
+
the GitHub environment. The only configuration required is to add a `.github/workflows/git_lint.yml`
|
392
|
+
to your repository with the following contents:
|
393
|
+
|
394
|
+
[source,yaml]
|
395
|
+
----
|
396
|
+
name: Git Lint
|
397
|
+
|
398
|
+
on: pull_request
|
399
|
+
|
400
|
+
jobs:
|
401
|
+
run:
|
402
|
+
runs-on: ubuntu-latest
|
403
|
+
container:
|
404
|
+
image: ruby:latest
|
405
|
+
steps:
|
406
|
+
- uses: actions/checkout@v2
|
407
|
+
with:
|
408
|
+
fetch-depth: '0'
|
409
|
+
ref: ${{github.head_ref}}
|
410
|
+
- name: Install
|
411
|
+
run: gem install git-lint
|
412
|
+
- name: Analyze
|
413
|
+
run: git-lint --analyze
|
414
|
+
----
|
415
|
+
|
416
|
+
The above will ensure Git Lint runs as an additional check on each Pull Request.
|
417
|
+
|
406
418
|
==== link:https://www.netlify.com[Netlify CI]
|
407
419
|
|
408
420
|
Detection and configuration happens automatically by checking the `NETLIFY` environment variable. No
|
@@ -903,14 +915,19 @@ configuration disabled.
|
|
903
915
|
* Use small, atomic commits:
|
904
916
|
** Easier to review and provide feedback.
|
905
917
|
** Easier to review implementation and corresponding tests.
|
906
|
-
** Easier to document with detailed
|
907
|
-
request).
|
918
|
+
** Easier to document with detailed subjects (especially when grouped together in a pull request).
|
908
919
|
** Easier to reword, edit, squash, fix, or drop when interactively rebasing.
|
909
920
|
** Easier to combine together versus tearing apart a larger commit into smaller commits.
|
910
921
|
* Use logically ordered commits:
|
911
922
|
** Each commit should tell a story and be a logical building block to the next commit.
|
923
|
+
** Each commit should, ideally, be the implementation plus corresponding test. Avoid committing
|
924
|
+
changes that are a jumble of mixed ideas as they are hard to decipher and a huge insult not only
|
925
|
+
to the reviewer but your future self.
|
912
926
|
** Each commit, when reviewed in order, should be able to explain _how_ the feature or bug fix was
|
913
927
|
completed and implemented properly.
|
928
|
+
* Keep refactored code separate from behavioral changes. This makes the review process easier
|
929
|
+
because you don't have to sift through all the line and format changes to figure out what is new
|
930
|
+
or changed.
|
914
931
|
|
915
932
|
=== Branches
|
916
933
|
|
@@ -944,8 +961,11 @@ configuration disabled.
|
|
944
961
|
|
945
962
|
=== Code Reviews
|
946
963
|
|
947
|
-
There are
|
964
|
+
There are three main objectives each code review should achieve:
|
948
965
|
|
966
|
+
. *Joy* - The experience of working with you, receiving feedback, giving feedback, and demonstrating
|
967
|
+
a level of care influences others and encourages a collaborative environment that is fun to work
|
968
|
+
in. Use this time to build and reinforce trust amongst your fellow colleagues.
|
949
969
|
. *Quality*: Ensures changes are of highest quality that adhere to team standards while enhancing
|
950
970
|
the customer experience and not disrupting their workflow.
|
951
971
|
. *Education*: Provides a chance for everyone on the team to learn more about the architecture,
|
@@ -955,13 +975,22 @@ There are two objectives each code review should achieve:
|
|
955
975
|
In addition to the objectives above, the following guidelines are worth following:
|
956
976
|
|
957
977
|
* Keep code reviews short and easy to review:
|
978
|
+
** Review your own code first before submitting to others. By ensuring your are confident in the
|
979
|
+
overall implementation and the commits in terms of commit messages and implementation details,
|
980
|
+
you'll encourage higher quality feedback and show appreciation for the reviewer's time.
|
958
981
|
** Provide a high level overview that answers _why_ the code review is necessary.
|
959
|
-
** Provide a link to the issue
|
982
|
+
** Provide a link to the issue that prompted the code review (if any) and any additional details
|
983
|
+
worth highlighting to guide the reviewer through the process.
|
960
984
|
** Provide screenshots/screencasts if possible.
|
961
|
-
**
|
962
|
-
**
|
963
|
-
|
964
|
-
|
985
|
+
** Provide any ancillary notes or points of interest worth highlighting for the reviewer.
|
986
|
+
** Ensure commits within the code review are related to the purpose of the code review and avoid
|
987
|
+
mixing in changes that are ancillary to the primary objective of the code view. If you do have
|
988
|
+
changes outside of the scope of the current code review, open those changes up as a separate code
|
989
|
+
review instead.
|
990
|
+
** Prefer code reviews at about 300 lines in order to keep the quality of the code review and defect
|
991
|
+
detection high. This also shows you value the reviewers time and attention away from their own
|
992
|
+
work.
|
993
|
+
** Avoid working on a large issues without first getting feedback in order to not overwhelm/surprise
|
965
994
|
the maintainers. More discussion up front will help ensure your work has a faster chance of
|
966
995
|
acceptance.
|
967
996
|
* Review and rebase code reviews quickly:
|
@@ -1001,9 +1030,14 @@ In addition to the objectives above, the following guidelines are worth followin
|
|
1001
1030
|
always meant as a response to helpful feedback.
|
1002
1031
|
** ✅ (`:white_check_mark:`) - Signifies code review approval. The author can
|
1003
1032
|
rebase onto `master` and delete the feature branch at this point.
|
1033
|
+
* Use all feedback as a chance to learn, teach, strenghen the bond of trust between you and your
|
1034
|
+
fellow colleagues, and avoid being cut by
|
1035
|
+
link:https://fs.blog/2017/04/mental-model-hanlons-razor[Hanlon's Razor].
|
1036
|
+
* Use automation to ensure code reviews are consistent, of high quality, and swift to resolve. Each
|
1037
|
+
code review can be an opportunity to identify and automate the process further.
|
1004
1038
|
* Use face-to-face communication if a code review's written discussion gets lengthy/noisy.
|
1005
|
-
* Create
|
1006
|
-
delaying code review acceptance. Return to the code review once
|
1039
|
+
* Create follow-up actions if additional features are discovered during a code review to avoid
|
1040
|
+
delaying code review acceptance. Return to the code review once the new actions have been logged.
|
1007
1041
|
* The author, not the reviewer, should rebase the feature branch onto `master` upon approval.
|
1008
1042
|
* Avoid reviewing your own code review before rebasing onto `master`. Have another pair of eyes
|
1009
1043
|
review your code first.
|
@@ -1046,6 +1080,24 @@ image::https://www.alchemists.io/images/projects/git-lint/screenshots/github-set
|
|
1046
1080
|
|
1047
1081
|
Applying the above changes will help maintain a clean Git history.
|
1048
1082
|
|
1083
|
+
== Development
|
1084
|
+
|
1085
|
+
To contribute, run:
|
1086
|
+
|
1087
|
+
[source,bash]
|
1088
|
+
----
|
1089
|
+
git clone https://github.com/bkuhlmann/git-lint.git
|
1090
|
+
cd git-lint
|
1091
|
+
bin/setup
|
1092
|
+
----
|
1093
|
+
|
1094
|
+
You can also use the IRB console for direct access to all objects:
|
1095
|
+
|
1096
|
+
[source,bash]
|
1097
|
+
----
|
1098
|
+
bin/console
|
1099
|
+
----
|
1100
|
+
|
1049
1101
|
== Tests
|
1050
1102
|
|
1051
1103
|
To test, run:
|
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,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
|
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
|
@@ -32,7 +32,11 @@ module Git
|
|
32
32
|
end
|
33
33
|
|
34
34
|
def invalid_line? line
|
35
|
-
line.match?(/\A\s*#{
|
35
|
+
line.match?(/\A\s*#{pattern}(?!(#{pattern}|\s)).+\Z/)
|
36
|
+
end
|
37
|
+
|
38
|
+
def pattern
|
39
|
+
Regexp.union filter_list.to_regexp
|
36
40
|
end
|
37
41
|
end
|
38
42
|
end
|
@@ -12,11 +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
|
return true if !String(subject).empty? && String(body).strip.empty?
|
18
19
|
|
19
|
-
|
20
|
+
message.match?(/\A.+(\n\n|\#).+/m)
|
20
21
|
end
|
21
22
|
|
22
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
|
@@ -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
|