#!/bin/bash -eu
#
# Script to reproduce a test failure from a dejagnu .log file.
#
# Contributed by Diego Novillo <dnovillo@google.com>
#
# Copyright (C) 2011, 2012, 2013 Free Software Foundation, Inc.
#
# This file is part of GCC.
#
# GCC is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3, or (at your option)
# any later version.
#
# GCC is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING.  If not, write to
# the Free Software Foundation, 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.

# This script will search a line starting with 'spawn' that includes the
# pattern you are looking for (typically a source file name).
#
# Once it finds that pattern, it re-executes the whole command
# in the spawn line.  If the pattern matches more than one spawn
# command, it asks which one you want.

if [ $# -lt 2 ] ; then
    echo "usage: $0 [--debug|--debug-tui] pattern file.log [additional-args]"
    echo
    echo "Finds the 'spawn' line matching PATTERN in FILE.LOG and executes"
    echo "the command with any arguments in ADDITIONAL-ARGS."
    echo
    echo "If --debug is used, the compiler is invoked with -wrapper gdb,--args"
    echo "If --debug-tui is used, the compiler is invoked with -wrapper "\
         "gdb,--tui,--args"
    exit 1
fi

if [ "$1" = "--debug" ] ; then
    debug_args="-wrapper gdb,--args"
    shift
elif [ "$1" = "--debug-tui" ] ; then
    debug_args="-wrapper gdb,--tui,--args"
    shift
else
    debug_args=""
fi
pattern="$1"
logf="$2"
shift 2

# Find the commands in LOGF that reference PATTERN.
lines=$(grep -E "^spawn .*$pattern" $logf \
        | sed -e 's/^spawn -ignore SIGHUP //' \
        | sed -e 's/^spawn //')
if [ -z "$lines" ] ; then
    echo "Could not find a spawn command for pattern $pattern"
    exit 1
fi

# Collect all the command lines into the COMMANDS array.
old_IFS="$IFS"
IFS=""
num_lines=0
for line in $lines ; do
    num_lines=$[$num_lines + 1]
    echo "[$num_lines] $line"
    commands[$num_lines]=$line
done

# If we found more than one line for PATTERN, ask which one we should run.
cmds_to_run='0'
if [ $num_lines -gt 1 ] ; then
    echo
    echo
    echo -n "Enter the list of commands to run or '0' to run them all: "
    read cmds_to_run
fi
if [ "$cmds_to_run" = "0" ] ; then
    cmds_to_run=$(seq 1 $num_lines)
fi
IFS="$old_IFS"

# Finally, execute all the commands we were told to execute.
for cmd_num in $cmds_to_run ; do
    cmd=${commands[$cmd_num]}
    set -x +e
    $cmd $debug_args "$@"
    set +x -e
done
