Add "applypatch" and "dotest" scripts to tie it all together.
This should be getting it all pretty close to a working setup.maint
parent
2744b2344d
commit
853916ff7f
2
Makefile
2
Makefile
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
14
mailinfo.c
14
mailinfo.c
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue