File expand.diff of Package quilt
Index: quilt-0.46/quilt/expand.in
===================================================================
--- /dev/null
+++ quilt-0.46/quilt/expand.in
@@ -0,0 +1,236 @@
+#! @BASH@
+
+# This script is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# See the COPYING and AUTHORS files for more details.
+
+# Read in library functions
+if [ "$(type -t patch_file_name)" != function ]
+then
+ if ! [ -r $QUILT_DIR/scripts/patchfns ]
+ then
+ echo "Cannot read library @SCRIPTS@/patchfns" >&2
+ exit 1
+ fi
+ . $QUILT_DIR/scripts/patchfns
+fi
+
+usage()
+{
+ printf $"Usage: quilt expand [patch]\n"
+ if [ x$1 = x-h ]
+ then
+ printf $"
+Expand the topmost or specified collapsed patch into its individual patches.
+"
+ exit 0
+ else
+ exit 1
+ fi
+}
+
+fill_orig() {
+ local orig=$1 patch exclude
+
+ cp -rld "$QUILT_PC/$combined_patch" "$orig"
+
+ for patch in $(patches_after "$combined_patch")
+ do
+ is_applied "$patch" || break
+ ( cd "$QUILT_PC/$patch" \
+ && find -type f \
+ | xargs -r cp -il --parents --target-directory "$orig" \
+ 2> /dev/null
+ )
+ done
+
+ if [ ${QUILT_PATCHES:0:1} != / ]
+ then
+ exclude="$exclude"'-path "./$QUILT_PATCHES" -prune -o '
+ fi
+ if [ ${QUILT_PC:0:1} != / ]
+ then
+ exclude="$exclude"'-path "./$QUILT_PC" -prune -o '
+ fi
+ eval find $exclude -type f -print \
+ | xargs -r cp -il --parents --target-directory "$orig" \
+ 2> /dev/null
+
+ find "$orig" -size 0 \
+ | xargs -r rm -f
+}
+
+move_pc_dirs() {
+ local pc_dir=$1
+
+ for ((n = 0; n < ${#patches[@]}; n++))
+ do
+ mkdir -p $(dirname "$QUILT_PC/${patches[n]}") \
+ && mv "$pc_dir/${patches[n]}" "$QUILT_PC/${patches[n]}" \
+ || return 1
+ done
+}
+
+expand_in_list() {
+ local series=$1 replace=$2 tmpfile=$(gen_tempfile $series.XXXXXX)
+ awk '
+ /^'"$(quote_re $combined_patch)"'([ \t]|$)/ \
+ { print patches
+ replaced++
+ next }
+ { print }
+ END { exit (replaced != 1) }
+ ' patches="$replace" \
+ < $series > $tmpfile
+ if [ $? = 0 ]
+ then
+ mv $tmpfile $series
+ else
+ rm -f $tmpfile
+ return 1
+ fi
+}
+
+options=`getopt -o h --long help: -- "$@"`
+
+if [ $? -ne 0 ]
+then
+ usage
+fi
+
+eval set -- "$options"
+
+while true
+do
+ case "$1" in
+ -h)
+ usage -h ;;
+ --)
+ shift
+ break ;;
+ esac
+done
+
+if [ $# -gt 1 ]
+then
+ usage
+fi
+
+if [ -n "$1" ]
+then
+ if ! combined_patch=$(find_patch $1)
+ then
+ printf $"Patch %s is not in series file\n" "$1" >&2
+ exit 1
+ fi
+else
+ if ! combined_patch=$(top_patch)
+ then
+ printf $"No patches applied\n" >&2
+ exit 1
+ fi
+fi
+
+combined_series=$(patch_file_name $combined_patch \
+ | sed -e 's:\.gz$::' -e 's:\.bz2$::').series
+
+if ! [ -f "$combined_series" ]
+then
+ printf $"Patch %s is not a combined patch\n" "$(print_patch "$1")"
+ exit 1
+fi
+
+patches=( $(sed -e $'s:[ \t].*::' $combined_series) )
+
+if ! is_applied "$combined_patch"
+then
+ for ((n = 0; n < ${#patches[@]}; n++))
+ do
+ printf $"Applying patch %s\n" "$(print_patch "${patches[n]}")"
+ done
+ if ! expand_in_list "$SERIES" "$(< "$combined_series")"
+ then
+ printf "Expanding %s failed\n" \
+ "$(print_patch "$combined_patch")"
+ exit 1
+ fi
+ exit 0
+fi
+
+for ((n = 0; n < ${#patches[@]}; n++))
+do
+ patch=${patches[n]}
+ if ! [ -e "$(patch_file_name "$patch")" ]
+ then
+ printf $"Component patch %s of %s not found\n" "$patch" \
+ "$(print_patch "$combined_patch")"
+ exit 1
+ fi
+ if is_applied "$patch"
+ then
+ printf $"Component patch %s of %s appears to be applied\n" \
+ "$(print_patch "$patch")" \
+ "$(print_patch "$combined_patch")"
+ exit 1
+ fi
+done
+
+tmpdir=$(gen_tempfile -d $QUILT_PC/expand)
+trap "rm -rf $tmpdir" EXIT
+
+[ "${tmpdir:0:1}" = / ] || tmpdir=$PWD/$tmpdir
+
+fill_orig $tmpdir/orig
+cp -rld $tmpdir/orig $tmpdir/tree
+
+for ((n = 0; n < ${#patches[@]}; n++))
+do
+ patch=${patches[n]}
+ pc_dir=$tmpdir/pc/$patch
+ patch_args=$(SERIES=$combined_series; patch_args $patch)
+
+ printf $"Applying patch %s\n" "$(print_patch "$patch")"
+ if ! cat_file "$(patch_file_name "$patch")" \
+ | patch $QUILT_PATCH_OPTS $patch_args \
+ --backup --prefix="$pc_dir/" \
+ -Efs -d "$tmpdir/tree" >/dev/null
+ then
+ printf $"Patch %s does not apply; aborting expand\n" \
+ "$(print_patch "$patch")"
+ exit 1
+ fi
+ touch $pc_dir/.timestamp
+done
+
+printf $"Verifying against patch %s\n" "$(print_patch "$combined_patch")"
+if ! cat_file "$(patch_file_name "$combined_patch")" \
+ | patch $QUILT_PATCH_OPTS $(patch_args $combined_patch) \
+ --no-backup-if-mismatch -Efs -d "$tmpdir/orig" >/dev/null
+then
+ printf $"Patch %s does not apply; aborting expand\n" \
+ "$(print_patch "combined_patch")"
+ exit 1
+fi
+
+if ! diff -Nqr "$tmpdir/orig" "$tmpdir/tree" > /dev/null
+then
+ diff -Nur "$tmpdir/orig" "$tmpdir/tree"
+ printf $"The patches do not add up to the combined patch\n"
+ exit 1
+fi
+
+if ! move_pc_dirs "$tmpdir/pc" ||
+ ! expand_in_list $DB "$(sed -e $'s:[ \t].*::' "$combined_series")" ||
+ ! expand_in_list "$SERIES" "$(< "$combined_series")" ||
+ ! rm -rf $QUILT_PC/$combined_patch
+then
+ printf "Expanding %s failed\n" "$(print_patch "$combined_patch")"
+ exit 1
+fi
+
+### Local Variables:
+### mode: shell-script
+### End:
+# vim:filetype=sh
Index: quilt-0.46/test/expand.test
===================================================================
--- /dev/null
+++ quilt-0.46/test/expand.test
@@ -0,0 +1,121 @@
+ $ rm -rf d
+ $ mkdir -p d/patches
+ $ cd d
+
+ $ echo not part of any > patch
+ $ echo foo > foo
+ $ echo bar > bar
+ $ echo void > void
+ $ quilt new patch1
+ > Patch patches/patch1 is now on top
+
+ $ quilt add foo
+ > File foo added to patch patches/patch1
+
+ $ echo foo2 > foo
+ $ quilt refresh
+ > Refreshed patch patches/patch1
+
+ $ quilt new subdir/patch2
+ > Patch patches/subdir/patch2 is now on top
+
+ $ quilt add bar void
+ > File bar added to patch patches/subdir/patch2
+ > File void added to patch patches/subdir/patch2
+
+ $ echo bar2 > bar
+ $ rm void
+ $ quilt refresh
+ > Refreshed patch patches/subdir/patch2
+
+ $ quilt diff -p0 --combine - --no-index > patches/combined
+ $ quilt pop -qa
+ > Removing patch patches/subdir/patch2
+ > Removing patch patches/patch1
+ > No patches applied
+
+ $ mv patches/series patches/combined.series
+ $ echo combined -p0 > patches/series
+ $ quilt push -q
+ > Applying patch patches/combined
+ > Now at patch patches/combined
+
+ $ quilt expand
+ > Applying patch patches/patch1
+ > Applying patch patches/subdir/patch2
+ > Verifying against patch patches/combined
+
+ $ quilt series
+ > patches/patch1
+ > patches/subdir/patch2
+
+ $ quilt pop -qaR
+ > Removing patch patches/subdir/patch2
+ > Removing patch patches/patch1
+ > No patches applied
+
+ $ quilt push -qa
+ > Applying patch patches/patch1
+ > Applying patch patches/subdir/patch2
+ > Now at patch patches/subdir/patch2
+
+ $ quilt new patch3
+ > Patch patches/patch3 is now on top
+
+ $ quilt add void
+ > File void added to patch patches/patch3
+
+ $ echo void > void
+ $ quilt refresh -p0
+ > Refreshed patch patches/patch3
+
+ $ mkdir -p patches/subdir2
+ $ quilt diff -p1 --combine - --no-index > patches/subdir2/combined2
+ $ quilt pop -qaR
+ > Removing patch patches/patch3
+ > Removing patch patches/subdir/patch2
+ > Removing patch patches/patch1
+ > No patches applied
+
+ $ mv patches/series patches/subdir2/combined2.series
+ $ echo subdir2/combined2 > patches/series
+ $ quilt push -q
+ > Applying patch patches/subdir2/combined2
+ > Now at patch patches/subdir2/combined2
+
+ $ quilt expand
+ > Applying patch patches/patch1
+ > Applying patch patches/subdir/patch2
+ > Applying patch patches/patch3
+ > Verifying against patch patches/subdir2/combined2
+
+ $ quilt series
+ > patches/patch1
+ > patches/subdir/patch2
+ > patches/patch3
+
+ $ quilt pop -qaR
+ > Removing patch patches/patch3
+ > Removing patch patches/subdir/patch2
+ > Removing patch patches/patch1
+ > No patches applied
+
+ $ cat foo bar void
+ > foo
+ > bar
+ > void
+
+ $ echo subdir2/combined2 > patches/series
+
+ $ quilt expand subdir2/combined2
+ > Applying patch patches/patch1
+ > Applying patch patches/subdir/patch2
+ > Applying patch patches/patch3
+
+ $ quilt series
+ > patches/patch1
+ > patches/subdir/patch2
+ > patches/patch3
+
+ $ cd ..
+ $ rm -rf d