From d3d8f361a8c6beb5647e0d963a1460a505324494 Mon Sep 17 00:00:00 2001 From: "Eric W. Biederman" Date: Wed, 17 May 2006 12:44:40 -0600 Subject: [PATCH 1/2] Implement git-quiltimport Importing a quilt patch series into git is not very difficult but parsing the patch descriptions and all of the other minutia take a bit of effort to get right, so this automates it. Since git and quilt complement each other it makes sense to make it easy to go back and forth between the two. If a patch is encountered that it cannot derive the author from the user is asked. Signed-off-by: Junio C Hamano --- Documentation/git-quiltimport.txt | 55 ++++++++++++++++ Makefile | 2 +- git-quiltimport.sh | 106 ++++++++++++++++++++++++++++++ 3 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 Documentation/git-quiltimport.txt create mode 100755 git-quiltimport.sh diff --git a/Documentation/git-quiltimport.txt b/Documentation/git-quiltimport.txt new file mode 100644 index 000000000..c66c82c61 --- /dev/null +++ b/Documentation/git-quiltimport.txt @@ -0,0 +1,55 @@ +git-quiltimport(1) +================ + +NAME +---- +git-quiltimport - Applies a quilt patchset onto the current branch + + +SYNOPSIS +-------- +[verse] +'git-quiltimport' [--author ] [--patches ] + + +DESCRIPTION +----------- +Applies a quilt patchset onto the current git branch, preserving +the patch boundaries, patch order, and patch descriptions present +in the quilt patchset. + +For each patch the code attempts to extract the author from the +patch description. If that fails it falls back to the author +specified with --author. If the --author flag was not given +the patch description is displayed and the user is asked to +interactively enter the author of the patch. + +If a subject is not found in the patch description the patch name is +preserved as the 1 line subject in the git description. + +OPTIONS +------- +--author Author Name :: + The author name and email address to use when no author + information can be found in the patch description. + +--patches :: + The directory to find the quilt patches and the + quilt series file. + + The default for the patch directory is patches + or the value of the $QUILT_PATCHES environment + variable. + +Author +------ +Written by Eric Biederman + +Documentation +-------------- +Documentation by Eric Biederman + +GIT +--- +Part of the gitlink:git[7] suite + diff --git a/Makefile b/Makefile index 2149fb8ce..549f953b7 100644 --- a/Makefile +++ b/Makefile @@ -125,7 +125,7 @@ SCRIPT_SH = \ git-applymbox.sh git-applypatch.sh git-am.sh \ git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \ git-merge-resolve.sh git-merge-ours.sh \ - git-lost-found.sh + git-lost-found.sh git-quiltimport.sh SCRIPT_PERL = \ git-archimport.perl git-cvsimport.perl git-relink.perl \ diff --git a/git-quiltimport.sh b/git-quiltimport.sh new file mode 100755 index 000000000..dd4a198fb --- /dev/null +++ b/git-quiltimport.sh @@ -0,0 +1,106 @@ +#!/bin/sh +USAGE='--author --patches ' +SUBDIRECTORY_ON=Yes +. git-sh-setup + +quilt_author="" +while case "$#" in 0) break;; esac +do + case "$1" in + --au=*|--aut=*|--auth=*|--autho=*|--author=*) + quilt_author=$(expr "$1" : '-[^=]*\(.*\)') + shift + ;; + + --au|--aut|--auth|--autho|--author) + case "$#" in 1) usage ;; esac + shift + quilt_author="$1" + shift + ;; + + --pa=*|--pat=*|--patc=*|--patch=*|--patche=*|--patches=*) + QUILT_PATCHES=$(expr "$1" : '-[^=]*\(.*\)') + shift + ;; + + --pa|--pat|--patc|--patch|--patche|--patches) + case "$#" in 1) usage ;; esac + shift + QUILT_PATCHES="$1" + shift + ;; + + *) + break + ;; + esac +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 "malformatted --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 + +# Temporay directories +tmp_dir=.dotest +tmp_msg="$tmp_dir/msg" +tmp_patch="$tmp_dir/patch" +tmp_info="$tmp_dir/info" + + +# Find the intial commit +commit=$(git-rev-parse HEAD) + +mkdir $tmp_dir || exit 2 +for patch_name in $(cat "$QUILT_PATCHES/series" | grep -v '^#'); do + echo $patch_name + (cat $QUILT_PATCHES/$patch_name | git-mailinfo "$tmp_msg" "$tmp_patch" > "$tmp_info") || exit 3 + + # Parse the author information + export GIT_AUTHOR_NAME=$(sed -ne 's/Author: //p' "$tmp_info") + export GIT_AUTHOR_EMAIL=$(sed -ne 's/Email: //p' "$tmp_info") + 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"; + else + echo "No author found in $patch_name"; + echo "---" + cat $tmp_msg + echo -n "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 + export GIT_AUTHOR_DATE=$(sed -ne 's/Date: //p' "$tmp_info") + export SUBJECT=$(sed -ne 's/Subject: //p' "$tmp_info") + if [ -z "$SUBJECT" ] ; then + SUBJECT=$(echo $patch_name | sed -e 's/.patch$//') + fi + + git-apply --index -C1 "$tmp_patch" && + tree=$(git-write-tree) && + commit=$((echo "$SUBJECT"; echo; cat "$tmp_msg") | git-commit-tree $tree -p $commit) && + git-update-ref HEAD $commit || exit 4 +done +rm -rf $tmp_dir || exit 5 From d3bd4ee1a5cc771b86f73dd0f4a2bea6f652b20a Mon Sep 17 00:00:00 2001 From: "Eric W. Biederman" Date: Wed, 17 May 2006 14:10:25 -0600 Subject: [PATCH 2/2] Implement a --dry-run option to git-quiltimport Since large quilt trees like -mm can easily have patches without clear authorship information, add a --dry-run option to make the problem patches easy to find. Signed-off-by: Junio C Hamano --- Documentation/git-quiltimport.txt | 8 +++++++- git-quiltimport.sh | 24 ++++++++++++++++++------ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/Documentation/git-quiltimport.txt b/Documentation/git-quiltimport.txt index c66c82c61..6e9a8c369 100644 --- a/Documentation/git-quiltimport.txt +++ b/Documentation/git-quiltimport.txt @@ -9,7 +9,7 @@ git-quiltimport - Applies a quilt patchset onto the current branch SYNOPSIS -------- [verse] -'git-quiltimport' [--author ] [--patches ] +'git-quiltimport' [--dry-run] [--author ] [--patches ] DESCRIPTION @@ -29,6 +29,12 @@ preserved as the 1 line subject in the git description. OPTIONS ------- +--dry-run:: + Walk through the patches in the series and warn + if we cannot find all of the necessary information to commit + a patch. At the time of this writing only missing author + information is warned about. + --author Author Name :: The author name and email address to use when no author information can be found in the patch description. diff --git a/git-quiltimport.sh b/git-quiltimport.sh index dd4a198fb..12d9d0cbc 100755 --- a/git-quiltimport.sh +++ b/git-quiltimport.sh @@ -1,8 +1,9 @@ #!/bin/sh -USAGE='--author --patches ' +USAGE='--dry-run --author --patches ' SUBDIRECTORY_ON=Yes . git-sh-setup +dry_run="" quilt_author="" while case "$#" in 0) break;; esac do @@ -19,6 +20,11 @@ do shift ;; + --dry-run) + shift + dry_run=1 + ;; + --pa=*|--pat=*|--patc=*|--patch=*|--patche=*|--patches=*) QUILT_PATCHES=$(expr "$1" : '-[^=]*\(.*\)') shift @@ -75,8 +81,12 @@ for patch_name in $(cat "$QUILT_PATCHES/series" | grep -v '^#'); 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"; + echo "No author found in $patch_name" >&2; echo "---" cat $tmp_msg echo -n "Author: "; @@ -98,9 +108,11 @@ for patch_name in $(cat "$QUILT_PATCHES/series" | grep -v '^#'); do SUBJECT=$(echo $patch_name | sed -e 's/.patch$//') fi - git-apply --index -C1 "$tmp_patch" && - tree=$(git-write-tree) && - commit=$((echo "$SUBJECT"; echo; cat "$tmp_msg") | git-commit-tree $tree -p $commit) && - git-update-ref HEAD $commit || exit 4 + if [ -z "$dry_run" ] ; then + git-apply --index -C1 "$tmp_patch" && + tree=$(git-write-tree) && + commit=$((echo "$SUBJECT"; echo; cat "$tmp_msg") | git-commit-tree $tree -p $commit) && + git-update-ref HEAD $commit || exit 4 + fi done rm -rf $tmp_dir || exit 5