The changes upstream since the last sync at commit 5c02350fa03d
("scripts/setlocalversion: sync with linux v6.9") are

e2ff1219a554 setlocalversion: add -e option
523f3dbc187a setlocalversion: work around "git describe" performance

Signed-off-by: Tom Rini <tr...@konsulko.com>
---
Cc: Rasmus Villemoes <rasmus.villem...@prevas.dk>
---
 scripts/setlocalversion | 58 +++++++++++++++++++++++++++++------------
 1 file changed, 42 insertions(+), 16 deletions(-)

diff --git a/scripts/setlocalversion b/scripts/setlocalversion
index dbe048210d6c..9ed3f56bebf9 100755
--- a/scripts/setlocalversion
+++ b/scripts/setlocalversion
@@ -10,6 +10,8 @@
 #
 #
 
+set -e
+
 usage() {
        echo "Usage: $0 [--no-local] [srctree]" >&2
        exit 1
@@ -30,6 +32,29 @@ if test $# -gt 0 -o ! -d "$srctree"; then
        usage
 fi
 
+try_tag() {
+       tag="$1"
+
+       # Is $tag an annotated tag?
+       if [ "$(git cat-file -t "$tag" 2> /dev/null)" != tag ]; then
+                return
+       fi
+
+       # Is it an ancestor of HEAD, and if so, how many commits are in 
$tag..HEAD?
+       # shellcheck disable=SC2046 # word splitting is the point here
+       set -- $(git rev-list --count --left-right "$tag"...HEAD 2> /dev/null)
+
+       # $1 is 0 if and only if $tag is an ancestor of HEAD. Use
+       # string comparison, because $1 is empty if the 'git rev-list'
+       # command somehow failed.
+       if [ "$1" != 0 ]; then
+               return
+       fi
+
+       # $2 is the number of commits in the range $tag..HEAD, possibly 0.
+       count="$2"
+}
+
 scm_version()
 {
        local short=false
@@ -61,33 +86,33 @@ scm_version()
        # stable kernel:    6.1.7      ->  v6.1.7
        version_tag=v$(echo "${KERNELVERSION}" | sed -E 
's/^([0-9]+\.[0-9]+)\.0(.*)$/\1\2/')
 
+       # try_tag initializes count if the tag is usable.
+       count=
+
        # If a localversion* file exists, and the corresponding
        # annotated tag exists and is an ancestor of HEAD, use
        # it. This is the case in linux-next.
-       tag=${file_localversion#-}
-       desc=
-       if [ -n "${tag}" ]; then
-               desc=$(git describe --match=$tag 2>/dev/null)
+       if [ -n "${file_localversion#-}" ] ; then
+               try_tag "${file_localversion#-}"
        fi
 
        # Otherwise, if a localversion* file exists, and the tag
        # obtained by appending it to the tag derived from
        # KERNELVERSION exists and is an ancestor of HEAD, use
        # it. This is e.g. the case in linux-rt.
-       if [ -z "${desc}" ] && [ -n "${file_localversion}" ]; then
-               tag="${version_tag}${file_localversion}"
-               desc=$(git describe --match=$tag 2>/dev/null)
+       if [ -z "${count}" ] && [ -n "${file_localversion}" ]; then
+               try_tag "${version_tag}${file_localversion}"
        fi
 
        # Otherwise, default to the annotated tag derived from KERNELVERSION.
-       if [ -z "${desc}" ]; then
-               tag="${version_tag}"
-               desc=$(git describe --match=$tag 2>/dev/null)
+       if [ -z "${count}" ]; then
+               try_tag "${version_tag}"
        fi
 
-       # If we are at the tagged commit, we ignore it because the version is
-       # well-defined.
-       if [ "${tag}" != "${desc}" ]; then
+       # If we are at the tagged commit, we ignore it because the
+       # version is well-defined. If none of the attempted tags exist
+       # or were usable, $count is still empty.
+       if [ -z "${count}" ] || [ "${count}" -gt 0 ]; then
 
                # If only the short version is requested, don't bother
                # running further git commands
@@ -95,14 +120,15 @@ scm_version()
                        echo "+"
                        return
                fi
+
                # If we are past the tagged commit, we pretty print it.
                # (like 6.1.0-14595-g292a089d78d3)
-               if [ -n "${desc}" ]; then
-                       echo "${desc}" | awk -F- '{printf("-%05d", $(NF-1))}'
+               if [ -n "${count}" ]; then
+                       printf "%s%05d" "-" "${count}"
                fi
 
                # Add -g and exactly 12 hex chars.
-               printf '%s%s' -g "$(echo $head | cut -c1-12)"
+               printf '%s%.12s' -g "$head"
        fi
 
        if ${no_dirty}; then
-- 
2.43.0

Reply via email to