Skip to content

Commit

Permalink
Merge branch 'eb/quilt'
Browse files Browse the repository at this point in the history
* eb/quilt:
  Implement a --dry-run option to git-quiltimport
  Implement git-quiltimport
  • Loading branch information
Junio C Hamano committed May 19, 2006
2 parents 12bb203 + d3bd4ee commit 667661d
Show file tree
Hide file tree
Showing 3 changed files with 180 additions and 1 deletion.
61 changes: 61 additions & 0 deletions Documentation/git-quiltimport.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
git-quiltimport(1)
================

NAME
----
git-quiltimport - Applies a quilt patchset onto the current branch


SYNOPSIS
--------
[verse]
'git-quiltimport' [--dry-run] [--author <author>] [--patches <dir>]


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
-------
--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 <Author Email>::
The author name and email address to use when no author
information can be found in the patch description.

--patches <dir>::
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 <ebiederm@lnxi.com>

Documentation
--------------
Documentation by Eric Biederman <ebiederm@lnxi.com>

GIT
---
Part of the gitlink:git[7] suite

2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down
118 changes: 118 additions & 0 deletions git-quiltimport.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
#!/bin/sh
USAGE='--dry-run --author <author> --patches </path/to/quilt/patch/directory>'
SUBDIRECTORY_ON=Yes
. git-sh-setup

dry_run=""
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
;;

--dry-run)
shift
dry_run=1
;;

--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";
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
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

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

0 comments on commit 667661d

Please sign in to comment.