This patch is the first step towards the introduction of a framework to allow git-am to import patches not in mailbox format. Currently detected formats are * the mailbox format itself, which is assumed by default if input is form stdin * Mercurial's output from 'hg export' * Stacked Git's output from 'stg export' with the default export template; StGIT patch series are also detected and expanded. Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@xxxxxxxxx> --- git-am.sh | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 105 insertions(+), 3 deletions(-) diff --git a/git-am.sh b/git-am.sh index 578780b..3508b7e 100755 --- a/git-am.sh +++ b/git-am.sh @@ -274,10 +274,112 @@ else done shift fi - git mailsplit -d"$prec" -o"$dotest" -b -- "$@" > "$dotest/last" || { - rm -fr "$dotest" + + # format of the patch(es) to be processed. we assume they are all + # of the same kind + patch_format=none + + # from stdin we only accept mboxes, because peeking at stdin + # to detect the format is destructive + case $# in + 0) + patch_format=mbox + ;; + 1) + if test x"$1" = x"-" + then + # stdin, so assume mbox + patch_format=mbox + else +# a single non-stdin argument was passed, check if it's a StGit patch series +# index by checking if the first line begins with '# This series' + { + read l1 + case "$l1" in + '# This series '*) +# replace the argument list with the files listed in the series index, +# prefixing them with the series index dirname, skipping comment lines + series_dir=`dirname "$1"` + while read filename + do + set "$@" "$series_dir/$filename" + done + # remove the series index name + shift + # set the patch format appropriately + patch_format=stgit + ;; + *) + ;; + esac + } < "$1" + fi + ;; + *) + ;; + esac + + # if the format is not defined yet, we can look at the first patch + # (which is not stdin) to try to understand the format. + if test $patch_format = none + then + echo "$patch_format" + # if it's a directory, assume mbox format + # TODO we could suppot StGIT patch series here too + if test -d "$1" + then + patch_format=mbox + else + # read the first four lines + { + read l1 + read l2 + read l3 + read l4 + } < "$1" + case "$l1" in + "# HG changeset patch") + patch_format=hg + ;; + From\ *) + patch_format=mbox + ;; + From:\ *) + patch_format=mbox + ;; + *) + # if the second and fourth lines are empty, + # this might be an StGIT patch + if test x"$l2$l4" = x + then + case "$l3" in + From:\ *) + patch_format=stgit + ;; + Author:\ *) + patch_format=stgit + ;; + *) + ;; + esac + fi + ;; + esac + fi + fi + + case "$patch_format" in + mbox) + git mailsplit -d"$prec" -o"$dotest" -b -- "$@" > "$dotest/last" || { + rm -fr "$dotest" + exit 1 + } + ;; + *) + echo "Patch format $patch_format is not currently handled, sorry" exit 1 - } + ;; + esac # -s, -u, -k, --whitespace, -3, -C and -p flags are kept # for the resuming session after a patch failure. -- 1.6.3.1.245.g4529.dirty -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html