The Gaudi Framework  v38r3 (c3fc9673)
update_version Namespace Reference

Classes

class  Fields
 
class  FileUpdater
 
class  ReplacementRule
 

Functions

tuple[str, str] normalize_version (str version)
 
tuple[str, list[str], list[str]] update_changelog (Fields fields)
 
def update_version (str version, datetime.datetime date, bool dry_run)
 

Function Documentation

◆ normalize_version()

tuple[str, str] update_version.normalize_version ( str  version)
Convert a version in format "vXrY" or "X.Y" in the pair ("X.Y", "vXrY").

>>> normalize_version("v37r0")
('37.0', 'v37r0')
>>> normalize_version("37.0.1")
('37.0.1', 'v37r0p1')

Definition at line 23 of file update_version.py.

23 def normalize_version(version: str) -> tuple[str, str]:
24  """
25  Convert a version in format "vXrY" or "X.Y" in the pair ("X.Y", "vXrY").
26 
27  >>> normalize_version("v37r0")
28  ('37.0', 'v37r0')
29  >>> normalize_version("37.0.1")
30  ('37.0.1', 'v37r0p1')
31  """
32  # extract the digits
33  numbers = re.findall(r"\d+", version)
34  return (
35  ".".join(numbers),
36  "".join("{}{}".format(*pair) for pair in zip("vrpt", numbers)),
37  )
38 
39 

◆ update_changelog()

tuple[str, list[str], list[str]] update_version.update_changelog ( Fields  fields)
Special updater to fill draft changelog entry.

Definition at line 119 of file update_version.py.

119 def update_changelog(fields: Fields) -> tuple[str, list[str], list[str]]:
120  """
121  Special updater to fill draft changelog entry.
122  """
123  latest_tag = run(
124  ["git", "describe", "--tags", "--abbrev=0"], capture_output=True, text=True
125  ).stdout.strip()
126  # This formats the git log as a rough markdown list
127  # - collect the log formatting it such that we can machine parse it
128  changes_txt = run(
129  ["git", "log", "--first-parent", "--format=%s<=>%b|", f"{latest_tag}.."],
130  capture_output=True,
131  text=True,
132  ).stdout
133  # - removing trailing separator and make it a single line
134  changes_txt = " ".join(changes_txt.strip().rstrip("|").splitlines())
135  # - normalize issues and merge requests links
136  changes = (
137  changes_txt.replace("Closes #", "gaudi/Gaudi#")
138  .replace("See merge request ", "")
139  .split("|")
140  )
141  # - split the messages and format the list
142  changes = [
143  f"- {msg.strip()} ({', '.join(refs.split())})\n"
144  if refs.strip()
145  else f"- {msg.strip()}\n"
146  for change in changes
147  for msg, refs in ([change.split("<=>", 1)] if "<=>" in change else [])
148  ]
149 
150  filename = "CHANGELOG.md"
151  with open(filename) as f:
152  old = f.readlines()
153  for idx, line in enumerate(old):
154  if line.startswith("## ["):
155  break
156 
157  data = old[:idx]
158  data.extend(
159  [
160  "## [{tag_version}](https://gitlab.cern.ch/gaudi/Gaudi/-/releases/{tag_version}) - {date}\n".format(
161  **fields.data
162  ),
163  "\n",
164  "### Changed\n",
165  "### Added\n",
166  "### Fixed\n",
167  "\n",
168  ]
169  )
170  data.extend(changes)
171  data.extend(["\n", "\n"])
172  data.extend(old[idx:])
173 
174  return filename, old, data
175 
176 
177 @click.command()
178 @click.argument("version", type=str)
179 @click.argument(
180  "date",
181  type=click.DateTime(("%Y-%m-%d",)),
182  metavar="[DATE]",
183  default=datetime.datetime.now(),
184 )
185 @click.option(
186  "--dry-run",
187  "-n",
188  default=False,
189  is_flag=True,
190  help="only show what would change, but do not modify the files",
191 )

◆ update_version()

def update_version.update_version ( str  version,
datetime.datetime  date,
bool  dry_run 
)
Helper to easily update the project version number in all needed files.

Definition at line 192 of file update_version.py.

192 def update_version(version: str, date: datetime.datetime, dry_run: bool):
193  """
194  Helper to easily update the project version number in all needed files.
195  """
196  fields = Fields(version, date.date())
197  click.echo(
198  "Bumping version to {cmake_version} (tag: {tag_version})".format(**fields.data)
199  )
200 
201  for updater in [
202  FileUpdater(
203  "CMakeLists.txt",
204  [(r"^project\‍(Gaudi VERSION", "project(Gaudi VERSION {cmake_version}")],
205  ),
206  FileUpdater(
207  "CITATION.cff",
208  [
209  (r"^version: ", "version: {tag_version}"),
210  (r"^date-released: ", "date-released: '{date}'"),
211  ],
212  ),
213  FileUpdater(
214  "docs/source/conf.py",
215  [
216  (r"^version = ", 'version = "{cmake_version}"'),
217  (r"^release = ", 'release = "{tag_version}"'),
218  ],
219  ),
220  update_changelog,
221  ]:
222  filename, old, new = updater(fields)
223 
224  if old != new:
225  if dry_run:
226  sys.stdout.writelines(
227  unified_diff(
228  old,
229  new,
230  fromfile=f"a/{filename}",
231  tofile=f"b/{filename}",
232  )
233  )
234  else:
235  click.echo(f"updated {filename}")
236  with open(filename, "w") as f:
237  f.writelines(new)
238 
239 
update_version.update_version
def update_version(str version, datetime.datetime date, bool dry_run)
Definition: update_version.py:192
format
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
Definition: MsgStream.cpp:119
update_version.normalize_version
tuple[str, str] normalize_version(str version)
Definition: update_version.py:23
update_version.update_changelog
tuple[str, list[str], list[str]] update_changelog(Fields fields)
Definition: update_version.py:119