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