Add "applypatch" and "dotest" scripts to tie it all together.

This should be getting it all pretty close to a working setup.
maint
Linus Torvalds 2005-04-12 01:40:20 -07:00
parent 2744b2344d
commit 853916ff7f
4 changed files with 63 additions and 5 deletions

View File

@ -3,7 +3,7 @@ CFLAGS=-Wall -O2
HOME=$(shell echo $$HOME) HOME=$(shell echo $$HOME)


PROGRAMS=mailsplit mailinfo PROGRAMS=mailsplit mailinfo
SCRIPTS= SCRIPTS=dotest applypatch


all: $(PROGRAMS) all: $(PROGRAMS)



35
applypatch Executable file
View File

@ -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

17
dotest Executable file
View File

@ -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

View File

@ -7,7 +7,7 @@
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>


static FILE *cmitmsg, *patchfile; static FILE *cmitmsg, *patchfile, *filelist;


static char line[1000]; static char line[1000];
static char name[1000]; static char name[1000];
@ -195,6 +195,7 @@ static void show_filename(char *line)
case '\t': case '\n': case '\t': case '\n':
break; break;


/* patch tends to special-case these things.. */
case '~': case '~':
break; break;
} }
@ -205,7 +206,7 @@ static void show_filename(char *line)
len -=5; len -=5;
if (!len) if (!len)
return; return;
printf("filename: %.*s\n", len, name); fprintf(filelist, "%.*s\n", len, name);
} }


static void handle_rest(void) static void handle_rest(void)
@ -270,13 +271,13 @@ static void handle_body(void)


static void usage(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); exit(1);
} }


int main(int argc, char ** argv) int main(int argc, char ** argv)
{ {
if (argc != 3) if (argc != 4)
usage(); usage();
cmitmsg = fopen(argv[1], "w"); cmitmsg = fopen(argv[1], "w");
if (!cmitmsg) { if (!cmitmsg) {
@ -288,6 +289,11 @@ int main(int argc, char ** argv)
perror(argv[2]); perror(argv[2]);
exit(1); exit(1);
} }
filelist = fopen(argv[3], "w");
if (!filelist) {
perror(argv[3]);
exit(1);
}
while (fgets(line, sizeof(line), stdin) != NULL) { while (fgets(line, sizeof(line), stdin) != NULL) {
int len = eatspace(line); int len = eatspace(line);
if (!len) { if (!len) {