#! /bin/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 /usr/share/quilt/scripts/patchfns ]
	then
		echo "Cannot read library /usr/share/quilt/scripts/patchfns" >&2
		exit 1
	fi
	. /usr/share/quilt/scripts/patchfns
fi

usage()
{
	echo $"Usage: quilt import [-f] [-p num] [-n patch] [patchfile]"
	if [ x$1 = x-h ]
	then
		echo $"

Import an external patch.  If a patch file name is specified, the patch
will be stored in this relative path in the patches/ directory.  Else,
if an input file name is given this name is used as the patch name.

-p num
	Number of directory levels to strip when aplying (default=1)

-n patch
	File name relative to patches/ to use.

-f	Overwite/update existing patches.

"
		exit 0
	else
		exit 1
	fi
}

options=`getopt -o fn:p:h -- "$@"`

if [ $? -ne 0 ]
then
        usage
fi

eval set -- "$options"

while true
do
        case "$1" in
        -n)
		opt_patch=$(echo "$2" |
			    sed -e 's/^'"$(quote_bre $QUILT_PATCHES)"'\///' \
			          -e 's/^\$QUILT_PC\///')
		shift 2 ;;
	-p)
		opt_strip=$2
		shift 2 ;;
	-f)
		opt_force=1
		shift ;;
	-h)
		usage -h ;;
        --)
                shift
		break ;;
        esac
done

if [ $# -eq 1 ]
then
	input_file=$1
elif [ $# -gt 1 ]
then
        usage
fi

[ -n "$opt_strip" ] && patch_args="-p$opt_strip"

if [ -n "$opt_patch" ]
then
	patch=$(stripit "$opt_patch")
	patch_file="$QUILT_PATCHES/$opt_patch"
else
	patch="$(stripit "$input_file")"
	if [ -n "$patch" ]
	then
		opt_patch="$patch.patch"
	else
		echo $"Please use -n to specify a patch file name."
		exit 1
	fi
	patch_file="$QUILT_PATCHES/$opt_patch"
fi

if echo "$patch_file" | grep -q -e $'[ \t]'
then
	echo $"Patch file name \"$patch_file\" contains whitespace."
	exit 1
fi

if is_applied $patch
then
	echo $"Patch $patch is applied."
	exit 1
fi

case "$input_file" in
'')
	tmpfile=$(gen_tempfile)
	if ! cat > $tmpfile
	then
		echo $"Cannot read from standard input."
		rm -f $tmpfile
		exit 1
	fi
	input_file=$tmpfile ;;
*.gz)
	tmpfile=$(gen_tempfile)
	if ! gzip -cd "$input_file" > $tmpfile
	then
		echo $"Cannot decompress file $input_file"
		rm -f $tmpfile
		exit 1
	fi
	input_file=$tmpfile ;;
*.bz2)
	tmpfile=$(gen_tempfile)
	if ! bzip2 -cd "$input_file" > $tmpfile
	then
		echo $"Cannot decompress file $input_file"
		rm -f $tmpfile
		exit
	fi
	input_file=$tmpfile ;;
*)
	if ! [ -r "$input_file" ]
	then
		echo $"Cannot read from file $input_file"
		exit 1
	fi
esac

if [ -e "$patch_file" ]
then
	if [ -z "$opt_force" ]
	then
		echo $"Patch $patch exists. Replace with -f."
		exit 1
	fi

	if grep -q '^%patch$' "$patch_file" &&
	   ! grep -q '^%patch$' "$input_file"
	then
		echo $"Updating %patch section of patch $patch"
		if ! /usr/share/quilt/scripts/parse-patch -u patch $patch_file < "$input_file"
		then
			echo $"Failed to update %patch section of patch $patch"
			exit 1
		fi
	else
		echo $"Replacing patch $patch with new version"
		if ! cat "$input_file" > "$patch_file"
		then
			echo $"Failed to replace patch $patch"
			exit 1
		fi
	fi
else
	echo $"Importing patch $patch (stored as $patch_file)"
	if ! grep -q '^%patch$' "$input_file"
	then
		echo "%patch" >> "$patch_file"
	fi
	if ! cat "$input_file" >> "$patch_file"
	then
		echo $"Failed to import patch $patch"
		exit 1
	fi
fi

rm -rf $QUILT_PC/$patch

if ! patch_in_series $patch &&
   ! insert_in_series $opt_patch "$patch_args"
then
	echo $"Failed to insert $patch in file series."
fi

if [ -n "$tmpfile" ]
then
	rm -f $tmpfile
fi
### Local Variables:
### mode: shell-script
### End:
# vim:filetype=sh
