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