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                # Update index only on r/w media
  75                [ -w . ] && git update-index --refresh --unmerged > /dev/null
  76
  77                # Check for uncommitted changes
  78                if git diff-index --name-only HEAD | grep -qv "^scripts/package"; then
  79                        printf '%s' -dirty
  80                fi
  81
  82                # All done with git
  83                return
  84        fi
  85
  86        # Check for mercurial and a mercurial repo.
  87        if test -d .hg && hgid=`hg id 2>/dev/null`; then
  88                # Do we have an tagged version?  If so, latesttagdistance == 1
  89                if [ "`hg log -r . --template '{latesttagdistance}'`" == "1" ]; then
  90                        id=`hg log -r . --template '{latesttag}'`
  91                        printf '%s%s' -hg "$id"
  92                else
  93                        tag=`printf '%s' "$hgid" | cut -d' ' -f2`
  94                        if [ -z "$tag" -o "$tag" = tip ]; then
  95                                id=`printf '%s' "$hgid" | sed 's/[+ ].*//'`
  96                                printf '%s%s' -hg "$id"
  97                        fi
  98                fi
  99
 100                # Are there uncommitted changes?
 101                # These are represented by + after the changeset id.
 102                case "$hgid" in
 103                        *+|*+\ *) printf '%s' -dirty ;;
 104                esac
 105
 106                # All done with mercurial
 107                return
 108        fi
 109
 110        # Check for svn and a svn repo.
 111        if rev=`svn info 2>/dev/null | grep '^Last Changed Rev'`; then
 112                rev=`echo $rev | awk '{print $NF}'`
 113                printf -- '-svn%s' "$rev"
 114
 115                # All done with svn
 116                return
 117        fi
 118}
 119
 120collect_files()
 121{
 122        local file res
 123
 124        for file; do
 125                case "$file" in
 126                *\~*)
 127                        continue
 128                        ;;
 129                esac
 130                if test -e "$file"; then
 131                        res="$res$(cat "$file")"
 132                fi
 133        done
 134        echo "$res"
 135}
 136
 137if $scm_only; then
 138        if test ! -e .scmversion; then
 139                res=$(scm_version)
 140                echo "$res" >.scmversion
 141        fi
 142        exit
 143fi
 144
 145if test -e include/config/auto.conf; then
 146        . include/config/auto.conf
 147else
 148        echo "Error: kernelrelease not valid - run 'make prepare' to update it"
 149        exit 1
 150fi
 151
 152# localversion* files in the build and source directory
 153res="$(collect_files localversion*)"
 154if test ! "$srctree" -ef .; then
 155        res="$res$(collect_files "$srctree"/localversion*)"
 156fi
 157
 158# CONFIG_LOCALVERSION and LOCALVERSION (if set)
 159res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"
 160
 161# scm version string if not at a tagged commit
 162if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
 163        # full scm version string
 164        res="$res$(scm_version)"
 165else
 166        # append a plus sign if the repository is not in a clean
 167        # annotated or signed tagged state (as git describe only
 168        # looks at signed or annotated tags - git tag -a/-s) and
 169        # LOCALVERSION= is not specified
 170        if test "${LOCALVERSION+set}" != "set"; then
 171                scm=$(scm_version --short)
 172                res="$res${scm:++}"
 173        fi
 174fi
 175
 176echo "$res"
 177