addon-sdk/source/python-lib/cuddlefish/_version.py

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     2 # This file helps to compute a version number in source trees obtained from
     3 # git-archive tarball (such as those provided by githubs download-from-tag
     4 # feature). Distribution tarballs (build by setup.py sdist) and build
     5 # directories (produced by setup.py build) will contain a much shorter file
     6 # that just contains the computed version number.
     8 # This file is released into the public domain. Generated by versioneer-0.6
     9 # (https://github.com/warner/python-versioneer)
    11 # these strings will be replaced by git during git-archive
    12 git_refnames = "$Format:%d$"
    13 git_full = "$Format:%H$"
    16 import subprocess
    18 def run_command(args, cwd=None, verbose=False):
    19     try:
    20         # remember shell=False, so use git.cmd on windows, not just git
    21         p = subprocess.Popen(args, stdout=subprocess.PIPE, cwd=cwd)
    22     except EnvironmentError, e:
    23         if verbose:
    24             print "unable to run %s" % args[0]
    25             print e
    26         return None
    27     stdout = p.communicate()[0].strip()
    28     if p.returncode != 0:
    29         if verbose:
    30             print "unable to run %s (error)" % args[0]
    31         return None
    32     return stdout
    35 import sys
    36 import re
    37 import os.path
    39 def get_expanded_variables(versionfile_source):
    40     # the code embedded in _version.py can just fetch the value of these
    41     # variables. When used from setup.py, we don't want to import
    42     # _version.py, so we do it with a regexp instead. This function is not
    43     # used from _version.py.
    44     variables = {}
    45     try:
    46         for line in open(versionfile_source,"r").readlines():
    47             if line.strip().startswith("git_refnames ="):
    48                 mo = re.search(r'=\s*"(.*)"', line)
    49                 if mo:
    50                     variables["refnames"] = mo.group(1)
    51             if line.strip().startswith("git_full ="):
    52                 mo = re.search(r'=\s*"(.*)"', line)
    53                 if mo:
    54                     variables["full"] = mo.group(1)
    55     except EnvironmentError:
    56         pass
    57     return variables
    59 def versions_from_expanded_variables(variables, tag_prefix):
    60     refnames = variables["refnames"].strip()
    61     if refnames.startswith("$Format"):
    62         return {} # unexpanded, so not in an unpacked git-archive tarball
    63     refs = set([r.strip() for r in refnames.strip("()").split(",")])
    64     for ref in list(refs):
    65         if not re.search(r'\d', ref):
    66             refs.discard(ref)
    67             # Assume all version tags have a digit. git's %d expansion
    68             # behaves like git log --decorate=short and strips out the
    69             # refs/heads/ and refs/tags/ prefixes that would let us
    70             # distinguish between branches and tags. By ignoring refnames
    71             # without digits, we filter out many common branch names like
    72             # "release" and "stabilization", as well as "HEAD" and "master".
    73     for ref in sorted(refs):
    74         # sorting will prefer e.g. "2.0" over "2.0rc1"
    75         if ref.startswith(tag_prefix):
    76             r = ref[len(tag_prefix):]
    77             return { "version": r,
    78                      "full": variables["full"].strip() }
    79     # no suitable tags, so we use the full revision id
    80     return { "version": variables["full"].strip(),
    81              "full": variables["full"].strip() }
    83 def versions_from_vcs(tag_prefix, versionfile_source, verbose=False):
    84     # this runs 'git' from the root of the source tree. That either means
    85     # someone ran a setup.py command (and this code is in versioneer.py, thus
    86     # the containing directory is the root of the source tree), or someone
    87     # ran a project-specific entry point (and this code is in _version.py,
    88     # thus the containing directory is somewhere deeper in the source tree).
    89     # This only gets called if the git-archive 'subst' variables were *not*
    90     # expanded, and _version.py hasn't already been rewritten with a short
    91     # version string, meaning we're inside a checked out source tree.
    93     try:
    94         here = os.path.abspath(__file__)
    95     except NameError:
    96         # some py2exe/bbfreeze/non-CPython implementations don't do __file__
    97         return {} # not always correct
    99     # versionfile_source is the relative path from the top of the source tree
   100     # (where the .git directory might live) to this file. Invert this to find
   101     # the root from __file__.
   102     root = here
   103     for i in range(len(versionfile_source.split("/"))):
   104         root = os.path.dirname(root)
   105     if not os.path.exists(os.path.join(root, ".git")):
   106         return {}
   108     GIT = "git"
   109     if sys.platform == "win32":
   110         GIT = "git.cmd"
   111     stdout = run_command([GIT, "describe", "--tags", "--dirty", "--always"],
   112                          cwd=root)
   113     if stdout is None:
   114         return {}
   115     if not stdout.startswith(tag_prefix):
   116         if verbose:
   117             print "tag '%s' doesn't start with prefix '%s'" % (stdout, tag_prefix)
   118         return {}
   119     tag = stdout[len(tag_prefix):]
   120     stdout = run_command([GIT, "rev-parse", "HEAD"], cwd=root)
   121     if stdout is None:
   122         return {}
   123     full = stdout.strip()
   124     if tag.endswith("-dirty"):
   125         full += "-dirty"
   126     return {"version": tag, "full": full}
   129 def versions_from_parentdir(parentdir_prefix, versionfile_source, verbose=False):
   130     try:
   131         here = os.path.abspath(__file__)
   132         # versionfile_source is the relative path from the top of the source
   133         # tree (where the .git directory might live) to _version.py, when
   134         # this is used by the runtime. Invert this to find the root from
   135         # __file__.
   136         root = here
   137         for i in range(len(versionfile_source.split("/"))):
   138             root = os.path.dirname(root)
   139     except NameError:
   140         # try a couple different things to handle py2exe, bbfreeze, and
   141         # non-CPython implementations which don't do __file__. This code
   142         # either lives in versioneer.py (used by setup.py) or _version.py
   143         # (used by the runtime). In the versioneer.py case, sys.argv[0] will
   144         # be setup.py, in the root of the source tree. In the _version.py
   145         # case, we have no idea what sys.argv[0] is (some
   146         # application-specific runner).
   147         root = os.path.dirname(os.path.abspath(sys.argv[0]))
   148     # Source tarballs conventionally unpack into a directory that includes
   149     # both the project name and a version string.
   150     dirname = os.path.basename(root)
   151     if not dirname.startswith(parentdir_prefix):
   152         if verbose:
   153             print "dirname '%s' doesn't start with prefix '%s'" %                   (dirname, parentdir_prefix)
   154         return None
   155     return {"version": dirname[len(parentdir_prefix):], "full": ""}
   157 tag_prefix = ""
   158 parentdir_prefix = "addon-sdk-"
   159 versionfile_source = "python-lib/cuddlefish/_version.py"
   161 def get_versions():
   162     variables = { "refnames": git_refnames, "full": git_full }
   163     ver = versions_from_expanded_variables(variables, tag_prefix)
   164     if not ver:
   165         ver = versions_from_vcs(tag_prefix, versionfile_source)
   166     if not ver:
   167         ver = versions_from_parentdir(parentdir_prefix, versionfile_source)
   168     if not ver:
   169         ver = {"version": "unknown", "full": ""}
   170     return ver

mercurial