Statistics
| Branch: | Tag: | Revision:

root / snf-common / synnefo / util / version.py @ ef67f714

History | View | Annotate | Download (3.6 kB)

1 07d104d8 Kostas Papadimitriou
import pkg_resources
2 07d104d8 Kostas Papadimitriou
import os
3 9b59a383 Kostas Papadimitriou
import pprint
4 0fb30b27 Kostas Papadimitriou
import re
5 07d104d8 Kostas Papadimitriou
6 07d104d8 Kostas Papadimitriou
def get_dist_from_module(modname):
7 07d104d8 Kostas Papadimitriou
    pkgroot = pkg_resources.get_provider(modname).egg_root
8 07d104d8 Kostas Papadimitriou
    return list(pkg_resources.find_distributions(pkgroot))[0]
9 07d104d8 Kostas Papadimitriou
10 07d104d8 Kostas Papadimitriou
11 07d104d8 Kostas Papadimitriou
def get_dist(dist_name):
12 07d104d8 Kostas Papadimitriou
    return pkg_resources.get_distribution(dist_name)
13 07d104d8 Kostas Papadimitriou
14 07d104d8 Kostas Papadimitriou
15 07d104d8 Kostas Papadimitriou
def get_dist_version(dist_name):
16 07d104d8 Kostas Papadimitriou
    """
17 07d104d8 Kostas Papadimitriou
    Get the version for the specified distribution name
18 07d104d8 Kostas Papadimitriou
    """
19 07d104d8 Kostas Papadimitriou
    try:
20 07d104d8 Kostas Papadimitriou
        return get_dist(dist_name).version
21 07d104d8 Kostas Papadimitriou
    except Exception, e:
22 07d104d8 Kostas Papadimitriou
        return 'unknown'
23 07d104d8 Kostas Papadimitriou
24 07d104d8 Kostas Papadimitriou
25 07d104d8 Kostas Papadimitriou
def get_component_version(modname):
26 07d104d8 Kostas Papadimitriou
    """
27 07d104d8 Kostas Papadimitriou
    Return the version of a synnefo module/package based on its
28 07d104d8 Kostas Papadimitriou
    corresponding distributed package version
29 07d104d8 Kostas Papadimitriou
    """
30 07d104d8 Kostas Papadimitriou
    try:
31 84e75610 Kostas Papadimitriou
        try:
32 84e75610 Kostas Papadimitriou
            return __import__('synnefo.versions.%s' % modname,
33 07d104d8 Kostas Papadimitriou
                    fromlist=['synnefo.versions']).__version__
34 84e75610 Kostas Papadimitriou
        except ImportError:
35 84e75610 Kostas Papadimitriou
            return  vcs_version()
36 07d104d8 Kostas Papadimitriou
    except Exception, e:
37 07d104d8 Kostas Papadimitriou
        return 'unknown'
38 07d104d8 Kostas Papadimitriou
39 07d104d8 Kostas Papadimitriou
40 07d104d8 Kostas Papadimitriou
def vcs_info():
41 07d104d8 Kostas Papadimitriou
    """
42 0fb30b27 Kostas Papadimitriou
    Return current git HEAD commit information.
43 0fb30b27 Kostas Papadimitriou

44 0fb30b27 Kostas Papadimitriou
    Returns a tuple containing
45 0fb30b27 Kostas Papadimitriou
        - branch name
46 0fb30b27 Kostas Papadimitriou
        - commit id
47 0fb30b27 Kostas Papadimitriou
        - commit index
48 0fb30b27 Kostas Papadimitriou
        - git describe output
49 07d104d8 Kostas Papadimitriou
    """
50 07d104d8 Kostas Papadimitriou
    import subprocess
51 07d104d8 Kostas Papadimitriou
    callgit = lambda(cmd): subprocess.Popen(
52 07d104d8 Kostas Papadimitriou
            ['/bin/sh', '-c', cmd],
53 84e75610 Kostas Papadimitriou
            stdout=subprocess.PIPE,
54 84e75610 Kostas Papadimitriou
            stderr=subprocess.PIPE).communicate()[0].strip()
55 07d104d8 Kostas Papadimitriou
56 07d104d8 Kostas Papadimitriou
    branch = callgit('git branch | grep -Ei "\* (.*)" | cut -f2 -d" "')
57 07d104d8 Kostas Papadimitriou
    revid = callgit("git --no-pager log --max-count=1 | cut -f2 -d' ' | head -1")
58 07d104d8 Kostas Papadimitriou
    revno = callgit('git --no-pager log --oneline | wc -l')
59 c5aecff5 Kostas Papadimitriou
    desc = callgit('git describe --tags')
60 07d104d8 Kostas Papadimitriou
61 07d104d8 Kostas Papadimitriou
    return branch, revid, revno, desc
62 07d104d8 Kostas Papadimitriou
63 07d104d8 Kostas Papadimitriou
64 0fb30b27 Kostas Papadimitriou
def get_version_from_describe(describe):
65 07d104d8 Kostas Papadimitriou
    """
66 0fb30b27 Kostas Papadimitriou
    Package version based on `git describe` output. Compatible with setuptools
67 07d104d8 Kostas Papadimitriou
    version format
68 0fb30b27 Kostas Papadimitriou

69 0fb30b27 Kostas Papadimitriou
    >>> get_version_from_describe("v0.8.0")
70 0fb30b27 Kostas Papadimitriou
    '0.8.0'
71 0fb30b27 Kostas Papadimitriou
    >>> get_version_from_describe("debian/v0.8.0")
72 0fb30b27 Kostas Papadimitriou
    '0.8.0'
73 0fb30b27 Kostas Papadimitriou
    >>> get_version_from_describe("0.8.0")
74 0fb30b27 Kostas Papadimitriou
    '0.8.0'
75 0fb30b27 Kostas Papadimitriou
    >>> get_version_from_describe("v0.8.0-34-g8f9a1bf")
76 0fb30b27 Kostas Papadimitriou
    '0.8.0-34-g8f9a1bf'
77 0fb30b27 Kostas Papadimitriou
    >>> get_version_from_describe("debian/v0.8.0-34-g8f9a1bf")
78 0fb30b27 Kostas Papadimitriou
    '0.8.0-34-g8f9a1bf'
79 07d104d8 Kostas Papadimitriou
    """
80 07d104d8 Kostas Papadimitriou
81 0fb30b27 Kostas Papadimitriou
    version = describe.split("/")[-1].lstrip('v')
82 0fb30b27 Kostas Papadimitriou
    version = version.lstrip('v')
83 0fb30b27 Kostas Papadimitriou
    return version
84 07d104d8 Kostas Papadimitriou
85 473e2b08 Christos Stavrakakis
86 473e2b08 Christos Stavrakakis
def update_version_old(module, name='version', root="."):
87 07d104d8 Kostas Papadimitriou
    """
88 07d104d8 Kostas Papadimitriou
    Helper util to generate/replace a version.py file containing version
89 0fb30b27 Kostas Papadimitriou
    information retrieved from get_version_from_describe as a submodule of passed `module`
90 07d104d8 Kostas Papadimitriou
    """
91 07d104d8 Kostas Papadimitriou
92 07d104d8 Kostas Papadimitriou
    # exit early if not in development environment
93 0fb30b27 Kostas Papadimitriou
    if not os.path.exists(os.path.join(root, '..', '.git')) and \
94 0fb30b27 Kostas Papadimitriou
        not os.path.exists(os.path.join(root, '.git')):
95 07d104d8 Kostas Papadimitriou
        return
96 07d104d8 Kostas Papadimitriou
97 07d104d8 Kostas Papadimitriou
    paths = [root] + module.split(".") + ["%s.py" % name]
98 07d104d8 Kostas Papadimitriou
    module_filename = os.path.join(*paths)
99 07d104d8 Kostas Papadimitriou
    content = """
100 07d104d8 Kostas Papadimitriou
__version__ = "%(version)s"
101 07d104d8 Kostas Papadimitriou
__version_info__ = __version__.split(".")
102 9b59a383 Kostas Papadimitriou
__version_vcs_info__ = %(vcs_info)s
103 0fb30b27 Kostas Papadimitriou
    """ % dict(version=get_version_from_describe(vcs_info()[3]),
104 9b59a383 Kostas Papadimitriou
            vcs_info=pprint.PrettyPrinter().pformat(vcs_info()))
105 07d104d8 Kostas Papadimitriou
106 07d104d8 Kostas Papadimitriou
    module_file = file(module_filename, "w+")
107 07d104d8 Kostas Papadimitriou
    module_file.write(content)
108 07d104d8 Kostas Papadimitriou
    module_file.close()
109 07d104d8 Kostas Papadimitriou
110 473e2b08 Christos Stavrakakis
111 473e2b08 Christos Stavrakakis
def update_version(module, name='version', root='.'):
112 473e2b08 Christos Stavrakakis
    try:
113 473e2b08 Christos Stavrakakis
        from devflow import versioning
114 473e2b08 Christos Stavrakakis
        return versioning.update_version(module, name, root)
115 473e2b08 Christos Stavrakakis
    except ImportError:
116 473e2b08 Christos Stavrakakis
        import sys
117 473e2b08 Christos Stavrakakis
        paths = [root] + module.split(".") + ["%s.py" % name]
118 473e2b08 Christos Stavrakakis
        module_filename = os.path.join(*paths)
119 ef67f714 Christos Stavrakakis
        sys.stdout.write("WARNING: Cannot update version because `devflow` is"
120 473e2b08 Christos Stavrakakis
                         " not installed. Please make sure to manually"
121 473e2b08 Christos Stavrakakis
                         " update version file: '%s'\n" % module_filename)