From a7b39185338c333a052728a7952b5f1cba4fc22a Mon Sep 17 00:00:00 2001 From: Kyle Moffett Date: Fri, 16 Dec 2011 11:14:40 +0000 Subject: [PATCH] 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 Cc: Wolfgang Denk Cc: Mike Frysinger Acked-by: Mike Frysinger --- tools/setlocalversion | 185 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 161 insertions(+), 24 deletions(-) diff --git a/tools/setlocalversion b/tools/setlocalversion index e11f54f..f551b4c 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" -- 2.7.4