dependabot-common 0.108.18 → 0.108.19

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c7a321afdc29b6aa6494a78c484e071649a2ecd967b43e5a23eab6008bcc2c6
4
- data.tar.gz: 2f1decb5e0952056542965f9006dc018c74b0a0eb7bf4631ef6b604a42f99dbe
3
+ metadata.gz: 9c8b59378241405894c2ce121aa7ed05e619caf957a927bf17cabb734b05f165
4
+ data.tar.gz: 3da383889459a00bf61b175c0f7a8a20fc4b95b703d1bb3eb562043d3a824a54
5
5
  SHA512:
6
- metadata.gz: 51695da91c51eb7a9c7938fb3141c5397273da2644e91d2f3533277bab839332688093f57e8b926a5155d92f6bcefd9f169c131bd149a428c2b5a623e16ef81f
7
- data.tar.gz: ce2ab6cd3a7591638ee2743c48ef7e4351aec09b9c68582e485ac35fe3a5f38f950deddb781fcbce598b79b9aad7881eb31801e6fee0332a120abfb5ed484c37
6
+ metadata.gz: 4df19d351139d8accd5c8afdf768bdfe4e61432c0d2afd7b69441dfa13006cac6915b44c556d81cf34682c35964a362a66a203f55bedb884b5e1c97f1e0742c4
7
+ data.tar.gz: c0f8720394c1e3059d4cdad5a22b764d8adb41549f9882901356ce97c0be097d2660634bf514124b92ded45094c556776d744c4af6399809c13b78d56f8b2d5f
@@ -12,24 +12,7 @@ module Dependabot
12
12
  class MessageBuilder
13
13
  require_relative "message_builder/issue_linker"
14
14
  require_relative "message_builder/link_and_mention_sanitizer"
15
-
16
- ANGULAR_PREFIXES = %w(build chore ci docs feat fix perf refactor style
17
- test).freeze
18
- ESLINT_PREFIXES = %w(Breaking Build Chore Docs Fix New Update
19
- Upgrade).freeze
20
- GITMOJI_PREFIXES = %w(alien ambulance apple arrow_down arrow_up art beers
21
- bento bookmark boom bug building_construction bulb
22
- busts_in_silhouette camera_flash card_file_box
23
- chart_with_upwards_trend checkered_flag
24
- children_crossing clown_face construction
25
- construction_worker egg fire globe_with_meridians
26
- green_apple green_heart hankey heavy_minus_sign
27
- heavy_plus_sign iphone lipstick lock loud_sound memo
28
- mute ok_hand package page_facing_up pencil2 penguin
29
- pushpin recycle rewind robot rocket rotating_light
30
- see_no_evil sparkles speech_balloon tada truck
31
- twisted_rightwards_arrows whale wheelchair
32
- white_check_mark wrench zap).freeze
15
+ require_relative "pr_name_prefixer"
33
16
 
34
17
  attr_reader :source, :dependencies, :files, :credentials,
35
18
  :pr_message_footer, :signoff_details, :vulnerabilities_fixed,
@@ -49,9 +32,11 @@ module Dependabot
49
32
  end
50
33
 
51
34
  def pr_name
52
- return library_pr_name if library?
35
+ pr_name = pr_name_prefixer.pr_name_prefix
36
+ pr_name += library? ? library_pr_name : application_pr_name
37
+ return pr_name if files.first.directory == "/"
53
38
 
54
- application_pr_name
39
+ pr_name + " in #{files.first.directory}"
55
40
  end
56
41
 
57
42
  def pr_message
@@ -68,53 +53,11 @@ module Dependabot
68
53
 
69
54
  private
70
55
 
71
- def commit_subject
72
- subject = pr_name.gsub("⬆️", ":arrow_up:").gsub("🔒", ":lock:")
73
- return subject unless subject.length > 72
74
-
75
- subject = subject.gsub(/ from [^\s]*? to [^\s]*/, "")
76
- return subject unless subject.length > 72
77
-
78
- subject.split(" in ").first
79
- end
80
-
81
- def commit_message_intro
82
- return requirement_commit_message_intro if library?
83
-
84
- version_commit_message_intro
85
- end
86
-
87
- def prefixed_pr_message_footer
88
- return "" unless pr_message_footer
89
-
90
- "\n\n#{pr_message_footer}"
91
- end
92
-
93
- def message_trailers
94
- return unless on_behalf_of_message || signoff_message
95
-
96
- [on_behalf_of_message, signoff_message].compact.join("\n")
97
- end
98
-
99
- def signoff_message
100
- return unless signoff_details.is_a?(Hash)
101
- return unless signoff_details[:name] && signoff_details[:email]
102
-
103
- "Signed-off-by: #{signoff_details[:name]} <#{signoff_details[:email]}>"
104
- end
105
-
106
- def on_behalf_of_message
107
- return unless signoff_details.is_a?(Hash)
108
- return unless signoff_details[:org_name] && signoff_details[:org_email]
109
-
110
- "On-behalf-of: @#{signoff_details[:org_name]} "\
111
- "<#{signoff_details[:org_email]}>"
112
- end
113
-
114
56
  def library_pr_name
115
- pr_name = pr_name_prefix
57
+ pr_name = "update "
58
+ pr_name = pr_name.capitalize if pr_name_prefixer.capitalize_first_word?
116
59
 
117
- pr_name +=
60
+ pr_name +
118
61
  if dependencies.count == 1
119
62
  "#{dependencies.first.display_name} requirement "\
120
63
  "from #{old_library_requirement(dependencies.first)} "\
@@ -123,17 +66,14 @@ module Dependabot
123
66
  names = dependencies.map(&:name)
124
67
  "requirements for #{names[0..-2].join(', ')} and #{names[-1]}"
125
68
  end
126
-
127
- return pr_name if files.first.directory == "/"
128
-
129
- pr_name + " in #{files.first.directory}"
130
69
  end
131
70
 
132
71
  # rubocop:disable Metrics/AbcSize
133
72
  def application_pr_name
134
- pr_name = pr_name_prefix
73
+ pr_name = "bump "
74
+ pr_name = pr_name.capitalize if pr_name_prefixer.capitalize_first_word?
135
75
 
136
- pr_name +=
76
+ pr_name +
137
77
  if dependencies.count == 1
138
78
  dependency = dependencies.first
139
79
  "#{dependency.display_name} from #{previous_version(dependency)} "\
@@ -151,95 +91,54 @@ module Dependabot
151
91
  names = dependencies.map(&:name)
152
92
  "#{names[0..-2].join(', ')} and #{names[-1]}"
153
93
  end
154
-
155
- return pr_name if files.first.directory == "/"
156
-
157
- pr_name + " in #{files.first.directory}"
158
94
  end
159
95
  # rubocop:enable Metrics/AbcSize
160
96
 
161
97
  def pr_name_prefix
162
- prefix = commit_prefix.to_s
163
- prefix += security_prefix if includes_security_fixes?
164
- prefix = prefix.gsub("⬆️ 🔒", "⬆️🔒")
165
- prefix + pr_name_first_word
166
- end
167
-
168
- def commit_prefix
169
- # If there is a previous Dependabot commit, and it used a known style,
170
- # use that as our model for subsequent commits
171
- case last_dependabot_commit_style
172
- when :gitmoji then "⬆️ "
173
- when :conventional_prefix then "#{last_dependabot_commit_prefix}: "
174
- when :conventional_prefix_with_scope
175
- "#{last_dependabot_commit_prefix}(#{scope}): "
176
- else
177
- # Otherwise we need to detect the user's preferred style from the
178
- # existing commits on their repo
179
- build_commit_prefix_from_previous_commits
180
- end
98
+ pr_name_prefixer.pr_name_prefix
181
99
  end
182
100
 
183
- def security_prefix
184
- return "🔒 " if commit_prefix == "⬆️ "
101
+ def commit_subject
102
+ subject = pr_name.gsub("⬆️", ":arrow_up:").gsub("🔒", ":lock:")
103
+ return subject unless subject.length > 72
185
104
 
186
- capitalize_first_word? ? "[Security] " : "[security] "
187
- end
105
+ subject = subject.gsub(/ from [^\s]*? to [^\s]*/, "")
106
+ return subject unless subject.length > 72
188
107
 
189
- def pr_name_first_word
190
- first_word = library? ? "update " : "bump "
191
- capitalize_first_word? ? first_word.capitalize : first_word
108
+ subject.split(" in ").first
192
109
  end
193
110
 
194
- def capitalize_first_word?
195
- case last_dependabot_commit_style
196
- when :gitmoji then true
197
- when :conventional_prefix, :conventional_prefix_with_scope
198
- last_dependabot_commit_message.match?(/: (\[Security\] )?(B|U)/)
199
- else
200
- if using_angular_commit_messages? || using_eslint_commit_messages?
201
- prefixes = ANGULAR_PREFIXES + ESLINT_PREFIXES
202
- semantic_msgs = recent_commit_messages.select do |message|
203
- prefixes.any? { |pre| message.match?(/#{pre}[:(]/i) }
204
- end
205
-
206
- return true if semantic_msgs.all? { |m| m.match?(/:\s+\[?[A-Z]/) }
207
- return false if semantic_msgs.all? { |m| m.match?(/:\s+\[?[a-z]/) }
208
- end
111
+ def commit_message_intro
112
+ return requirement_commit_message_intro if library?
209
113
 
210
- !commit_prefix&.match(/\A[a-z]/)
211
- end
114
+ version_commit_message_intro
212
115
  end
213
116
 
214
- def build_commit_prefix_from_previous_commits
215
- if using_angular_commit_messages?
216
- "#{angular_commit_prefix}(#{scope}): "
217
- elsif using_eslint_commit_messages?
218
- # https://eslint.org/docs/developer-guide/contributing/pull-requests
219
- "Upgrade: "
220
- elsif using_gitmoji_commit_messages?
221
- "⬆️ "
222
- elsif using_prefixed_commit_messages?
223
- "build(#{scope}): "
224
- end
225
- end
117
+ def prefixed_pr_message_footer
118
+ return "" unless pr_message_footer
226
119
 
227
- def scope
228
- dependencies.any?(&:production?) ? "deps" : "deps-dev"
120
+ "\n\n#{pr_message_footer}"
229
121
  end
230
122
 
231
- def last_dependabot_commit_style
232
- return unless (msg = last_dependabot_commit_message)
123
+ def message_trailers
124
+ return unless on_behalf_of_message || signoff_message
125
+
126
+ [on_behalf_of_message, signoff_message].compact.join("\n")
127
+ end
233
128
 
234
- return :gitmoji if msg.start_with?("⬆️")
235
- return :conventional_prefix if msg.match?(/\A(chore|build|upgrade):/i)
236
- return unless msg.match?(/\A(chore|build|upgrade)\(/i)
129
+ def signoff_message
130
+ return unless signoff_details.is_a?(Hash)
131
+ return unless signoff_details[:name] && signoff_details[:email]
237
132
 
238
- :conventional_prefix_with_scope
133
+ "Signed-off-by: #{signoff_details[:name]} <#{signoff_details[:email]}>"
239
134
  end
240
135
 
241
- def last_dependabot_commit_prefix
242
- last_dependabot_commit_message&.split(/[:(]/)&.first
136
+ def on_behalf_of_message
137
+ return unless signoff_details.is_a?(Hash)
138
+ return unless signoff_details[:org_name] && signoff_details[:org_email]
139
+
140
+ "On-behalf-of: @#{signoff_details[:org_name]} "\
141
+ "<#{signoff_details[:org_email]}>"
243
142
  end
244
143
 
245
144
  def requirement_commit_message_intro
@@ -619,6 +518,16 @@ module Dependabot
619
518
  new(dependency: dependency, credentials: credentials)
620
519
  end
621
520
 
521
+ def pr_name_prefixer
522
+ @pr_name_prefixer ||=
523
+ PrNamePrefixer.new(
524
+ source: source,
525
+ dependencies: dependencies,
526
+ credentials: credentials,
527
+ security_fix: vulnerabilities_fixed.values.flatten.any?
528
+ )
529
+ end
530
+
622
531
  def previous_version(dependency)
623
532
  if dependency.previous_version.match?(/^[0-9a-f]{40}$/)
624
533
  return previous_ref(dependency) if ref_changed?(dependency)
@@ -753,191 +662,6 @@ module Dependabot
753
662
  Gem::Version.correct?(dependency.version)
754
663
  end
755
664
 
756
- def includes_security_fixes?
757
- vulnerabilities_fixed.values.flatten.any?
758
- end
759
-
760
- def using_angular_commit_messages?
761
- return false if recent_commit_messages.none?
762
-
763
- angular_messages = recent_commit_messages.select do |message|
764
- ANGULAR_PREFIXES.any? { |pre| message.match?(/#{pre}[:(]/i) }
765
- end
766
-
767
- # Definitely not using Angular commits if < 30% match angular commits
768
- if angular_messages.count.to_f / recent_commit_messages.count < 0.3
769
- return false
770
- end
771
-
772
- eslint_only_pres = ESLINT_PREFIXES.map(&:downcase) - ANGULAR_PREFIXES
773
- angular_only_pres = ANGULAR_PREFIXES - ESLINT_PREFIXES.map(&:downcase)
774
-
775
- uses_eslint_only_pres =
776
- recent_commit_messages.
777
- any? { |m| eslint_only_pres.any? { |pre| m.match?(/#{pre}[:(]/i) } }
778
-
779
- uses_angular_only_pres =
780
- recent_commit_messages.
781
- any? { |m| angular_only_pres.any? { |pre| m.match?(/#{pre}[:(]/i) } }
782
-
783
- # If using any angular-only prefixes, return true
784
- # (i.e., we assume Angular over ESLint when both are present)
785
- return true if uses_angular_only_pres
786
- return false if uses_eslint_only_pres
787
-
788
- true
789
- end
790
-
791
- def using_eslint_commit_messages?
792
- return false if recent_commit_messages.none?
793
-
794
- semantic_messages = recent_commit_messages.select do |message|
795
- ESLINT_PREFIXES.any? { |pre| message.start_with?(/#{pre}[:(]/) }
796
- end
797
-
798
- semantic_messages.count.to_f / recent_commit_messages.count > 0.3
799
- end
800
-
801
- def using_prefixed_commit_messages?
802
- return false if using_gitmoji_commit_messages?
803
- return false if recent_commit_messages.none?
804
-
805
- prefixed_messages = recent_commit_messages.select do |message|
806
- message.start_with?(/[a-z][^\s]+:/)
807
- end
808
-
809
- prefixed_messages.count.to_f / recent_commit_messages.count > 0.3
810
- end
811
-
812
- def angular_commit_prefix
813
- raise "Not using angular commits!" unless using_angular_commit_messages?
814
-
815
- recent_commits_using_chore =
816
- recent_commit_messages.
817
- any? { |msg| msg.start_with?("chore", "Chore") }
818
-
819
- recent_commits_using_build =
820
- recent_commit_messages.
821
- any? { |msg| msg.start_with?("build", "Build") }
822
-
823
- commit_prefix =
824
- if recent_commits_using_chore && !recent_commits_using_build
825
- "chore"
826
- else
827
- "build"
828
- end
829
-
830
- if capitalize_angular_commit_prefix?
831
- commit_prefix = commit_prefix.capitalize
832
- end
833
-
834
- commit_prefix
835
- end
836
-
837
- def capitalize_angular_commit_prefix?
838
- semantic_messages = recent_commit_messages.select do |message|
839
- ANGULAR_PREFIXES.any? { |pre| message.match?(/#{pre}[:(]/i) }
840
- end
841
-
842
- if semantic_messages.none?
843
- return last_dependabot_commit_message&.start_with?(/[A-Z]/)
844
- end
845
-
846
- capitalized_msgs = semantic_messages.
847
- select { |m| m.start_with?(/[A-Z]/) }
848
- capitalized_msgs.count.to_f / semantic_messages.count > 0.5
849
- end
850
-
851
- def using_gitmoji_commit_messages?
852
- return false unless recent_commit_messages.any?
853
-
854
- gitmoji_messages =
855
- recent_commit_messages.
856
- select { |m| GITMOJI_PREFIXES.any? { |pre| m.match?(/:#{pre}:/i) } }
857
-
858
- gitmoji_messages.count / recent_commit_messages.count.to_f > 0.3
859
- end
860
-
861
- def recent_commit_messages
862
- case source.provider
863
- when "github" then recent_github_commit_messages
864
- when "gitlab" then recent_gitlab_commit_messages
865
- else raise "Unsupported provider: #{source.provider}"
866
- end
867
- end
868
-
869
- def recent_github_commit_messages
870
- recent_github_commits.
871
- reject { |c| c.author&.type == "Bot" }.
872
- reject { |c| c.commit&.message&.start_with?("Merge") }.
873
- map(&:commit).
874
- map(&:message).
875
- compact.
876
- map(&:strip)
877
- end
878
-
879
- def recent_gitlab_commit_messages
880
- @recent_gitlab_commit_messages ||=
881
- gitlab_client_for_source.commits(source.repo)
882
-
883
- @recent_gitlab_commit_messages.
884
- reject { |c| c.author_email == "support@dependabot.com" }.
885
- reject { |c| c.message&.start_with?("merge !") }.
886
- map(&:message).
887
- compact.
888
- map(&:strip)
889
- end
890
-
891
- def last_dependabot_commit_message
892
- case source.provider
893
- when "github" then last_github_dependabot_commit_message
894
- when "gitlab" then last_gitlab_dependabot_commit_message
895
- else raise "Unsupported provider: #{source.provider}"
896
- end
897
- end
898
-
899
- def last_github_dependabot_commit_message
900
- recent_github_commits.
901
- reject { |c| c.commit&.message&.start_with?("Merge") }.
902
- find { |c| c.commit.author&.name&.include?("dependabot") }&.
903
- commit&.
904
- message&.
905
- strip
906
- end
907
-
908
- def recent_github_commits
909
- @recent_github_commits ||=
910
- github_client_for_source.commits(source.repo, per_page: 100)
911
- rescue Octokit::Conflict
912
- @recent_github_commits ||= []
913
- end
914
-
915
- def last_gitlab_dependabot_commit_message
916
- @recent_gitlab_commit_messages ||=
917
- gitlab_client_for_source.commits(source.repo)
918
-
919
- @recent_gitlab_commit_messages.
920
- find { |c| c.author_email == "support@dependabot.com" }&.
921
- message&.
922
- strip
923
- end
924
-
925
- def github_client_for_source
926
- @github_client_for_source ||=
927
- Dependabot::Clients::GithubWithRetries.for_source(
928
- source: source,
929
- credentials: credentials
930
- )
931
- end
932
-
933
- def gitlab_client_for_source
934
- @gitlab_client_for_source ||=
935
- Dependabot::Clients::GitlabWithRetries.for_source(
936
- source: source,
937
- credentials: credentials
938
- )
939
- end
940
-
941
665
  def package_manager
942
666
  @package_manager ||= dependencies.first.package_manager
943
667
  end
@@ -0,0 +1,307 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/clients/github_with_retries"
4
+ require "dependabot/clients/gitlab_with_retries"
5
+ require "dependabot/pull_request_creator"
6
+
7
+ module Dependabot
8
+ class PullRequestCreator
9
+ class PrNamePrefixer
10
+ ANGULAR_PREFIXES = %w(build chore ci docs feat fix perf refactor style
11
+ test).freeze
12
+ ESLINT_PREFIXES = %w(Breaking Build Chore Docs Fix New Update
13
+ Upgrade).freeze
14
+ GITMOJI_PREFIXES = %w(alien ambulance apple arrow_down arrow_up art beers
15
+ bento bookmark boom bug building_construction bulb
16
+ busts_in_silhouette camera_flash card_file_box
17
+ chart_with_upwards_trend checkered_flag
18
+ children_crossing clown_face construction
19
+ construction_worker egg fire globe_with_meridians
20
+ green_apple green_heart hankey heavy_minus_sign
21
+ heavy_plus_sign iphone lipstick lock loud_sound memo
22
+ mute ok_hand package page_facing_up pencil2 penguin
23
+ pushpin recycle rewind robot rocket rotating_light
24
+ see_no_evil sparkles speech_balloon tada truck
25
+ twisted_rightwards_arrows whale wheelchair
26
+ white_check_mark wrench zap).freeze
27
+
28
+ def initialize(source:, dependencies:, credentials:, security_fix: false)
29
+ @dependencies = dependencies
30
+ @source = source
31
+ @credentials = credentials
32
+ @security_fix = security_fix
33
+ end
34
+
35
+ def pr_name_prefix
36
+ prefix = commit_prefix.to_s
37
+ prefix += security_prefix if security_fix?
38
+ prefix.gsub("⬆️ 🔒", "⬆️🔒")
39
+ end
40
+
41
+ def capitalize_first_word?
42
+ case last_dependabot_commit_style
43
+ when :gitmoji then true
44
+ when :conventional_prefix, :conventional_prefix_with_scope
45
+ last_dependabot_commit_message.match?(/: (\[Security\] )?(B|U)/)
46
+ else
47
+ if using_angular_commit_messages? || using_eslint_commit_messages?
48
+ prefixes = ANGULAR_PREFIXES + ESLINT_PREFIXES
49
+ semantic_msgs = recent_commit_messages.select do |message|
50
+ prefixes.any? { |pre| message.match?(/#{pre}[:(]/i) }
51
+ end
52
+
53
+ return true if semantic_msgs.all? { |m| m.match?(/:\s+\[?[A-Z]/) }
54
+ return false if semantic_msgs.all? { |m| m.match?(/:\s+\[?[a-z]/) }
55
+ end
56
+
57
+ !commit_prefix&.match(/\A[a-z]/)
58
+ end
59
+ end
60
+
61
+ private
62
+
63
+ attr_reader :source, :dependencies, :credentials
64
+
65
+ def security_fix?
66
+ @security_fix
67
+ end
68
+
69
+ def commit_prefix
70
+ # If there is a previous Dependabot commit, and it used a known style,
71
+ # use that as our model for subsequent commits
72
+ case last_dependabot_commit_style
73
+ when :gitmoji then "⬆️ "
74
+ when :conventional_prefix then "#{last_dependabot_commit_prefix}: "
75
+ when :conventional_prefix_with_scope
76
+ "#{last_dependabot_commit_prefix}(#{scope}): "
77
+ else
78
+ # Otherwise we need to detect the user's preferred style from the
79
+ # existing commits on their repo
80
+ build_commit_prefix_from_previous_commits
81
+ end
82
+ end
83
+
84
+ def security_prefix
85
+ return "🔒 " if commit_prefix == "⬆️ "
86
+
87
+ capitalize_first_word? ? "[Security] " : "[security] "
88
+ end
89
+
90
+ def build_commit_prefix_from_previous_commits
91
+ if using_angular_commit_messages?
92
+ "#{angular_commit_prefix}(#{scope}): "
93
+ elsif using_eslint_commit_messages?
94
+ # https://eslint.org/docs/developer-guide/contributing/pull-requests
95
+ "Upgrade: "
96
+ elsif using_gitmoji_commit_messages?
97
+ "⬆️ "
98
+ elsif using_prefixed_commit_messages?
99
+ "build(#{scope}): "
100
+ end
101
+ end
102
+
103
+ def scope
104
+ dependencies.any?(&:production?) ? "deps" : "deps-dev"
105
+ end
106
+
107
+ def last_dependabot_commit_style
108
+ return unless (msg = last_dependabot_commit_message)
109
+
110
+ return :gitmoji if msg.start_with?("⬆️")
111
+ return :conventional_prefix if msg.match?(/\A(chore|build|upgrade):/i)
112
+ return unless msg.match?(/\A(chore|build|upgrade)\(/i)
113
+
114
+ :conventional_prefix_with_scope
115
+ end
116
+
117
+ def last_dependabot_commit_prefix
118
+ last_dependabot_commit_message&.split(/[:(]/)&.first
119
+ end
120
+
121
+ def using_angular_commit_messages?
122
+ return false if recent_commit_messages.none?
123
+
124
+ angular_messages = recent_commit_messages.select do |message|
125
+ ANGULAR_PREFIXES.any? { |pre| message.match?(/#{pre}[:(]/i) }
126
+ end
127
+
128
+ # Definitely not using Angular commits if < 30% match angular commits
129
+ if angular_messages.count.to_f / recent_commit_messages.count < 0.3
130
+ return false
131
+ end
132
+
133
+ eslint_only_pres = ESLINT_PREFIXES.map(&:downcase) - ANGULAR_PREFIXES
134
+ angular_only_pres = ANGULAR_PREFIXES - ESLINT_PREFIXES.map(&:downcase)
135
+
136
+ uses_eslint_only_pres =
137
+ recent_commit_messages.
138
+ any? { |m| eslint_only_pres.any? { |pre| m.match?(/#{pre}[:(]/i) } }
139
+
140
+ uses_angular_only_pres =
141
+ recent_commit_messages.
142
+ any? { |m| angular_only_pres.any? { |pre| m.match?(/#{pre}[:(]/i) } }
143
+
144
+ # If using any angular-only prefixes, return true
145
+ # (i.e., we assume Angular over ESLint when both are present)
146
+ return true if uses_angular_only_pres
147
+ return false if uses_eslint_only_pres
148
+
149
+ true
150
+ end
151
+
152
+ def using_eslint_commit_messages?
153
+ return false if recent_commit_messages.none?
154
+
155
+ semantic_messages = recent_commit_messages.select do |message|
156
+ ESLINT_PREFIXES.any? { |pre| message.start_with?(/#{pre}[:(]/) }
157
+ end
158
+
159
+ semantic_messages.count.to_f / recent_commit_messages.count > 0.3
160
+ end
161
+
162
+ def using_prefixed_commit_messages?
163
+ return false if using_gitmoji_commit_messages?
164
+ return false if recent_commit_messages.none?
165
+
166
+ prefixed_messages = recent_commit_messages.select do |message|
167
+ message.start_with?(/[a-z][^\s]+:/)
168
+ end
169
+
170
+ prefixed_messages.count.to_f / recent_commit_messages.count > 0.3
171
+ end
172
+
173
+ def angular_commit_prefix
174
+ raise "Not using angular commits!" unless using_angular_commit_messages?
175
+
176
+ recent_commits_using_chore =
177
+ recent_commit_messages.
178
+ any? { |msg| msg.start_with?("chore", "Chore") }
179
+
180
+ recent_commits_using_build =
181
+ recent_commit_messages.
182
+ any? { |msg| msg.start_with?("build", "Build") }
183
+
184
+ commit_prefix =
185
+ if recent_commits_using_chore && !recent_commits_using_build
186
+ "chore"
187
+ else
188
+ "build"
189
+ end
190
+
191
+ if capitalize_angular_commit_prefix?
192
+ commit_prefix = commit_prefix.capitalize
193
+ end
194
+
195
+ commit_prefix
196
+ end
197
+
198
+ def capitalize_angular_commit_prefix?
199
+ semantic_messages = recent_commit_messages.select do |message|
200
+ ANGULAR_PREFIXES.any? { |pre| message.match?(/#{pre}[:(]/i) }
201
+ end
202
+
203
+ if semantic_messages.none?
204
+ return last_dependabot_commit_message&.start_with?(/[A-Z]/)
205
+ end
206
+
207
+ capitalized_msgs = semantic_messages.
208
+ select { |m| m.start_with?(/[A-Z]/) }
209
+ capitalized_msgs.count.to_f / semantic_messages.count > 0.5
210
+ end
211
+
212
+ def using_gitmoji_commit_messages?
213
+ return false unless recent_commit_messages.any?
214
+
215
+ gitmoji_messages =
216
+ recent_commit_messages.
217
+ select { |m| GITMOJI_PREFIXES.any? { |pre| m.match?(/:#{pre}:/i) } }
218
+
219
+ gitmoji_messages.count / recent_commit_messages.count.to_f > 0.3
220
+ end
221
+
222
+ def recent_commit_messages
223
+ case source.provider
224
+ when "github" then recent_github_commit_messages
225
+ when "gitlab" then recent_gitlab_commit_messages
226
+ else raise "Unsupported provider: #{source.provider}"
227
+ end
228
+ end
229
+
230
+ def recent_github_commit_messages
231
+ recent_github_commits.
232
+ reject { |c| c.author&.type == "Bot" }.
233
+ reject { |c| c.commit&.message&.start_with?("Merge") }.
234
+ map(&:commit).
235
+ map(&:message).
236
+ compact.
237
+ map(&:strip)
238
+ end
239
+
240
+ def recent_gitlab_commit_messages
241
+ @recent_gitlab_commit_messages ||=
242
+ gitlab_client_for_source.commits(source.repo)
243
+
244
+ @recent_gitlab_commit_messages.
245
+ reject { |c| c.author_email == "support@dependabot.com" }.
246
+ reject { |c| c.message&.start_with?("merge !") }.
247
+ map(&:message).
248
+ compact.
249
+ map(&:strip)
250
+ end
251
+
252
+ def last_dependabot_commit_message
253
+ case source.provider
254
+ when "github" then last_github_dependabot_commit_message
255
+ when "gitlab" then last_gitlab_dependabot_commit_message
256
+ else raise "Unsupported provider: #{source.provider}"
257
+ end
258
+ end
259
+
260
+ def last_github_dependabot_commit_message
261
+ recent_github_commits.
262
+ reject { |c| c.commit&.message&.start_with?("Merge") }.
263
+ find { |c| c.commit.author&.name&.include?("dependabot") }&.
264
+ commit&.
265
+ message&.
266
+ strip
267
+ end
268
+
269
+ def recent_github_commits
270
+ @recent_github_commits ||=
271
+ github_client_for_source.commits(source.repo, per_page: 100)
272
+ rescue Octokit::Conflict
273
+ @recent_github_commits ||= []
274
+ end
275
+
276
+ def last_gitlab_dependabot_commit_message
277
+ @recent_gitlab_commit_messages ||=
278
+ gitlab_client_for_source.commits(source.repo)
279
+
280
+ @recent_gitlab_commit_messages.
281
+ find { |c| c.author_email == "support@dependabot.com" }&.
282
+ message&.
283
+ strip
284
+ end
285
+
286
+ def github_client_for_source
287
+ @github_client_for_source ||=
288
+ Dependabot::Clients::GithubWithRetries.for_source(
289
+ source: source,
290
+ credentials: credentials
291
+ )
292
+ end
293
+
294
+ def gitlab_client_for_source
295
+ @gitlab_client_for_source ||=
296
+ Dependabot::Clients::GitlabWithRetries.for_source(
297
+ source: source,
298
+ credentials: credentials
299
+ )
300
+ end
301
+
302
+ def package_manager
303
+ @package_manager ||= dependencies.first.package_manager
304
+ end
305
+ end
306
+ end
307
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Dependabot
4
- VERSION = "0.108.18"
4
+ VERSION = "0.108.19"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.108.18
4
+ version: 0.108.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-14 00:00:00.000000000 Z
11
+ date: 2019-06-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk-ecr
@@ -346,6 +346,7 @@ files:
346
346
  - lib/dependabot/pull_request_creator/message_builder.rb
347
347
  - lib/dependabot/pull_request_creator/message_builder/issue_linker.rb
348
348
  - lib/dependabot/pull_request_creator/message_builder/link_and_mention_sanitizer.rb
349
+ - lib/dependabot/pull_request_creator/pr_name_prefixer.rb
349
350
  - lib/dependabot/pull_request_updater.rb
350
351
  - lib/dependabot/pull_request_updater/github.rb
351
352
  - lib/dependabot/security_advisory.rb