1*dd88ab32SMasahiro Yamada#!/bin/sh 2*dd88ab32SMasahiro Yamada# 3*dd88ab32SMasahiro Yamada# This scripts adds local version information from the version 4*dd88ab32SMasahiro Yamada# control systems git, mercurial (hg) and subversion (svn). 5*dd88ab32SMasahiro Yamada# 6*dd88ab32SMasahiro Yamada# It was originally copied from the Linux kernel v3.2.0-rc4 and modified 7*dd88ab32SMasahiro Yamada# to support the U-Boot build-system. 8*dd88ab32SMasahiro Yamada# 9*dd88ab32SMasahiro Yamada 10*dd88ab32SMasahiro Yamadausage() { 11*dd88ab32SMasahiro Yamada echo "Usage: $0 [--save-scmversion] [srctree]" >&2 12*dd88ab32SMasahiro Yamada exit 1 13*dd88ab32SMasahiro Yamada} 14*dd88ab32SMasahiro Yamada 15*dd88ab32SMasahiro Yamadascm_only=false 16*dd88ab32SMasahiro Yamadasrctree=. 17*dd88ab32SMasahiro Yamadaif test "$1" = "--save-scmversion"; then 18*dd88ab32SMasahiro Yamada scm_only=true 19*dd88ab32SMasahiro Yamada shift 20*dd88ab32SMasahiro Yamadafi 21*dd88ab32SMasahiro Yamadaif test $# -gt 0; then 22*dd88ab32SMasahiro Yamada srctree=$1 23*dd88ab32SMasahiro Yamada shift 24*dd88ab32SMasahiro Yamadafi 25*dd88ab32SMasahiro Yamadaif test $# -gt 0 -o ! -d "$srctree"; then 26*dd88ab32SMasahiro Yamada usage 27*dd88ab32SMasahiro Yamadafi 28*dd88ab32SMasahiro Yamada 29*dd88ab32SMasahiro Yamadascm_version() 30*dd88ab32SMasahiro Yamada{ 31*dd88ab32SMasahiro Yamada local short 32*dd88ab32SMasahiro Yamada short=false 33*dd88ab32SMasahiro Yamada 34*dd88ab32SMasahiro Yamada cd "$srctree" 35*dd88ab32SMasahiro Yamada if test -e .scmversion; then 36*dd88ab32SMasahiro Yamada cat .scmversion 37*dd88ab32SMasahiro Yamada return 38*dd88ab32SMasahiro Yamada fi 39*dd88ab32SMasahiro Yamada if test "$1" = "--short"; then 40*dd88ab32SMasahiro Yamada short=true 41*dd88ab32SMasahiro Yamada fi 42*dd88ab32SMasahiro Yamada 43*dd88ab32SMasahiro Yamada # Check for git and a git repo. 44*dd88ab32SMasahiro Yamada if test -e .git && head=`git rev-parse --verify --short HEAD 2>/dev/null`; then 45*dd88ab32SMasahiro Yamada 46*dd88ab32SMasahiro Yamada # If we are at a tagged commit (like "v2.6.30-rc6"), we ignore 47*dd88ab32SMasahiro Yamada # it, because this version is defined in the top level Makefile. 48*dd88ab32SMasahiro Yamada if [ -z "`git describe --exact-match 2>/dev/null`" ]; then 49*dd88ab32SMasahiro Yamada 50*dd88ab32SMasahiro Yamada # If only the short version is requested, don't bother 51*dd88ab32SMasahiro Yamada # running further git commands 52*dd88ab32SMasahiro Yamada if $short; then 53*dd88ab32SMasahiro Yamada echo "+" 54*dd88ab32SMasahiro Yamada return 55*dd88ab32SMasahiro Yamada fi 56*dd88ab32SMasahiro Yamada # If we are past a tagged commit (like 57*dd88ab32SMasahiro Yamada # "v2.6.30-rc5-302-g72357d5"), we pretty print it. 58*dd88ab32SMasahiro Yamada if atag="`git describe 2>/dev/null`"; then 59*dd88ab32SMasahiro Yamada echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}' 60*dd88ab32SMasahiro Yamada 61*dd88ab32SMasahiro Yamada # If we don't have a tag at all we print -g{commitish}. 62*dd88ab32SMasahiro Yamada else 63*dd88ab32SMasahiro Yamada printf '%s%s' -g $head 64*dd88ab32SMasahiro Yamada fi 65*dd88ab32SMasahiro Yamada fi 66*dd88ab32SMasahiro Yamada 67*dd88ab32SMasahiro Yamada # Is this git on svn? 68*dd88ab32SMasahiro Yamada if git config --get svn-remote.svn.url >/dev/null; then 69*dd88ab32SMasahiro Yamada printf -- '-svn%s' "`git svn find-rev $head`" 70*dd88ab32SMasahiro Yamada fi 71*dd88ab32SMasahiro Yamada 72*dd88ab32SMasahiro Yamada # Update index only on r/w media 73*dd88ab32SMasahiro Yamada [ -w . ] && git update-index --refresh --unmerged > /dev/null 74*dd88ab32SMasahiro Yamada 75*dd88ab32SMasahiro Yamada # Check for uncommitted changes 76*dd88ab32SMasahiro Yamada if git diff-index --name-only HEAD | grep -v "^scripts/package" \ 77*dd88ab32SMasahiro Yamada | read dummy; then 78*dd88ab32SMasahiro Yamada printf '%s' -dirty 79*dd88ab32SMasahiro Yamada fi 80*dd88ab32SMasahiro Yamada 81*dd88ab32SMasahiro Yamada # All done with git 82*dd88ab32SMasahiro Yamada return 83*dd88ab32SMasahiro Yamada fi 84*dd88ab32SMasahiro Yamada 85*dd88ab32SMasahiro Yamada # Check for mercurial and a mercurial repo. 86*dd88ab32SMasahiro Yamada if test -d .hg && hgid=`hg id 2>/dev/null`; then 87*dd88ab32SMasahiro Yamada # Do we have an tagged version? If so, latesttagdistance == 1 88*dd88ab32SMasahiro Yamada if [ "`hg log -r . --template '{latesttagdistance}'`" == "1" ]; then 89*dd88ab32SMasahiro Yamada id=`hg log -r . --template '{latesttag}'` 90*dd88ab32SMasahiro Yamada printf '%s%s' -hg "$id" 91*dd88ab32SMasahiro Yamada else 92*dd88ab32SMasahiro Yamada tag=`printf '%s' "$hgid" | cut -d' ' -f2` 93*dd88ab32SMasahiro Yamada if [ -z "$tag" -o "$tag" = tip ]; then 94*dd88ab32SMasahiro Yamada id=`printf '%s' "$hgid" | sed 's/[+ ].*//'` 95*dd88ab32SMasahiro Yamada printf '%s%s' -hg "$id" 96*dd88ab32SMasahiro Yamada fi 97*dd88ab32SMasahiro Yamada fi 98*dd88ab32SMasahiro Yamada 99*dd88ab32SMasahiro Yamada # Are there uncommitted changes? 100*dd88ab32SMasahiro Yamada # These are represented by + after the changeset id. 101*dd88ab32SMasahiro Yamada case "$hgid" in 102*dd88ab32SMasahiro Yamada *+|*+\ *) printf '%s' -dirty ;; 103*dd88ab32SMasahiro Yamada esac 104*dd88ab32SMasahiro Yamada 105*dd88ab32SMasahiro Yamada # All done with mercurial 106*dd88ab32SMasahiro Yamada return 107*dd88ab32SMasahiro Yamada fi 108*dd88ab32SMasahiro Yamada 109*dd88ab32SMasahiro Yamada # Check for svn and a svn repo. 110*dd88ab32SMasahiro Yamada if rev=`svn info 2>/dev/null | grep '^Last Changed Rev'`; then 111*dd88ab32SMasahiro Yamada rev=`echo $rev | awk '{print $NF}'` 112*dd88ab32SMasahiro Yamada printf -- '-svn%s' "$rev" 113*dd88ab32SMasahiro Yamada 114*dd88ab32SMasahiro Yamada # All done with svn 115*dd88ab32SMasahiro Yamada return 116*dd88ab32SMasahiro Yamada fi 117*dd88ab32SMasahiro Yamada} 118*dd88ab32SMasahiro Yamada 119*dd88ab32SMasahiro Yamadacollect_files() 120*dd88ab32SMasahiro Yamada{ 121*dd88ab32SMasahiro Yamada local file res 122*dd88ab32SMasahiro Yamada 123*dd88ab32SMasahiro Yamada for file; do 124*dd88ab32SMasahiro Yamada case "$file" in 125*dd88ab32SMasahiro Yamada *\~*) 126*dd88ab32SMasahiro Yamada continue 127*dd88ab32SMasahiro Yamada ;; 128*dd88ab32SMasahiro Yamada esac 129*dd88ab32SMasahiro Yamada if test -e "$file"; then 130*dd88ab32SMasahiro Yamada res="$res$(cat "$file")" 131*dd88ab32SMasahiro Yamada fi 132*dd88ab32SMasahiro Yamada done 133*dd88ab32SMasahiro Yamada echo "$res" 134*dd88ab32SMasahiro Yamada} 135*dd88ab32SMasahiro Yamada 136*dd88ab32SMasahiro Yamadaif $scm_only; then 137*dd88ab32SMasahiro Yamada if test ! -e .scmversion; then 138*dd88ab32SMasahiro Yamada res=$(scm_version) 139*dd88ab32SMasahiro Yamada echo "$res" >.scmversion 140*dd88ab32SMasahiro Yamada fi 141*dd88ab32SMasahiro Yamada exit 142*dd88ab32SMasahiro Yamadafi 143*dd88ab32SMasahiro Yamada 144*dd88ab32SMasahiro Yamada#if test -e include/config/auto.conf; then 145*dd88ab32SMasahiro Yamada# . include/config/auto.conf 146*dd88ab32SMasahiro Yamada#else 147*dd88ab32SMasahiro Yamada# echo "Error: kernelrelease not valid - run 'make prepare' to update it" 148*dd88ab32SMasahiro Yamada# exit 1 149*dd88ab32SMasahiro Yamada#fi 150*dd88ab32SMasahiro YamadaCONFIG_LOCALVERSION= 151*dd88ab32SMasahiro YamadaCONFIG_LOCALVERSION_AUTO=y 152*dd88ab32SMasahiro Yamada 153*dd88ab32SMasahiro Yamada# localversion* files in the build and source directory 154*dd88ab32SMasahiro Yamadares="$(collect_files localversion*)" 155*dd88ab32SMasahiro Yamadaif test ! "$srctree" -ef .; then 156*dd88ab32SMasahiro Yamada res="$res$(collect_files "$srctree"/localversion*)" 157*dd88ab32SMasahiro Yamadafi 158*dd88ab32SMasahiro Yamada 159*dd88ab32SMasahiro Yamada# CONFIG_LOCALVERSION and LOCALVERSION (if set) 160*dd88ab32SMasahiro Yamadares="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}" 161*dd88ab32SMasahiro Yamada 162*dd88ab32SMasahiro Yamada# scm version string if not at a tagged commit 163*dd88ab32SMasahiro Yamadaif test "$CONFIG_LOCALVERSION_AUTO" = "y"; then 164*dd88ab32SMasahiro Yamada # full scm version string 165*dd88ab32SMasahiro Yamada res="$res$(scm_version)" 166*dd88ab32SMasahiro Yamadaelse 167*dd88ab32SMasahiro Yamada # append a plus sign if the repository is not in a clean 168*dd88ab32SMasahiro Yamada # annotated or signed tagged state (as git describe only 169*dd88ab32SMasahiro Yamada # looks at signed or annotated tags - git tag -a/-s) and 170*dd88ab32SMasahiro Yamada # LOCALVERSION= is not specified 171*dd88ab32SMasahiro Yamada if test "${LOCALVERSION+set}" != "set"; then 172*dd88ab32SMasahiro Yamada scm=$(scm_version --short) 173*dd88ab32SMasahiro Yamada res="$res${scm:++}" 174*dd88ab32SMasahiro Yamada fi 175*dd88ab32SMasahiro Yamadafi 176*dd88ab32SMasahiro Yamada 177*dd88ab32SMasahiro Yamadaecho "$res" 178