From patchwork Fri Sep 30 14:18:42 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Monjalon X-Patchwork-Id: 16314 X-Patchwork-Delegate: thomas@monjalon.net Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [IPv6:::1]) by dpdk.org (Postfix) with ESMTP id 58B8058C5; Fri, 30 Sep 2016 16:18:48 +0200 (CEST) Received: from mail-wm0-f49.google.com (mail-wm0-f49.google.com [74.125.82.49]) by dpdk.org (Postfix) with ESMTP id 21646E07 for ; Fri, 30 Sep 2016 16:18:47 +0200 (CEST) Received: by mail-wm0-f49.google.com with SMTP id b4so50155508wmb.0 for ; Fri, 30 Sep 2016 07:18:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=6wind-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=xcNwiHzwD3l8+jCebWnhtPzDNb8n4Wbx4QGV1M8vtdg=; b=qimHYkoBdJwC8ezb7l2AHpeGWXZ/7j7WhF47pITKIUvK61M13qqmsKXTkUB6BX8cvy pXdCndExJRGQI1Pwne0hnFAhiJHaTVQzpCnnds6VAKX60847mHaZ2xZLaYpTM/anzWRN 26Q+Xabbrb5yvlluZurnbuqFNlO70D2yK69Yj6bq5yAXvvCx7ufEsitq6uBBfNFA8GA5 2IBJqc6kwoyLYrRfDPDgI5800DP/lkEVMpH+VvwnbXonTiz0uTDk8jH9jTO/2JOtYD/K mYtg44vZdFEvGNrSAaZkT/6M2X9CA6B1JCuNKqd2rxMWykAUFnV86IwJjFHLiBgI28Nd VgVw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=xcNwiHzwD3l8+jCebWnhtPzDNb8n4Wbx4QGV1M8vtdg=; b=IBrqzhmCJLKeBfqBF3CyzB72NeeP8Je8n1eXIaGJQtBuN4r2sFGuQZfJzGNXlgpXm4 b726RaWWRos0wwFzUHdnWVE2isRcyxhyuWjtS+BfyJIE+fNAfhc1tKpiR+GGHuie8rJd zAuzdih4eyBrA+xJFIUUf7zJQfVoV7SUPldl1HRyhhwiTvcjuCeomY7yay97neM0s3O9 O+XkQ24PoJ4MiYVB448DmHxKym4PR5si5pFVsoDk4OwVDZETet80i457PegOeZze3uLi WrVNeQz6UQQ3NzEgOTDEQE40rRZoZSjuTiZhAQoDTVhrjZN7gOte8/RERV9vmerfoF9j lsvw== X-Gm-Message-State: AA6/9Rnl8fcxvqe99DA5ksZKlh6Qvy9Mri5s6hPVBkWxIxVNUj/CZPhGFOhKa8btiLWIisZC X-Received: by 10.28.18.11 with SMTP id 11mr4321251wms.79.1475245126683; Fri, 30 Sep 2016 07:18:46 -0700 (PDT) Received: from XPS13.localdomain (184.203.134.77.rev.sfr.net. [77.134.203.184]) by smtp.gmail.com with ESMTPSA id p13sm4434526wmd.1.2016.09.30.07.18.45 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 30 Sep 2016 07:18:46 -0700 (PDT) From: Thomas Monjalon To: dev@dpdk.org Cc: Yuanhan Liu Date: Fri, 30 Sep 2016 16:18:42 +0200 Message-Id: <1475245122-23719-1-git-send-email-thomas.monjalon@6wind.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1475142110-8294-1-git-send-email-thomas.monjalon@6wind.com> References: <1475142110-8294-1-git-send-email-thomas.monjalon@6wind.com> Subject: [dpdk-dev] [PATCH v2] scripts: show fixes with release version of bug X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" This script can help to find commits to backport in stable branches. Fixes are found if there is the word "fix" in the headline or if there is a tag Fixes: or Reverts: in the message. Chained fixes of fixes are explored to find the oldest origin. Fixes of not released bugs are ignored. Signed-off-by: Thomas Monjalon Reviewed-by: Yuanhan Liu --- v2: add help, license and maintainers entry --- MAINTAINERS | 1 + scripts/git-log-fixes.sh | 120 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100755 scripts/git-log-fixes.sh diff --git a/MAINTAINERS b/MAINTAINERS index 7c33ad4..e64b61d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -28,6 +28,7 @@ F: scripts/check-maintainers.sh F: scripts/check-git-log.sh F: scripts/check-includes.sh F: scripts/checkpatches.sh +F: scripts/git-log-fixes.sh F: scripts/load-devel-config F: scripts/test-build.sh diff --git a/scripts/git-log-fixes.sh b/scripts/git-log-fixes.sh new file mode 100755 index 0000000..4824c7f --- /dev/null +++ b/scripts/git-log-fixes.sh @@ -0,0 +1,120 @@ +#! /bin/sh -e + +# BSD LICENSE +# +# Copyright 2016 6WIND S.A. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of 6WIND S.A. nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +print_usage () +{ + echo "usage: $(basename $0) [-h] " +} + +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 () # +{ + 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 () # +{ + tag=$(git tag -l --contains $1 | 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 () # +{ + 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 () # ... +{ + 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 +} + +git log --oneline --reverse $range | +while read id headline ; do + origins=$(origin_filter $id) + [ -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)\n' $version $id "$headline" "$origver" +done