139def update_changelog(fields: Fields) -> tuple[str, list[str], list[str]]:
140 """
141 Special updater to fill draft changelog entry.
142 """
143 latest_tag = run(
144 ["git", "describe", "--tags", "--abbrev=0"], capture_output=True, text=True
145 ).stdout.strip()
146
147
148 changes_txt = run(
149 ["git", "log", "--first-parent", "--format=%s<=>%b|", f"{latest_tag}.."],
150 capture_output=True,
151 text=True,
152 ).stdout
153
154 changes_txt = " ".join(changes_txt.strip().rstrip("|").splitlines())
155
156 changes = (
157 changes_txt.replace("Closes #", "gaudi/Gaudi#")
158 .replace("See merge request ", "")
159 .split("|")
160 )
161
162 changes = [
163 f"- {msg.strip()} ({', '.join(refs.split())})\n"
164 if refs.strip()
165 else f"- {msg.strip()}\n"
166 for change in changes
167 for msg, refs in ([change.split("<=>", 1)] if "<=>" in change else [])
168 ]
169
170 contributors = sorted(
171 contributor_handle(name)
172 for name in set(
173 run(
174 ["git", "log", "--format=%an", f"{latest_tag}...HEAD"],
175 capture_output=True,
176 text=True,
177 ).stdout.splitlines()
178 )
179 )
180
181 filename = "CHANGELOG.md"
182 with open(filename) as f:
183 old = f.readlines()
184 for idx, line in enumerate(old):
185 if line.startswith("## ["):
186 break
187
188 data = old[:idx]
189 data.extend(
190 [
191 "## [{tag_version}](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/{tag_version}) - {date}\n".
format(
192 **fields.data
193 ),
194 "\nA special thanks to all the people that contributed to this release:\n",
195 ",\n".join(contributors),
196 ".\n\n",
197 "### Changed\n",
198 "### Added\n",
199 "### Fixed\n",
200 "\n",
201 ]
202 )
203 data.extend(changes)
204 data.extend(["\n", "\n"])
205 data.extend(old[idx:])
206
207 return filename, old, data
208
209