ec019bcf64
By default, cut prints the entire line if the specified delimiter is not present at all: $ printf "foo bar" | cut -d' ' -f2 bar $ printf "foobar" | cut -d' ' -f2 foobar In setlocalversion, cut is presented with the output of 'hg id' which has the format: "<revision> <tags-if-any>" If the current revision is not tagged, the output of 'hg id' does not contain the delimiter (space), cut prints the entire string, and setlocalversion thinks the version is the tag. As setlocalversion does not print anything for tagged versions, there is no output overall, and no correct indication of the mercurial revision. Fix by passing the extra cut option '--only-delimited', which suppresses output if no delimiter is found. This problem likely went unnoticed for so long, because the tag 'tip' (i.e. most recent revision of the branch) is treated specially: in this case the mercurial revision _is_ printed, i.e. the situation is treated as 'untagged'. The problem is only seen when you are _not_ at the most recent revision in your branch. Signed-off-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
83 lines
2.0 KiB
Bash
Executable File
83 lines
2.0 KiB
Bash
Executable File
#!/bin/sh
|
|
#
|
|
# 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>.
|
|
#
|
|
#
|
|
|
|
usage() {
|
|
echo "Usage: $0 [srctree]" >&2
|
|
exit 1
|
|
}
|
|
|
|
cd "${1:-.}" || usage
|
|
|
|
# Check for git and a git repo.
|
|
if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
|
|
|
|
# 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 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
|
|
|
|
# Is this git on svn?
|
|
if git config --get svn-remote.svn.url >/dev/null; then
|
|
printf -- '-svn%s' "`git svn find-rev $head`"
|
|
fi
|
|
|
|
# Update index only on r/w media
|
|
[ -w . ] && git update-index --refresh --unmerged > /dev/null
|
|
|
|
# Check for uncommitted changes
|
|
if git diff-index --name-only HEAD | grep -v "^scripts/package" \
|
|
| read dummy; then
|
|
printf '%s' -dirty
|
|
fi
|
|
|
|
# All done with git
|
|
exit
|
|
fi
|
|
|
|
# Check for mercurial and a mercurial repo.
|
|
if hgid=`hg id 2>/dev/null`; then
|
|
tag=`printf '%s' "$hgid" | cut -d' ' -f2 --only-delimited`
|
|
|
|
# Do we have an untagged version?
|
|
if [ -z "$tag" -o "$tag" = tip ]; then
|
|
id=`printf '%s' "$hgid" | sed 's/[+ ].*//'`
|
|
printf '%s%s' -hg "$id"
|
|
fi
|
|
|
|
# Are there uncommitted changes?
|
|
# These are represented by + after the changeset id.
|
|
case "$hgid" in
|
|
*+|*+\ *) printf '%s' -dirty ;;
|
|
esac
|
|
|
|
# All done with mercurial
|
|
exit
|
|
fi
|
|
|
|
# Check for svn and a svn repo.
|
|
if rev=`LC_ALL=C svn info 2>/dev/null | grep '^Last Changed Rev'`; then
|
|
rev=`echo $rev | awk '{print $NF}'`
|
|
printf -- '-svn%s' "$rev"
|
|
|
|
# All done with svn
|
|
exit
|
|
fi
|