#! /bin/sh # patchview, Copyright (C) 2005 Randy Dunlap # License: GPL v2. # # uses patchutils (lsdiff) and tkdiff # returns 'base' function strip_filename() { fn=$1 len=${#fn} fx=$((len - 1)) base="" while [ 1 -eq 1 ]; do if [ ${fn:$fx:1} == "/" ]; then ##fx=$((fx - 1)) base=${fn:0:$fx} break fi fx=$((fx - 1)) if [ $fx -eq 0 ]; then break fi done } force=0 patchfile=$1 srctree=$2 VIEWER="tkdiff" # or maybe "sh -c colordiff" would work if [ "$patchfile" == "-f" ]; then force=1 patchfile=$2 srctree=$3 fi if [ "$patchfile" = "" -o "$srctree" = "" ]; then echo "usage: patchview [-f] patchfile srctree" echo " -f : force tkdiff even if 'patch' has errors" exit 1 fi # setup temp working directory if [ -d ~/tmp ]; then TMPDIR=~/tmp else TMPDIR=/tmp fi WORKDIR=`mktemp -d -p ${TMPDIR}/XXXXXX` || echo "failed mktemp for patch files dir." pfiles=`lsdiff --strip 1 $patchfile` for pf in $pfiles ; do strip_filename $pf # sets 'base' ##echo pf: $pf + basename: $base if [ "$base" != "" ]; then if [ ! -e $WORKDIR/$base ]; then mkdir -p $WORKDIR/$base fi fi cp -a $srctree/$pf $WORKDIR/$pf done patch -p1 -bs -d $WORKDIR < $patchfile sts=$? if [ $sts -ne 0 ] && [ $force -eq 0 ]; then echo "patch errors, use 'patchview -f' to force continuation" rm -rf $WORKDIR exit 1 fi for pf in $pfiles ; do $VIEWER $WORKDIR/$pf.orig $WORKDIR/$pf & done wait # for all viewers to exit rm -rf $WORKDIR