dependabot-git_submodules 0.316.0 → 0.317.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: 9667cdfa37aaa6e90bba941f1b653fb5f8f158e6ca251728fedb387134a4d5f8
4
- data.tar.gz: 49c4e869e2baad8f0e7af43eb19cab762abcce32581d1eaf4cb55058039e1838
3
+ metadata.gz: 1099ab7191ce79866f178d1718f9e543f052f1f332601775dc7c4fcd3fe2908f
4
+ data.tar.gz: c0e7fcac933fd87b126bc51461a2c00cd2ad83a623a316701226cd303b10b221
5
5
  SHA512:
6
- metadata.gz: e800f9531b77938d70e90e2acb9b9c41caaea92ec0f362d6b500c37298c0213fcf8ccd0d1302a935e919a2dc5420fcb4ee36942f8c15daee07c293ecb6cbf49c
7
- data.tar.gz: 266c229f93ef4d8cfe09542d1b85151d3b76e1c89f6f8bb7c6f3c8aaa652ccdd4517690c5866656eea7b05dda2aaaf06ab6907fb6d2c7eb76b6c19a844be1b43
6
+ metadata.gz: df5a16f36e7e909500429bc779c6c13d65447a4a9aefe2a136c1c1bfa9dc292acd5c251fe2c216a29f82dd6084a0b98c4c268b6fa908fa2238566e05ed47c5c9
7
+ data.tar.gz: db0e34225b6c31d5017d0ad32e8114c263d5eda8e798e3342eb43e649644cce93fdfacf1e5691b5790ad9160a3a74f7320ed4706403939de9a895f1fd30b94d9
@@ -28,17 +28,9 @@ module Dependabot
28
28
  @dependency = dependency
29
29
  @credentials = credentials
30
30
 
31
- @ref = T.let(ref, String)
32
31
  @url = T.let(url, String)
33
32
  end
34
33
 
35
- # as git submodules do not have versions (refs/tags are used instead), we use a pseudo version as placeholder
36
- VERSION = "1.0.0"
37
-
38
- # we use a default release date in case we reply on fallback logic of
39
- # getting refs/tags to prevent filtering out head release (greater than max cooldown period)
40
- DEFAULT_RELEASE_DATE = T.let(Time.now.utc - (60 * 60 * 24 * 91), Time)
41
-
42
34
  sig { returns(Dependabot::Dependency) }
43
35
  attr_reader :dependency
44
36
 
@@ -49,6 +41,9 @@ module Dependabot
49
41
  def available_versions
50
42
  versions_metadata = T.let(fetch_tags_and_release_date, T.nilable(T::Array[GitTagWithDetail]))
51
43
 
44
+ # as git submodules do not have versions (refs/tags are used instead), we use a pseudo version as placeholder
45
+ pseudo_version = 1.0
46
+
52
47
  # we fallback to the git based tag info if no versions metadata is available
53
48
  if versions_metadata&.empty?
54
49
  versions_metadata = T.let(fetch_latest_tag_info,
@@ -57,9 +52,9 @@ module Dependabot
57
52
 
58
53
  releases = T.must(versions_metadata).map do |version_details|
59
54
  Dependabot::Package::PackageRelease.new(
60
- version: GitSubmodules::Version.new(VERSION),
55
+ version: GitSubmodules::Version.new((pseudo_version += 1).to_s),
61
56
  tag: version_details.tag,
62
- released_at: Time.parse(version_details.release_date)
57
+ released_at: version_details.release_date ? Time.parse(T.must(version_details.release_date)) : nil
63
58
  )
64
59
  end
65
60
 
@@ -79,8 +74,7 @@ module Dependabot
79
74
 
80
75
  parsed_results <<
81
76
  GitTagWithDetail.new(
82
- tag: T.must(git_commit_checker.head_commit_for_current_branch),
83
- release_date: DEFAULT_RELEASE_DATE.to_s
77
+ tag: T.must(git_commit_checker.head_commit_for_current_branch)
84
78
  )
85
79
 
86
80
  parsed_results
@@ -93,11 +87,16 @@ module Dependabot
93
87
  begin
94
88
  Dependabot.logger.info("Fetching release info for Git Submodules: #{dependency.name}")
95
89
 
96
- response = Excon.get(provider_url)
90
+ client = Dependabot::GitCommitChecker.new(
91
+ dependency: dependency,
92
+ credentials: credentials
93
+ )
94
+
95
+ response = client.ref_details_for_pinned_ref
97
96
 
98
97
  unless response.status == 200
99
- Dependabot.logger.error("Error while fetching details for #{dependency.name}" \
100
- " Detail : #{response.body}")
98
+ Dependabot.logger.error("Error while fetching details for #{dependency.name} " \
99
+ "Detail : #{response.body}")
101
100
  end
102
101
 
103
102
  return parsed_results unless response.status == 200
@@ -113,28 +112,11 @@ module Dependabot
113
112
 
114
113
  parsed_results
115
114
  rescue StandardError => e
116
- Dependabot.logger.error("Error while fetching package info for Git Submodules: #{e.message}")
115
+ Dependabot.logger.error("Error while fetching package info for git submodule: #{e.message}")
117
116
  parsed_results
118
117
  end
119
118
  end
120
119
 
121
- sig { returns(String) }
122
- def provider_url
123
- provider_url = @url.gsub(/\.git$/, "")
124
-
125
- api_url = {
126
- github: provider_url.gsub("github.com", "api.github.com/repos")
127
- }.freeze
128
-
129
- "#{api_url[:github]}/commits?sha=#{@ref}"
130
- end
131
-
132
- sig { returns(String) }
133
- def ref
134
- dependency.source_details&.fetch(:ref, nil) ||
135
- dependency.source_details&.fetch(:branch, nil) || "HEAD"
136
- end
137
-
138
120
  sig { returns(String) }
139
121
  def url
140
122
  dependency.source_details&.fetch(:url, nil)
@@ -15,24 +15,32 @@ require "dependabot/git_submodules/package/package_details_fetcher"
15
15
  module Dependabot
16
16
  module GitSubmodules
17
17
  class UpdateChecker
18
- class LatestVersionFinder
18
+ class LatestVersionFinder < Dependabot::Package::PackageLatestVersionFinder
19
19
  extend T::Sig
20
20
 
21
21
  sig do
22
22
  params(
23
23
  dependency: Dependabot::Dependency,
24
- credentials: T::Array[Dependabot::Credential]
24
+ credentials: T::Array[Dependabot::Credential],
25
+ cooldown_options: T.nilable(Dependabot::Package::ReleaseCooldownOptions)
25
26
  ).void
26
27
  end
27
- def initialize(dependency:, credentials:)
28
+ def initialize(dependency:, credentials:, cooldown_options:)
28
29
  @dependency = dependency
29
30
  @credentials = credentials
31
+ @cooldown_options = cooldown_options
30
32
  end
31
33
 
32
- sig { returns(Dependabot::Dependency) }
33
- attr_reader :dependency
34
- sig { returns(T::Array[Dependabot::Credential]) }
35
- attr_reader :credentials
34
+ sig { returns(T.nilable(String)) }
35
+ def latest_tag
36
+ releases = version_list
37
+
38
+ releases = filter_by_cooldown(T.must(releases))
39
+
40
+ # if there are no releases after applying filters, we fallback to the current tag to avoid empty results
41
+ releases = apply_post_fetch_latest_versions_filter(releases)
42
+ releases.first&.tag
43
+ end
36
44
 
37
45
  sig { returns(T.nilable(T::Array[Dependabot::Package::PackageRelease])) }
38
46
  def version_list
@@ -43,12 +51,74 @@ module Dependabot
43
51
  ).available_versions, T.nilable(T::Array[Dependabot::Package::PackageRelease]))
44
52
  end
45
53
 
46
- sig { returns(T.nilable(String)) }
47
- def latest_version
48
- latest_version = version_list
49
- latest_version = latest_version&.first&.tag.to_s
50
- latest_version
54
+ sig { params(release: Dependabot::Package::PackageRelease).returns(T::Boolean) }
55
+ def in_cooldown_period?(release)
56
+ unless release.released_at
57
+ Dependabot.logger.info("Release date not available for ref tag #{release.tag}")
58
+ return false
59
+ end
60
+
61
+ days = cooldown_days
62
+ passed_seconds = Time.now.to_i - release.released_at.to_i
63
+ passed_days = passed_seconds / DAY_IN_SECONDS
64
+
65
+ if passed_days < days
66
+ Dependabot.logger.info("Filtered #{release.tag}, Released on: " \
67
+ "#{T.must(release.released_at).strftime('%Y-%m-%d')} " \
68
+ "(#{passed_days}/#{days} cooldown days)")
69
+ end
70
+
71
+ passed_seconds < days * DAY_IN_SECONDS
51
72
  end
73
+
74
+ sig do
75
+ returns(Integer)
76
+ end
77
+ def cooldown_days
78
+ cooldown = @cooldown_options
79
+ return 0 if cooldown.nil?
80
+ return 0 unless cooldown_enabled?
81
+ return 0 unless cooldown.included?(dependency.name)
82
+
83
+ return cooldown.default_days if cooldown.default_days.positive?
84
+ return cooldown.semver_major_days if cooldown.semver_major_days.positive?
85
+ return cooldown.semver_minor_days if cooldown.semver_minor_days.positive?
86
+ return cooldown.semver_patch_days if cooldown.semver_patch_days.positive?
87
+
88
+ cooldown.default_days
89
+ end
90
+
91
+ sig { returns(T::Boolean) }
92
+ def cooldown_enabled?
93
+ Dependabot::Experiments.enabled?(:enable_cooldown_for_gitsubmodules)
94
+ end
95
+
96
+ sig do
97
+ params(releases: T::Array[Dependabot::Package::PackageRelease])
98
+ .returns(T::Array[Dependabot::Package::PackageRelease])
99
+ end
100
+ def apply_post_fetch_latest_versions_filter(releases)
101
+ if releases.empty?
102
+ Dependabot.logger.info("No releases found for #{dependency.name} after applying filters.")
103
+ return releases
104
+ end
105
+
106
+ releases << Dependabot::Package::PackageRelease.new(
107
+ version: GitSubmodules::Version.new("1.0.0"),
108
+ tag: dependency.version
109
+ )
110
+
111
+ releases
112
+ end
113
+
114
+ sig { returns(Dependabot::Dependency) }
115
+ attr_reader :dependency
116
+ sig { returns(T::Array[Dependabot::Credential]) }
117
+ attr_reader :credentials
118
+ sig { returns(T.nilable(Dependabot::Package::ReleaseCooldownOptions)) }
119
+ attr_reader :cooldown_options
120
+ sig { override.returns(T.nilable(Dependabot::Package::PackageDetails)) }
121
+ def package_details; end
52
122
  end
53
123
  end
54
124
  end
@@ -60,8 +60,9 @@ module Dependabot
60
60
  def fetch_latest_version
61
61
  T.let(LatestVersionFinder.new(
62
62
  dependency: dependency,
63
- credentials: credentials
64
- ).latest_version, T.nilable(String))
63
+ credentials: credentials,
64
+ cooldown_options: update_cooldown
65
+ ).latest_tag, T.nilable(String))
65
66
  end
66
67
  end
67
68
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-git_submodules
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.316.0
4
+ version: 0.317.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -15,14 +15,14 @@ dependencies:
15
15
  requirements:
16
16
  - - '='
17
17
  - !ruby/object:Gem::Version
18
- version: 0.316.0
18
+ version: 0.317.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.316.0
25
+ version: 0.317.0
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: parseconfig
28
28
  requirement: !ruby/object:Gem::Requirement
@@ -277,7 +277,7 @@ licenses:
277
277
  - MIT
278
278
  metadata:
279
279
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
280
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.316.0
280
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.317.0
281
281
  rdoc_options: []
282
282
  require_paths:
283
283
  - lib