26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
# File 'lib/kettle/gha/pins/action_resolver.rb', line 26
def determine_upgrade_plan(old_ref:, repo_ref:, versions:, upgrade_level:, client:)
level = VersionRubric.normalize_upgrade_level(upgrade_level)
current_ref = old_ref.to_s.strip
available_versions = versions || []
return {is_outdated: false, updates: nil, reason: nil, current_version: nil, versions: available_versions} if current_ref.empty?
latest = available_versions.first
current_sha = if SHA_RE.match?(current_ref) || WEAK_SHA_RE.match?(current_ref)
current_ref
else
client.commit_sha(repo_ref, current_ref)
end
parsed_current_ref = VersionRubric.parse(current_ref)
version_equivalent_entry = if parsed_current_ref
available_versions.find { |entry| entry[:version_obj] == parsed_current_ref }
end
matched_entry = matching_version_entry(available_versions, current_ref, current_sha, client, repo_ref)
unresolved_version_ref = false
if matched_entry.nil? && current_sha.to_s.empty? && version_equivalent_entry && non_sha?(current_ref)
matched_entry = version_equivalent_entry
unresolved_version_ref = true
end
current_version = matched_entry ? matched_entry[:version] : nil
updates = nil
reason = nil
is_outdated = false
latest_outdated = nil
if current_version
latest_outdated = VersionRubric.latest_outdated_target(current_version, available_versions)
target = VersionRubric.choose_upgrade_target(current_version, available_versions, level)
target_sha = target ? version_entry_sha(target, client, repo_ref) : nil
latest_outdated_sha = latest_outdated ? version_entry_sha(latest_outdated, client, repo_ref) : nil
if latest_outdated && stale_sha?(current_ref, latest_outdated_sha)
latest_outdated = latest_outdated.merge(sha: latest_outdated_sha)
is_outdated = true
reason = UPGRADE_REASON
end
if target && stale_sha?(current_ref, target_sha)
updates = {
sha: target_sha,
version: target[:version],
released_at: target[:released_at],
reason: UPGRADE_REASON
}
reason ||= UPGRADE_REASON
end
if updates.nil? && unresolved_version_ref
matched_sha = version_entry_sha(matched_entry, client, repo_ref)
if stale_sha?(current_ref, matched_sha)
updates = {
sha: matched_sha,
version: nil,
reason: NON_SHA_REASON
}
latest_outdated ||= matched_entry.merge(sha: matched_sha)
is_outdated = true
reason ||= NON_SHA_REASON
end
end
elsif current_sha && non_sha?(current_ref)
if stale_sha?(current_ref, current_sha)
updates = {
sha: current_sha,
version: nil,
reason: NON_SHA_REASON
}
reason = NON_SHA_REASON
end
elsif current_sha
latest_sha = latest ? version_entry_sha(latest, client, repo_ref) : nil
if latest && stale_sha?(current_ref, latest_sha)
latest_outdated = latest.merge(sha: latest_sha)
updates = {
sha: latest_sha,
version: latest[:version],
reason: STALE_SHA_REASON
}
reason = STALE_SHA_REASON
is_outdated = true
end
end
{
is_outdated: is_outdated,
updates: updates,
reason: reason,
current_version: current_version,
versions: available_versions,
latest_outdated: latest_outdated
}
end
|