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