diff options
| -rw-r--r-- | versioneer.py | 73 | 
1 files changed, 43 insertions, 30 deletions
| diff --git a/versioneer.py b/versioneer.py index 57d99419..34e48073 100644 --- a/versioneer.py +++ b/versioneer.py @@ -74,8 +74,8 @@ To use it:       version=versioneer.get_version(),       cmdclass=versioneer.get_cmdclass(),   4: run 'setup.py update_files', which will create _version.py, and will -    append the following to your __init__.py: -     from _version import __version__ +    modify your __init__.py to define __version__ (by calling a function +    from _version.py)   5: modify your MANIFEST.in to include versioneer.py   6: add both versioneer.py and the generated _version.py to your VCS  """ @@ -144,7 +144,8 @@ def get_expanded_variables(versionfile_source):      # used from _version.py.      variables = {}      try: -        for line in open(versionfile_source,"r").readlines(): +        f = open(versionfile_source,"r") +        for line in f.readlines():              if line.strip().startswith("git_refnames ="):                  mo = re.search(r'=\s*"(.*)"', line)                  if mo: @@ -153,6 +154,7 @@ def get_expanded_variables(versionfile_source):                  mo = re.search(r'=\s*"(.*)"', line)                  if mo:                      variables["full"] = mo.group(1) +        f.close()      except EnvironmentError:          pass      return variables @@ -164,20 +166,24 @@ def versions_from_expanded_variables(variables, tag_prefix, verbose=False):              print("variables are unexpanded, not using")          return {} # unexpanded, so not in an unpacked git-archive tarball      refs = set([r.strip() for r in refnames.strip("()").split(",")]) -    for ref in list(refs): -        if not re.search(r'\d', ref): -            if verbose: -                print("discarding '%%s', no digits" %% ref) -            refs.discard(ref) -            # Assume all version tags have a digit. git's %%d expansion -            # behaves like git log --decorate=short and strips out the -            # refs/heads/ and refs/tags/ prefixes that would let us -            # distinguish between branches and tags. By ignoring refnames -            # without digits, we filter out many common branch names like -            # "release" and "stabilization", as well as "HEAD" and "master". +    # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of +    # just "foo-1.0". If we see a "tag: " prefix, prefer those. +    TAG = "tag: " +    tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) +    if not tags: +        # Either we're using git < 1.8.3, or there really are no tags. We use +        # a heuristic: assume all version tags have a digit. The old git %%d +        # expansion behaves like git log --decorate=short and strips out the +        # refs/heads/ and refs/tags/ prefixes that would let us distinguish +        # between branches and tags. By ignoring refnames without digits, we +        # filter out many common branch names like "release" and +        # "stabilization", as well as "HEAD" and "master". +        tags = set([r for r in refs if re.search(r'\d', r)]) +        if verbose: +            print("discarding '%%s', no digits" %% ",".join(refs-tags))      if verbose: -        print("remaining refs: %%s" %% ",".join(sorted(refs))) -    for ref in sorted(refs): +        print("likely tags: %%s" %% ",".join(sorted(tags))) +    for ref in sorted(tags):          # sorting will prefer e.g. "2.0" over "2.0rc1"          if ref.startswith(tag_prefix):              r = ref[len(tag_prefix):] @@ -328,7 +334,8 @@ def get_expanded_variables(versionfile_source):      # used from _version.py.      variables = {}      try: -        for line in open(versionfile_source,"r").readlines(): +        f = open(versionfile_source,"r") +        for line in f.readlines():              if line.strip().startswith("git_refnames ="):                  mo = re.search(r'=\s*"(.*)"', line)                  if mo: @@ -337,6 +344,7 @@ def get_expanded_variables(versionfile_source):                  mo = re.search(r'=\s*"(.*)"', line)                  if mo:                      variables["full"] = mo.group(1) +        f.close()      except EnvironmentError:          pass      return variables @@ -348,20 +356,24 @@ def versions_from_expanded_variables(variables, tag_prefix, verbose=False):              print("variables are unexpanded, not using")          return {} # unexpanded, so not in an unpacked git-archive tarball      refs = set([r.strip() for r in refnames.strip("()").split(",")]) -    for ref in list(refs): -        if not re.search(r'\d', ref): -            if verbose: -                print("discarding '%s', no digits" % ref) -            refs.discard(ref) -            # Assume all version tags have a digit. git's %d expansion -            # behaves like git log --decorate=short and strips out the -            # refs/heads/ and refs/tags/ prefixes that would let us -            # distinguish between branches and tags. By ignoring refnames -            # without digits, we filter out many common branch names like -            # "release" and "stabilization", as well as "HEAD" and "master". +    # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of +    # just "foo-1.0". If we see a "tag: " prefix, prefer those. +    TAG = "tag: " +    tags = set([r[len(TAG):] for r in refs if r.startswith(TAG)]) +    if not tags: +        # Either we're using git < 1.8.3, or there really are no tags. We use +        # a heuristic: assume all version tags have a digit. The old git %d +        # expansion behaves like git log --decorate=short and strips out the +        # refs/heads/ and refs/tags/ prefixes that would let us distinguish +        # between branches and tags. By ignoring refnames without digits, we +        # filter out many common branch names like "release" and +        # "stabilization", as well as "HEAD" and "master". +        tags = set([r for r in refs if re.search(r'\d', r)]) +        if verbose: +            print("discarding '%s', no digits" % ",".join(refs-tags))      if verbose: -        print("remaining refs: %s" % ",".join(sorted(refs))) -    for ref in sorted(refs): +        print("likely tags: %s" % ",".join(sorted(tags))) +    for ref in sorted(tags):          # sorting will prefer e.g. "2.0" over "2.0rc1"          if ref.startswith(tag_prefix):              r = ref[len(tag_prefix):] @@ -513,6 +525,7 @@ def versions_from_file(filename):          mo = re.match("version_full = '([^']+)'", line)          if mo:              versions["full"] = mo.group(1) +    f.close()      return versions  def write_to_version_file(filename, versions): | 
