Jeff Mahoney 3dff52
#!/bin/bash
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
URL="https://apibugzilla.suse.com/xmlrpc.cgi"
Jeff Mahoney 3dff52
COMPONENT="Kernel"
Jeff Mahoney 3dff52
COMMENT="This is an automated report for a proactive fix, documented below."
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
handle_one_patch() {
Jeff Mahoney 3dff52
    FILE="$1"
Jeff Mahoney 3dff52
    SUBJ=$(formail -x Subject < "${FILE}")
Jeff Mahoney 3dff52
    BODY="$(formail -I "" < "${FILE}" | awk '/^---/ { exit; }; { print; } ')"
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
    # Use the last available version
Jeff Mahoney 3dff52
    ${BUGZILLA} info -v "${PRODUCT}" > ${tmpdir}/version
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
    if [ $? -ne 0 ]; then
Jeff Mahoney 3dff52
        echo "Could not get versions for ${PRODUCT}." >&2
Jeff Mahoney 3dff52
        echo "This sometimes produces weird connection aborted errors." >&2
Jeff Mahoney 3dff52
        cat ${tmpdir}/version >&2
Jeff Mahoney 3dff52
        exit 1
Jeff Mahoney 3dff52
    fi
Jeff Mahoney 3dff52
Jeff Mahoney d7a9ad
    VERSION=$(grep -v unspecified ${tmpdir}/version | tail -1)
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
    ${BUGZILLA} new -p "${PRODUCT}" -c "${COMPONENT}" -a "${EMAIL}" \
Jeff Mahoney 3dff52
        ${QA_EMAIL} -t "${SUBJ}" -v "${VERSION}" \
Jeff Mahoney 3dff52
        --comment "${COMMENT}" -s "CONFIRMED" \
Joerg Roedel 3ef358
	--keywords Proactive-Upstream-Fix \
Jeff Mahoney 3dff52
	--no-refresh --ids > ${tmpdir}/bugid
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
    if [ $? -ne 0 ]; then
Jeff Mahoney 3dff52
        echo "Bug creation failed for "${FILE}"." >&2
Jeff Mahoney 3dff52
	cat ${tmpdir}/bugid >&2
Jeff Mahoney 3dff52
        exit 1
Jeff Mahoney 3dff52
    fi
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
    read BUGID < ${tmpdir}/bugid
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
    # If we didn't get just a bug number, we got an error
Jeff Mahoney 3dff52
    if [ -z "${BUGID}" -o "${BUGID}" != "${BUGID%[^0-9]}" ]; then
Jeff Mahoney 3dff52
        echo "Bug creation failed for ${FILE}; Errors follow." >&2
Jeff Mahoney 3dff52
        cat ${tmpdir}/bugid >&2
Jeff Mahoney 3dff52
        exit 1
Jeff Mahoney 3dff52
    fi
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
    OLDREFS=$(grep "^References:" "${FILE}"|sed -e 's#References: *##')
Jeff Mahoney 3dff52
    if [ -n "${OLDREFS}" ]; then
Jeff Mahoney 3dff52
        OLDREFS="${OLDREFS} "
Jeff Mahoney 3dff52
    fi
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
    REFERENCE="References: ${OLDREFS}bsc#${BUGID}"
Jeff Mahoney 3dff52
    if [ -n "${MORE_REFERENCES}" ]; then
Jeff Mahoney 3dff52
        REFERENCE="${REFERENCE} ${MORE_REFERENCES}"
Jeff Mahoney 3dff52
    fi
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
    # Update the references header before uploading
Jeff Mahoney 3dff52
    FILENAME="$(basename "${FILE}")"
Jeff Mahoney 3dff52
    grep -v "^References:" "${FILE}" | formail -f -I "${REFERENCE}" \
Jeff Mahoney 3dff52
        > "${tmpdir}/${FILENAME}"
Jeff Mahoney 3dff52
    if [ $? -eq 0 ]; then
Jeff Mahoney 3dff52
        mv "${tmpdir}/${FILENAME}" "${FILE}"
Jeff Mahoney 3dff52
    fi
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
    if [ "${SUBJ}" = "${SUBJ/\[PATCH}" ]; then
Jeff Mahoney 3dff52
            SUBJ="[PATCH] ${SUBJ}"
Jeff Mahoney 3dff52
    fi
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
    ${BUGZILLA} attach --file="${FILE}" -d "${SUBJ}" -t "text/x-patch" \
Jeff Mahoney 3dff52
          --comment "${BODY}" ${BUGID}
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
    echo "Filed report ${BUGID} for ${FILE}"
Jeff Mahoney 3dff52
}
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
usage () {
Jeff Mahoney 3dff52
cat <
Jeff Mahoney 791c92
usage: $(basename $0) [options...] PATCH [PATCH ...]
Jeff Mahoney 3dff52
Options:
Jeff Mahoney 3dff52
    -e | --email <address>
Jeff Mahoney 3dff52
        * Email address to which this report will be assigned
Jeff Mahoney 3dff52
    -p | --product <product>
Jeff Mahoney 3dff52
        * Bugzilla product to fail this report against
Jeff Mahoney 3dff52
    -d | --debug
Jeff Mahoney 3dff52
        * Enable debugging output (also assigns QA contact as you)
Jeff Mahoney 3dff52
    -r | --reference
Jeff Mahoney 3dff52
        * Any additional references to assign to this report,
Jeff Mahoney 3dff52
          e.g. FATE#123456
Jeff Mahoney 3dff52
    -h | --help
Jeff Mahoney 3dff52
    	* Print this message
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
Notes:
Jeff Mahoney 3dff52
  * If no email address specified, the username component of git-config
Jeff Mahoney 3dff52
    user.email will be used with @suse.com appended.
Jeff Mahoney 3dff52
  * If no product is specified, the \$BUGZILLA_PRODUCT variable in
Jeff Mahoney 3dff52
    rpm/config.sh will be used, if present.
Jeff Mahoney 3dff52
  * If the patch already contains references, they will be preserved with
Jeff Mahoney 3dff52
    the bugzilla ID created and any additional references specified with
Jeff Mahoney 3dff52
    --reference appended.  Otherwise, a new References tag will be created.
Jeff Mahoney 3dff52
  * The patch will be updated with new references prior to upload.
Jeff Mahoney 3dff52
  * Use of this script requires a ~/.bugzillarc with the following contents:
Jeff Mahoney 3dff52
    [apibugzilla.suse.com]
Jeff Mahoney 3dff52
    user = <bugzilla username>
Jeff Mahoney 3dff52
    password = <bugzilla password>
Jeff Mahoney 3dff52
    authtype = basic
Jeff Mahoney 3dff52
END
Jeff Mahoney 3dff52
    exit $1
Jeff Mahoney 3dff52
}
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
# Defaults
Jeff Mahoney 3dff52
EMAIL="$(git config user.email)"
Jeff Mahoney 3dff52
if [ "${EMAIL}" != "${EMAIL%%*@suse.com}" ]; then
Jeff Mahoney 3dff52
    EMAIL="${EMAIL%%@*}@suse.com"
Jeff Mahoney 3dff52
fi
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
. $(dirname $0)/../rpm/config.sh
Jeff Mahoney 3dff52
PRODUCT="${BUGZILLA_PRODUCT}"
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
OPTS="$(getopt -o e:p:dr:h --long email:,product:,debug,reference: -n 'bugzilla-upload' -- "$@")"
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
if [ $? -ne 0 ]; then
Jeff Mahoney 3dff52
    echo "" >&2
Jeff Mahoney 3dff52
    usage 1
Jeff Mahoney 3dff52
fi
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
eval set -- "${OPTS}"
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
while true; do
Jeff Mahoney 3dff52
    case "$1" in
Jeff Mahoney 3dff52
    -e | --email)
Jeff Mahoney 3dff52
        EMAIL="$2" ; shift 2 ;;
Jeff Mahoney 3dff52
    -p | --product)
Jeff Mahoney 3dff52
        PRODUCT="$2" ; shift 2 ;;
Jeff Mahoney 3dff52
    -d | --debug)
Jeff Mahoney 3dff52
        DEBUG=true; shift ;;
Jeff Mahoney 3dff52
    -r | --reference)
Jeff Mahoney 3dff52
        MORE_REFERENCES="${MORE_REFERENCES} $2" ; shift 2 ;;
Jeff Mahoney 3dff52
    -h | --help)
Jeff Mahoney 3dff52
        usage 0 ;;
Jeff Mahoney 3dff52
    --)
Jeff Mahoney 3dff52
        shift ; break ;;
Jeff Mahoney 3dff52
    *)
Jeff Mahoney 3dff52
        break ;;
Jeff Mahoney 3dff52
    esac
Jeff Mahoney 3dff52
done
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
if [ "$#" -eq 0 ]; then
Jeff Mahoney 3dff52
	echo "" >&2
Jeff Mahoney 3dff52
	usage 1
Jeff Mahoney 3dff52
fi
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
DEBUG=true
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
if [ -z "${PRODUCT}" ]; then
Jeff Mahoney 3dff52
    cat <<-END >&2
Jeff Mahoney 3dff52
	ERROR: No product specified.
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
	Product may be specified via -p or rpm/config.sh:\$BUGZILLA_PRODUCT
Jeff Mahoney 3dff52
	END
Jeff Mahoney 3dff52
    exit 1
Jeff Mahoney 3dff52
fi
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
if [ -z "${EMAIL}" ]; then
Jeff Mahoney 3dff52
    cat <<-END >&2
Jeff Mahoney 3dff52
	ERROR: No assignee email address specified.
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
	Email may be specified via -e or git-config user.email
Jeff Mahoney 3dff52
	END
Jeff Mahoney 3dff52
fi
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
# Don't spam QA while testing
Jeff Mahoney 3dff52
if [ -n "${DEBUG}" ]; then
Jeff Mahoney 3dff52
    QA_EMAIL="-q ${EMAIL}"
Jeff Mahoney 3dff52
fi
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
DIR="$(realpath "$(dirname "$0")")"
Jeff Mahoney 3dff52
if [ ! -e "${DIR}/bugzilla-cli" ]; then
Jeff Mahoney 3dff52
    echo "Missing ${DIR}/bugzilla-cli" >&2
Jeff Mahoney 3dff52
    exit 1
Jeff Mahoney 3dff52
fi
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
BUGZILLA="${DIR}/bugzilla-cli --bugzilla ${URL} --ensure-logged-in"
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
cleanup () {
Jeff Mahoney 3dff52
    rm -rf ${tmpdir}
Jeff Mahoney 3dff52
}
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
trap cleanup EXIT
Jeff Mahoney 3dff52
tmpdir=$(mktemp -d /tmp/bugzilla.XXXXXX)
Jeff Mahoney 3dff52
Jeff Mahoney 3dff52
for patch in "$@"; do
Jeff Mahoney 3dff52
    handle_one_patch "${patch}"
Jeff Mahoney 3dff52
done