gitlab-dangerfiles 0.1.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/lib/danger/helper.rb +155 -113
  3. data/lib/danger/roulette.rb +68 -36
  4. data/lib/gitlab/dangerfiles.rb +0 -34
  5. data/lib/gitlab/dangerfiles/base_linter.rb +96 -0
  6. data/lib/gitlab/dangerfiles/commit_linter.rb +25 -103
  7. data/lib/gitlab/dangerfiles/merge_request_linter.rb +30 -0
  8. data/lib/gitlab/dangerfiles/teammate.rb +23 -9
  9. data/lib/gitlab/dangerfiles/title_linting.rb +38 -0
  10. data/lib/gitlab/dangerfiles/version.rb +1 -1
  11. data/lib/gitlab/dangerfiles/weightage.rb +10 -0
  12. data/lib/gitlab/dangerfiles/weightage/maintainers.rb +33 -0
  13. data/lib/gitlab/dangerfiles/weightage/reviewers.rb +65 -0
  14. metadata +9 -25
  15. data/lib/danger/changelog.rb +0 -39
  16. data/lib/danger/sidekiq_queues.rb +0 -37
  17. data/lib/gitlab/dangerfiles/bundle_size/Dangerfile +0 -38
  18. data/lib/gitlab/dangerfiles/ce_ee_vue_templates/Dangerfile +0 -56
  19. data/lib/gitlab/dangerfiles/changelog/Dangerfile +0 -90
  20. data/lib/gitlab/dangerfiles/changes_size/Dangerfile +0 -17
  21. data/lib/gitlab/dangerfiles/commit_messages/Dangerfile +0 -135
  22. data/lib/gitlab/dangerfiles/database/Dangerfile +0 -67
  23. data/lib/gitlab/dangerfiles/documentation/Dangerfile +0 -29
  24. data/lib/gitlab/dangerfiles/duplicate_yarn_dependencies/Dangerfile +0 -29
  25. data/lib/gitlab/dangerfiles/eslint/Dangerfile +0 -31
  26. data/lib/gitlab/dangerfiles/frozen_string/Dangerfile +0 -28
  27. data/lib/gitlab/dangerfiles/karma/Dangerfile +0 -51
  28. data/lib/gitlab/dangerfiles/metadata/Dangerfile +0 -50
  29. data/lib/gitlab/dangerfiles/popen.rb +0 -55
  30. data/lib/gitlab/dangerfiles/prettier/Dangerfile +0 -41
  31. data/lib/gitlab/dangerfiles/roulette/Dangerfile +0 -97
  32. data/lib/gitlab/dangerfiles/sidekiq_queues/Dangerfile +0 -27
  33. data/lib/gitlab/dangerfiles/specs/Dangerfile +0 -42
  34. data/lib/gitlab/dangerfiles/tasks.rb +0 -19
  35. data/lib/gitlab/dangerfiles/telemetry/Dangerfile +0 -32
  36. data/lib/gitlab/dangerfiles/utility_css/Dangerfile +0 -51
@@ -1,17 +0,0 @@
1
- # FIXME: git.info_for_file raises the following error
2
- # /usr/local/bundle/gems/git-1.4.0/lib/git/lib.rb:956:in `command': (Danger::DSLError)
3
- # [!] Invalid `Dangerfile` file:
4
- # [!] Invalid `Dangerfile` file: git '--git-dir=/builds/gitlab-org/gitlab/.git' '--work-tree=/builds/gitlab-org/gitlab' cat-file '-t' '' 2>&1:fatal: Not a valid object name
5
- # This seems to be the same as https://github.com/danger/danger/issues/535.
6
-
7
- # locale_files_updated = git.modified_files.select { |path| path.start_with?('locale') }
8
- # locale_files_updated.each do |locale_file_updated|
9
- # git_stats = git.info_for_file(locale_file_updated)
10
- # message "Git stats for #{locale_file_updated}: #{git_stats[:insertions]} insertions, #{git_stats[:deletions]} insertions"
11
- # end
12
-
13
- if git.lines_of_code > 2_000
14
- warn "This merge request is definitely too big (more than #{git.lines_of_code} lines changed), please split it into multiple merge requests."
15
- elsif git.lines_of_code > 500
16
- warn "This merge request is quite big (more than #{git.lines_of_code} lines changed), please consider splitting it into multiple merge requests."
17
- end
@@ -1,135 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative File.expand_path("../../danger/commit_linter", __dir__)
4
-
5
- COMMIT_MESSAGE_GUIDELINES = "https://docs.gitlab.com/ee/development/contributing/merge_request_workflow.html#commit-messages-guidelines"
6
- MORE_INFO = "For more information, take a look at our [Commit message guidelines](#{COMMIT_MESSAGE_GUIDELINES})."
7
- THE_DANGER_JOB_TEXT = "the `danger-review` job"
8
- MAX_COMMITS_COUNT = 10
9
- MAX_COMMITS_COUNT_EXCEEDED_MESSAGE = <<~MSG
10
- This merge request includes more than %<max_commits_count>d commits. Each commit should meet the following criteria:
11
-
12
- 1. Have a well-written commit message.
13
- 1. Has all tests passing when used on its own (e.g. when using git checkout SHA).
14
- 1. Can be reverted on its own without also requiring the revert of commit that came before it.
15
- 1. Is small enough that it can be reviewed in isolation in under 30 minutes or so.
16
-
17
- If this merge request contains commits that do not meet this criteria and/or contains intermediate work, please rebase these commits into a smaller number of commits or split this merge request into multiple smaller merge requests.
18
- MSG
19
-
20
- def fail_commit(commit, message, more_info: true)
21
- self.fail(build_message(commit, message, more_info: more_info))
22
- end
23
-
24
- def warn_commit(commit, message, more_info: true)
25
- self.warn(build_message(commit, message, more_info: more_info))
26
- end
27
-
28
- def build_message(commit, message, more_info: true)
29
- [message].tap do |full_message|
30
- full_message << ". #{MORE_INFO}" if more_info
31
- full_message.unshift("#{commit.sha}: ") if commit.sha
32
- end.join
33
- end
34
-
35
- def squash_mr?
36
- helper.ci? ? gitlab.mr_json['squash'] : false
37
- end
38
-
39
- def wip_mr?
40
- helper.ci? ? gitlab.mr_json['work_in_progress'] : false
41
- end
42
-
43
- def danger_job_link
44
- helper.ci? ? "[#{THE_DANGER_JOB_TEXT}](#{ENV['CI_JOB_URL']})" : THE_DANGER_JOB_TEXT
45
- end
46
-
47
- # Perform various checks against commits. We're not using
48
- # https://github.com/jonallured/danger-commit_lint because its output is not
49
- # very helpful, and it doesn't offer the means of ignoring merge commits.
50
- def lint_commit(commit)
51
- linter = Gitlab::Dangerfiles::CommitLinter.new(commit)
52
-
53
- # For now we'll ignore merge commits, as getting rid of those is a problem
54
- # separate from enforcing good commit messages.
55
- return linter if linter.merge?
56
-
57
- # We ignore revert commits as they are well structured by Git already
58
- return linter if linter.revert?
59
-
60
- # If MR is set to squash, we ignore fixup commits
61
- return linter if linter.fixup? && squash_mr?
62
-
63
- if linter.fixup?
64
- msg = "Squash or fixup commits must be squashed before merge, or enable squash merge option and re-run #{danger_job_link}."
65
- if wip_mr? || squash_mr?
66
- warn_commit(commit, msg, more_info: false)
67
- else
68
- fail_commit(commit, msg, more_info: false)
69
- end
70
-
71
- # Makes no sense to process other rules for fixup commits, they trigger just more noise
72
- return linter
73
- end
74
-
75
- # Fail if a suggestion commit is used and squash is not enabled
76
- if linter.suggestion?
77
- unless squash_mr?
78
- fail_commit(commit, "If you are applying suggestions, enable squash in the merge request and re-run #{danger_job_link}.", more_info: false)
79
- end
80
-
81
- return linter
82
- end
83
-
84
- linter.lint
85
- end
86
-
87
- def lint_mr_title(mr_title)
88
- commit = Struct.new(:message, :sha).new(mr_title)
89
-
90
- Gitlab::Dangerfiles::CommitLinter.new(commit).lint_subject("merge request title")
91
- end
92
-
93
- def count_non_fixup_commits(commit_linters)
94
- commit_linters.count { |commit_linter| !commit_linter.fixup? }
95
- end
96
-
97
- def lint_commits(commits)
98
- commit_linters = commits.map { |commit| lint_commit(commit) }
99
- failed_commit_linters = commit_linters.select { |commit_linter| commit_linter.failed? }
100
- warn_or_fail_commits(failed_commit_linters, default_to_fail: !squash_mr?)
101
-
102
- if count_non_fixup_commits(commit_linters) > MAX_COMMITS_COUNT
103
- self.warn(format(MAX_COMMITS_COUNT_EXCEEDED_MESSAGE, max_commits_count: MAX_COMMITS_COUNT))
104
- end
105
-
106
- if squash_mr?
107
- multi_line_commit_linter = commit_linters.detect { |commit_linter| !commit_linter.merge? && commit_linter.multi_line? }
108
-
109
- if multi_line_commit_linter && multi_line_commit_linter.failed?
110
- warn_or_fail_commits(multi_line_commit_linter)
111
- else
112
- title_linter = lint_mr_title(gitlab.mr_json['title'])
113
- if title_linter.failed?
114
- warn_or_fail_commits(title_linter)
115
- end
116
- end
117
- end
118
- end
119
-
120
- def warn_or_fail_commits(failed_linters, default_to_fail: true)
121
- level = default_to_fail ? :fail : :warn
122
-
123
- Array(failed_linters).each do |linter|
124
- linter.problems.each do |problem_key, problem_desc|
125
- case problem_key
126
- when :subject_above_warning
127
- warn_commit(linter.commit, problem_desc)
128
- else
129
- self.__send__("#{level}_commit", linter.commit, problem_desc) # rubocop:disable GitlabSecurity/PublicSend
130
- end
131
- end
132
- end
133
- end
134
-
135
- lint_commits(git.commits)
@@ -1,67 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- SCHEMA_NOT_UPDATED_MESSAGE_SHORT = <<~MSG
4
- New %<migrations>s added but %<schema>s wasn't updated.
5
- MSG
6
-
7
- SCHEMA_NOT_UPDATED_MESSAGE_FULL = <<~MSG
8
- **#{SCHEMA_NOT_UPDATED_MESSAGE_SHORT}**
9
-
10
- Usually, when adding new %<migrations>s, %<schema>s should be
11
- updated too (unless the migration isn't changing the DB schema
12
- and isn't the most recent one).
13
- MSG
14
-
15
- DB_MESSAGE = <<~MSG
16
- This merge request requires a database review. To make sure these
17
- changes are reviewed, take the following steps:
18
-
19
- 1. Ensure the merge request has ~database and ~"database::review pending" labels.
20
- If the merge request modifies database files, Danger will do this for you.
21
- 1. Prepare your MR for database review according to the
22
- [docs](https://docs.gitlab.com/ee/development/database_review.html#how-to-prepare-the-merge-request-for-a-database-review).
23
- 1. Assign and mention the database reviewer suggested by Reviewer Roulette.
24
- MSG
25
-
26
- DB_FILES_MESSAGE = <<~MSG
27
- The following files require a review from the Database team:
28
- MSG
29
-
30
- DATABASE_APPROVED_LABEL = 'database::approved'
31
-
32
- non_geo_db_schema_updated = !git.modified_files.grep(%r{\Adb/structure\.sql}).empty?
33
- geo_db_schema_updated = !git.modified_files.grep(%r{\Aee/db/geo/schema\.rb}).empty?
34
-
35
- non_geo_migration_created = !git.added_files.grep(%r{\A(db/(post_)?migrate)/}).empty?
36
- geo_migration_created = !git.added_files.grep(%r{\Aee/db/geo/(post_)?migrate/}).empty?
37
-
38
- format_str = helper.ci? ? SCHEMA_NOT_UPDATED_MESSAGE_FULL : SCHEMA_NOT_UPDATED_MESSAGE_SHORT
39
-
40
- if non_geo_migration_created && !non_geo_db_schema_updated
41
- warn format(format_str, migrations: 'migrations', schema: helper.html_link("db/structure.sql"))
42
- end
43
-
44
- if geo_migration_created && !geo_db_schema_updated
45
- warn format(format_str, migrations: 'Geo migrations', schema: helper.html_link("ee/db/geo/schema.rb"))
46
- end
47
-
48
- return unless helper.ci?
49
- return if gitlab.mr_labels.include?(DATABASE_APPROVED_LABEL)
50
-
51
- db_paths_to_review = helper.changes_by_category[:database]
52
-
53
- if gitlab.mr_labels.include?('database') || db_paths_to_review.any?
54
- message 'This merge request adds or changes files that require a ' \
55
- 'review from the [Database team](https://gitlab.com/groups/gl-database/-/group_members).'
56
-
57
- markdown(DB_MESSAGE)
58
- markdown(DB_FILES_MESSAGE + helper.markdown_list(db_paths_to_review)) if db_paths_to_review.any?
59
-
60
- database_labels = helper.missing_database_labels(gitlab.mr_labels)
61
-
62
- if database_labels.any?
63
- gitlab.api.update_merge_request(gitlab.mr_json['project_id'],
64
- gitlab.mr_json['iid'],
65
- labels: (gitlab.mr_labels + database_labels).join(','))
66
- end
67
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- docs_paths_to_review = helper.changes_by_category[:docs]
4
-
5
- return if docs_paths_to_review.empty?
6
-
7
- message 'This merge request adds or changes files that require a review ' \
8
- 'from the Technical Writing team.'
9
-
10
- return unless helper.ci?
11
-
12
- markdown(<<~MARKDOWN)
13
- ## Documentation review
14
-
15
- The following files require a review from a technical writer:
16
-
17
- * #{docs_paths_to_review.map { |path| "`#{path}`" }.join("\n* ")}
18
-
19
- The review does not need to block merging this merge request. See the:
20
-
21
- - [Technical Writers assignments](https://about.gitlab.com/handbook/engineering/technical-writing/#designated-technical-writers) for the appropriate technical writer for this review.
22
- - [Documentation workflows](https://docs.gitlab.com/ee/development/documentation/workflow.html) for information on when to assign a merge request for review.
23
- MARKDOWN
24
-
25
- unless gitlab.mr_labels.include?('documentation')
26
- gitlab.api.update_merge_request(gitlab.mr_json['project_id'],
27
- gitlab.mr_json['iid'],
28
- labels: (gitlab.mr_labels + ['documentation']).join(','))
29
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- return unless helper.all_changed_files.include?('yarn.lock')
4
-
5
- duplicate = `node_modules/.bin/yarn-deduplicate --list --strategy fewer yarn.lock`
6
- .split(/$/)
7
- .map(&:strip)
8
- .reject(&:empty?)
9
-
10
- return if duplicate.empty?
11
-
12
- warn 'This merge request has introduced duplicated yarn dependencies.'
13
-
14
- if helper.ci?
15
- markdown(<<~MARKDOWN)
16
- ## Duplicate yarn dependencies
17
-
18
- The following dependencies should be de-duplicated:
19
-
20
- * #{duplicate.map { |path| "`#{path}`" }.join("\n* ")}
21
-
22
- Please run the following command and commit the changes to `yarn.lock`:
23
-
24
- ```
25
- node_modules/.bin/yarn-deduplicate --strategy fewer yarn.lock \\
26
- && yarn install
27
- ```
28
- MARKDOWN
29
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- def get_eslint_files(files)
4
- files.select do |file|
5
- file.end_with?('.js', '.vue') &&
6
- File.read(file).include?('/* eslint-disable')
7
- end
8
- end
9
-
10
- eslint_candidates = get_eslint_files(helper.all_changed_files)
11
-
12
- return if eslint_candidates.empty?
13
-
14
- warn 'This merge request changed files with disabled eslint rules. Please consider fixing them.'
15
-
16
- if helper.ci?
17
- markdown(<<~MARKDOWN)
18
- ## Disabled eslint rules
19
-
20
- The following files have disabled `eslint` rules. Please consider fixing them:
21
-
22
- * #{eslint_candidates.map { |path| "`#{path}`" }.join("\n* ")}
23
-
24
- Run the following command for more details
25
-
26
- ```
27
- node_modules/.bin/eslint --report-unused-disable-directives --no-inline-config \\
28
- #{eslint_candidates.map { |path| " '#{path}'" }.join(" \\\n")}
29
- ```
30
- MARKDOWN
31
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- FILE_EXTENSION = ".rb"
4
- MAGIC_COMMENT = "# frozen_string_literal: true"
5
-
6
- def get_files_with_no_magic_comment(files)
7
- files.select do |file|
8
- file.end_with?(FILE_EXTENSION) &&
9
- !File.open(file, &:gets)&.start_with?(MAGIC_COMMENT)
10
- end
11
- end
12
-
13
- files_to_fix = get_files_with_no_magic_comment(git.added_files)
14
-
15
- if files_to_fix.any?
16
- warn 'This merge request adds files that do not enforce frozen string literal. ' \
17
- 'See https://gitlab.com/gitlab-org/gitlab-foss/issues/47424 for more information.'
18
-
19
- if helper.ci?
20
- markdown(<<~MARKDOWN)
21
- ## Enable Frozen String Literal
22
-
23
- The following files should have `#{MAGIC_COMMENT}` on the first line:
24
-
25
- * #{files_to_fix.map { |path| "`#{path}`" }.join("\n* ")}
26
- MARKDOWN
27
- end
28
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
- # rubocop:disable Style/SignalException
3
-
4
- def get_karma_files(files)
5
- files.select do |file|
6
- file.start_with?('ee/spec/javascripts', 'spec/javascripts') &&
7
- file.end_with?('_spec.js') &&
8
- !file.end_with?('browser_spec.js')
9
- end
10
- end
11
-
12
- new_karma_files = get_karma_files(git.added_files.to_a)
13
-
14
- unless new_karma_files.empty?
15
-
16
- if helper.ci?
17
- markdown(<<~MARKDOWN)
18
- ## New karma spec file
19
-
20
- New frontend specs ([except `browser_specs`](https://gitlab.com/gitlab-org/gitlab/blob/3b6fe2f1077eedb0b8aff02a7350234f0b7dc4f9/spec/javascripts/lib/utils/browser_spec.js#L2)) should be
21
- [written in jest](https://docs.gitlab.com/ee/development/testing_guide/frontend_testing.html#jest).
22
-
23
- You have created the following tests, please migrate them over to jest:
24
-
25
- * #{new_karma_files.map { |path| "`#{path}`" }.join("\n* ")}
26
- MARKDOWN
27
- end
28
-
29
- fail "You have created a new karma spec file"
30
-
31
- end
32
-
33
- changed_karma_files = get_karma_files(helper.all_changed_files) - new_karma_files
34
-
35
- return if changed_karma_files.empty?
36
-
37
- warn 'You have edited karma spec files. Please consider migrating them to jest.'
38
-
39
- if helper.ci?
40
- markdown(<<~MARKDOWN)
41
- ## Edited karma files
42
-
43
- You have edited the following karma spec files. Please consider migrating them to jest:
44
-
45
- * #{changed_karma_files.map { |path| "`#{path}`" }.join("\n* ")}
46
-
47
- In order to align with our Iteration value, migration can also be done as a follow-up.
48
-
49
- For more information: [Jestodus epic](https://gitlab.com/groups/gitlab-org/-/epics/895)
50
- MARKDOWN
51
- end
@@ -1,50 +0,0 @@
1
- # rubocop:disable Style/SignalException
2
-
3
- THROUGHPUT_LABELS = [
4
- 'Community contribution',
5
- 'security',
6
- 'bug',
7
- 'backstage', # To be removed by https://gitlab.com/gitlab-org/gitlab/-/issues/222360.
8
- 'feature',
9
- 'feature::addition',
10
- 'feature::maintenance',
11
- 'tooling',
12
- 'tooling::pipelines',
13
- 'tooling::workflow',
14
- 'documentation'
15
- ].freeze
16
-
17
- if gitlab.mr_body.size < 5
18
- fail "Please provide a proper merge request description."
19
- end
20
-
21
- if gitlab.mr_labels.empty?
22
- fail "Please add labels to this merge request."
23
- end
24
-
25
- if (THROUGHPUT_LABELS & gitlab.mr_labels).empty?
26
- warn 'Please add a [throughput label](https://about.gitlab.com/handbook/engineering/management/throughput/#implementation) to this merge request.'
27
- end
28
-
29
- unless gitlab.mr_json["assignee"]
30
- warn "This merge request does not have any assignee yet. Setting an assignee clarifies who needs to take action on the merge request at any given time."
31
- end
32
-
33
- has_milestone = !gitlab.mr_json["milestone"].nil?
34
-
35
- unless has_milestone
36
- warn "This merge request does not refer to an existing milestone.", sticky: false
37
- end
38
-
39
- has_pick_into_stable_label = gitlab.mr_labels.find { |label| label.start_with?('Pick into') }
40
-
41
- if gitlab.branch_for_base != "master" && !has_pick_into_stable_label && !helper.security_mr?
42
- warn "Most of the time, merge requests should target `master`. Otherwise, please set the relevant `Pick into X.Y` label."
43
- end
44
-
45
- if gitlab.mr_json['title'].length > 72
46
- warn 'The title of this merge request is longer than 72 characters and ' \
47
- 'would violate our commit message rules when using the Squash on Merge ' \
48
- 'feature. Please consider adjusting the title, or rebase the ' \
49
- "commits manually and don't use Squash on Merge."
50
- end