123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156 |
- #!/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
|