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 -z "$(git rev-parse --show-cdup 2>/dev/null)" &&
  47           head=`git rev-parse --verify --short HEAD 2>/dev/null`; then
  48
  49                # If we are at a tagged commit (like "v2.6.30-rc6"), we ignore
  50                # it, because this version is defined in the top level Makefile.
  51                if [ -z "`git describe --exact-match 2>/dev/null`" ]; then
  52
  53                        # If only the short version is requested, don't bother
  54                        # running further git commands
  55                        if $short; then
  56                                echo "+"
  57                                return
  58                        fi
  59                        # If we are past a tagged commit (like
  60                        # "v2.6.30-rc5-302-g72357d5"), we pretty print it.
  61                        if atag="`git describe 2>/dev/null`"; then
  62                                echo "$atag" | awk -F- '{printf("-%05d-%s", $(NF-1),$(NF))}'
  63
  64                        # If we don't have a tag at all we print -g{commitish}.
  65                        else
  66                                printf '%s%s' -g $head
  67                        fi
  68                fi
  69
  70                # Is this git on svn?
  71                if git config --get svn-remote.svn.url >/dev/null; then
  72                        printf -- '-svn%s' "`git svn find-rev $head`"
  73                fi
  74
  75                # Check for uncommitted changes
  76                if git diff-index --name-only HEAD | grep -qv "^scripts/package"; then
  77                        printf '%s' -dirty
  78                fi
  79
  80                # All done with git
  81                return
  82        fi
  83
  84        # Check for mercurial and a mercurial repo.
  85        if test -d .hg && hgid=`hg id 2>/dev/null`; then
  86                # Do we have an tagged version?  If so, latesttagdistance == 1
  87                if [ "`hg log -r . --template '{latesttagdistance}'`" == "1" ]; then
  88                        id=`hg log -r . --template '{latesttag}'`
  89                        printf '%s%s' -hg "$id"
  90                else
  91                        tag=`printf '%s' "$hgid" | cut -d' ' -f2`
  92                        if [ -z "$tag" -o "$tag" = tip ]; then
  93                                id=`printf '%s' "$hgid" | sed 's/[+ ].*//'`
  94                                printf '%s%s' -hg "$id"
  95                        fi
  96                fi
  97
  98                # Are there uncommitted changes?
  99                # These are represented by + after the changeset id.
 100                case "$hgid" in
 101                        *+|*+\ *) printf '%s' -dirty ;;
 102                esac
 103
 104                # All done with mercurial
 105                return
 106        fi
 107
 108        # Check for svn and a svn repo.
 109        if rev=`LANG= LC_ALL= LC_MESSAGES=C svn info 2>/dev/null | grep '^Last Changed Rev'`; then
 110                rev=`echo $rev | awk '{print $NF}'`
 111                printf -- '-svn%s' "$rev"
 112
 113                # All done with svn
 114                return
 115        fi
 116}
 117
 118collect_files()
 119{
 120        local file res
 121
 122        for file; do
 123                case "$file" in
 124                *\~*)
 125                        continue
 126                        ;;
 127                esac
 128                if test -e "$file"; then
 129                        res="$res$(cat "$file")"
 130                fi
 131        done
 132        echo "$res"
 133}
 134
 135if $scm_only; then
 136        if test ! -e .scmversion; then
 137                res=$(scm_version)
 138                echo "$res" >.scmversion
 139        fi
 140        exit
 141fi
 142
 143if test -e include/config/auto.conf; then
 144        . include/config/auto.conf
 145else
 146        echo "Error: kernelrelease not valid - run 'make prepare' to update it"
 147        exit 1
 148fi
 149
 150# localversion* files in the build and source directory
 151res="$(collect_files localversion*)"
 152if test ! "$srctree" -ef .; then
 153        res="$res$(collect_files "$srctree"/localversion*)"
 154fi
 155
 156# CONFIG_LOCALVERSION and LOCALVERSION (if set)
 157res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"
 158
 159# scm version string if not at a tagged commit
 160if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
 161        # full scm version string
 162        res="$res$(scm_version)"
 163else
 164        # append a plus sign if the repository is not in a clean
 165        # annotated or signed tagged state (as git describe only
 166        # looks at signed or annotated tags - git tag -a/-s) and
 167        # LOCALVERSION= is not specified
 168        if test "${LOCALVERSION+set}" != "set"; then
 169                scm=$(scm_version --short)
 170                res="$res${scm:++}"
 171        fi
 172fi
 173
 174echo "$res"
 175