Make git-mailsplit a builtin
Signed-off-by: Lukas Sandström <lukass@etek.chalmers.se> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
8ed05fb5e9
commit
e690e84315
5
Makefile
5
Makefile
@ -144,7 +144,6 @@ SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH)) \
|
|||||||
|
|
||||||
# The ones that do not have to link with lcrypto, lz nor xdiff.
|
# The ones that do not have to link with lcrypto, lz nor xdiff.
|
||||||
SIMPLE_PROGRAMS = \
|
SIMPLE_PROGRAMS = \
|
||||||
git-mailsplit$X \
|
|
||||||
git-stripspace$X git-daemon$X
|
git-stripspace$X git-daemon$X
|
||||||
|
|
||||||
# ... and all the rest that could be moved out of bindir to gitexecdir
|
# ... and all the rest that could be moved out of bindir to gitexecdir
|
||||||
@ -165,7 +164,7 @@ PROGRAMS = \
|
|||||||
git-describe$X git-merge-tree$X git-blame$X git-imap-send$X
|
git-describe$X git-merge-tree$X git-blame$X git-imap-send$X
|
||||||
|
|
||||||
BUILT_INS = git-log$X git-whatchanged$X git-show$X \
|
BUILT_INS = git-log$X git-whatchanged$X git-show$X \
|
||||||
git-count-objects$X git-diff$X git-push$X \
|
git-count-objects$X git-diff$X git-push$X git-mailsplit$X \
|
||||||
git-grep$X git-add$X git-rm$X git-rev-list$X \
|
git-grep$X git-add$X git-rm$X git-rev-list$X \
|
||||||
git-check-ref-format$X git-rev-parse$X \
|
git-check-ref-format$X git-rev-parse$X \
|
||||||
git-init-db$X git-tar-tree$X git-upload-tar$X git-format-patch$X \
|
git-init-db$X git-tar-tree$X git-upload-tar$X git-format-patch$X \
|
||||||
@ -227,7 +226,7 @@ BUILTIN_OBJS = \
|
|||||||
builtin-read-tree.o builtin-commit-tree.o \
|
builtin-read-tree.o builtin-commit-tree.o \
|
||||||
builtin-apply.o builtin-show-branch.o builtin-diff-files.o \
|
builtin-apply.o builtin-show-branch.o builtin-diff-files.o \
|
||||||
builtin-diff-index.o builtin-diff-stages.o builtin-diff-tree.o \
|
builtin-diff-index.o builtin-diff-stages.o builtin-diff-tree.o \
|
||||||
builtin-cat-file.o
|
builtin-cat-file.o builtin-mailsplit.o
|
||||||
|
|
||||||
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
|
GITLIBS = $(LIB_FILE) $(XDIFF_LIB)
|
||||||
LIBS = $(GITLIBS) -lz
|
LIBS = $(GITLIBS) -lz
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "cache.h"
|
#include "cache.h"
|
||||||
|
#include "builtin.h"
|
||||||
|
|
||||||
static const char git_mailsplit_usage[] =
|
static const char git_mailsplit_usage[] =
|
||||||
"git-mailsplit [-d<prec>] [-f<n>] [-b] -o<directory> <mbox>...";
|
"git-mailsplit [-d<prec>] [-f<n>] [-b] -o<directory> <mbox>...";
|
||||||
@ -102,14 +103,48 @@ static int split_one(FILE *mbox, const char *name, int allow_bare)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, const char **argv)
|
int split_mbox(const char **mbox, const char *dir, int allow_bare, int nr_prec, int skip)
|
||||||
{
|
{
|
||||||
int nr = 0, nr_prec = 4;
|
char *name = xmalloc(strlen(dir) + 2 + 3 * sizeof(skip));
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
while (*mbox) {
|
||||||
|
const char *file = *mbox++;
|
||||||
|
FILE *f = !strcmp(file, "-") ? stdin : fopen(file, "r");
|
||||||
|
int file_done = 0;
|
||||||
|
|
||||||
|
if ( !f ) {
|
||||||
|
error("cannot open mbox %s", file);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fgets(buf, sizeof(buf), f) == NULL) {
|
||||||
|
if (f == stdin)
|
||||||
|
break; /* empty stdin is OK */
|
||||||
|
error("cannot read mbox %s", file);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!file_done) {
|
||||||
|
sprintf(name, "%s/%0*d", dir, nr_prec, ++skip);
|
||||||
|
file_done = split_one(f, name, allow_bare);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (f != stdin)
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
ret = skip;
|
||||||
|
out:
|
||||||
|
free(name);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
int cmd_mailsplit(int argc, const char **argv, char **envp)
|
||||||
|
{
|
||||||
|
int nr = 0, nr_prec = 4, ret;
|
||||||
int allow_bare = 0;
|
int allow_bare = 0;
|
||||||
const char *dir = NULL;
|
const char *dir = NULL;
|
||||||
const char **argp;
|
const char **argp;
|
||||||
static const char *stdin_only[] = { "-", NULL };
|
static const char *stdin_only[] = { "-", NULL };
|
||||||
char *name;
|
|
||||||
|
|
||||||
for (argp = argv+1; *argp; argp++) {
|
for (argp = argv+1; *argp; argp++) {
|
||||||
const char *arg = *argp;
|
const char *arg = *argp;
|
||||||
@ -158,31 +193,9 @@ int main(int argc, const char **argv)
|
|||||||
argp = stdin_only;
|
argp = stdin_only;
|
||||||
}
|
}
|
||||||
|
|
||||||
name = xmalloc(strlen(dir) + 2 + 3 * sizeof(nr));
|
ret = split_mbox(argp, dir, allow_bare, nr_prec, nr);
|
||||||
|
if (ret != -1)
|
||||||
|
printf("%d\n", ret);
|
||||||
|
|
||||||
while (*argp) {
|
return ret == -1;
|
||||||
const char *file = *argp++;
|
|
||||||
FILE *f = !strcmp(file, "-") ? stdin : fopen(file, "r");
|
|
||||||
int file_done = 0;
|
|
||||||
|
|
||||||
if ( !f )
|
|
||||||
die ("cannot open mbox %s", file);
|
|
||||||
|
|
||||||
if (fgets(buf, sizeof(buf), f) == NULL) {
|
|
||||||
if (f == stdin)
|
|
||||||
break; /* empty stdin is OK */
|
|
||||||
die("cannot read mbox %s", file);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (!file_done) {
|
|
||||||
sprintf(name, "%s/%0*d", dir, nr_prec, ++nr);
|
|
||||||
file_done = split_one(f, name, allow_bare);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (f != stdin)
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
printf("%d\n", nr);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
@ -49,4 +49,6 @@ extern int cmd_rev_parse(int argc, const char **argv, char **envp);
|
|||||||
extern int cmd_write_tree(int argc, const char **argv, char **envp);
|
extern int cmd_write_tree(int argc, const char **argv, char **envp);
|
||||||
extern int write_tree(unsigned char *sha1, int missing_ok, const char *prefix);
|
extern int write_tree(unsigned char *sha1, int missing_ok, const char *prefix);
|
||||||
|
|
||||||
|
extern int cmd_mailsplit(int argc, const char **argv, char **envp);
|
||||||
|
extern int split_mbox(const char **mbox, const char *dir, int allow_bare, int nr_prec, int skip);
|
||||||
#endif
|
#endif
|
||||||
|
3
git.c
3
git.c
@ -179,7 +179,8 @@ static void handle_internal_command(int argc, const char **argv, char **envp)
|
|||||||
{ "diff-tree", cmd_diff_tree },
|
{ "diff-tree", cmd_diff_tree },
|
||||||
{ "cat-file", cmd_cat_file },
|
{ "cat-file", cmd_cat_file },
|
||||||
{ "rev-parse", cmd_rev_parse },
|
{ "rev-parse", cmd_rev_parse },
|
||||||
{ "write-tree", cmd_write_tree }
|
{ "write-tree", cmd_write_tree },
|
||||||
|
{ "mailsplit", cmd_mailsplit }
|
||||||
};
|
};
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user