From 55526e4dce4baa4b9f69230b90b62ddc8a8c1245 Mon Sep 17 00:00:00 2001
From: Peter Odding <peter@peterodding.com>
Date: Sun, 16 Dec 2018 01:12:42 +0100
Subject: [PATCH 1/2] Backwards compatibility w/ old version number conversion

---
 py2deb/converter.py | 16 ++++++++++++++--
 py2deb/package.py   |  6 ++++--
 py2deb/tests.py     |  7 +++++--
 py2deb/utils.py     | 16 ++++++++++------
 4 files changed, 33 insertions(+), 12 deletions(-)

diff --git a/py2deb/converter.py b/py2deb/converter.py
index 26a42a7..bbc6ce6 100644
--- a/py2deb/converter.py
+++ b/py2deb/converter.py
@@ -3,7 +3,7 @@
 # Authors:
 #  - Arjan Verwer
 #  - Peter Odding <peter.odding@paylogic.com>
-# Last Change: November 18, 2018
+# Last Change: December 16, 2018
 # URL: https://py2deb.readthedocs.io
 
 """
@@ -212,6 +212,18 @@ def name_prefix(self):
         """
         return default_name_prefix()
 
+    @mutable_property
+    def prerelease_workaround(self):
+        """
+        Whether to enable the pre-release workaround in :func:`normalize_package_version()` (a boolean).
+
+        By setting this to :data:`False` converted version numbers will match
+        those generated by py2deb 0.25 and earlier. Release 1.0 introduced the
+        pre-release workaround and release 2.1 added the option to control
+        backwards compatibility in this respect.
+        """
+        return True
+
     @mutable_property
     def python_callback(self):
         """
@@ -908,4 +920,4 @@ def transform_version(self, package_to_convert, python_requirement_name, python_
                                        python_requirement_name, package_to_convert.python_name,
                                        python_requirement_version, modified_version)
                         python_requirement_version = modified_version
-        return normalize_package_version(python_requirement_version)
+        return normalize_package_version(python_requirement_version, prerelease_workaround=self.prerelease_workaround)
diff --git a/py2deb/package.py b/py2deb/package.py
index c0ef8da..39a5144 100644
--- a/py2deb/package.py
+++ b/py2deb/package.py
@@ -3,7 +3,7 @@
 # Authors:
 #  - Arjan Verwer
 #  - Peter Odding <peter.odding@paylogic.com>
-# Last Change: November 18, 2018
+# Last Change: December 16, 2018
 # URL: https://py2deb.readthedocs.io
 
 """
@@ -126,7 +126,9 @@ def debian_version(self):
         Reformats :attr:`python_version` using
         :func:`.normalize_package_version()`.
         """
-        return normalize_package_version(self.python_version)
+        return normalize_package_version(
+            self.python_version, prerelease_workaround=self.converter.prerelease_workaround
+        )
 
     @cached_property
     def debian_maintainer(self):
diff --git a/py2deb/tests.py b/py2deb/tests.py
index 5cae93f..690c6ba 100644
--- a/py2deb/tests.py
+++ b/py2deb/tests.py
@@ -1,7 +1,7 @@
 # Automated tests for the `py2deb' package.
 #
 # Author: Peter Odding <peter.odding@paylogic.com>
-# Last Change: November 18, 2018
+# Last Change: December 16, 2018
 # URL: https://py2deb.readthedocs.io
 
 """
@@ -156,11 +156,14 @@ def test_version_reformatting(self):
         """Test reformatting of Python version strings."""
         assert normalize_package_version('1.5_42') == '1.5-42'
         assert normalize_package_version('1.5-whatever') == '1.5-whatever-1'
-        # PEP 440 pre-release versions.
+        # PEP 440 pre-release versions (specific handling added in release 1.0).
         assert normalize_package_version('1.0a2') == '1.0~a2'
         assert normalize_package_version('1.0b2') == '1.0~b2'
         assert normalize_package_version('1.0c2') == '1.0~rc2'
         assert normalize_package_version('1.0rc2') == '1.0~rc2'
+        # New versus old behavior (the option to control backwards compatibility was added in release 2.1).
+        assert normalize_package_version('1.0a2', prerelease_workaround=True) == '1.0~a2'
+        assert normalize_package_version('1.0a2', prerelease_workaround=False) == '1.0a2'
 
     def test_conversion_of_simple_package(self):
         """
diff --git a/py2deb/utils.py b/py2deb/utils.py
index 1a7b533..dc5a24e 100644
--- a/py2deb/utils.py
+++ b/py2deb/utils.py
@@ -3,7 +3,7 @@
 # Authors:
 #  - Arjan Verwer
 #  - Peter Odding <peter.odding@paylogic.com>
-# Last Change: November 18, 2018
+# Last Change: December 16, 2018
 # URL: https://py2deb.readthedocs.io
 
 """The :mod:`py2deb.utils` module contains miscellaneous code."""
@@ -346,11 +346,14 @@ def normalize_package_name(python_package_name):
     return re.sub('[^a-z0-9]+', '-', python_package_name.lower()).strip('-')
 
 
-def normalize_package_version(python_package_version):
+def normalize_package_version(python_package_version, prerelease_workaround=True):
     """
     Normalize Python package version to be used as Debian package version.
 
     :param python_package_version: The version of a Python package (a string).
+    :param prerelease_workaround: :data:`True` to enable the pre-release
+                                  handling documented below, :data:`False` to
+                                  restore the old behavior.
 
     Reformats Python package versions to comply with the Debian policy manual.
     All characters except alphanumerics, dot (``.``) and plus (``+``) are
@@ -363,10 +366,11 @@ def normalize_package_version(python_package_version):
     """
     # Lowercase and remove invalid characters from the version string.
     version = re.sub('[^a-z0-9.+]+', '-', python_package_version.lower()).strip('-')
-    # Translate the PEP 440 pre-release identifier 'c' to 'rc'.
-    version = re.sub(r'(\d)c(\d)', r'\1rc\2', version)
-    # Replicate the intended ordering of PEP 440 pre-release versions (a, b, rc).
-    version = re.sub(r'(\d)(a|b|rc)(\d)', r'\1~\2\3', version)
+    if prerelease_workaround:
+        # Translate the PEP 440 pre-release identifier 'c' to 'rc'.
+        version = re.sub(r'(\d)c(\d)', r'\1rc\2', version)
+        # Replicate the intended ordering of PEP 440 pre-release versions (a, b, rc).
+        version = re.sub(r'(\d)(a|b|rc)(\d)', r'\1~\2\3', version)
     # Make sure the "Debian revision" contains a digit.
     components = version.split('-')
     if len(components) > 1 and not re.search('[0-9]', components[-1]):

From 5e144e4e257c2527170b0ad0ec8ed30a83319b7c Mon Sep 17 00:00:00 2001
From: Peter Odding <peter@peterodding.com>
Date: Sun, 16 Dec 2018 01:23:17 +0100
Subject: [PATCH 2/2] Release 2.1: Compatibility with old version number format

---
 CHANGELOG.rst      | 14 ++++++++++++++
 py2deb/__init__.py |  4 ++--
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.rst b/CHANGELOG.rst
index 6ee09a5..068b51c 100644
--- a/CHANGELOG.rst
+++ b/CHANGELOG.rst
@@ -11,6 +11,20 @@ to `semantic versioning`_.
 .. _Keep a Changelog: http://keepachangelog.com/
 .. _semantic versioning: http://semver.org/
 
+`Release 2.1`_ (2018-12-16)
+---------------------------
+
+Enable optional backwards compatibility with the old version number conversion
+up to :ref:`release 0.25` in which pre-release identifiers didn't receive any
+special treatment.
+
+My reason for adding this backwards compatibility now is that it will allow me
+to upgrade py2deb on the build server of my employer to the latest version
+without being forced to switch to the new version number format at the same
+time. This simplifies the transition significantly.
+
+.. _Release 2.1: https://github.com/paylogic/py2deb/compare/2.0...2.1
+
 `Release 2.0`_ (2018-11-18)
 ---------------------------
 
diff --git a/py2deb/__init__.py b/py2deb/__init__.py
index e15d996..1223ef0 100644
--- a/py2deb/__init__.py
+++ b/py2deb/__init__.py
@@ -3,7 +3,7 @@
 # Authors:
 #  - Arjan Verwer
 #  - Peter Odding <peter.odding@paylogic.com>
-# Last Change: November 18, 2018
+# Last Change: December 16, 2018
 # URL: https://py2deb.readthedocs.io
 
 """
@@ -15,4 +15,4 @@
 """
 
 # Semi-standard module versioning.
-__version__ = '2.0'
+__version__ = '2.1'