Avoid doing the "filelist" thing, since "git-apply" picks up the files automatically
..and git-apply does a lot better job at it anyway. Also, we break the comment/diff on a line that starts with "diff -", not just on the "---" line. Especially for git diffs, we actually want that line in the diff. (We should probably also break on "Index: ..." followed by "=====")
This commit is contained in:
parent
f48516746f
commit
a196d8d423
10
applypatch
10
applypatch
@ -7,11 +7,10 @@
|
||||
## 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
|
||||
## $5 - optional file containing signoff to add
|
||||
## $3 - "info" file with Author, email and subject
|
||||
## $4 - optional file containing signoff to add
|
||||
##
|
||||
signoff="$5"
|
||||
signoff="$4"
|
||||
final=.dotest/final-commit
|
||||
##
|
||||
## If this file exists, we ask before applying
|
||||
@ -19,8 +18,7 @@ final=.dotest/final-commit
|
||||
query_apply=.dotest/.query_apply
|
||||
MSGFILE=$1
|
||||
PATCHFILE=$2
|
||||
FILES=$3
|
||||
INFO=$4
|
||||
INFO=$3
|
||||
EDIT=${VISUAL:-$EDITOR}
|
||||
EDIT=${EDIT:-vi}
|
||||
|
||||
|
4
dotest
4
dotest
@ -19,9 +19,9 @@ esac
|
||||
mailsplit $1 .dotest || exit 1
|
||||
for i in .dotest/*
|
||||
do
|
||||
mailinfo .dotest/msg .dotest/patch .dotest/file < $i > .dotest/info || exit 1
|
||||
mailinfo .dotest/msg .dotest/patch < $i > .dotest/info || exit 1
|
||||
stripspace < .dotest/msg > .dotest/msg-clean
|
||||
applypatch .dotest/msg-clean .dotest/patch .dotest/file .dotest/info "$2"
|
||||
applypatch .dotest/msg-clean .dotest/patch .dotest/info "$2"
|
||||
ret=$?
|
||||
if [ $ret -ne 0 ]; then
|
||||
# 2 is a special exit code from applypatch to indicate that
|
||||
|
59
mailinfo.c
59
mailinfo.c
@ -7,7 +7,7 @@
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
||||
static FILE *cmitmsg, *patchfile, *filelist;
|
||||
static FILE *cmitmsg, *patchfile;
|
||||
|
||||
static char line[1000];
|
||||
static char date[1000];
|
||||
@ -181,45 +181,6 @@ static void cleanup_space(char *buf)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Hacky hacky. This depends not only on -p1, but on
|
||||
* filenames not having some special characters in them,
|
||||
* like tilde.
|
||||
*/
|
||||
static void show_filename(char *line)
|
||||
{
|
||||
int len;
|
||||
char *name = strchr(line, '/');
|
||||
|
||||
if (!name || !isspace(*line))
|
||||
return;
|
||||
name++;
|
||||
len = 0;
|
||||
for (;;) {
|
||||
unsigned char c = name[len];
|
||||
switch (c) {
|
||||
default:
|
||||
len++;
|
||||
continue;
|
||||
|
||||
case 0: case ' ':
|
||||
case '\t': case '\n':
|
||||
break;
|
||||
|
||||
/* patch tends to special-case these things.. */
|
||||
case '~':
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* remove ".orig" from the end - common patch behaviour */
|
||||
if (len > 5 && !memcmp(name+len-5, ".orig", 5))
|
||||
len -=5;
|
||||
if (!len)
|
||||
return;
|
||||
fprintf(filelist, "%.*s\n", len, name);
|
||||
}
|
||||
|
||||
static void handle_rest(void)
|
||||
{
|
||||
char *sub = cleanup_subject(subject);
|
||||
@ -231,14 +192,9 @@ static void handle_rest(void)
|
||||
FILE *out = cmitmsg;
|
||||
|
||||
do {
|
||||
/* Track filename information from the patch.. */
|
||||
if (!memcmp("---", line, 3)) {
|
||||
if (!memcmp("diff -", line, 6) ||
|
||||
!memcmp("---", line, 3))
|
||||
out = patchfile;
|
||||
show_filename(line+3);
|
||||
}
|
||||
|
||||
if (!memcmp("+++", line, 3))
|
||||
show_filename(line+3);
|
||||
|
||||
fputs(line, out);
|
||||
} while (fgets(line, sizeof(line), stdin) != NULL);
|
||||
@ -283,13 +239,13 @@ static void handle_body(void)
|
||||
|
||||
static void usage(void)
|
||||
{
|
||||
fprintf(stderr, "mailinfo msg-file path-file filelist-file < email\n");
|
||||
fprintf(stderr, "mailinfo msg-file path-file < email\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
if (argc != 4)
|
||||
if (argc != 3)
|
||||
usage();
|
||||
cmitmsg = fopen(argv[1], "w");
|
||||
if (!cmitmsg) {
|
||||
@ -301,11 +257,6 @@ 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) {
|
||||
|
Loading…
Reference in New Issue
Block a user