@@ -37,36 +37,44 @@ def initialize(dependency:, credentials:, cooldown_options:, git_commit_checker:
37
37
sig { returns ( Dependabot ::Dependency ) }
38
38
attr_reader :dependency
39
39
40
+ sig { returns ( T ::Array [ Dependabot ::Credential ] ) }
41
+ attr_reader :credentials
42
+
43
+ sig { returns ( T . nilable ( Dependabot ::Package ::ReleaseCooldownOptions ) ) }
44
+ attr_reader :cooldown_options
45
+
46
+ sig { returns ( Dependabot ::GitCommitChecker ) }
47
+ attr_reader :git_commit_checker
48
+
40
49
# Return latest version tag for the dependency, it removes tags that are in cooldown period
41
- # and returns the latest version tag that is not in cooldown period. If eexception occurs
42
- # it will return the latest version tag from the git_commit_checker. as it was before
50
+ # and returns the latest version tag that is not in cooldown period. If an exception occurs
51
+ # and returns the latest version tag that is not in cooldown period. If an exception occurs,
52
+ # it will return the latest version tag from the git_commit_checker, as before.
43
53
sig { returns ( T . nilable ( T ::Hash [ Symbol , T . untyped ] ) ) }
44
54
def latest_version_tag
45
55
# step one fetch allowed version tags and
56
+ return git_commit_checker . local_tag_for_latest_version unless cooldown_enabled?
57
+
46
58
allowed_version_tags = git_commit_checker . allowed_version_tags
47
- begin
48
- # sort the allowed version tags by name in descending order
49
- select_version_tags_in_cooldown_period &.each do |tag_name |
50
- # filter out if name is not in cooldown period
51
- allowed_version_tags . reject! do |gitref_filtered |
52
- true if gitref_filtered . name == tag_name
53
- end
59
+ select_version_tags_in_cooldown_period &.each do |tag_name |
60
+ # filter out if name is in cooldown period
61
+ allowed_version_tags . reject! do |gitref_filtered |
62
+ gitref_filtered . name == tag_name
54
63
end
55
- Dependabot . logger . info ( "Allowed version tags after filtering versions in cooldown:
56
- #{ allowed_version_tags . map ( &:name ) . join ( ', ' ) } " )
57
- git_commit_checker . max_local_tag ( allowed_version_tags )
58
- rescue StandardError => e
59
- Dependabot . logger . error ( "Error fetching latest version tag: #{ e . message } " )
60
- git_commit_checker . local_tag_for_latest_version
61
64
end
65
+
66
+ git_commit_checker . max_local_tag ( allowed_version_tags )
67
+ rescue StandardError => e
68
+ Dependabot . logger . error ( "Error fetching latest version tag: #{ e . message } " )
69
+ git_commit_checker . local_tag_for_latest_version
62
70
end
63
71
64
72
sig { returns ( T . nilable ( T ::Array [ String ] ) ) }
65
73
def select_version_tags_in_cooldown_period
66
74
version_tags_in_cooldown_period = T . let ( [ ] , T ::Array [ String ] )
67
75
68
76
package_details_fetcher . fetch_tag_and_release_date . each do |git_tag_with_detail |
69
- if check_if_version_in_cooldown_period? ( T . must ( git_tag_with_detail . release_date ) )
77
+ if check_if_version_in_cooldown_period? ( git_tag_with_detail )
70
78
version_tags_in_cooldown_period << git_tag_with_detail . tag
71
79
end
72
80
end
@@ -76,27 +84,59 @@ def select_version_tags_in_cooldown_period
76
84
version_tags_in_cooldown_period
77
85
end
78
86
79
- sig { params ( release_date : String ) . returns ( T ::Boolean ) }
80
- def check_if_version_in_cooldown_period? ( release_date )
81
- return false unless release_date . length . positive?
87
+ sig { params ( tag_with_detail : Dependabot :: GitTagWithDetail ) . returns ( T ::Boolean ) }
88
+ def check_if_version_in_cooldown_period? ( tag_with_detail )
89
+ return false unless tag_with_detail . release_date
82
90
83
- cooldown = @cooldown_options
84
- return false unless cooldown
91
+ current_version = version_class . correct? ( dependency . version ) ? version_class . new ( dependency . version ) : nil
92
+ days = cooldown_days_for ( current_version , version_class . new ( tag_with_detail . tag . delete ( "v" ) ) )
85
93
86
- return false if cooldown . nil?
87
-
88
- # Get maximum cooldown days based on semver parts
89
- days = [ cooldown . default_days , cooldown . semver_major_days ] . max
90
- days = cooldown . semver_minor_days unless days > cooldown . semver_minor_days
91
- days = cooldown . semver_patch_days unless days > cooldown . semver_patch_days
92
94
# Calculate the number of seconds passed since the release
93
- passed_seconds = Time . now . to_i - release_date_to_seconds ( release_date )
95
+ passed_seconds = Time . now . to_i - release_date_to_seconds ( tag_with_detail . release_date )
94
96
# Check if the release is within the cooldown period
95
97
passed_seconds < days * DAY_IN_SECONDS
96
98
end
97
99
98
- sig { params ( release_date : String ) . returns ( Integer ) }
100
+ sig do
101
+ params (
102
+ current_version : T . nilable ( Dependabot ::Version ) ,
103
+ new_version : Dependabot ::Version
104
+ ) . returns ( Integer )
105
+ end
106
+ def cooldown_days_for ( current_version , new_version )
107
+ return 0 unless cooldown_enabled?
108
+
109
+ cooldown = T . must ( cooldown_options )
110
+ return 0 unless cooldown . included? ( dependency . name )
111
+ return cooldown . default_days if current_version . nil?
112
+
113
+ current_version_semver = current_version . semver_parts
114
+ new_version_semver = new_version . semver_parts
115
+
116
+ # If semver_parts is nil for either, return default cooldown
117
+ return cooldown . default_days if current_version_semver . nil? || new_version_semver . nil?
118
+
119
+ # Ensure values are always integers
120
+ current_major , current_minor , current_patch = current_version_semver
121
+ new_major , new_minor , new_patch = new_version_semver
122
+
123
+ # Determine cooldown based on version difference
124
+ return cooldown . semver_major_days if new_major > current_major
125
+ return cooldown . semver_minor_days if new_minor > current_minor
126
+ return cooldown . semver_patch_days if new_patch > current_patch
127
+
128
+ cooldown . default_days
129
+ end
130
+
131
+ sig { returns ( T . class_of ( Dependabot ::Version ) ) }
132
+ def version_class
133
+ dependency . version_class
134
+ end
135
+
136
+ sig { params ( release_date : T . nilable ( String ) ) . returns ( Integer ) }
99
137
def release_date_to_seconds ( release_date )
138
+ return 0 unless release_date
139
+
100
140
Time . parse ( release_date ) . to_i
101
141
rescue ArgumentError => e
102
142
Dependabot . logger . error ( "Invalid release date format: #{ release_date } and error: #{ e . message } " )
@@ -114,17 +154,16 @@ def package_details_fetcher
114
154
)
115
155
end
116
156
117
- # Since base class is returning false, we need to override it.
118
157
sig { returns ( T ::Boolean ) }
119
158
def cooldown_enabled?
120
- true
121
- end
122
-
123
- sig { returns ( Dependabot ::GitCommitChecker ) }
124
- attr_reader :git_commit_checker
159
+ return false if cooldown_options . nil?
125
160
126
- sig { returns ( T ::Array [ Dependabot ::Credential ] ) }
127
- attr_reader :credentials
161
+ cooldown = T . must ( cooldown_options )
162
+ cooldown . default_days . to_i . positive? ||
163
+ cooldown . semver_major_days . to_i . positive? ||
164
+ cooldown . semver_minor_days . to_i . positive? ||
165
+ cooldown . semver_patch_days . to_i . positive?
166
+ end
128
167
end
129
168
end
130
169
end
0 commit comments