summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorKyle Moffett <Kyle.D.Moffett@boeing.com>2011-12-16 11:14:40 +0000
committerWolfgang Denk <wd@denx.de>2011-12-17 20:58:48 +0100
commita7b39185338c333a052728a7952b5f1cba4fc22a (patch)
tree7664c20d70cdf87f6ca70da4c65a36b66e6b3b9f /tools
parent8b0affecb98f91142015ccf8c43653e1ad87c156 (diff)
tools/setlocalversion: Update from the Linux Kernel
Several bugfixes have occurred upstream since this script was imported into U-Boot. In particular, the script currently in U-Boot does not describe commit f8bbb4dad0e9d91b7a51d6cc54dcf66d142f50fe correctly, resulting in a version of "2011.09" instead of "2011.09-01460-gf8bbb4d". With that commit checked out, the command "git name-rev --tags HEAD" gives this result: HEAD tags/v2011.12-rc1~30^2 Then the "changes" regex does not match because of the trailing '^2': grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' The new version of tools/setlocalversion in the kernel correctly handles those situations by using different plumbing commands. The version from the kernel is not directly usable as it does not append the full GIT version that U-Boot expects unless the right config options are set (CONFIG_LOCALVERSION_AUTO=y). Other than a few minor changes for Kconfig, the imported version is very similar to Linux v3.2-rc4. Signed-off-by: Kyle Moffett <Kyle.D.Moffett@boeing.com> Cc: Wolfgang Denk <wd@denx.de> Cc: Mike Frysinger <vapier@gentoo.org> Acked-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'tools')
-rwxr-xr-xtools/setlocalversion185
1 files changed, 161 insertions, 24 deletions
diff --git a/tools/setlocalversion b/tools/setlocalversion
index e11f54f55ab..f551b4c4f4c 100755
--- a/tools/setlocalversion
+++ b/tools/setlocalversion
@@ -1,40 +1,177 @@
#!/bin/sh
-# Print additional version information for non-release trees.
+#
+# This scripts adds local version information from the version
+# control systems git, mercurial (hg) and subversion (svn).
+#
+# It was originally copied from the Linux kernel v3.2.0-rc4 and modified
+# to support the U-Boot build-system.
+#
usage() {
- echo "Usage: $0 [srctree]" >&2
+ echo "Usage: $0 [--save-scmversion] [srctree]" >&2
exit 1
}
-cd "${1:-.}" || usage
+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 -e .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 [ -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
+
+ # 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
-# Check for git and a git repo.
-if head=`git rev-parse --verify HEAD 2>/dev/null`; then
- # Do we have an untagged version?
- if git name-rev --tags HEAD | \
- grep -E '^HEAD[[:space:]]+(.*~[0-9]*|undefined)$' > /dev/null; then
- (git describe || git describe --tags || git describe --all --long) \
- 2>/dev/null | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
+ # All done with git
+ return
fi
- # Are there uncommitted changes?
- git update-index --refresh --unmerged > /dev/null
- if git diff-index --name-only HEAD | grep -v "^scripts/package" \
- | read dummy; then
- printf '%s' -dirty
+ # 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
- # Is this git on svn?
- if git config --get svn-remote.svn.url >/dev/null; then
- printf -- '-svn%s' "`git svn find-rev $head`"
+ # Check for svn and a svn repo.
+ if rev=`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
-# Check for svn and a svn repo.
-if rev=`svn info 2>/dev/null` ; then
- rev=`echo "${rev}" | grep '^Revision' | awk '{print $NF}'`
- printf -- '-svn%s' $rev
+#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
+CONFIG_LOCALVERSION=
+CONFIG_LOCALVERSION_AUTO=y
+
+# 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
-# Check for any localversion-* files
-printf '%s' "`cat localversion-* 2>/dev/null`"
+echo "$res"