Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

scripts/setlocalversion: also consider annotated tags of the form vx.y.z-${file_localversion}

Commit 6ab7e1f95e96 ("setlocalversion: use only the correct release
tag for git-describe") was absolutely correct to limit which annotated
tags would be used to compute the -01234-gabcdef suffix. Otherwise, if
some random annotated tag exists closer to HEAD than the vX.Y.Z one,
the commit count would be too low.

However, since the version string always includes the
${file_localversion} part, now the problem is that the count can be
too high. For example, building an 6.4.6-rt8 kernel with a few patches
on top, I currently get

$ make -s kernelrelease
6.4.6-rt8-00128-gd78b7f406397

But those 128 commits include the 100 commits that are in
v6.4.6..v6.4.6-rt8, so this is somewhat misleading.

Amend the logic so that, in addition to the linux-next consideration,
the script also looks for a tag corresponding to the 6.4.6-rt8 part of
what will become the `uname -r` string. With this patch (so 29 patches
on top of v6.4.6-rt8), one instead gets

$ make -s kernelrelease
6.4.6-rt8-00029-gd533209291a2

While there, note that the line

git describe --exact-match --match=$tag $tag 2>/dev/null

obviously asks if $tag is an annotated tag, but it does not actually
tell if the commit pointed to has any relation to HEAD. So remove both
uses of --exact-match, and instead just ask if the description
generated is identical to the tag we provided. Since we then already
have the result of

git describe --match=$tag

we also end up reducing the number of times we invoke "git describe".

Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>

authored by

Rasmus Villemoes and committed by
Masahiro Yamada
01e89a4a 3354c64d

+26 -10
+26 -10
scripts/setlocalversion
··· 57 57 return 58 58 fi 59 59 60 - # If a localversion*' file and the corresponding annotated tag exist, 61 - # use it. This is the case in linux-next. 60 + # mainline kernel: 6.2.0-rc5 -> v6.2-rc5 61 + # stable kernel: 6.1.7 -> v6.1.7 62 + version_tag=v$(echo "${KERNELVERSION}" | sed -E 's/^([0-9]+\.[0-9]+)\.0(.*)$/\1\2/') 63 + 64 + # If a localversion* file exists, and the corresponding 65 + # annotated tag exists and is an ancestor of HEAD, use 66 + # it. This is the case in linux-next. 62 67 tag=${file_localversion#-} 63 - tag=$(git describe --exact-match --match=$tag $tag 2>/dev/null) 68 + desc= 69 + if [ -n "${tag}" ]; then 70 + desc=$(git describe --match=$tag 2>/dev/null) 71 + fi 72 + 73 + # Otherwise, if a localversion* file exists, and the tag 74 + # obtained by appending it to the tag derived from 75 + # KERNELVERSION exists and is an ancestor of HEAD, use 76 + # it. This is e.g. the case in linux-rt. 77 + if [ -z "${desc}" ] && [ -n "${file_localversion}" ]; then 78 + tag="${version_tag}${file_localversion}" 79 + desc=$(git describe --match=$tag 2>/dev/null) 80 + fi 64 81 65 82 # Otherwise, default to the annotated tag derived from KERNELVERSION. 66 - # mainline kernel: 6.2.0-rc5 -> v6.2-rc5 67 - # stable kernel: 6.1.7 -> v6.1.7 68 - if [ -z "${tag}" ]; then 69 - tag=v$(echo "${KERNELVERSION}" | sed -E 's/^([0-9]+\.[0-9]+)\.0(.*)$/\1\2/') 83 + if [ -z "${desc}" ]; then 84 + tag="${version_tag}" 85 + desc=$(git describe --match=$tag 2>/dev/null) 70 86 fi 71 87 72 88 # If we are at the tagged commit, we ignore it because the version is 73 89 # well-defined. 74 - if [ -z "$(git describe --exact-match --match=$tag 2>/dev/null)" ]; then 90 + if [ "${tag}" != "${desc}" ]; then 75 91 76 92 # If only the short version is requested, don't bother 77 93 # running further git commands ··· 97 81 fi 98 82 # If we are past the tagged commit, we pretty print it. 99 83 # (like 6.1.0-14595-g292a089d78d3) 100 - if atag="$(git describe --match=$tag 2>/dev/null)"; then 101 - echo "$atag" | awk -F- '{printf("-%05d", $(NF-1))}' 84 + if [ -n "${desc}" ]; then 85 + echo "${desc}" | awk -F- '{printf("-%05d", $(NF-1))}' 102 86 fi 103 87 104 88 # Add -g and exactly 12 hex chars.