]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
chore(bump-version): find versions to maintain in setup.cfg files 466/head
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Thu, 29 Dec 2022 00:26:33 +0000 (00:26 +0000)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Thu, 29 Dec 2022 00:34:21 +0000 (00:34 +0000)
psycopg/setup.cfg
tools/bump_version.py

index 5dd06445cc136e1bc27ec3ba64dcaf5aa7f72204..29e64c895440d59827a04c3b1bd723df5c37374d 100644 (file)
@@ -14,6 +14,8 @@ version = 3.2.0.dev1
 # also change:
 # - `docs/news.rst` to declare this as the current version or an unreleased one
 # - `psycopg_c/setup.cfg`, and the extra dependencies below, to the same version.
+#
+# Check out tools/bump_version.py to help maintaining versions.
 
 project_urls =
     Homepage = https://psycopg.org/
index 50dbe0bd457e5f99927101d4eea890ef5c0ffe54..3c12aba0ba8565a75ac90f66b16a43304bbecc6d 100755 (executable)
@@ -25,9 +25,10 @@ logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(mess
 @dataclass
 class Package:
     name: str
-    version_files: list[Path]
+    ini_files: list[Path]
     history_file: Path
     tag_format: str
+    extras: list[str]
 
     def __post_init__(self) -> None:
         packages[self.name] = self
@@ -37,19 +38,21 @@ packages: dict[str, Package] = {}
 
 Package(
     name="psycopg",
-    version_files=[
-        PROJECT_DIR / "psycopg/psycopg/version.py",
-        PROJECT_DIR / "psycopg_c/psycopg_c/version.py",
+    ini_files=[
+        PROJECT_DIR / "psycopg/setup.cfg",
+        PROJECT_DIR / "psycopg_c/setup.cfg",
     ],
     history_file=PROJECT_DIR / "docs/news.rst",
     tag_format="{version}",
+    extras=["psycopg-c", "psycopg-binary"],
 )
 
 Package(
     name="psycopg_pool",
-    version_files=[PROJECT_DIR / "psycopg_pool/psycopg_pool/version.py"],
+    ini_files=[PROJECT_DIR / "psycopg_pool/setup.cfg"],
     history_file=PROJECT_DIR / "docs/news_pool.rst",
     tag_format="pool-{version}",
+    extras=[],
 )
 
 
@@ -58,25 +61,34 @@ class Bumper:
         self.package = package
         self.bump_level = BumpLevel(bump_level)
 
-        self._version_regex = re.compile(
+        self._ini_regex = re.compile(
             r"""(?ix)
             ^
-            (?P<pre>__version__\s*=\s*(?P<quote>["']))
-            (?P<ver>[^'"]+)
-            (?P<post>(?P=quote)\s*(?:\#.*)?)
-            $
+            (?P<pre> version \s* = \s*)
+            (?P<ver> [^\s]+)
+            (?P<post> \s*)
+            \s* $
+            """
+        )
+        self._extra_regex = re.compile(
+            r"""(?ix)
+            ^
+            (?P<pre> \s* )
+            (?P<package> [^\s]+)
+            (?P<op> \s* == \s*)
+            (?P<ver> [^\s]+)
+            (?P<post> \s*)
+            \s* $
             """
         )
 
     @cached_property
     def current_version(self) -> Version:
-        versions = set(
-            self._parse_version_from_file(f) for f in self.package.version_files
-        )
+        versions = set(self._parse_version_from_file(f) for f in self.package.ini_files)
         if len(versions) > 1:
             raise ValueError(
                 f"inconsistent versions ({', '.join(map(str, sorted(versions)))})"
-                f" in {self.package.version_files}"
+                f" in {self.package.ini_files}"
             )
 
         return versions.pop()
@@ -115,23 +127,23 @@ class Bumper:
         return Version(".".join(sparts))
 
     def update_files(self) -> None:
-        for f in self.package.version_files:
+        for f in self.package.ini_files:
             self._update_version_in_file(f, self.want_version)
 
         if self.bump_level != BumpLevel.DEV:
             self._update_history_file(self.package.history_file, self.want_version)
 
     def commit(self) -> None:
-        logger.debug("committing version changes")
+        logger.info("committing version changes")
         msg = f"""\
 chore: bump {self.package.name} package version to {self.want_version}
 """
-        files = self.package.version_files + [self.package.history_file]
+        files = self.package.ini_files + [self.package.history_file]
         cmdline = ["git", "commit", "-m", msg] + list(map(str, files))
         sp.check_call(cmdline)
 
     def create_tag(self) -> None:
-        logger.debug("tagging version %s", self.want_version)
+        logger.info("tagging version %s", self.want_version)
         tag_name = self.package.tag_format.format(version=self.want_version)
         changes = self._get_changes_lines(
             self.package.history_file,
@@ -150,7 +162,7 @@ chore: bump {self.package.name} package version to {self.want_version}
         matches = []
         with fp.open() as f:
             for line in f:
-                m = self._version_regex.match(line)
+                m = self._ini_regex.match(line)
                 if m:
                     matches.append(m)
 
@@ -164,12 +176,18 @@ chore: bump {self.package.name} package version to {self.want_version}
         return vs
 
     def _update_version_in_file(self, fp: Path, version: Version) -> None:
-        logger.debug("upgrading version to %s in %s", version, fp)
+        logger.info("upgrading version in %s", fp)
         lines = []
         with fp.open() as f:
             for line in f:
-                if self._version_regex.match(line):
-                    line = self._version_regex.sub(f"\\g<pre>{version}\\g<post>", line)
+                if self._ini_regex.match(line):
+                    line = self._ini_regex.sub(f"\\g<pre>{version}\\g<post>", line)
+                elif m := self._extra_regex.match(line):
+                    if m.group("package") in self.package.extras:
+                        line = self._extra_regex.sub(
+                            f"\\g<pre>\\g<package>\\g<op>{version}\\g<post>", line
+                        )
+
                 lines.append(line)
 
         with fp.open("w") as f:
@@ -177,7 +195,7 @@ chore: bump {self.package.name} package version to {self.want_version}
                 f.write(line)
 
     def _update_history_file(self, fp: Path, version: Version) -> None:
-        logger.debug("upgrading history file %s", fp)
+        logger.info("upgrading history file %s", fp)
         with fp.open() as f:
             lines = f.readlines()