#!/bin/bash usage() { echo "Check whether a given list of commit is available in" echo "a given list of branches." echo echo "Usage: ${0##*/} [branches.conf] term..." echo echo "Parametes:" echo " branches.conf: file with the list of branches to be checked" echo " term: hash of the commit|CVE|bsc to be found" } fetch_branches() { local CACHED_BRANCHES="/tmp/$USER-branches.conf" local URL="https://kerncvs.suse.de/branches.conf" local EXPIRE=7 branches=$CACHED_BRANCHES if [[ $(find "$CACHED_BRANCHES" -mtime -$EXPIRE -print 2>/dev/null) \ && -s "$CACHED_BRANCHES" ]]; then echo "Using cached $CACHED_BRANCHES" >&2 return fi curl "$URL" -o "$CACHED_BRANCHES" } if [ $# -lt 1 ] ; then usage exit 1 fi branches=$1 if [ ! -f "$branches" ] ; then echo "Branches file not specified, trying to fetch it..." >&2 if ! fetch_branches ; then "Error: Can't find the file with the list of branches: $branches nor fetch it" exit 1 fi else shift; fi KBC_CHECK_TERMS="$*" term2regex() { shopt -q nocasematch local t=$1 case $t in # CVEs first 2[0-9][0-9][0-9]-*) t=cve-$t ;& cve-*) echo "^References:.*$t" ;; # looks like a hash, look for commits [a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]*) echo "^Git-commit:.*$t" ;; # treat rest as a generic reference *) echo "^References:.*$t" ;; esac } check_branch() { verbose=0 if [ "$1" = "-v" ] ; then verbose=1 shift fi branch="$1" found="" missing="" for term in $KBC_CHECK_TERMS ; do git grep -qi "$(term2regex $term)" "remotes/origin/$branch" -- 'patches.*' 2>/dev/null if [ $? -eq 0 ] ; then found="$found $term" else missing="$missing $term" fi done # found if [ -z "$missing" ] ; then return 0 fi # missing if [ -z "$found" ] ; then return 2 fi # partly if [ $verbose -ne 0 ] ; then echo " missing hash:" for hash in $missing ; do echo " $term" done echo fi return 1 } check_parents() { last_branch="" for branch in "$@" ; do check_branch $branch case $? in 0) echo " (found in $branch)" return ;; 1) echo " (partly in $branch)" return ;; *) ;; esac last_branch="$branch" done # not found anywhere echo " (not even in $last_branch)" } grep -w build "$branches" | grep -v -E "^(master|vanilla|linux-next|cve)" | \ while read line ; do line=${line%%\#*} branch=${line%%:*} # empty line or comment if [ -z "$branch" ] ; then continue fi # always check also the _EMBARGO branch as a possible parent parents="${branch}_EMBARGO" set dummy ${line#$branch:} while [ $# -gt 0 ] ; do shift [[ "$1" =~ "merge:" ]] || continue tmp="${1//*merge:-/}" parents="$parents ${tmp//*merge:/}" done printf "%-23s" "$branch" check_branch "$branch" case $? in 0) echo "" ;; 1) echo -n " " check_parents $parents # print missing commits check_branch -v "$branch" ;; *) echo -n "" check_parents "${branch}_EMBARGO" $parents esac done