mirror of
https://github.com/team-infusion-developers/android_kernel_samsung_msm8976.git
synced 2024-10-31 18:09:19 +00:00
f1cb0a9f6f
The localversion detection script assumes that if there's a tag describing the commit the toplevel Makefile would indicate what that version is. This is usually true because Linus tags a commit and updates the Makefile at the same time to make a release. Unfortunately this means that any other tags made on the kernel are ignored and not used in the localversion output. For example, consider Linus tagged v3.0-rc5 and I have worked on a bunch of commits based off that tag and then tagged my branch with another tag called "changes-for-linus". Ideally I would like to see the kernel is based off v3.0-rc5 at the tag changes-for-linus. When localversion detects the version it assumes that the kernel is v3.0-rc5 because a tag is on the current commit but it doesn't confirm that the tag matches the Makefile. It then proceeds to throw away everything after the patch level and git commit hash from git describe output so we lost the tag changes-for-linus and are left with: v3.0-rc5-0003-g234ad Instead of doing that always try to describe the tree regardless of whether or not there is an exact match (unless we are doing --short output and just want to put a + after the version). Include the hash of the tag so that we get a bit more information about the tree that was built, but be sure to throw away any tags from Linus himself that start with v3.* so that we get output like: v3.0-rc5-g1561da-linus-0003-g234ad Change-Id: I9c4d03c61650658676f221680c61899305c6217a Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
191 lines
4.5 KiB
Bash
Executable file
191 lines
4.5 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 [--save-scmversion] [srctree]" >&2
|
|
exit 1
|
|
}
|
|
|
|
scm_only=false
|
|
srctree=.
|
|
if test "$1" = "--save-scmversion"; then
|
|
scm_only=true
|
|
shift
|
|
fi
|
|
if test $# -gt 0; then
|
|
srctree=$1
|
|
shift
|
|
fi
|
|
if test $# -gt 0 -o ! -d "$srctree"; then
|
|
usage
|
|
fi
|
|
|
|
scm_version()
|
|
{
|
|
local short
|
|
short=false
|
|
|
|
cd "$srctree"
|
|
if test -e .scmversion; then
|
|
cat .scmversion
|
|
return
|
|
fi
|
|
if test "$1" = "--short"; then
|
|
short=true
|
|
fi
|
|
|
|
# Check for git and a git repo.
|
|
if test -d .git && 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 atag="`git describe --exact-match --abbrev=0 2>/dev/null`"; then
|
|
# Make sure we're at the tag that matches the Makefile.
|
|
# If not place the hash of the tag as well for
|
|
# v2.6.30-rc5-g314aef
|
|
if [ "x$atag" != "x$VERSION" ]; then
|
|
# If only the short version is requested,
|
|
# don't bother running further git commands
|
|
if $short; then
|
|
echo "+"
|
|
return
|
|
fi
|
|
printf '%s%s' -g "`git show-ref -s --abbrev --tags $atag 2>/dev/null`"
|
|
fi
|
|
else
|
|
|
|
# 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 and
|
|
# include the hash of any new tag on top.
|
|
if atag="`git describe 2>/dev/null`"; then
|
|
tag="`git describe --abbrev=0 2>/dev/null`"
|
|
commit="`echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'`"
|
|
printf '%s%s%s' -g "`git show-ref -s --abbrev --tags $tag 2>/dev/null`" $commit
|
|
# 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 -qv "^scripts/package"; then
|
|
printf '%s' -dirty
|
|
fi
|
|
|
|
# All done with git
|
|
return
|
|
fi
|
|
|
|
# Check for mercurial and a mercurial repo.
|
|
if test -d .hg && hgid=`hg id 2>/dev/null`; then
|
|
# Do we have an tagged version? If so, latesttagdistance == 1
|
|
if [ "`hg log -r . --template '{latesttagdistance}'`" == "1" ]; then
|
|
id=`hg log -r . --template '{latesttag}'`
|
|
printf '%s%s' -hg "$id"
|
|
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
|
|
fi
|
|
|
|
# Are there uncommitted changes?
|
|
# These are represented by + after the changeset id.
|
|
case "$hgid" in
|
|
*+|*+\ *) printf '%s' -dirty ;;
|
|
esac
|
|
|
|
# All done with mercurial
|
|
return
|
|
fi
|
|
|
|
# Check for svn and a svn repo.
|
|
if rev=`LANG= LC_ALL= LC_MESSAGES=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
|
|
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
|
|
if test ! -e .scmversion; then
|
|
res=$(scm_version)
|
|
echo "$res" >.scmversion
|
|
fi
|
|
exit
|
|
fi
|
|
|
|
if test -e include/config/auto.conf; then
|
|
. include/config/auto.conf
|
|
else
|
|
echo "Error: kernelrelease not valid - run 'make prepare' to update it"
|
|
exit 1
|
|
fi
|
|
|
|
# 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
|
|
# 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
|
|
if test "${LOCALVERSION+set}" != "set"; then
|
|
scm=$(scm_version --short)
|
|
res="$res${scm:++}"
|
|
fi
|
|
fi
|
|
|
|
echo "$res"
|