setlocalversion 3.9 KB
Newer Older
1
#!/bin/sh
2 3 4 5 6 7 8 9 10
#
# This scripts adds local version information from the version
# control systems git, mercurial (hg) and subversion (svn).
#
# If something goes wrong, send a mail the kernel build mailinglist
# (see MAINTAINERS) and CC Nico Schottelius
# <nico-linuxsetlocalversion -at- schottelius.org>.
#
#
11

12
usage() {
M
Michal Marek 已提交
13
	echo "Usage: $0 [--save-scmversion] [srctree]" >&2
14
	exit 1
15 16
}

17 18
scm_only=false
srctree=.
M
Michal Marek 已提交
19
if test "$1" = "--save-scmversion"; then
20 21 22 23 24 25 26 27 28 29
	scm_only=true
	shift
fi
if test $# -gt 0; then
	srctree=$1
	shift
fi
if test $# -gt 0 -o ! -d "$srctree"; then
	usage
fi
30

31 32
scm_version()
{
33 34
	local short
	short=false
35

36 37
	cd "$srctree"
	if test -e .scmversion; then
38
		cat .scmversion
39 40 41 42 43
		return
	fi
	if test "$1" = "--short"; then
		short=true
	fi
44

45
	# Check for git and a git repo.
46 47
	if test -z "$(git rev-parse --show-cdup 2>/dev/null)" &&
	   head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68

		# If we are at a tagged commit (like "v2.6.30-rc6"), we ignore
		# it, because this version is defined in the top level Makefile.
		if [ -z "`git describe --exact-match 2>/dev/null`" ]; then

			# If only the short version is requested, don't bother
			# running further git commands
			if $short; then
				echo "+"
				return
			fi
			# If we are past a tagged commit (like
			# "v2.6.30-rc5-302-g72357d5"), we pretty print it.
			if atag="`git describe 2>/dev/null`"; then
				echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'

			# If we don't have a tag at all we print -g{commitish}.
			else
				printf '%s%s' -g $head
			fi
		fi
69

70 71 72
		# Is this git on svn?
		if git config --get svn-remote.svn.url >/dev/null; then
			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 78
			printf '%s' -dirty
		fi
79

80 81
		# All done with git
		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 87 88
		# Do we have an tagged version?  If so, latesttagdistance == 1
		if [ "`hg log -r . --template '{latesttagdistance}'`" == "1" ]; then
			id=`hg log -r . --template '{latesttag}'`
89
			printf '%s%s' -hg "$id"
90 91 92 93 94 95
		else
			tag=`printf '%s' "$hgid" | cut -d' ' -f2`
			if [ -z "$tag" -o "$tag" = tip ]; then
				id=`printf '%s' "$hgid" | sed 's/[+ ].*//'`
				printf '%s%s' -hg "$id"
			fi
96
		fi
97

98 99 100 101 102
		# Are there uncommitted changes?
		# These are represented by + after the changeset id.
		case "$hgid" in
			*+|*+\ *) printf '%s' -dirty ;;
		esac
103

104 105
		# All done with mercurial
		return
106 107
	fi

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 111
		rev=`echo $rev | awk '{print $NF}'`
		printf -- '-svn%s' "$rev"
112

113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
		# All done with svn
		return
	fi
}

collect_files()
{
	local file res

	for file; do
		case "$file" in
		*\~*)
			continue
			;;
		esac
		if test -e "$file"; then
			res="$res$(cat "$file")"
		fi
	done
	echo "$res"
}

if $scm_only; then
M
Michal Marek 已提交
136 137 138 139
	if test ! -e .scmversion; then
		res=$(scm_version)
		echo "$res" >.scmversion
	fi
140
	exit
141
fi
142

143
if test -e include/config/auto.conf; then
144
	. include/config/auto.conf
145 146 147 148
else
	echo "Error: kernelrelease not valid - run 'make prepare' to update it"
	exit 1
fi
149

150 151 152 153 154 155 156 157 158 159 160 161 162 163
# localversion* files in the build and source directory
res="$(collect_files localversion*)"
if test ! "$srctree" -ef .; then
	res="$res$(collect_files "$srctree"/localversion*)"
fi

# CONFIG_LOCALVERSION and LOCALVERSION (if set)
res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"

# scm version string if not at a tagged commit
if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
	# full scm version string
	res="$res$(scm_version)"
else
164 165 166 167
	# append a plus sign if the repository is not in a clean
	# annotated or signed tagged state (as git describe only
	# looks at signed or annotated tags - git tag -a/-s) and
	# LOCALVERSION= is not specified
168 169 170 171
	if test "${LOCALVERSION+set}" != "set"; then
		scm=$(scm_version --short)
		res="$res${scm:++}"
	fi
172
fi
173 174

echo "$res"