diff --git a/.gitignore b/.gitignore index 3d5b80428d4d3d96051e085c47612d07a4aeecc0..c5d29d7c34f52c54cf724c91f0f86a9e7b4c96df 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,5 @@ examples/*.pdf .cache tags + +pytential/_git_rev.py diff --git a/pytential/version.py b/pytential/version.py index 426eafaf79ab790587a3d57c2370c4ac689d30f0..5cb9cc61161073b0cd9e9a5fad471dcc6620763d 100644 --- a/pytential/version.py +++ b/pytential/version.py @@ -1,8 +1,49 @@ +from __future__ import division, absolute_import + +__copyright__ = "Copyright (C) 2018 Andreas Kloeckner" + +__license__ = """ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +""" + +# {{{ find install- or run-time git revision + +import os +if os.environ.get("AKPYTHON_EXEC_FROM_WITHIN_WITHIN_SETUP_PY") is not None: + # We're just being exec'd by setup.py. We can't import anything. + _git_rev = None + +else: + import pytential._git_rev as _git_rev_mod + _git_rev = _git_rev_mod.GIT_REVISION + + # If we're running from a dev tree, the last install (and hence the most + # recent update of the above git rev) could have taken place very long ago. + from pytools import find_module_git_revision + _runtime_git_rev = find_module_git_revision(__file__, n_levels_up=1) + if _runtime_git_rev is not None: + _git_rev = _runtime_git_rev + +# }}} + + VERSION = (2016, 1) VERSION_TEXT = ".".join(str(i) for i in VERSION) -# When developing on a branch, set the first element of this tuple to your -# branch name, so as to avoid conflicts with the master branch. Make sure -# to reset this to the next number up with "master" before merging into -# master. -PYTENTIAL_KERNEL_VERSION = ("master", 10) +PYTENTIAL_KERNEL_VERSION = (VERSION, _git_rev, 0) diff --git a/setup.py b/setup.py index d8d49a9cb1d30b0ac134f308ce983cd8dee0e7b1..84438494a9bf49fd79df6dab0513e763833c3ae4 100644 --- a/setup.py +++ b/setup.py @@ -1,63 +1,110 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +import os +from setuptools import setup, find_packages -def main(): - from setuptools import setup, find_packages - - version_dict = {} - init_filename = "pytential/version.py" - exec(compile(open(init_filename, "r").read(), init_filename, "exec"), - version_dict) - - setup(name="pytential", - version=version_dict["VERSION_TEXT"], - description="Evaluate layer and volume potentials accurately. " - "Solve integral equations.", - long_description=open("README.rst", "rt").read(), - author="Andreas Kloeckner", - author_email="inform@tiker.net", - license="MIT", - url="http://wiki.tiker.net/Pytential", - classifiers=[ - 'Development Status :: 3 - Alpha', - 'Intended Audience :: Developers', - 'Intended Audience :: Other Audience', - 'Intended Audience :: Science/Research', - 'License :: OSI Approved :: MIT License', - 'Natural Language :: English', - 'Programming Language :: Python', - - 'Programming Language :: Python :: 2.6', - 'Programming Language :: Python :: 2.7', - # 3.x has not yet been tested. - 'Topic :: Scientific/Engineering', - 'Topic :: Scientific/Engineering :: Information Analysis', - 'Topic :: Scientific/Engineering :: Mathematics', - 'Topic :: Scientific/Engineering :: Visualization', - 'Topic :: Software Development :: Libraries', - 'Topic :: Utilities', - ], - - packages=find_packages(), - - install_requires=[ - "pytest>=2.3", - # FIXME leave out for now - # https://code.google.com/p/sympy/issues/detail?id=3874 - #"sympy>=0.7.2", - - "modepy>=2013.3", - "pyopencl>=2013.1", - "boxtree>=2013.1", - "pymbolic>=2013.2", - "loo.py>=2017.2", - "sumpy>=2013.1", - "cgen>=2013.1.2", - - "six", - ]) - - -if __name__ == '__main__': - main() + +# {{{ capture git revision at install time + +# authoritative version in pytools/__init__.py +def find_git_revision(tree_root): + # Keep this routine self-contained so that it can be copy-pasted into + # setup.py. + + from os.path import join, exists, abspath + tree_root = abspath(tree_root) + + if not exists(join(tree_root, ".git")): + return None + + from subprocess import Popen, PIPE, STDOUT + p = Popen(["git", "rev-parse", "HEAD"], shell=False, + stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True, + cwd=tree_root) + (git_rev, _) = p.communicate() + + import sys + if sys.version_info >= (3,): + git_rev = git_rev.decode() + + git_rev = git_rev.rstrip() + + retcode = p.returncode + assert retcode is not None + if retcode != 0: + from warnings import warn + warn("unable to find git revision") + return None + + return git_rev + + +def write_git_revision(package_name): + from os.path import dirname, join + dn = dirname(__file__) + git_rev = find_git_revision(dn) + + with open(join(dn, package_name, "_git_rev.py"), "w") as outf: + outf.write("GIT_REVISION = %s\n" % repr(git_rev)) + + +write_git_revision("pytential") + +# }}} + + +version_dict = {} +init_filename = "pytential/version.py" +os.environ["AKPYTHON_EXEC_FROM_WITHIN_WITHIN_SETUP_PY"] = "1" +exec(compile(open(init_filename, "r").read(), init_filename, "exec"), + version_dict) + +setup(name="pytential", + version=version_dict["VERSION_TEXT"], + description="Evaluate layer and volume potentials accurately. " + "Solve integral equations.", + long_description=open("README.rst", "rt").read(), + author="Andreas Kloeckner", + author_email="inform@tiker.net", + license="MIT", + url="http://wiki.tiker.net/Pytential", + classifiers=[ + 'Development Status :: 3 - Alpha', + 'Intended Audience :: Developers', + 'Intended Audience :: Other Audience', + 'Intended Audience :: Science/Research', + 'License :: OSI Approved :: MIT License', + 'Natural Language :: English', + 'Programming Language :: Python', + + 'Programming Language :: Python :: 2.6', + 'Programming Language :: Python :: 2.7', + # 3.x has not yet been tested. + 'Topic :: Scientific/Engineering', + 'Topic :: Scientific/Engineering :: Information Analysis', + 'Topic :: Scientific/Engineering :: Mathematics', + 'Topic :: Scientific/Engineering :: Visualization', + 'Topic :: Software Development :: Libraries', + 'Topic :: Utilities', + ], + + packages=find_packages(), + + install_requires=[ + "pytest>=2.3", + # FIXME leave out for now + # https://code.google.com/p/sympy/issues/detail?id=3874 + #"sympy>=0.7.2", + + "pytools>=2018.2", + "modepy>=2013.3", + "pyopencl>=2013.1", + "boxtree>=2013.1", + "pymbolic>=2013.2", + "loo.py>=2017.2", + "sumpy>=2013.1", + "cgen>=2013.1.2", + + "six", + ])