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