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