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