From: Linus Torvalds Date: Tue, 12 Apr 2005 08:40:20 +0000 (-0700) Subject: Add "applypatch" and "dotest" scripts to tie it all together. X-Git-Tag: v0.99.2~51^2~20 X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=853916ff7f1a5b34bd2728fe81059e6270bac134;p=git.git Add "applypatch" and "dotest" scripts to tie it all together. This should be getting it all pretty close to a working setup. --- diff --git a/Makefile b/Makefile index 3c518bac..eca3a5d5 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 00000000..2791d913 --- /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 00000000..7d2c16b9 --- /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 1ca554e9..c1dcac13 100644 --- a/mailinfo.c +++ b/mailinfo.c @@ -7,7 +7,7 @@ #include #include -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) {