(tag_prefix, root, verbose, run_command=run_command)
return pieces
Get version from 'git describe' in the root of the source tree.

    This only gets called if the git-archive 'subst' keywords were *not*
    expanded, and _version.py hasn't already been rewritten with a short
    version string, meaning we're inside a checked out source tree.
Get version from 'git describe' in the root of the source tree.
Get version from git describe in the root of the source tree .
def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command):
    """Get version from 'git describe' in the root of the source tree.

    This only gets called if the git-archive 'subst' keywords were *not*
    expanded, and _version.py hasn't already been rewritten with a short
    version string, meaning we're inside a checked out source tree.
    """
    GITS = ["git"]
    if sys.platform == "win32":
        GITS = ["git.cmd", "git.exe"]

    out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root,
                          hide_stderr=True)
    if rc != 0:
        if verbose:
            print("Directory %s not under git control" % root)
        raise NotThisMethod("'git rev-parse --git-dir' returned error")

    # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty]
    # if there isn't one, this yields HEX[-dirty] (no NUM)
    describe_out, rc = run_command(GITS, ["describe", "--tags", "--dirty",
                                          "--always", "--long",
                                          "--match", "%s*" % tag_prefix],
                                   cwd=root)
    # --long was added in git-1.5.5
    if describe_out is None:
        raise NotThisMethod("'git describe' failed")
    describe_out = describe_out.strip()
    full_out, rc = run_command(GITS, ["rev-parse", "HEAD"], cwd=root)
    if full_out is None:
        raise NotThisMethod("'git rev-parse' failed")
    full_out = full_out.strip()

    pieces = {}
    pieces["long"] = full_out
    pieces["short"] = full_out[:7]  # maybe improved later
    pieces["error"] = None

    # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty]
    # TAG might have hyphens.
    git_describe = describe_out

    # look for -dirty suffix
    dirty = git_describe.endswith("-dirty")
    pieces["dirty"] = dirty
    if dirty:
        git_describe = git_describe[:git_describe.rindex("-dirty")]

    # now we have TAG-NUM-gHEX or HEX

    if "-" in git_describe:
        # TAG-NUM-gHEX
        mo = re.search(r'^(.+)-(\d+)-g([0-9a-f]+)$', git_describe)
        if not mo:
            # unparseable. Maybe git-describe is misbehaving?
            pieces["error"] = ("unable to parse git-describe output: '%s'"
                               % describe_out)
            return pieces

        # tag
        full_tag = mo.group(1)
        if not full_tag.startswith(tag_prefix):
            if verbose:
                fmt = "tag '%s' doesn't start with prefix '%s'"
                print(fmt % (full_tag, tag_prefix))
            pieces["error"] = ("tag '%s' doesn't start with prefix '%s'"
                               % (full_tag, tag_prefix))
            return pieces
        pieces["closest-tag"] = full_tag[len(tag_prefix):]

        # distance: number of commits since tag
        pieces["distance"] = int(mo.group(2))

        # commit: short hex revision ID
        pieces["short"] = mo.group(3)

    else:
        # HEX: no tags
        pieces["closest-tag"] = None
        count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"],
                                    cwd=root)
        pieces["distance"] = int(count_out)  # total number of commits

    # commit date: see ISO-8601 comment in git_versions_from_keywords()
    date = run_command(GITS, ["show", "-s", "--format=%ci", "HEAD"],
                       cwd=root)[0].strip()
    pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1)

    return pieces
def git_pieces_from_vcs ( tag_prefix , root , verbose , run_command = run_command ) : GITS = [ "git" ] if sys . platform == "win32" : GITS = [ "git.cmd" , "git.exe" ] out , rc = run_command ( GITS , [ "rev-parse" , "--git-dir" ] , cwd = root , hide_stderr = True ) if rc != 0 : if verbose : print ( "Directory %s not under git control" % root ) raise NotThisMethod ( "'git rev-parse --git-dir' returned error" ) # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] # if there isn't one, this yields HEX[-dirty] (no NUM) describe_out , rc = run_command ( GITS , [ "describe" , "--tags" , "--dirty" , "--always" , "--long" , "--match" , "%s*" % tag_prefix ] , cwd = root ) # --long was added in git-1.5.5 if describe_out is None : raise NotThisMethod ( "'git describe' failed" ) describe_out = describe_out . strip ( ) full_out , rc = run_command ( GITS , [ "rev-parse" , "HEAD" ] , cwd = root ) if full_out is None : raise NotThisMethod ( "'git rev-parse' failed" ) full_out = full_out . strip ( ) pieces = { } pieces [ "long" ] = full_out pieces [ "short" ] = full_out [ : 7 ] # maybe improved later pieces [ "error" ] = None # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] # TAG might have hyphens. git_describe = describe_out # look for -dirty suffix dirty = git_describe . endswith ( "-dirty" ) pieces [ "dirty" ] = dirty if dirty : git_describe = git_describe [ : git_describe . rindex ( "-dirty" ) ] # now we have TAG-NUM-gHEX or HEX if "-" in git_describe : # TAG-NUM-gHEX mo = re . search ( r'^(.+)-(\d+)-g([0-9a-f]+)$' , git_describe ) if not mo : # unparseable. Maybe git-describe is misbehaving? pieces [ "error" ] = ( "unable to parse git-describe output: '%s'" % describe_out ) return pieces # tag full_tag = mo . group ( 1 ) if not full_tag . startswith ( tag_prefix ) : if verbose : fmt = "tag '%s' doesn't start with prefix '%s'" print ( fmt % ( full_tag , tag_prefix ) ) pieces [ "error" ] = ( "tag '%s' doesn't start with prefix '%s'" % ( full_tag , tag_prefix ) ) return pieces pieces [ "closest-tag" ] = full_tag [ len ( tag_prefix ) : ] # distance: number of commits since tag pieces [ "distance" ] = int ( mo . group ( 2 ) ) # commit: short hex revision ID pieces [ "short" ] = mo . group ( 3 ) else : # HEX: no tags pieces [ "closest-tag" ] = None count_out , rc = run_command ( GITS , [ "rev-list" , "HEAD" , "--count" ] , cwd = root ) pieces [ "distance" ] = int ( count_out ) # total number of commits # commit date: see ISO-8601 comment in git_versions_from_keywords() date = run_command ( GITS , [ "show" , "-s" , "--format=%ci" , "HEAD" ] , cwd = root ) [ 0 ] . strip ( ) pieces [ "date" ] = date . strip ( ) . replace ( " " , "T" , 1 ) . replace ( " " , "" , 1 ) return pieces