xref: /openbmc/u-boot/scripts/setlocalversion (revision dd88ab32)
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