Basic Auto-Versioning from Git
If you're using the winning workflow and the recommended Python project layout then you've set up a CI server to build releases when you tag them in Git, and you set your version in the
__init__.py file of your package. But, "Oh, No!" you did it again. You created the Git tag, but forgot to update your code's
Okay, there is a Python package called Versioneer that handles this for you, and it's pretty awesome. But it turns out it's also pretty easy to roll your own, especially if you're just using Git, because Python has a Git implementation called Dulwich that can do this in just a few lines. Maybe it will get integrated into a future version of Dulwich - I've submitted a PR (#462). Anyway, for now, the easiest way to use this is to copy this file into your package at the top level, import it and then add something like this to your package dunder init module so it works both in your repo during dev and then later when deployed to users.
""" Example package dunder init module implementing ``dulwich.contrib.release_robot`` to get current version. """ from dulwich.contrib.release_robot import get_current_version from dulwich.repo import NotGitRepository import os import importlib BASEDIR = os.path.dirname(__file__) # this directory VER_FILE = 'version' # name of file to store version # use release robot to try to get current Git tag try: GIT_TAG = get_current_version() except NotGitRepository: GIT_TAG = None # check version file try: version = importlib.import_module('%s.%s' % (__name__, VER_FILE)) except ImportError: VERSION = None else: VERSION = version.VERSION # update version file if it differs from Git tag if GIT_TAG is not None and VERSION != GIT_TAG: with open(os.path.join(BASEDIR, VER_FILE + '.py'), 'w') as vf: vf.write('VERSION = "%s"\n' % GIT_TAG) else: GIT_TAG = VERSION # if Git tag is none use version file VERSION = GIT_TAG # version __author__ = u'your name' __email__ = email@example.com' __url__ = u'https://github.com/your-org/your-project' __version__ = VERSION __release__ = u'your release name'
Or you can also use it to get all recent tags.
assuming your tags all use semantic versions like "v0.3". Enjoy!