#! /bin/bash
# retraces launchpad bugs. ATM it should notice if a bug has to be retraced on
# feisty or on edgy's chroot. By the moment this is done by checking the file
# name of the first attached file in LP bug report. eg:
# _usr_lib_firefox_firefox-bin.1000.crash for edgy's and CoreDump.gz in feistys
# 
# vim:ts=4:sw=4:et:ft=sh
# Created: 2007-02-28
# $Id: retrace_bug.sh,v 1.9 2007/03/25 19:41:19 hjmf Exp $
# $Source: /home/hjmf/bugsquad_dir/dev/RCS/retrace_bug.sh,v $
# $Log: retrace_bug.sh,v $
# Revision 1.9  2007/03/25 19:41:19  hjmf
# *** empty log message ***
#

# some variables:
LAUNCHPAD_BUG_URL='https://launchpad.net/ubuntu/+source/firefox/+bug/'
BASE_DIR="/home/bugsquad/retrace_tmp/" # Should be already each chroots

# Input $@ bugnumbers
BUGNUMBERS=$@
FEISTY_CHROOT_NAME=feisty
EDGY_CHROOT_NAME=edgy
CHROOT_CMD="schroot --chroot="

# "Pluggins"
# Local add-on to check and install reporter's ff version on feisty chroot
# just a draft not enough tested:
HANDLE_FEISTY_FF_VERSIONS=/home/bugsquad/retrace_tmp/handle_ff_versions_feisty.sh
HANDLE_EDGY_FF_VERSIONS=/home/bugsquad/retrace_tmp/handle_ff_versions_edgy.sh

# temporal, test
OTHER_LD_LIBS=${OTHER_LD_LIBS:=/usr/lib/firefox/:/usr/lib/flashplugin-nonfree/}

bug_report_extract_attached_files_urls () { 
    # Gets an array with the urls to the attached files in a crash report from
    # the bug number.
    # Usage: -> bug_report_extract_attached_files_urls "$THIS_BUGNUMBER"
    # Input args:
        local THIS_BUGNUMBER="$1" # Launchpad's bug number  
    # Output: Crash Report(s) URL(s)
    # Returns: 0 always # TODO
    # Global Vars: $LAUNCHPAD_BUG_URL >> url de los informes de error
        local LAUNCHPADBUGURL="$LAUNCHPAD_BUG_URL"
        local CRASH_REPORT_URL # Output: URL1 URL2 URL3 (array)

    
    CRASH_REPORT_URL="$(wget -q -O - "$LAUNCHPADBUGURL/$THIS_BUGNUMBER" | sed -n '/<div class="portletContent">/,/<\div>/ {s@.*\(http://librarian.launchpad.net/.[^" ]*\)\".*@\1 @gp}')"
    echo $CRASH_REPORT_URL
    return 0;
}


# test
for BUGNUMBER in $BUGNUMBERS; do
    # check_bug_distro
    ATTACHMENT_URLS=($(bug_report_extract_attached_files_urls $BUGNUMBER))
    case ${ATTACHMENT_URLS[0]} in
        *crash) echo "$BUGNUMBER    @edgy" >> /home/hjmf/current_bugs_tmp
        WORK_D="$BASE_DIR/e_$BUGNUMBER"; ${CHROOT_CMD}${EDGY_CHROOT_NAME} -- bash -c "
        [ -x ${HANDLE_EDGY_FF_VERSIONS} ] && ${HANDLE_EDGY_FF_VERSIONS} ${BUGNUMBER}
        [ -d ${WORK_D} ] || mkdir -p ${WORK_D}; cd ${WORK_D}
        if ! [ -f $(basename ${ATTACHMENT_URLS[0]}) ]; then wget -c ${ATTACHMENT_URLS[0]}; fi 
        echo $BUGNUMBER...
        export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:$OTHER_LD_LIBS
        apport-retrace -o retraced.crash -d -c -C /tmp/ddebs $(basename ${ATTACHMENT_URLS[0]}) 2>&1 | tee retrace.err;
        sed -n '/^Stacktrace:/,/^ThreadStacktrace:/ {s/^Stacktrace:/--- stack trace ---/;s/^ThreadStacktrace:/--- end of stack trace ---/g;p}' retraced.crash > retraced_Stacktrace.txt
        sed -n '/^ThreadStacktrace:/,$ {p}' retraced.crash > retraced_Thread_Stacktrace.txt

        [ -d unpack ] && rm -fr unpack/ ; apport-unpack retraced.crash unpack # adicional
        "
        ;;

        *CoreDump.gz) echo "$BUGNUMBER  @feisty retrace" >> /home/hjmf/current_bugs_tmp
        WORK_D="$BASE_DIR/f_$BUGNUMBER"; ${CHROOT_CMD}${FEISTY_CHROOT_NAME} -- bash -c "
        [ -x ${HANDLE_FEISTY_FF_VERSIONS} ] && ${HANDLE_FEISTY_FF_VERSIONS} ${BUGNUMBER}
        [ -d ${WORK_D} ] || mkdir -p ${WORK_D}
        cd ${WORK_D}
        echo $BUGNUMBER...
        export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:$OTHER_LD_LIBS
        apport-retrace -s -v -d -C /tmp/ddebs $BUGNUMBER 2> retrace.err > retrace.out
        sed -n '/^--- stack/,/--- thread/ {s/--- thread/--- end of/;p}' retrace.out > retraced_Stacktrace.txt
        sed -n '/^--- thread/,$ {p}' retrace.out > retraced_Thread_Stacktrace.txt"
        ;;

        *) true ;; # TODO HANDLE ERROR  ;;
    esac
done

