xref: /openbmc/openbmc/poky/meta/lib/oe/buildcfg.py (revision 03514f19)
178b72798SAndrew Geissler
2ac13d5f3SPatrick Williamsimport os
378b72798SAndrew Geisslerimport subprocess
478b72798SAndrew Geisslerimport bb.process
578b72798SAndrew Geissler
678b72798SAndrew Geisslerdef detect_revision(d):
778b72798SAndrew Geissler    path = get_scmbasepath(d)
8ac13d5f3SPatrick Williams    return get_metadata_git_revision(path)
978b72798SAndrew Geissler
1078b72798SAndrew Geisslerdef detect_branch(d):
1178b72798SAndrew Geissler    path = get_scmbasepath(d)
12ac13d5f3SPatrick Williams    return get_metadata_git_branch(path)
1378b72798SAndrew Geissler
1478b72798SAndrew Geisslerdef get_scmbasepath(d):
1578b72798SAndrew Geissler    return os.path.join(d.getVar('COREBASE'), 'meta')
1678b72798SAndrew Geissler
17ac13d5f3SPatrick Williamsdef get_metadata_git_branch(path):
1878b72798SAndrew Geissler    try:
1978b72798SAndrew Geissler        rev, _ = bb.process.run('git rev-parse --abbrev-ref HEAD', cwd=path)
2078b72798SAndrew Geissler    except bb.process.ExecutionError:
2178b72798SAndrew Geissler        rev = '<unknown>'
2278b72798SAndrew Geissler    return rev.strip()
2378b72798SAndrew Geissler
24ac13d5f3SPatrick Williamsdef get_metadata_git_revision(path):
2578b72798SAndrew Geissler    try:
2678b72798SAndrew Geissler        rev, _ = bb.process.run('git rev-parse HEAD', cwd=path)
2778b72798SAndrew Geissler    except bb.process.ExecutionError:
2878b72798SAndrew Geissler        rev = '<unknown>'
2978b72798SAndrew Geissler    return rev.strip()
3078b72798SAndrew Geissler
31*03514f19SPatrick Williamsdef get_metadata_git_toplevel(path):
32*03514f19SPatrick Williams    try:
33*03514f19SPatrick Williams        toplevel, _ = bb.process.run('git rev-parse --show-toplevel', cwd=path)
34*03514f19SPatrick Williams    except bb.process.ExecutionError:
35*03514f19SPatrick Williams        return ""
36*03514f19SPatrick Williams    return toplevel.strip()
37*03514f19SPatrick Williams
38*03514f19SPatrick Williamsdef get_metadata_git_remotes(path):
39*03514f19SPatrick Williams    try:
40*03514f19SPatrick Williams        remotes_list, _ = bb.process.run('git remote', cwd=path)
41*03514f19SPatrick Williams        remotes = remotes_list.split()
42*03514f19SPatrick Williams    except bb.process.ExecutionError:
43*03514f19SPatrick Williams        remotes = []
44*03514f19SPatrick Williams    return remotes
45*03514f19SPatrick Williams
46*03514f19SPatrick Williamsdef get_metadata_git_remote_url(path, remote):
47*03514f19SPatrick Williams    try:
48*03514f19SPatrick Williams        uri, _ = bb.process.run('git remote get-url {remote}'.format(remote=remote), cwd=path)
49*03514f19SPatrick Williams    except bb.process.ExecutionError:
50*03514f19SPatrick Williams        return ""
51*03514f19SPatrick Williams    return uri.strip()
52*03514f19SPatrick Williams
53*03514f19SPatrick Williamsdef get_metadata_git_describe(path):
54*03514f19SPatrick Williams    try:
55*03514f19SPatrick Williams        describe, _ = bb.process.run('git describe --tags', cwd=path)
56*03514f19SPatrick Williams    except bb.process.ExecutionError:
57*03514f19SPatrick Williams        return ""
58*03514f19SPatrick Williams    return describe.strip()
59*03514f19SPatrick Williams
6078b72798SAndrew Geisslerdef is_layer_modified(path):
6178b72798SAndrew Geissler    try:
6278b72798SAndrew Geissler        subprocess.check_output("""cd %s; export PSEUDO_UNLOAD=1; set -e;
6378b72798SAndrew Geissler                                git diff --quiet --no-ext-diff
6478b72798SAndrew Geissler                                git diff --quiet --no-ext-diff --cached""" % path,
6578b72798SAndrew Geissler                                shell=True,
6678b72798SAndrew Geissler                                stderr=subprocess.STDOUT)
6778b72798SAndrew Geissler        return ""
6878b72798SAndrew Geissler    except subprocess.CalledProcessError as ex:
6978b72798SAndrew Geissler        # Silently treat errors as "modified", without checking for the
7078b72798SAndrew Geissler        # (expected) return code 1 in a modified git repo. For example, we get
7178b72798SAndrew Geissler        # output and a 129 return code when a layer isn't a git repo at all.
7278b72798SAndrew Geissler        return " -- modified"
7378b72798SAndrew Geissler
7478b72798SAndrew Geisslerdef get_layer_revisions(d):
7578b72798SAndrew Geissler    layers = (d.getVar("BBLAYERS") or "").split()
7678b72798SAndrew Geissler    revisions = []
7778b72798SAndrew Geissler    for i in layers:
78ac13d5f3SPatrick Williams        revisions.append((i, os.path.basename(i), get_metadata_git_branch(i).strip(), get_metadata_git_revision(i), is_layer_modified(i)))
7978b72798SAndrew Geissler    return revisions
80