summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-12 01:40:20 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-12 01:40:20 -0700
commit853916ff7f1a5b34bd2728fe81059e6270bac134 (patch)
tree32195815983806b5bbfb708e11fea0ec139d772d
parent2744b2344dc42fa2a1ddf17f4818975cd48f6d42 (diff)
downloadgit-853916ff7f1a5b34bd2728fe81059e6270bac134.tar.gz
Add "applypatch" and "dotest" scripts to tie it all together.
This should be getting it all pretty close to a working setup.
-rw-r--r--Makefile2
-rwxr-xr-xapplypatch35
-rwxr-xr-xdotest17
-rw-r--r--mailinfo.c14
4 files changed, 63 insertions, 5 deletions
diff --git a/Makefile b/Makefile
index 3c518baca9..eca3a5d525 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ CFLAGS=-Wall -O2
HOME=$(shell echo $$HOME)
PROGRAMS=mailsplit mailinfo
-SCRIPTS=
+SCRIPTS=dotest applypatch
all: $(PROGRAMS)
diff --git a/applypatch b/applypatch
new file mode 100755
index 0000000000..2791d9139a
--- /dev/null
+++ b/applypatch
@@ -0,0 +1,35 @@
+#!/bin/sh
+##
+## applypatch takes four file arguments, and uses those to
+## apply the unpacked patch (surprise surprise) that they
+## represent to the current tree.
+##
+## The arguments are:
+## $1 - file with commit message
+## $2 - file with the actual patch
+## $3 - file with list of filenames the patch touches
+## $4 - "info" file with Author, email and subject
+##
+MSGFILE=$1
+PATCHFILE=$2
+FILES=$3
+INFO=$4
+export AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' .dotest/info)"
+export AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' .dotest/info)"
+export SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' .dotest/info)"
+
+echo
+echo Applying $SUBJECT
+echo
+
+(echo "[PATCH] $SUBJECT" ; echo ; cat $MSGFILE ) > .dotest/final-commit
+
+check-files $(cat $FILES) || exit 1
+patch -u --no-backup-if-mismatch -f -p1 --fuzz=0 --input=$PATCHFILE || exit 1
+update-cache --add --remove $(cat $FILES) || exit 1
+tree=$(write-tree) || exit 1
+echo Wrote tree $tree
+commit=$(commit-tree $tree -p $(cat .git/HEAD) < .dotest/final-commit) || exit 1
+echo Committed: $commit
+echo $commit > .git/HEAD
+
diff --git a/dotest b/dotest
new file mode 100755
index 0000000000..7d2c16b9ab
--- /dev/null
+++ b/dotest
@@ -0,0 +1,17 @@
+#!/bin/sh
+##
+## "dotest" is my stupid name for my patch-application script, which
+## I never got around to renaming after I tested it. We're now on the
+## second generation of scripts, still called "dotest".
+##
+## You give it a mbox-format collection of emails, and it will try to
+## apply them to the kernel using "applypatch"
+##
+rm -rf .dotest
+mkdir .dotest
+mailsplit $1 .dotest || exit 1
+for i in .dotest/*
+do
+ mailinfo .dotest/msg .dotest/patch .dotest/file < $i > .dotest/info || exit 1
+ applypatch .dotest/msg .dotest/patch .dotest/file .dotest/info || exit 1
+done
diff --git a/mailinfo.c b/mailinfo.c
index 1ca554e92a..c1dcac1305 100644
--- a/mailinfo.c
+++ b/mailinfo.c
@@ -7,7 +7,7 @@
#include <string.h>
#include <ctype.h>
-static FILE *cmitmsg, *patchfile;
+static FILE *cmitmsg, *patchfile, *filelist;
static char line[1000];
static char name[1000];
@@ -195,6 +195,7 @@ static void show_filename(char *line)
case '\t': case '\n':
break;
+ /* patch tends to special-case these things.. */
case '~':
break;
}
@@ -205,7 +206,7 @@ static void show_filename(char *line)
len -=5;
if (!len)
return;
- printf("filename: %.*s\n", len, name);
+ fprintf(filelist, "%.*s\n", len, name);
}
static void handle_rest(void)
@@ -270,13 +271,13 @@ static void handle_body(void)
static void usage(void)
{
- fprintf(stderr, "mailinfo msg-file path-file < email\n");
+ fprintf(stderr, "mailinfo msg-file path-file filelist-file < email\n");
exit(1);
}
int main(int argc, char ** argv)
{
- if (argc != 3)
+ if (argc != 4)
usage();
cmitmsg = fopen(argv[1], "w");
if (!cmitmsg) {
@@ -288,6 +289,11 @@ int main(int argc, char ** argv)
perror(argv[2]);
exit(1);
}
+ filelist = fopen(argv[3], "w");
+ if (!filelist) {
+ perror(argv[3]);
+ exit(1);
+ }
while (fgets(line, sizeof(line), stdin) != NULL) {
int len = eatspace(line);
if (!len) {