Merge branch 'eb/quilt'
* eb/quilt: Implement a --dry-run option to git-quiltimport Implement git-quiltimport
This commit is contained in:
commit
667661d46e
61
Documentation/git-quiltimport.txt
Normal file
61
Documentation/git-quiltimport.txt
Normal file
@ -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
Makefile
2
Makefile
@ -125,7 +125,7 @@ SCRIPT_SH = \
|
|||||||
git-applymbox.sh git-applypatch.sh git-am.sh \
|
git-applymbox.sh git-applypatch.sh git-am.sh \
|
||||||
git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \
|
git-merge.sh git-merge-stupid.sh git-merge-octopus.sh \
|
||||||
git-merge-resolve.sh git-merge-ours.sh \
|
git-merge-resolve.sh git-merge-ours.sh \
|
||||||
git-lost-found.sh
|
git-lost-found.sh git-quiltimport.sh
|
||||||
|
|
||||||
SCRIPT_PERL = \
|
SCRIPT_PERL = \
|
||||||
git-archimport.perl git-cvsimport.perl git-relink.perl \
|
git-archimport.perl git-cvsimport.perl git-relink.perl \
|
||||||
|
118
git-quiltimport.sh
Executable file
118
git-quiltimport.sh
Executable file
@ -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
|
Loading…
Reference in New Issue
Block a user