13
13
from materialize import buildkite , git
14
14
from materialize .mz_version import MzVersion
15
15
16
+ """
17
+ Git revisions that are based on commits listed as keys require at least the version specified in the value.
18
+ Note that specified versions do not necessarily need to be already published.
19
+ Commits must be ordered descending by their date.
20
+ """
21
+ MIN_ANCESTOR_MZ_VERSION_PER_COMMIT : dict [str , MzVersion ] = {
22
+ # insert newer commits at the top
23
+ # PR#23421 (coord: smorgasbord of improvements for the crdb-backed timestamp oracle) introduces regressions against 0.78.13
24
+ "5179ebd39aea4867622357a832aaddcde951b411" : MzVersion .parse_mz ("v0.79.0" )
25
+ }
26
+
16
27
17
28
def resolve_ancestor_image_tag () -> str :
18
29
image_tag , context = _resolve_ancestor_image_tag ()
@@ -22,71 +33,99 @@ def resolve_ancestor_image_tag() -> str:
22
33
23
34
def _resolve_ancestor_image_tag () -> tuple [str , str ]:
24
35
if buildkite .is_in_buildkite ():
25
- if buildkite .is_in_pull_request ():
26
- # return the merge base
27
- common_ancestor_commit = buildkite .get_merge_base ()
28
- if _image_of_commit_exists (common_ancestor_commit ):
29
- return (
30
- _commit_to_image_tag (common_ancestor_commit ),
31
- "merge base of pull request" ,
32
- )
33
- else :
34
- return (
35
- _version_to_image_tag (get_latest_published_version ()),
36
- "latest release because image of merge base of pull request not available" ,
37
- )
38
- elif git .is_on_release_version ():
39
- # return the previous release
40
- tagged_release_version = git .get_tagged_release_version (
41
- version_type = MzVersion
42
- )
43
- assert tagged_release_version is not None
44
- previous_release_version = get_previous_published_version (
45
- tagged_release_version
46
- )
36
+ return _resolve_ancestor_image_tag_when_in_buildkite ()
37
+ else :
38
+ return _resolve_ancestor_image_tag_when_running_locally ()
39
+
40
+
41
+ def _resolve_ancestor_image_tag_when_in_buildkite () -> tuple [str , str ]:
42
+ if buildkite .is_in_pull_request ():
43
+ # return the merge base
44
+ common_ancestor_commit = buildkite .get_merge_base ()
45
+ if _image_of_commit_exists (common_ancestor_commit ):
47
46
return (
48
- _version_to_image_tag ( previous_release_version ),
49
- f"previous release because on release branch { tagged_release_version } " ,
47
+ _commit_to_image_tag ( common_ancestor_commit ),
48
+ "merge base of pull request " ,
50
49
)
51
50
else :
52
- # return the latest release
53
51
return (
54
52
_version_to_image_tag (get_latest_published_version ()),
55
- "latest release because not in a pull request and not on a release branch " ,
53
+ "latest release because image of merge base of pull request not available " ,
56
54
)
55
+ elif git .is_on_release_version ():
56
+ # return the previous release
57
+ tagged_release_version = git .get_tagged_release_version (version_type = MzVersion )
58
+ assert tagged_release_version is not None
59
+ previous_release_version = get_previous_published_version (
60
+ tagged_release_version
61
+ )
62
+ return (
63
+ _version_to_image_tag (previous_release_version ),
64
+ f"previous release because on release branch { tagged_release_version } " ,
65
+ )
57
66
else :
58
- if git .is_on_release_version ():
59
- # return the previous release
60
- tagged_release_version = git .get_tagged_release_version (
61
- version_type = MzVersion
67
+ latest_published_version = get_latest_published_version ()
68
+ override_commit = _get_override_commit_instead_of_version (
69
+ latest_published_version
70
+ )
71
+
72
+ if override_commit is not None :
73
+ # use the commit instead of the latest release
74
+ return (
75
+ _commit_to_image_tag (override_commit ),
76
+ f"commit override instead of latest release ({ latest_published_version } )" ,
62
77
)
63
- assert tagged_release_version is not None
64
- previous_release_version = get_previous_published_version (
65
- tagged_release_version
78
+
79
+ # return the latest release
80
+ return (
81
+ _version_to_image_tag (latest_published_version ),
82
+ "latest release because not in a pull request and not on a release branch" ,
83
+ )
84
+
85
+
86
+ def _resolve_ancestor_image_tag_when_running_locally () -> tuple [str , str ]:
87
+ if git .is_on_release_version ():
88
+ # return the previous release
89
+ tagged_release_version = git .get_tagged_release_version (version_type = MzVersion )
90
+ assert tagged_release_version is not None
91
+ previous_release_version = get_previous_published_version (
92
+ tagged_release_version
93
+ )
94
+ return (
95
+ _version_to_image_tag (previous_release_version ),
96
+ f"previous release because on local release branch { tagged_release_version } " ,
97
+ )
98
+ elif git .is_on_main_branch ():
99
+ # return the latest release
100
+ latest_published_version = get_latest_published_version ()
101
+ override_commit = _get_override_commit_instead_of_version (
102
+ latest_published_version
103
+ )
104
+
105
+ if override_commit is not None :
106
+ # use the commit instead of the latest release
107
+ return (
108
+ _commit_to_image_tag (override_commit ),
109
+ f"commit override instead of latest release ({ latest_published_version } )" ,
66
110
)
111
+
112
+ return (
113
+ _version_to_image_tag (latest_published_version ),
114
+ "latest release because on local main branch" ,
115
+ )
116
+ else :
117
+ # return the merge base
118
+ common_ancestor_commit = buildkite .get_merge_base ()
119
+ if _image_of_commit_exists (common_ancestor_commit ):
67
120
return (
68
- _version_to_image_tag ( previous_release_version ),
69
- f"previous release because on local release branch { tagged_release_version } " ,
121
+ _commit_to_image_tag ( common_ancestor_commit ),
122
+ "merge base of local non-main branch" ,
70
123
)
71
- elif git .is_on_main_branch ():
72
- # return the latest release
124
+ else :
73
125
return (
74
126
_version_to_image_tag (get_latest_published_version ()),
75
- "latest release because on local main branch" ,
127
+ "latest release because image of merge base of local non- main branch not available " ,
76
128
)
77
- else :
78
- # return the merge base
79
- common_ancestor_commit = buildkite .get_merge_base ()
80
- if _image_of_commit_exists (common_ancestor_commit ):
81
- return (
82
- _commit_to_image_tag (common_ancestor_commit ),
83
- "merge base of local non-main branch" ,
84
- )
85
- else :
86
- return (
87
- _version_to_image_tag (get_latest_published_version ()),
88
- "latest release because image of merge base of local non-main branch not available" ,
89
- )
90
129
91
130
92
131
def get_latest_published_version () -> MzVersion :
@@ -121,6 +160,29 @@ def get_previous_published_version(release_version: MzVersion) -> MzVersion:
121
160
excluded_versions .add (previous_published_version )
122
161
123
162
163
+ def _get_override_commit_instead_of_version (
164
+ latest_published_version : MzVersion ,
165
+ ) -> str | None :
166
+ """
167
+ If a commit specifies a mz version as prerequisite (to avoid regressions) that is newer than the
168
+ provided latest version (i.e., prerequisite not satisfied by the latest version), then return
169
+ that commit's hash if the commit contained in the current state.
170
+ Otherwise, return none.
171
+ """
172
+ for (
173
+ commit_hash ,
174
+ min_required_mz_version ,
175
+ ) in MIN_ANCESTOR_MZ_VERSION_PER_COMMIT .items ():
176
+ if latest_published_version >= min_required_mz_version :
177
+ continue
178
+
179
+ if git .contains_commit (commit_hash ):
180
+ # commit would require at least min_required_mz_version
181
+ return commit_hash
182
+
183
+ return None
184
+
185
+
124
186
def _image_of_release_version_exists (version : MzVersion ) -> bool :
125
187
return _mz_image_tag_exists (_version_to_image_tag (version ))
126
188
0 commit comments