156 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			156 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
| #!/bin/sh
 | |
| OPTIONS_KEEPDASHDASH=
 | |
| OPTIONS_STUCKLONG=
 | |
| OPTIONS_SPEC="\
 | |
| git quiltimport [options]
 | |
| --
 | |
| n,dry-run     dry run
 | |
| author=       author name and email address for patches without any
 | |
| patches=      path to the quilt patches
 | |
| series=       path to the quilt series file
 | |
| keep-non-patch Pass -b to git mailinfo
 | |
| "
 | |
| SUBDIRECTORY_ON=Yes
 | |
| . git-sh-setup
 | |
| 
 | |
| dry_run=""
 | |
| quilt_author=""
 | |
| while test $# != 0
 | |
| do
 | |
| 	case "$1" in
 | |
| 	--author)
 | |
| 		shift
 | |
| 		quilt_author="$1"
 | |
| 		;;
 | |
| 	-n|--dry-run)
 | |
| 		dry_run=1
 | |
| 		;;
 | |
| 	--patches)
 | |
| 		shift
 | |
| 		QUILT_PATCHES="$1"
 | |
| 		;;
 | |
| 	--series)
 | |
| 		shift
 | |
| 		QUILT_SERIES="$1"
 | |
| 		;;
 | |
| 	--keep-non-patch)
 | |
| 		MAILINFO_OPT="-b"
 | |
| 		;;
 | |
| 	--)
 | |
| 		shift
 | |
| 		break;;
 | |
| 	*)
 | |
| 		usage
 | |
| 		;;
 | |
| 	esac
 | |
| 	shift
 | |
| done
 | |
| 
 | |
| # Quilt Author
 | |
| if [ -n "$quilt_author" ] ; then
 | |
| 	quilt_author_name=$(expr "z$quilt_author" : 'z\(.*[^ ]\) *<.*') &&
 | |
| 	quilt_author_email=$(expr "z$quilt_author" : '.*<\([^>]*\)') &&
 | |
| 	test '' != "$quilt_author_name" &&
 | |
| 	test '' != "$quilt_author_email" ||
 | |
| 	die "malformed --author parameter"
 | |
| fi
 | |
| 
 | |
| # Quilt patch directory
 | |
| : ${QUILT_PATCHES:=patches}
 | |
| if ! [ -d "$QUILT_PATCHES" ] ; then
 | |
| 	echo "The \"$QUILT_PATCHES\" directory does not exist."
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| # Quilt series file
 | |
| : ${QUILT_SERIES:=$QUILT_PATCHES/series}
 | |
| if ! [ -e "$QUILT_SERIES" ] ; then
 | |
| 	echo "The \"$QUILT_SERIES\" file does not exist."
 | |
| 	exit 1
 | |
| fi
 | |
| 
 | |
| # Temporary directories
 | |
| tmp_dir="$GIT_DIR"/rebase-apply
 | |
| tmp_msg="$tmp_dir/msg"
 | |
| tmp_patch="$tmp_dir/patch"
 | |
| tmp_info="$tmp_dir/info"
 | |
| 
 | |
| 
 | |
| # Find the initial commit
 | |
| commit=$(git rev-parse HEAD)
 | |
| 
 | |
| mkdir $tmp_dir || exit 2
 | |
| while read patch_name level garbage <&3
 | |
| do
 | |
| 	case "$patch_name" in ''|'#'*) continue;; esac
 | |
| 	case "$level" in
 | |
| 	-p*)	;;
 | |
| 	''|'#'*)
 | |
| 		level=;;
 | |
| 	*)
 | |
| 		echo "unable to parse patch level, ignoring it."
 | |
| 		level=;;
 | |
| 	esac
 | |
| 	case "$garbage" in
 | |
| 	''|'#'*);;
 | |
| 	*)
 | |
| 		echo "trailing garbage found in series file: $garbage"
 | |
| 		exit 1;;
 | |
| 	esac
 | |
| 	if ! [ -f "$QUILT_PATCHES/$patch_name" ] ; then
 | |
| 		echo "$patch_name doesn't exist. Skipping."
 | |
| 		continue
 | |
| 	fi
 | |
| 	echo $patch_name
 | |
| 	git mailinfo $MAILINFO_OPT "$tmp_msg" "$tmp_patch" \
 | |
| 		<"$QUILT_PATCHES/$patch_name" >"$tmp_info" || exit 3
 | |
| 	test -s "$tmp_patch" || {
 | |
| 		echo "Patch is empty.  Was it split wrong?"
 | |
| 		exit 1
 | |
| 	}
 | |
| 
 | |
| 	# Parse the author information
 | |
| 	GIT_AUTHOR_NAME=$(sed -ne 's/Author: //p' "$tmp_info")
 | |
| 	GIT_AUTHOR_EMAIL=$(sed -ne 's/Email: //p' "$tmp_info")
 | |
| 	export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL
 | |
| 	while test -z "$GIT_AUTHOR_EMAIL" && test -z "$GIT_AUTHOR_NAME" ; do
 | |
| 		if [ -n "$quilt_author" ] ; then
 | |
| 			GIT_AUTHOR_NAME="$quilt_author_name";
 | |
| 			GIT_AUTHOR_EMAIL="$quilt_author_email";
 | |
| 		elif [ -n "$dry_run" ]; then
 | |
| 			echo "No author found in $patch_name" >&2;
 | |
| 			GIT_AUTHOR_NAME="dry-run-not-found";
 | |
| 			GIT_AUTHOR_EMAIL="dry-run-not-found";
 | |
| 		else
 | |
| 			echo "No author found in $patch_name" >&2;
 | |
| 			echo "---"
 | |
| 			cat $tmp_msg
 | |
| 			printf "Author: ";
 | |
| 			read patch_author
 | |
| 
 | |
| 			echo "$patch_author"
 | |
| 
 | |
| 			patch_author_name=$(expr "z$patch_author" : 'z\(.*[^ ]\) *<.*') &&
 | |
| 			patch_author_email=$(expr "z$patch_author" : '.*<\([^>]*\)') &&
 | |
| 			test '' != "$patch_author_name" &&
 | |
| 			test '' != "$patch_author_email" &&
 | |
| 			GIT_AUTHOR_NAME="$patch_author_name" &&
 | |
| 			GIT_AUTHOR_EMAIL="$patch_author_email"
 | |
| 		fi
 | |
| 	done
 | |
| 	GIT_AUTHOR_DATE=$(sed -ne 's/Date: //p' "$tmp_info")
 | |
| 	SUBJECT=$(sed -ne 's/Subject: //p' "$tmp_info")
 | |
| 	export GIT_AUTHOR_DATE SUBJECT
 | |
| 	if [ -z "$SUBJECT" ] ; then
 | |
| 		SUBJECT=$(echo $patch_name | sed -e 's/.patch$//')
 | |
| 	fi
 | |
| 
 | |
| 	if [ -z "$dry_run" ] ; then
 | |
| 		git apply --index -C1 ${level:+"$level"} "$tmp_patch" &&
 | |
| 		tree=$(git write-tree) &&
 | |
| 		commit=$( (echo "$SUBJECT"; echo; cat "$tmp_msg") | git commit-tree $tree -p $commit) &&
 | |
| 		git update-ref -m "quiltimport: $patch_name" HEAD $commit || exit 4
 | |
| 	fi
 | |
| done 3<"$QUILT_SERIES"
 | |
| rm -rf $tmp_dir || exit 5
 |