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