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:
10
applypatch
10
applypatch
@ -7,11 +7,10 @@
|
|||||||
## The arguments are:
|
## The arguments are:
|
||||||
## $1 - file with commit message
|
## $1 - file with commit message
|
||||||
## $2 - file with the actual patch
|
## $2 - file with the actual patch
|
||||||
## $3 - file with list of filenames the patch touches
|
## $3 - "info" file with Author, email and subject
|
||||||
## $4 - "info" file with Author, email and subject
|
## $4 - optional file containing signoff to add
|
||||||
## $5 - optional file containing signoff to add
|
|
||||||
##
|
##
|
||||||
signoff="$5"
|
signoff="$4"
|
||||||
final=.dotest/final-commit
|
final=.dotest/final-commit
|
||||||
##
|
##
|
||||||
## If this file exists, we ask before applying
|
## If this file exists, we ask before applying
|
||||||
@ -19,8 +18,7 @@ final=.dotest/final-commit
|
|||||||
query_apply=.dotest/.query_apply
|
query_apply=.dotest/.query_apply
|
||||||
MSGFILE=$1
|
MSGFILE=$1
|
||||||
PATCHFILE=$2
|
PATCHFILE=$2
|
||||||
FILES=$3
|
INFO=$3
|
||||||
INFO=$4
|
|
||||||
EDIT=${VISUAL:-$EDITOR}
|
EDIT=${VISUAL:-$EDITOR}
|
||||||
EDIT=${EDIT:-vi}
|
EDIT=${EDIT:-vi}
|
||||||
|
|
||||||
|
4
dotest
4
dotest
@ -19,9 +19,9 @@ esac
|
|||||||
mailsplit $1 .dotest || exit 1
|
mailsplit $1 .dotest || exit 1
|
||||||
for i in .dotest/*
|
for i in .dotest/*
|
||||||
do
|
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
|
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=$?
|
ret=$?
|
||||||
if [ $ret -ne 0 ]; then
|
if [ $ret -ne 0 ]; then
|
||||||
# 2 is a special exit code from applypatch to indicate that
|
# 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 <string.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
|
||||||
static FILE *cmitmsg, *patchfile, *filelist;
|
static FILE *cmitmsg, *patchfile;
|
||||||
|
|
||||||
static char line[1000];
|
static char line[1000];
|
||||||
static char date[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)
|
static void handle_rest(void)
|
||||||
{
|
{
|
||||||
char *sub = cleanup_subject(subject);
|
char *sub = cleanup_subject(subject);
|
||||||
@ -231,14 +192,9 @@ static void handle_rest(void)
|
|||||||
FILE *out = cmitmsg;
|
FILE *out = cmitmsg;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
/* Track filename information from the patch.. */
|
if (!memcmp("diff -", line, 6) ||
|
||||||
if (!memcmp("---", line, 3)) {
|
!memcmp("---", line, 3))
|
||||||
out = patchfile;
|
out = patchfile;
|
||||||
show_filename(line+3);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!memcmp("+++", line, 3))
|
|
||||||
show_filename(line+3);
|
|
||||||
|
|
||||||
fputs(line, out);
|
fputs(line, out);
|
||||||
} while (fgets(line, sizeof(line), stdin) != NULL);
|
} while (fgets(line, sizeof(line), stdin) != NULL);
|
||||||
@ -283,13 +239,13 @@ static void handle_body(void)
|
|||||||
|
|
||||||
static void usage(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);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char ** argv)
|
int main(int argc, char ** argv)
|
||||||
{
|
{
|
||||||
if (argc != 4)
|
if (argc != 3)
|
||||||
usage();
|
usage();
|
||||||
cmitmsg = fopen(argv[1], "w");
|
cmitmsg = fopen(argv[1], "w");
|
||||||
if (!cmitmsg) {
|
if (!cmitmsg) {
|
||||||
@ -301,11 +257,6 @@ 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) {
|
||||||
|
Reference in New Issue
Block a user