From 3a69cd99d56f0051362759417b063ebcd86125ab Mon Sep 17 00:00:00 2001
From: Bas Nijholt <basnijholt@gmail.com>
Date: Mon, 15 Oct 2018 14:03:58 +0200
Subject: [PATCH] update to the latest miniver

---
 adaptive/__init__.py                 |  5 +-
 adaptive/_static_version.py          |  6 ++-
 adaptive/{version.py => _version.py} | 79 +++++++++++++++++++---------
 setup.py                             |  6 +--
 4 files changed, 62 insertions(+), 34 deletions(-)
 rename adaptive/{version.py => _version.py} (66%)

diff --git a/adaptive/__init__.py b/adaptive/__init__.py
index 797935e4..83d44d18 100644
--- a/adaptive/__init__.py
+++ b/adaptive/__init__.py
@@ -17,9 +17,8 @@ with suppress(ImportError):
     from .learner import SKOptLearner
 
 from .runner import Runner, BlockingRunner
-from . import version
 
-__version__ = version.version
+from ._version import __version__
+del _version
 
 del notebook_integration  # to avoid confusion with `notebook_extension`
-del version
diff --git a/adaptive/_static_version.py b/adaptive/_static_version.py
index 7ce7ef04..f7d3e6c9 100644
--- a/adaptive/_static_version.py
+++ b/adaptive/_static_version.py
@@ -1,9 +1,11 @@
+# This file is part of 'miniver': https://github.com/jbweston/miniver
+#
 # This file will be overwritten by setup.py when a source or binary
 # distribution is made.  The magic value "__use_git__" is interpreted by
-# version.py.
+# _version.py.
 
 version = "__use_git__"
 
 # These values are only set if the distribution was created with 'git archive'
-refnames =  "$Format:%D$"
+refnames = "$Format:%D$"
 git_hash = "$Format:%h$"
diff --git a/adaptive/version.py b/adaptive/_version.py
similarity index 66%
rename from adaptive/version.py
rename to adaptive/_version.py
index 5d06fa7d..02bb5b1d 100644
--- a/adaptive/version.py
+++ b/adaptive/_version.py
@@ -1,9 +1,11 @@
+# -*- coding: utf-8 -*-
+# This file is part of 'miniver': https://github.com/jbweston/miniver
+#
 from collections import namedtuple
 import os
 import subprocess
-import sys
 
-from distutils.command.build import build as build_orig
+from distutils.command.build_py import build_py as build_py_orig
 from setuptools.command.sdist import sdist as sdist_orig
 
 Version = namedtuple('Version', ('release', 'dev', 'labels'))
@@ -19,31 +21,39 @@ STATIC_VERSION_FILE = '_static_version.py'
 
 
 def get_version(version_file=STATIC_VERSION_FILE):
-    version_info = {}
-    with open(os.path.join(package_root, version_file), 'rb') as f:
-        exec(f.read(), {}, version_info)
+    version_info = get_static_version_info(version_file)
     version = version_info['version']
-    version_is_from_git = (version == "__use_git__")
-    if version_is_from_git:
+    if version == "__use_git__":
         version = get_version_from_git()
         if not version:
             version = get_version_from_git_archive(version_info)
         if not version:
             version = Version("unknown", None, None)
-        return semver_format(version)
+        return pep440_format(version)
     else:
         return version
 
 
-def semver_format(version_info):
+def get_static_version_info(version_file=STATIC_VERSION_FILE):
+    version_info = {}
+    with open(os.path.join(package_root, version_file), 'rb') as f:
+        exec(f.read(), {}, version_info)
+    return version_info
+
+
+def version_is_from_git(version_file=STATIC_VERSION_FILE):
+    return get_static_version_info(version_file)['version'] == '__use_git__'
+
+
+def pep440_format(version_info):
     release, dev, labels = version_info
 
     version_parts = [release]
     if dev:
-        if release.endswith('-dev'):
+        if release.endswith('-dev') or release.endswith('.dev'):
             version_parts.append(dev)
-        else:
-            version_parts.append('-dev{}'.format(dev))
+        else:  # prefer PEP440 over strict adhesion to semver
+            version_parts.append('.dev{}'.format(dev))
 
     if labels:
         version_parts.append('+')
@@ -64,26 +74,42 @@ def get_version_from_git():
     if not os.path.samefile(p.communicate()[0].decode().rstrip('\n'),
                             distr_root):
         # The top-level directory of the current Git repository is not the same
-        # as the root directory of the Kwant distribution: do not extract the
+        # as the root directory of the distribution: do not extract the
         # version from Git.
         return
 
     # git describe --first-parent does not take into account tags from branches
-    # that were merged-in.
+    # that were merged-in. The '--long' flag gets us the 'dev' version and
+    # git hash, '--always' returns the git hash even if there are no tags.
     for opts in [['--first-parent'], []]:
         try:
-            p = subprocess.Popen(['git', 'describe', '--long'] + opts,
-                                 cwd=distr_root,
-                                 stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+            p = subprocess.Popen(
+                ['git', 'describe', '--long', '--always'] + opts,
+                cwd=distr_root,
+                stdout=subprocess.PIPE, stderr=subprocess.PIPE)
         except OSError:
             return
         if p.wait() == 0:
             break
     else:
         return
-    description = p.communicate()[0].decode().strip('v').rstrip('\n')
 
-    release, dev, git = description.rsplit('-', 2)
+    description = (
+        p.communicate()[0]
+        .decode()
+        .strip('v')  # Tags can have a leading 'v', but the version should not
+        .rstrip('\n')
+        .rsplit('-', 2)  # Split the latest tag, commits since tag, and hash
+    )
+
+    try:
+        release, dev, git = description
+    except ValueError:  # No tags, only the git hash
+        # prepend 'g' to match with format returned by 'git describe'
+        git = 'g{}'.format(*description)
+        release = 'unknown'
+        dev = None
+
     labels = []
     if dev == "0":
         dev = None
@@ -93,7 +119,7 @@ def get_version_from_git():
     try:
         p = subprocess.Popen(['git', 'diff', '--quiet'], cwd=distr_root)
     except OSError:
-        labels.append('confused') # This should never happen.
+        labels.append('confused')  # This should never happen.
     else:
         if p.wait() == 1:
             labels.append('dirty')
@@ -126,14 +152,15 @@ def get_version_from_git_archive(version_info):
         release, *_ = sorted(version_tags)  # prefer e.g. "2.0" over "2.0rc1"
         return Version(release, dev=None, labels=None)
     else:
-        return Version('unknown', dev=None, labels=[f'g{git_hash}'])
+        return Version('unknown', dev=None, labels=['g{}'.format(git_hash)])
+
 
+__version__ = get_version()
 
-version = get_version()
 
 # The following section defines a module global 'cmdclass',
 # which can be used from setup.py. The 'package_name' and
-# 'version' module globals are used (but not modified).
+# '__version__' module globals are used (but not modified).
 
 def _write_version(fname):
     # This could be a hard link, so try to delete it first.  Is there any way
@@ -144,10 +171,10 @@ def _write_version(fname):
         pass
     with open(fname, 'w') as f:
         f.write("# This file has been created by setup.py.\n"
-                "version = '{}'\n".format(version))
+                "version = '{}'\n".format(__version__))
 
 
-class _build(build_orig):
+class _build_py(build_py_orig):
     def run(self):
         super().run()
         _write_version(os.path.join(self.build_lib, package_name,
@@ -161,4 +188,4 @@ class _sdist(sdist_orig):
                                     STATIC_VERSION_FILE))
 
 
-cmdclass = dict(sdist=_sdist, build=_build)
+cmdclass = dict(sdist=_sdist, build_py=_build_py)
diff --git a/setup.py b/setup.py
index a0e98f7f..c57a2888 100644
--- a/setup.py
+++ b/setup.py
@@ -10,15 +10,15 @@ if sys.version_info < (3, 6):
     sys.exit(1)
 
 
-# Loads version.py module without importing the whole package.
+# Loads _version.py module without importing the whole package.
 def get_version_and_cmdclass(package_name):
     import os
     from importlib.util import module_from_spec, spec_from_file_location
     spec = spec_from_file_location('version',
-                                   os.path.join(package_name, 'version.py'))
+                                   os.path.join(package_name, '_version.py'))
     module = module_from_spec(spec)
     spec.loader.exec_module(module)
-    return module.version, module.cmdclass
+    return module.__version__, module.cmdclass
 
 
 version, cmdclass = get_version_and_cmdclass('adaptive')
-- 
GitLab