#! /bin/sh -e if [ $# -ne 3 ] || [ ! -f $3 ] || [ ! -d $1 ]; then echo Usage: $0 " " >&2 exit 1 fi # Find dependency $1 in dir $2. find_dep() { find_dep_file="$1" find_dep_dir="$2" # Absolute file path. case "$find_dep_file" in /*) echo "$find_dep_file"; return;; esac # For every dir in file, take one dir off directory. while [ "$(dirname $find_dep_file)" != . ]; do find_dep_dir="$(dirname $find_dep_dir)" find_dep_file="$(dirname $find_dep_file)" done # List all variants from most recent backwards. find_dep_wildcard=$(echo "$find_dep_dir"/"$1" | sed 's/gz//') ls -rt "$find_dep_wildcard"*gz } BASEDIR=$1/linux-$2.$$ # Clean up on exit trap "rm -rf $BASEDIR*" 0 # Create base tree cp -al $1/linux-$2 $BASEDIR # Populate tree with all the dependent patches. for dep in `zcat $3 | grep '^Depends:' | cut -d: -f2-`; do APPLIED=0 for possible_dep in $(find_dep $dep $(dirname $3) ); do if isapplied $BASEDIR $possible_dep >/dev/null || lkpatch $BASEDIR $possible_dep > /dev/null; then APPLIED=1 break fi done if [ $APPLIED -eq 0 ]; then echo Could not apply $dep >&2 exit 1 fi done cp -al $BASEDIR $BASEDIR.updated # Apply this patch if lkpatch --keep-broken $BASEDIR.updated $3; then echo lkpatch succeeded... exit 1 fi emacs `find $BASEDIR.updated -name '*.rej'` NEWPATCH=`echo $3 | sed 's/\.patch\..*$/.patch/'`.$2.gz if [ -f $NEWPATCH ]; then echo -n "$NEWPATCH already exists: overwrite? [Y/n] " read REPLY case "$REPLY" in N*|n*) exit 1;; esac fi # Copy patch preample, and append diff. (zcat $3 | grep '^\([^-+ ]\+:\|$\)'; cd $(dirname $BASEDIR); kerndiff $(basename $BASEDIR) $(basename $BASEDIR).updated) | gzip -9 > $NEWPATCH echo Created $NEWPATCH.