dependabot-pre_commit 0.378.0 → 0.380.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0d6b73af616d5369c52451ccbef4a7f69f84715bf04ca0ddb1745f396b4d425f
4
- data.tar.gz: 8bf9a0fdde19ff0b7ab8cccd0978e76cfbac723315bc68378574fda758bb9598
3
+ metadata.gz: 8e78048cc01b6cc8337b84479eb4406150f0755fccf0903e49dcbc99a5edd4ea
4
+ data.tar.gz: a8e05e70a8b9e6897d2d2282d6505eb3829a605c8b7a3398121a3481fed22257
5
5
  SHA512:
6
- metadata.gz: af324b530336ecce23a2734b971eb95ebb974a1dcf7a37d7dffb0a43feed8c8ba484cd71cb166d001525f99dade877f71ec56f3f1198502fad1d5156b00a08ec
7
- data.tar.gz: d350daf7fabc6897facf71f563bc6a40c4bd60537ea544de3408095e3938f4b5431fab45ba7da3b85c95d5e91fb897fb8184bffb382e20a3706abe8ca4985eca
6
+ metadata.gz: 7bfd3900fac1e250950fc46e60af6297b585cb9e29ed7ca5d440d259caf6082c988cc9523b1bcc5fa158996e3f8b567a16ecc4318dfc05e15bd10816d14f3a49
7
+ data.tar.gz: 0bf8f5fa2372328cec0bd516d5d59bff609da33a93dcb4b42f83428af191d46e461928313cca184bd029c03319a571f1c6306a793c0726e0cf286c4219bdb68b
@@ -2,6 +2,7 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  require "sorbet-runtime"
5
+ require "dependabot/package/release_cooldown_options"
5
6
 
6
7
  module Dependabot
7
8
  module PreCommit
@@ -43,14 +44,16 @@ module Dependabot
43
44
  source: T::Hash[Symbol, T.untyped],
44
45
  credentials: T::Array[Dependabot::Credential],
45
46
  requirements: T::Array[T::Hash[Symbol, T.untyped]],
46
- current_version: T.nilable(String)
47
+ current_version: T.nilable(String),
48
+ cooldown_options: T.nilable(Dependabot::Package::ReleaseCooldownOptions)
47
49
  ).void
48
50
  end
49
- def initialize(source:, credentials:, requirements:, current_version:)
51
+ def initialize(source:, credentials:, requirements:, current_version:, cooldown_options: nil)
50
52
  @source = source
51
53
  @credentials = credentials
52
54
  @requirements = requirements
53
55
  @current_version = current_version
56
+ @cooldown_options = cooldown_options
54
57
  end
55
58
 
56
59
  # Find the latest available version for this dependency
@@ -79,6 +82,9 @@ module Dependabot
79
82
  sig { returns(T.nilable(String)) }
80
83
  attr_reader :current_version
81
84
 
85
+ sig { returns(T.nilable(Dependabot::Package::ReleaseCooldownOptions)) }
86
+ attr_reader :cooldown_options
87
+
82
88
  sig { returns(T.nilable(String)) }
83
89
  def package_name
84
90
  source[:package_name]&.to_s
@@ -85,7 +85,8 @@ module Dependabot
85
85
  credentials: credentials,
86
86
  ignored_versions: [],
87
87
  security_advisories: [],
88
- raise_on_ignored: false
88
+ raise_on_ignored: false,
89
+ update_cooldown: cooldown_options
89
90
  )
90
91
  end
91
92
 
@@ -89,7 +89,8 @@ module Dependabot
89
89
  credentials: credentials,
90
90
  ignored_versions: [],
91
91
  security_advisories: [],
92
- raise_on_ignored: false
92
+ raise_on_ignored: false,
93
+ update_cooldown: cooldown_options
93
94
  )
94
95
  end
95
96
 
@@ -86,7 +86,8 @@ module Dependabot
86
86
  credentials: credentials,
87
87
  ignored_versions: [],
88
88
  security_advisories: [],
89
- raise_on_ignored: false
89
+ raise_on_ignored: false,
90
+ update_cooldown: cooldown_options
90
91
  )
91
92
  end
92
93
 
@@ -92,7 +92,8 @@ module Dependabot
92
92
  credentials: credentials,
93
93
  ignored_versions: [],
94
94
  security_advisories: [],
95
- raise_on_ignored: false
95
+ raise_on_ignored: false,
96
+ update_cooldown: cooldown_options
96
97
  )
97
98
  end
98
99
 
@@ -86,7 +86,8 @@ module Dependabot
86
86
  credentials: credentials,
87
87
  ignored_versions: [],
88
88
  security_advisories: [],
89
- raise_on_ignored: false
89
+ raise_on_ignored: false,
90
+ update_cooldown: cooldown_options
90
91
  )
91
92
  end
92
93
 
@@ -87,7 +87,8 @@ module Dependabot
87
87
  credentials: credentials,
88
88
  ignored_versions: [],
89
89
  security_advisories: [],
90
- raise_on_ignored: false
90
+ raise_on_ignored: false,
91
+ update_cooldown: cooldown_options
91
92
  )
92
93
  end
93
94
 
@@ -20,7 +20,7 @@ module Dependabot
20
20
  if info.nil?
21
21
  dependency.name
22
22
  else
23
- info[:url] || info.fetch("url")
23
+ info[:url] || info[:repo_url] || info["url"] || dependency.name
24
24
  end
25
25
  Source.from_url(url)
26
26
  end
@@ -46,6 +46,7 @@ module Dependabot
46
46
  @raise_on_ignored = raise_on_ignored
47
47
  @options = options
48
48
  @cooldown_options = cooldown_options
49
+ @cooldown_selected_tag = T.let(nil, T.nilable(T::Hash[Symbol, T.untyped]))
49
50
 
50
51
  @git_helper = T.let(git_helper, Dependabot::PreCommit::Helpers::Githelper)
51
52
  super(
@@ -85,22 +86,35 @@ module Dependabot
85
86
 
86
87
  Dependabot.logger.info("Available release version/ref is #{release}")
87
88
 
88
- release = cooldown_filter(release)
89
- if release.nil?
90
- Dependabot.logger.info("Returning current version/ref (no viable filtered release) #{current_version}")
91
- return current_version
92
- end
93
-
94
- release
89
+ filter_release_with_cooldown(release)
95
90
  end
96
91
 
97
92
  sig { returns(T.nilable(T::Hash[Symbol, T.untyped])) }
98
93
  def latest_version_tag
99
- available_latest_version_tag
94
+ @cooldown_selected_tag || available_latest_version_tag
100
95
  end
101
96
 
102
97
  private
103
98
 
99
+ sig do
100
+ params(release: T.any(Dependabot::Version, String))
101
+ .returns(T.nilable(T.any(Dependabot::Version, String)))
102
+ end
103
+ def filter_release_with_cooldown(release)
104
+ return release unless cooldown_enabled?
105
+ return release unless cooldown_options
106
+ # Commit SHA releases have no version ordering to fall back through
107
+ return release if release_type_sha?
108
+
109
+ Dependabot.logger.info("Applying cooldown filter for #{dependency.name}")
110
+
111
+ result = find_latest_version_outside_cooldown
112
+ return result if result
113
+
114
+ Dependabot.logger.info("All candidate versions are in cooldown, keeping current version #{current_version}")
115
+ current_version
116
+ end
117
+
104
118
  sig { returns(T.nilable(Dependabot::PreCommit::Package::PackageDetailsFetcher)) }
105
119
  def package_details_fetcher
106
120
  @package_details_fetcher ||= T.let(
@@ -136,58 +150,89 @@ module Dependabot
136
150
  true
137
151
  end
138
152
 
139
- sig do
140
- params(release: T.nilable(T.any(Dependabot::Version, String)))
141
- .returns(T.nilable(T.any(Dependabot::Version, String)))
142
- end
143
- def cooldown_filter(release)
144
- return release unless cooldown_enabled?
145
- return release unless cooldown_options
153
+ # Checks versions from latest downward (among versions > current_version)
154
+ # in a single bare clone. Returns the newest version outside cooldown,
155
+ # or nil if all candidates are within cooldown.
156
+ sig { returns(T.nilable(Dependabot::Version)) }
157
+ def find_latest_version_outside_cooldown
158
+ candidates = version_candidates_descending
159
+ return nil if candidates.empty?
146
160
 
147
- Dependabot.logger.info("Initializing cooldown filter")
148
- release_date = commit_metadata_details
161
+ url = @git_helper.git_commit_checker.dependency_source_details&.fetch(:url)
162
+ source = T.must(Source.from_url(url))
149
163
 
150
- unless release_date
151
- Dependabot.logger.info("No release date found, skipping cooldown filtering")
152
- return release
164
+ SharedHelpers.in_a_temporary_directory(File.dirname(source.repo)) do |temp_dir|
165
+ repo_contents_path = File.join(temp_dir, File.basename(source.repo))
166
+ SharedHelpers.run_shell_command("git clone --bare --no-recurse-submodules #{url} #{repo_contents_path}")
167
+
168
+ Dir.chdir(repo_contents_path) do
169
+ return check_candidates_cooldown(candidates)
170
+ end
153
171
  end
172
+ rescue StandardError => e
173
+ Dependabot.logger.error("Error checking cooldown for #{dependency.name}: #{e.message}")
174
+ nil
175
+ end
154
176
 
155
- if release_in_cooldown_period?(Time.parse(release_date))
156
- Dependabot.logger.info("Filtered out (cooldown) #{dependency.name}, #{release}")
157
- return nil
177
+ # Iterates candidate tags inside a bare clone directory, returning the first
178
+ # version whose release date falls outside the cooldown window.
179
+ sig do
180
+ params(candidates: T::Array[T::Hash[Symbol, T.untyped]])
181
+ .returns(T.nilable(Dependabot::Version))
182
+ end
183
+ def check_candidates_cooldown(candidates)
184
+ filtered_count = 0
185
+
186
+ candidates.each do |tag|
187
+ commit_sha = tag[:commit_sha]
188
+ next unless commit_sha
189
+
190
+ date_str = SharedHelpers.run_shell_command(
191
+ "git show --no-patch --format=\"%cd\" --date=iso #{commit_sha}",
192
+ fingerprint: "git show --no-patch --format=\"%cd\" --date=iso <commit_sha>"
193
+ )
194
+ release_date = Time.parse(date_str)
195
+
196
+ if release_in_cooldown_period?(release_date)
197
+ filtered_count += 1
198
+ else
199
+ log_cooldown_result(filtered_count, tag[:version], release_date)
200
+ @cooldown_selected_tag = tag
201
+ return T.cast(tag[:version], Dependabot::Version)
202
+ end
158
203
  end
159
204
 
160
- release
161
- end
162
-
163
- sig { returns(T.nilable(String)) }
164
- def commit_metadata_details
165
- @commit_metadata_details ||= T.let(
166
- begin
167
- url = @git_helper.git_commit_checker.dependency_source_details&.fetch(:url)
168
- source = T.must(Source.from_url(url))
169
-
170
- SharedHelpers.in_a_temporary_directory(File.dirname(source.repo)) do |temp_dir|
171
- repo_contents_path = File.join(temp_dir, File.basename(source.repo))
172
-
173
- SharedHelpers.run_shell_command("git clone --bare --no-recurse-submodules #{url} #{repo_contents_path}")
174
- Dir.chdir(repo_contents_path) do
175
- date = SharedHelpers.run_shell_command(
176
- "git show --no-patch --format=\"%cd\" " \
177
- "--date=iso #{commit_ref}"
178
- )
179
- Dependabot.logger.info("Found release date : #{Time.parse(date)}")
180
- return date
181
- end
182
- end
183
- rescue StandardError => e
184
- Dependabot.logger.error("Error (pre_commit) while checking release date for #{dependency.name}")
185
- Dependabot.logger.error(e.message)
186
-
187
- nil
188
- end,
189
- T.nilable(String)
205
+ Dependabot.logger.info(
206
+ "Filtered #{filtered_count} version(s) due to cooldown for #{dependency.name}, " \
207
+ "no eligible version found"
190
208
  )
209
+ nil
210
+ end
211
+
212
+ sig do
213
+ params(filtered_count: Integer, version: T.untyped, release_date: Time).void
214
+ end
215
+ def log_cooldown_result(filtered_count, version, release_date)
216
+ if filtered_count.positive?
217
+ Dependabot.logger.info(
218
+ "Filtered #{filtered_count} version(s) due to cooldown for #{dependency.name}"
219
+ )
220
+ end
221
+ Dependabot.logger.info("Selected version #{version} (released #{release_date})")
222
+ end
223
+
224
+ # Returns all version tags > current_version, sorted descending (latest first).
225
+ # This ensures we evaluate from the newest candidate downward.
226
+ sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
227
+ def version_candidates_descending
228
+ all_tags = @git_helper.git_commit_checker.local_tags_for_allowed_versions_matching_existing_precision
229
+ cur_version = current_version
230
+
231
+ all_tags
232
+ .select { |tag| tag[:version].is_a?(Gem::Version) }
233
+ .select { |tag| cur_version.nil? || tag[:version] > cur_version }
234
+ .sort_by { |tag| tag[:version] }
235
+ .reverse
191
236
  end
192
237
 
193
238
  sig { params(release_date: Time).returns(T::Boolean) }
@@ -198,25 +243,26 @@ module Dependabot
198
243
 
199
244
  days = T.must(cooldown).default_days
200
245
 
201
- Dependabot.logger.info(
202
- "Days since release : #{(Time.now.to_i - release_date.to_i) / (24 * 60 * 60)} " \
203
- "(cooldown days #{days})"
204
- )
205
-
206
246
  Dependabot::UpdateCheckers::CooldownCalculation
207
247
  .within_cooldown_window?(release_date, days)
208
248
  end
209
249
 
210
- sig { returns(String) }
211
- def commit_ref
212
- T.cast(latest_version_tag&.fetch(:commit_sha), String)
213
- end
214
-
215
250
  sig { returns(T.nilable(T.any(Dependabot::Version, String))) }
216
251
  def current_version
217
252
  return dependency.source_details(allowed_types: ["git"])&.fetch(:ref) if release_type_sha?
218
253
 
219
- T.let(dependency.numeric_version, T.nilable(Dependabot::Version))
254
+ # numeric_version handles plain versions like "4.4.0"
255
+ numeric = dependency.numeric_version
256
+ return numeric if numeric
257
+
258
+ # Handle v-prefixed tags like "v4.4.0" common in pre-commit
259
+ version_str = dependency.version
260
+ return nil unless version_str
261
+
262
+ stripped = version_str.sub(/\Av/i, "")
263
+ return nil unless Dependabot::PreCommit::Version.correct?(stripped)
264
+
265
+ Dependabot::PreCommit::Version.new(stripped)
220
266
  end
221
267
 
222
268
  sig { returns(T::Boolean) }
@@ -349,7 +349,8 @@ module Dependabot
349
349
  source: source,
350
350
  credentials: credentials,
351
351
  requirements: dependency.requirements,
352
- current_version: dependency.version
352
+ current_version: dependency.version,
353
+ cooldown_options: update_cooldown
353
354
  )
354
355
  rescue StandardError => e
355
356
  Dependabot.logger.error("Error creating checker for #{language}: #{e.message}")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-pre_commit
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.378.0
4
+ version: 0.380.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -15,84 +15,84 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.378.0
18
+ version: 0.380.0
19
19
  type: :runtime
20
20
  prerelease: false
21
21
  version_requirements: !ruby/object:Gem::Requirement
22
22
  requirements:
23
23
  - - '='
24
24
  - !ruby/object:Gem::Version
25
- version: 0.378.0
25
+ version: 0.380.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: dependabot-cargo
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
30
  - - '='
31
31
  - !ruby/object:Gem::Version
32
- version: 0.378.0
32
+ version: 0.380.0
33
33
  type: :runtime
34
34
  prerelease: false
35
35
  version_requirements: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - '='
38
38
  - !ruby/object:Gem::Version
39
- version: 0.378.0
39
+ version: 0.380.0
40
40
  - !ruby/object:Gem::Dependency
41
41
  name: dependabot-common
42
42
  requirement: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - '='
45
45
  - !ruby/object:Gem::Version
46
- version: 0.378.0
46
+ version: 0.380.0
47
47
  type: :runtime
48
48
  prerelease: false
49
49
  version_requirements: !ruby/object:Gem::Requirement
50
50
  requirements:
51
51
  - - '='
52
52
  - !ruby/object:Gem::Version
53
- version: 0.378.0
53
+ version: 0.380.0
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: dependabot-go_modules
56
56
  requirement: !ruby/object:Gem::Requirement
57
57
  requirements:
58
58
  - - '='
59
59
  - !ruby/object:Gem::Version
60
- version: 0.378.0
60
+ version: 0.380.0
61
61
  type: :runtime
62
62
  prerelease: false
63
63
  version_requirements: !ruby/object:Gem::Requirement
64
64
  requirements:
65
65
  - - '='
66
66
  - !ruby/object:Gem::Version
67
- version: 0.378.0
67
+ version: 0.380.0
68
68
  - !ruby/object:Gem::Dependency
69
69
  name: dependabot-npm_and_yarn
70
70
  requirement: !ruby/object:Gem::Requirement
71
71
  requirements:
72
72
  - - '='
73
73
  - !ruby/object:Gem::Version
74
- version: 0.378.0
74
+ version: 0.380.0
75
75
  type: :runtime
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - '='
80
80
  - !ruby/object:Gem::Version
81
- version: 0.378.0
81
+ version: 0.380.0
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: dependabot-python
84
84
  requirement: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - '='
87
87
  - !ruby/object:Gem::Version
88
- version: 0.378.0
88
+ version: 0.380.0
89
89
  type: :runtime
90
90
  prerelease: false
91
91
  version_requirements: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - '='
94
94
  - !ruby/object:Gem::Version
95
- version: 0.378.0
95
+ version: 0.380.0
96
96
  - !ruby/object:Gem::Dependency
97
97
  name: debug
98
98
  requirement: !ruby/object:Gem::Requirement
@@ -338,7 +338,7 @@ licenses:
338
338
  - MIT
339
339
  metadata:
340
340
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
341
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.378.0
341
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.380.0
342
342
  rdoc_options: []
343
343
  require_paths:
344
344
  - lib