2008-03-31 21:50:05 +02:00
|
|
|
#!/bin/sh
|
2013-09-04 11:36:31 +02:00
|
|
|
#
|
|
|
|
# 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>.
|
|
|
|
#
|
|
|
|
#
|
2008-03-31 21:50:05 +02:00
|
|
|
|
|
|
|
usage() {
|
|
|
|
echo "Usage: $0 [srctree]" >&2
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
|
|
|
cd "${1:-.}" || usage
|
|
|
|
|
|
|
|
# Check for git and a git repo.
|
2009-02-03 17:24:13 +01:00
|
|
|
if head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
|
2013-09-04 11:36:31 +02:00
|
|
|
|
|
|
|
# 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}.
|
2009-02-03 17:24:13 +01:00
|
|
|
else
|
|
|
|
printf '%s%s' -g $head
|
|
|
|
fi
|
2008-04-01 11:53:14 +02:00
|
|
|
fi
|
|
|
|
|
|
|
|
# Is this git on svn?
|
|
|
|
if git config --get svn-remote.svn.url >/dev/null; then
|
2009-03-26 21:47:38 +01:00
|
|
|
printf -- '-svn%s' "`git svn find-rev $head`"
|
2008-03-31 21:50:05 +02:00
|
|
|
fi
|
|
|
|
|
2013-09-04 11:36:31 +02:00
|
|
|
# Update index only on r/w media
|
|
|
|
[ -w . ] && git update-index --refresh --unmerged > /dev/null
|
|
|
|
|
|
|
|
# Check for uncommitted changes
|
2008-03-31 21:50:05 +02:00
|
|
|
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.
|
support/scripts/setlocalversion: ignore user settings for Mercurial
setlocalversion will use 'hg id' to determine whether or not the current
revision is tagged. If there is no tag, the Mercurial revision is printed,
otherwise nothing is printed.
The problem is that the user may have custom configuration settings (in
their ~/.hgrc file or similar) that changes the output of 'hg id' in a way
that the script does not expect. In such cases, the Mercurial revision may
not be printed or printed incorrectly.
It is good practice to ignore the user environment when calling Mercurial
commands from a well-defined script, by setting the environment variable
HGRCPATH to the empty string. See also 'hg help environment'.
In the particular case of Nokia, a custom extension adds dynamic tags in the
repository, i.e. tags that are stored in a file external to the repository
and only visible when the extension is active. These tags should not
influence the behavior of setlocalversion as they are not official Buildroot
tags, i.e. even if a revision is tagged, the Mercurial revision should still
be printed.
Note that this still does not solve the problem where an organization adds
_real_ tags in their Buildroot repository. For example, there might be a
moving tag 'last-validated' or tags indicating in which product release that
Buildroot revision was used. In these cases, setlocalversion will still not
behave as expected, i.e. show the Mercurial revision.
Signed-off-by: Thomas De Schampheleire <thomas.de_schampheleire@nokia.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
2019-01-30 21:15:08 +01:00
|
|
|
if hgid=`HGRCPATH= hg id --id --tags 2>/dev/null`; then
|
setlocalversion: fix detection of hg revision for untagged versions
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>
2017-04-26 14:43:11 +02:00
|
|
|
tag=`printf '%s' "$hgid" | cut -d' ' -f2 --only-delimited`
|
2008-03-31 21:50:05 +02:00
|
|
|
|
|
|
|
# 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.
|
2012-01-16 13:54:57 +01:00
|
|
|
if rev=`LC_ALL=C svn info 2>/dev/null | grep '^Last Changed Rev'`; then
|
2008-03-31 21:50:05 +02:00
|
|
|
rev=`echo $rev | awk '{print $NF}'`
|
2013-09-04 11:36:31 +02:00
|
|
|
printf -- '-svn%s' "$rev"
|
2008-03-31 21:50:05 +02:00
|
|
|
|
|
|
|
# All done with svn
|
|
|
|
exit
|
|
|
|
fi
|