linux/scripts/setlocalversion
<<
>>
Prefs
   1#!/bin/sh
   2#
   3# This scripts adds local version information from the version
   4# control systems git, mercurial (hg) and subversion (svn).
   5#
   6# If something goes wrong, send a mail the kernel build mailinglist
   7# (see MAINTAINERS) and CC Nico Schottelius
   8# <nico-linuxsetlocalversion -at- schottelius.org>.
   9#
  10#
  11
  12usage() {
  13        echo "Usage: $0 [--save-scmversion] [srctree]" >&2
  14        exit 1
  15}
  16
  17scm_only=false
  18srctree=.
  19if test "$1" = "--save-scmversion"; then
  20        scm_only=true
  21        shift
  22fi
  23if test $# -gt 0; then
  24        srctree=$1
  25        shift
  26fi
  27if test $# -gt 0 -o ! -d "$srctree"; then
  28        usage
  29fi
  30
  31scm_version()
  32{
  33        local short
  34        short=false
  35
  36        cd "$srctree"
  37        if test -e .scmversion; then
  38                cat .scmversion
  39                return
  40        fi
  41        if test "$1" = "--short"; then
  42                short=true
  43        fi
  44
  45        # Check for git and a git repo.
  46        if test -d .git && head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
  47
  48                # If we are at a tagged commit (like "v2.6.30-rc6"), we ignore
  49                # it, because this version is defined in the top level Makefile.
  50                if [ -z "`git describe --exact-match 2>/dev/null`" ]; then
  51
  52                        # If only the short version is requested, don't bother
  53                        # running further git commands
  54                        if $short; then
  55                                echo "+"
  56                                return
  57                        fi
  58                        # If we are past a tagged commit (like
  59                        # "v2.6.30-rc5-302-g72357d5"), we pretty print it.
  60                        if atag="`git describe 2>/dev/null`"; then
  61                                echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
  62
  63                        # If we don't have a tag at all we print -g{commitish}.
  64                        else
  65                                printf '%s%s' -g $head
  66                        fi
  67                fi
  68
  69                # Is this git on svn?
  70                if git config --get svn-remote.svn.url >/dev/null; then
  71                        printf -- '-svn%s' "`git svn find-rev $head`"
  72                fi
  73
  74                # Check for uncommitted changes
  75                if git diff-index --name-only HEAD | grep -qv "^scripts/package"; then
  76                        printf '%s' -dirty
  77                fi
  78
  79                # All done with git
  80                return
  81        fi
  82
  83        # Check for mercurial and a mercurial repo.
  84        if test -d .hg && hgid=`hg id 2>/dev/null`; then
  85                # Do we have an tagged version?  If so, latesttagdistance == 1
  86                if [ "`hg log -r . --template '{latesttagdistance}'`" == "1" ]; then
  87                        id=`hg log -r . --template '{latesttag}'`
  88                        printf '%s%s' -hg "$id"
  89                else
  90                        tag=`printf '%s' "$hgid" | cut -d' ' -f2`
  91                        if [ -z "$tag" -o "$tag" = tip ]; then
  92                                id=`printf '%s' "$hgid" | sed 's/[+ ].*//'`
  93                                printf '%s%s' -hg "$id"
  94                        fi
  95                fi
  96
  97                # Are there uncommitted changes?
  98                # These are represented by + after the changeset id.
  99                case "$hgid" in
 100                        *+|*+\ *) printf '%s' -dirty ;;
 101                esac
 102
 103                # All done with mercurial
 104                return
 105        fi
 106
 107        # Check for svn and a svn repo.
 108        if rev=`LANG= LC_ALL= LC_MESSAGES=C svn info 2>/dev/null | grep '^Last Changed Rev'`; then
 109                rev=`echo $rev | awk '{print $NF}'`
 110                printf -- '-svn%s' "$rev"
 111
 112                # All done with svn
 113                return
 114        fi
 115}
 116
 117collect_files()
 118{
 119        local file res
 120
 121        for file; do
 122                case "$file" in
 123                *\~*)
 124                        continue
 125                        ;;
 126                esac
 127                if test -e "$file"; then
 128                        res="$res$(cat "$file")"
 129                fi
 130        done
 131        echo "$res"
 132}
 133
 134if $scm_only; then
 135        if test ! -e .scmversion; then
 136                res=$(scm_version)
 137                echo "$res" >.scmversion
 138        fi
 139        exit
 140fi
 141
 142if test -e include/config/auto.conf; then
 143        . include/config/auto.conf
 144else
 145        echo "Error: kernelrelease not valid - run 'make prepare' to update it"
 146        exit 1
 147fi
 148
 149# localversion* files in the build and source directory
 150res="$(collect_files localversion*)"
 151if test ! "$srctree" -ef .; then
 152        res="$res$(collect_files "$srctree"/localversion*)"
 153fi
 154
 155# CONFIG_LOCALVERSION and LOCALVERSION (if set)
 156res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"
 157
 158# scm version string if not at a tagged commit
 159if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
 160        # full scm version string
 161        res="$res$(scm_version)"
 162else
 163        # append a plus sign if the repository is not in a clean
 164        # annotated or signed tagged state (as git describe only
 165        # looks at signed or annotated tags - git tag -a/-s) and
 166        # LOCALVERSION= is not specified
 167        if test "${LOCALVERSION+set}" != "set"; then
 168                scm=$(scm_version --short)
 169                res="$res${scm:++}"
 170        fi
 171fi
 172
 173echo "$res"
 174