Index: Tools/scripts/getpatch.sh =================================================================== --- /dev/null +++ Tools/scripts/getpatch.sh @@ -0,0 +1,177 @@ +#!/bin/sh + +# Copyright (c) 2015 Rodrigo Osorio +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. 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. +# +# THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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. + +XML_URL='https://bugs.freebsd.org/bugzilla/show_bug.cgi?ctype=xml&id=' +GET_URL='https://bz-attachments.freebsd.org/attachment.cgi?id=' + +TEMP_DIR= +PR_DIR= +deprecate=0 +build_path=1 +verbose=0 + +usage() { + echo "usage: getpatch [-dp] tknum tknum ..." + echo " -d : download deprecated patches too" + echo " -p : store the patches in the current dir, instead of the dedicated bug id directory" + echo "use the GETPATCH_DIR variable to define the root location for the downloaded patches" + echo + exit 1 +} + +die() { + echo $@ + erase_env + exit 1 +} + +build_env() { + if [ -z ${TEMP_DIR} ]; then + TEMP_DIR=`mktemp -d -t 'getpatch'` + fi +} + +erase_env() { + if [ ! -z ${TEMP_DIR} ]; then + rm -rf ${TEMP_DIR} >/dev/null 2>&1 + fi +} + +getpatch() { + echo -n " + attachment ${2}-${3} " + if [ $deprecate -eq 1 ] || [ "$1" != "1" ]; then + if [ ! -f "${PR_DIR}${2}-${3}" ]; then + echo -n "download " + fetch --no-verify-peer -o "${PR_DIR}${2}-${3}" "${GET_URL}${2}" > /dev/null 2>&1 + if [ $? -ne 0 ]; then + echo "error" + die "Unable to download ${GET_URL}${2}" + fi + echo "success" + else + echo "is present, skip" + fi + else + echo "is obsolete, skip" + fi +} + +parse_and_fetch(){ + + for patchline in `awk ' + /<\/attachment>/ { IN_ATTACH=0; + printf "%d>%s>%s\n",obsolete, patchid, patchname ; + } + /isobsolete/ || /ispatch/ && IN_ATTACH == 1 { + gsub(/^[ \t]+|[ \t]+$|"/, ""); + split($0,val,"="); + if(val[1] == "isobsolete") + obsolete = val[2]; + } + ( // || // ) && IN_ATTACH == 1 { + gsub(/^[ \t]+|[ \t]+$/, ""); + gsub(/[<]/, ">"); + split($0,val,">"); + if(val[2] == "filename") + patchname=val[3]; + else if(val[2] == "attachid") + patchid=val[3]; + } + /" " "` + done +} + +get_list_of_patches() { + ## Get xml file + PR_ID=$1 + echo "Bug ID: $1" + build_env + fetch --no-verify-peer -o "${TEMP_DIR}/my${1}.xml" "${XML_URL}${1}" > /dev/null 2>&1 + if [ $? -ne 0 ]; then + die "Can't upload ${XML_URL}${1}" + fi + ## Search for error + error_msg=`grep "bug error=" "${TEMP_DIR}/my${1}.xml"` + if [ ! -z "${error_msg}" ]; then + echo " !! Can't recover the bug attachements : " "`echo "${error_msg}" | cut -d '"' -f 2` !!" + return 1 + fi + + PR_DIR=${GETPATCH_DIR%%/} + if [ ${build_path} == 1 ]; then + PR_DIR=${PR_DIR}/${PR_ID}/ + fi + + if [ ! -d ${PR_DIR} ]; then + mkdir -p ${PR_DIR} + if [ $? != 0 ]; then + die "Can't create ${PR_DIR} directory" + fi + fi + + parse_and_fetch "${TEMP_DIR}/my${1}.xml" + echo -n " >> Patches stored in " + realpath ${PR_DIR} + +} + +trap "die 'Interruption caught, exit'" 2 3 6 9 14 15 + +if [ -z ${GETPATCH_DIR} ]; then + GETPATCH_DIR='.' +fi + + + +while getopts ":pd" arg; do + case "$arg" in + d ) deprecate=1 ;; + p ) build_path=0 ;; + * ) usage ;; + esac + shift +done + +if [ "$#" -eq 0 ]; then + usage + exit 1 +fi + +for arg in "$@"; do + if [ -z "`echo "${arg}" | sed 's/[0-9]//g'`" ]; then + get_list_of_patches ${arg} + else + echo "Error: ${arg} isn't a valid PR number" + exit 1 + fi +done +erase_env