8070d8fecb
During backporting, if the fixes or stable tag are missing, it usually requires some investigation by stable maintainer as to why. The presence of a fixes tag may be known from whether the originating release of the issue is printed at the end of the line but with variable line lengths and nested partial fixes it doesn't catch the eye. When there are a large amount of commits, adding an aligned column indicating the presence of a fixes tag beside the stable one makes it easier to quickly see the patches requiring further investigation. e.g. 20.028f33cbcfa
S F net/i40e/base: fix buffer address (16.04) 20.024b3da9415
S F net/i40e/base: fix error message (1.7.0) 20.021da546c39
- F net/i40e/base: fix missing link modes (17.08) 20.0279bfe7808
S F net/i40e/base: fix Tx descriptors number (1.7.0) 20.0250126939c
- F net/i40e/base: fix retrying logic (18.02) 20.02dcd05da0a
S F app/testpmd: fix GENEVE flow item (18.02) 20.02b0b9fdad2
S - net/bnx2x: support secondary process (N/A) 20.02f8279f47d
S F net/netvsc: fix crash in secondary process (18.08) Signed-off-by: Kevin Traynor <ktraynor@redhat.com>
125 lines
3.0 KiB
Bash
Executable File
125 lines
3.0 KiB
Bash
Executable File
#! /bin/sh -e
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
# Copyright 2016 6WIND S.A.
|
|
|
|
print_usage ()
|
|
{
|
|
echo "usage: $(basename $0) [-h] <git_range>"
|
|
}
|
|
|
|
print_help ()
|
|
{
|
|
print_usage
|
|
cat <<- END_OF_HELP
|
|
|
|
Find fixes to backport on previous versions.
|
|
It looks for the word "fix" in the headline or a tag "Fixes" or "Reverts".
|
|
The oldest bug origin is printed as well as partially fixed versions.
|
|
END_OF_HELP
|
|
}
|
|
|
|
usage_error () # <message>
|
|
{
|
|
echo "$*" >&2
|
|
print_usage >&2
|
|
exit 1
|
|
}
|
|
|
|
while getopts h ARG ; do
|
|
case $ARG in
|
|
h ) print_help ; exit 0 ;;
|
|
? ) print_usage >&2 ; exit 1 ;;
|
|
esac
|
|
done
|
|
shift $(($OPTIND - 1))
|
|
[ $# -ge 1 ] || usage_error 'range argument required'
|
|
range="$*"
|
|
|
|
# get major release version of a commit
|
|
commit_version () # <hash>
|
|
{
|
|
# use current branch as history reference
|
|
local refbranch=$(git rev-parse --abbrev-ref HEAD)
|
|
local tag=$( (git tag -l --contains $1 --merged $refbranch 2>&- ||
|
|
# tag --merged option has been introduced in git 2.7.0
|
|
# below is a fallback in case of old git version
|
|
for t in $(git tag -l --contains $1) ; do
|
|
git branch $refbranch --contains $t |
|
|
sed "s,.\+,$t,"
|
|
done) |
|
|
head -n1)
|
|
if [ -z "$tag" ] ; then
|
|
# before -rc1 tag of release in progress
|
|
make showversion | cut -d'.' -f-2
|
|
else
|
|
echo $tag | sed 's,^v,,' | sed 's,-rc.*,,'
|
|
fi
|
|
}
|
|
|
|
# get bug origin hashes of a fix
|
|
origin_filter () # <hash>
|
|
{
|
|
git log --format='%b' -1 $1 |
|
|
sed -n 's,^ *\([Ff]ixes\|[Rr]everts\): *\([0-9a-f]*\).*,\2,p'
|
|
}
|
|
|
|
# get oldest major release version of bug origins
|
|
origin_version () # <origin_hash> ...
|
|
{
|
|
for origin in $* ; do
|
|
# check hash is valid
|
|
git rev-parse -q --verify $1 >&- || continue
|
|
# get version of this bug origin
|
|
local origver=$(commit_version $origin)
|
|
local roothashes="$(origin_filter $origin)"
|
|
if [ -n "$roothashes" ] ; then
|
|
# look chained fix of fix recursively
|
|
local rootver="$(origin_version $roothashes)"
|
|
[ -n "$rootver" ] || continue
|
|
echo "$rootver (partially fixed in $origver)"
|
|
else
|
|
echo "$origver"
|
|
fi
|
|
# filter the oldest origin
|
|
done | sort -uV | head -n1
|
|
}
|
|
|
|
# print a marker for stable tag presence
|
|
stable_tag () # <hash>
|
|
{
|
|
if git log --format='%b' -1 $1 | grep -qi '^Cc: *stable@dpdk.org' ; then
|
|
echo 'S'
|
|
else
|
|
echo '-'
|
|
fi
|
|
}
|
|
|
|
# print a marker for fixes tag presence
|
|
fixes_tag () # <hash>
|
|
{
|
|
if git log --format='%b' -1 $1 | grep -qi '^Fixes: *' ; then
|
|
echo 'F'
|
|
else
|
|
echo '-'
|
|
fi
|
|
}
|
|
|
|
git log --oneline --reverse $range |
|
|
while read id headline ; do
|
|
origins=$(origin_filter $id)
|
|
stable=$(stable_tag $id)
|
|
fixes=$(fixes_tag $id)
|
|
[ "$stable" = "S" ] || [ "$fixes" = "F" ] || [ -n "$origins" ] || \
|
|
echo "$headline" | grep -q fix || continue
|
|
version=$(commit_version $id)
|
|
if [ -n "$origins" ] ; then
|
|
origver="$(origin_version $origins)"
|
|
[ -n "$origver" ] || continue
|
|
# ignore fix of bug introduced in the same release
|
|
! echo "$origver" | grep -q "^$version" || continue
|
|
else
|
|
origver='N/A'
|
|
fi
|
|
printf '%s %7s %s %s %s (%s)\n' $version $id $stable $fixes "$headline" "$origver"
|
|
done
|