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