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 62dd88ab32SMasahiro Yamada echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(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 75dd88ab32SMasahiro Yamada # Check for uncommitted changes 76a6f47d24SMasahiro Yamada if git diff-index --name-only HEAD | grep -qv "^scripts/package"; then 77dd88ab32SMasahiro Yamada printf '%s' -dirty 78dd88ab32SMasahiro Yamada fi 79dd88ab32SMasahiro Yamada 80dd88ab32SMasahiro Yamada # All done with git 81dd88ab32SMasahiro Yamada return 82dd88ab32SMasahiro Yamada fi 83dd88ab32SMasahiro Yamada 84dd88ab32SMasahiro Yamada # Check for mercurial and a mercurial repo. 85dd88ab32SMasahiro Yamada if test -d .hg && hgid=`hg id 2>/dev/null`; then 86dd88ab32SMasahiro Yamada # Do we have an tagged version? If so, latesttagdistance == 1 87dd88ab32SMasahiro Yamada if [ "`hg log -r . --template '{latesttagdistance}'`" == "1" ]; then 88dd88ab32SMasahiro Yamada id=`hg log -r . --template '{latesttag}'` 89dd88ab32SMasahiro Yamada printf '%s%s' -hg "$id" 90dd88ab32SMasahiro Yamada else 91dd88ab32SMasahiro Yamada tag=`printf '%s' "$hgid" | cut -d' ' -f2` 92dd88ab32SMasahiro Yamada if [ -z "$tag" -o "$tag" = tip ]; then 93dd88ab32SMasahiro Yamada id=`printf '%s' "$hgid" | sed 's/[+ ].*//'` 94dd88ab32SMasahiro Yamada printf '%s%s' -hg "$id" 95dd88ab32SMasahiro Yamada fi 96dd88ab32SMasahiro Yamada fi 97dd88ab32SMasahiro Yamada 98dd88ab32SMasahiro Yamada # Are there uncommitted changes? 99dd88ab32SMasahiro Yamada # These are represented by + after the changeset id. 100dd88ab32SMasahiro Yamada case "$hgid" in 101dd88ab32SMasahiro Yamada *+|*+\ *) printf '%s' -dirty ;; 102dd88ab32SMasahiro Yamada esac 103dd88ab32SMasahiro Yamada 104dd88ab32SMasahiro Yamada # All done with mercurial 105dd88ab32SMasahiro Yamada return 106dd88ab32SMasahiro Yamada fi 107dd88ab32SMasahiro Yamada 108dd88ab32SMasahiro Yamada # Check for svn and a svn repo. 109a6f47d24SMasahiro Yamada if rev=`LANG= LC_ALL= LC_MESSAGES=C svn info 2>/dev/null | grep '^Last Changed Rev'`; then 110dd88ab32SMasahiro Yamada rev=`echo $rev | awk '{print $NF}'` 111dd88ab32SMasahiro Yamada printf -- '-svn%s' "$rev" 112dd88ab32SMasahiro Yamada 113dd88ab32SMasahiro Yamada # All done with svn 114dd88ab32SMasahiro Yamada return 115dd88ab32SMasahiro Yamada fi 116dd88ab32SMasahiro Yamada} 117dd88ab32SMasahiro Yamada 118dd88ab32SMasahiro Yamadacollect_files() 119dd88ab32SMasahiro Yamada{ 120dd88ab32SMasahiro Yamada local file res 121dd88ab32SMasahiro Yamada 122dd88ab32SMasahiro Yamada for file; do 123dd88ab32SMasahiro Yamada case "$file" in 124dd88ab32SMasahiro Yamada *\~*) 125dd88ab32SMasahiro Yamada continue 126dd88ab32SMasahiro Yamada ;; 127dd88ab32SMasahiro Yamada esac 128dd88ab32SMasahiro Yamada if test -e "$file"; then 129dd88ab32SMasahiro Yamada res="$res$(cat "$file")" 130dd88ab32SMasahiro Yamada fi 131dd88ab32SMasahiro Yamada done 132dd88ab32SMasahiro Yamada echo "$res" 133dd88ab32SMasahiro Yamada} 134dd88ab32SMasahiro Yamada 135dd88ab32SMasahiro Yamadaif $scm_only; then 136dd88ab32SMasahiro Yamada if test ! -e .scmversion; then 137dd88ab32SMasahiro Yamada res=$(scm_version) 138dd88ab32SMasahiro Yamada echo "$res" >.scmversion 139dd88ab32SMasahiro Yamada fi 140dd88ab32SMasahiro Yamada exit 141dd88ab32SMasahiro Yamadafi 142dd88ab32SMasahiro Yamada 143a6f47d24SMasahiro Yamadaif test -e include/config/auto.conf; then 144*81630a3bSPhilipp Tomsich # We are interested only in CONFIG_LOCALVERSION and 145*81630a3bSPhilipp Tomsich # CONFIG_LOCALVERSION_AUTO, so extract these in a safe 146*81630a3bSPhilipp Tomsich # way (i.e. w/o sourcing auto.conf) 147*81630a3bSPhilipp Tomsich CONFIG_LOCALVERSION=`cat include/config/auto.conf | awk -F '=' '/^CONFIG_LOCALVERSION=/ {print $2}'` 148*81630a3bSPhilipp Tomsich CONFIG_LOCALVERSION_AUTO=`cat include/config/auto.conf | awk -F '=' '/^CONFIG_LOCALVERSION_AUTO=/ {print $2}'` 149a6f47d24SMasahiro Yamadaelse 150a6f47d24SMasahiro Yamada echo "Error: kernelrelease not valid - run 'make prepare' to update it" 151a6f47d24SMasahiro Yamada exit 1 152a6f47d24SMasahiro Yamadafi 153dd88ab32SMasahiro Yamada 154dd88ab32SMasahiro Yamada# localversion* files in the build and source directory 155dd88ab32SMasahiro Yamadares="$(collect_files localversion*)" 156dd88ab32SMasahiro Yamadaif test ! "$srctree" -ef .; then 157dd88ab32SMasahiro Yamada res="$res$(collect_files "$srctree"/localversion*)" 158dd88ab32SMasahiro Yamadafi 159dd88ab32SMasahiro Yamada 160dd88ab32SMasahiro Yamada# CONFIG_LOCALVERSION and LOCALVERSION (if set) 161dd88ab32SMasahiro Yamadares="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}" 162dd88ab32SMasahiro Yamada 163dd88ab32SMasahiro Yamada# scm version string if not at a tagged commit 164dd88ab32SMasahiro Yamadaif test "$CONFIG_LOCALVERSION_AUTO" = "y"; then 165dd88ab32SMasahiro Yamada # full scm version string 166dd88ab32SMasahiro Yamada res="$res$(scm_version)" 167dd88ab32SMasahiro Yamadaelse 168dd88ab32SMasahiro Yamada # append a plus sign if the repository is not in a clean 169dd88ab32SMasahiro Yamada # annotated or signed tagged state (as git describe only 170dd88ab32SMasahiro Yamada # looks at signed or annotated tags - git tag -a/-s) and 171dd88ab32SMasahiro Yamada # LOCALVERSION= is not specified 172dd88ab32SMasahiro Yamada if test "${LOCALVERSION+set}" != "set"; then 173dd88ab32SMasahiro Yamada scm=$(scm_version --short) 174dd88ab32SMasahiro Yamada res="$res${scm:++}" 175dd88ab32SMasahiro Yamada fi 176dd88ab32SMasahiro Yamadafi 177dd88ab32SMasahiro Yamada 178dd88ab32SMasahiro Yamadaecho "$res" 179