xref: /OK3568_Linux_fs/yocto/meta-openembedded/meta-oe/classes/gitver.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# Copyright (C) 2009 Chris Larson <clarson@kergoth.com>
2*4882a593Smuzhiyun# Released under the MIT license (see COPYING.MIT for the terms)
3*4882a593Smuzhiyun#
4*4882a593Smuzhiyun# gitver.bbclass provides a GITVER variable which is a (fairly) sane version,
5*4882a593Smuzhiyun# for use in ${PV}, extracted from the ${S} git checkout, assuming it is one.
6*4882a593Smuzhiyun# This is most useful in concert with srctree.bbclass.
7*4882a593Smuzhiyun
8*4882a593Smuzhiyundef git_drop_tag_prefix(version):
9*4882a593Smuzhiyun    import re
10*4882a593Smuzhiyun    if re.match("v\d", version):
11*4882a593Smuzhiyun        return version[1:]
12*4882a593Smuzhiyun    else:
13*4882a593Smuzhiyun        return version
14*4882a593Smuzhiyun
15*4882a593SmuzhiyunGIT_TAGADJUST = "git_drop_tag_prefix(version)"
16*4882a593SmuzhiyunGITVER = "${@get_git_pv(d, tagadjust=lambda version:${GIT_TAGADJUST})}"
17*4882a593SmuzhiyunGITSHA = "${@get_git_hash(d)}"
18*4882a593Smuzhiyun
19*4882a593Smuzhiyundef gitrev_run(cmd, path):
20*4882a593Smuzhiyun    (output, error) = bb.process.run(cmd, cwd=path)
21*4882a593Smuzhiyun    return output.rstrip()
22*4882a593Smuzhiyun
23*4882a593Smuzhiyundef get_git_pv(d, tagadjust=None):
24*4882a593Smuzhiyun    import os
25*4882a593Smuzhiyun
26*4882a593Smuzhiyun    srcdir = d.getVar("EXTERNALSRC") or d.getVar("S")
27*4882a593Smuzhiyun    gitdir = os.path.abspath(os.path.join(srcdir, ".git"))
28*4882a593Smuzhiyun    try:
29*4882a593Smuzhiyun        ver = gitrev_run("git describe --tags", gitdir)
30*4882a593Smuzhiyun    except:
31*4882a593Smuzhiyun        try:
32*4882a593Smuzhiyun            ver = gitrev_run("git rev-parse --short HEAD", gitdir)
33*4882a593Smuzhiyun            if ver:
34*4882a593Smuzhiyun                return "0.0+%s" % ver
35*4882a593Smuzhiyun            else:
36*4882a593Smuzhiyun                return "0.0"
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun        except Exception as exc:
39*4882a593Smuzhiyun            raise bb.parse.SkipRecipe(str(exc))
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun    if ver and tagadjust:
42*4882a593Smuzhiyun        ver = tagadjust(ver)
43*4882a593Smuzhiyun    return ver
44*4882a593Smuzhiyun
45*4882a593Smuzhiyundef get_git_hash(d):
46*4882a593Smuzhiyun    import os
47*4882a593Smuzhiyun
48*4882a593Smuzhiyun    srcdir = d.getVar("EXTERNALSRC") or d.getVar("S")
49*4882a593Smuzhiyun    gitdir = os.path.abspath(os.path.join(srcdir, ".git"))
50*4882a593Smuzhiyun    try:
51*4882a593Smuzhiyun        rev = gitrev_run("git rev-list HEAD -1", gitdir)
52*4882a593Smuzhiyun        return rev[:7]
53*4882a593Smuzhiyun    except Exception as exc:
54*4882a593Smuzhiyun        bb.fatal(str(exc))
55*4882a593Smuzhiyun
56*4882a593Smuzhiyundef mark_recipe_dependencies(path, d):
57*4882a593Smuzhiyun    from bb.parse import mark_dependency
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun    gitdir = os.path.join(path, ".git")
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun    # Force the recipe to be reparsed so the version gets bumped
62*4882a593Smuzhiyun    # if the active branch is switched, or if the branch changes.
63*4882a593Smuzhiyun    mark_dependency(d, os.path.join(gitdir, "HEAD"))
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun    # Force a reparse if anything in the index changes.
66*4882a593Smuzhiyun    mark_dependency(d, os.path.join(gitdir, "index"))
67*4882a593Smuzhiyun
68*4882a593Smuzhiyun    try:
69*4882a593Smuzhiyun        ref = gitrev_run("git symbolic-ref -q HEAD", gitdir)
70*4882a593Smuzhiyun    except bb.process.CmdError:
71*4882a593Smuzhiyun        pass
72*4882a593Smuzhiyun    else:
73*4882a593Smuzhiyun        if ref:
74*4882a593Smuzhiyun            mark_dependency(d, os.path.join(gitdir, ref))
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun    # Catch new tags.
77*4882a593Smuzhiyun    tagdir = os.path.join(gitdir, "refs", "tags")
78*4882a593Smuzhiyun    if os.path.exists(tagdir):
79*4882a593Smuzhiyun        mark_dependency(d, tagdir)
80*4882a593Smuzhiyun
81*4882a593Smuzhiyunpython () {
82*4882a593Smuzhiyun    srcdir = d.getVar("EXTERNALSRC") or d.getVar("S")
83*4882a593Smuzhiyun    mark_recipe_dependencies(srcdir, d)
84*4882a593Smuzhiyun}
85