Hi I've attached a new patchfs module which has the following changes: 1. Handles patches than were done on file(s) and not just directories 2. Only (and explicitly) handles unified format patches 3. Only creates the SUMMARY file when required (it was previously FILELIST)
comments appreciated. cheers, Padraig.
#! /bin/sh # Peter Daum <[EMAIL PROTECTED]> (Jan 1998, mc-4.1.22) # # Initial implementation. # # Padraig Brady <[EMAIL PROTECTED]> (May 2002, mc-4.5.51) # # Added support for unified diffs of files and not just directories, # i.e. when there is no "diff date file1 file2" line. Note patchfs # does not support context or "default" format diffs at present, # only unified format. Also cleaned up, and only displayed the # special file SUMMARY when required (it wa origonally called FILELIST). # # override any locale for dates. But LANG override LC_TIME (at least in glibc) # unset LC_ALL # LC_TIME=C # export LC_TIME LC_ALL=C export LC_ALL filelist=SUMMARY # names for "special" files patchfs_list () { date=`date +"%b %d %H:%M"` perm="-r--r--r--" uid=00000000 gid=00000000 size=00000000 nlink=" 1" if ! $cat $1 | grep -q '^+++'; then #don't display anything if not unified diff echo "$perm $nlink $uid $gid $size $date ERROR-NOT-IN-UNIFIED-FORMAT" exit 1 fi if $cat $1 | grep -Eq '^\+\+\+ [^ ]+/[^ ]+'; then #files in different dirs, so summarise echo "$perm $nlink $uid $gid $size $date $filelist" fi $cat $1 | sed -n "s/^+++ \([^ ]*\).*/$perm $nlink $uid $gid $size $date \1/gp" } patchfs_copyout () { if [ "$2" = "ERROR-NOT-IN-UNIFIED-FORMAT" ]; then exit 1 fi if [ "$2" = "$filelist" ]; then # list of all affected files $cat $1 | sed -n "s/^+++ \([^ ]*\).*/\1/gp" > $3 exit 0 fi fn=`echo $2 | sed 's|/|\\\/|g'` # escape '/' in filename $cat $1 | sed -e '/^diff /d' | sed -ne "/^+++ .*$fn/,/^--- /{ /^--- /d p }" > $3 } patchfs_run () { exit 0 } type=`file $2` case $type in *bzip*) cat="bzip2 -dc" ;; *gzip*) cat="gzip -dc" ;; *text*) cat="cat" ;; *) exit 1 esac umask 077 case "$1" in list) patchfs_list $2; exit 0;; copyout) patchfs_copyout $2 $3 $4; exit 0;; run) patchfs_run; exit 0;; esac exit 1