Signed-off-by: Lukas Sandström <lukass@xxxxxxxxxxxxxxxx> --- Makefile | 5 +-- mailsplit.c => builtin-mailsplit.c | 71 +++++++++++++++++++++--------------- builtin.h | 2 + git.c | 3 +- 4 files changed, 48 insertions(+), 33 deletions(-) diff --git a/Makefile b/Makefile index 37b5e40..7bee30d 100644 --- a/Makefile +++ b/Makefile @@ -144,7 +144,6 @@ SCRIPTS = $(patsubst %.sh,%,$(SCRIPT_SH) # The ones that do not have to link with lcrypto, lz nor xdiff. SIMPLE_PROGRAMS = \ - git-mailsplit$X \ git-stripspace$X git-daemon$X # ... 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 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-check-ref-format$X git-rev-parse$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-apply.o builtin-show-branch.o builtin-diff-files.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) LIBS = $(GITLIBS) -lz diff --git a/mailsplit.c b/builtin-mailsplit.c similarity index 85% rename from mailsplit.c rename to builtin-mailsplit.c index 70a569c..e2a0058 100644 --- a/mailsplit.c +++ b/builtin-mailsplit.c @@ -12,6 +12,7 @@ #include <sys/stat.h> #include <string.h> #include <stdio.h> #include "cache.h" +#include "builtin.h" static const char git_mailsplit_usage[] = "git-mailsplit [-d<prec>] [-f<n>] [-b] -o<directory> <mbox>..."; @@ -102,14 +103,48 @@ static int split_one(FILE *mbox, const c 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; const char *dir = NULL; const char **argp; static const char *stdin_only[] = { "-", NULL }; - char *name; for (argp = argv+1; *argp; argp++) { const char *arg = *argp; @@ -158,31 +193,9 @@ int main(int argc, const char **argv) argp = stdin_only; } - name = xmalloc(strlen(dir) + 2 + 3 * sizeof(nr)); - - while (*argp) { - 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); - } + ret = split_mbox(argp, dir, allow_bare, nr_prec, nr); + if (ret != -1) + printf("%d\n", ret); - printf("%d\n", nr); - return 0; + return ret == -1; } diff --git a/builtin.h b/builtin.h index 885422e..92e1e1b 100644 --- a/builtin.h +++ b/builtin.h @@ -49,4 +49,6 @@ extern int cmd_rev_parse(int argc, const 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 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 diff --git a/git.c b/git.c index 5868fb9..3264c65 100644 --- a/git.c +++ b/git.c @@ -179,7 +179,8 @@ static void handle_internal_command(int { "diff-tree", cmd_diff_tree }, { "cat-file", cmd_cat_file }, { "rev-parse", cmd_rev_parse }, - { "write-tree", cmd_write_tree } + { "write-tree", cmd_write_tree }, + { "mailsplit", cmd_mailsplit } }; int i; -- 1.4.0 - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html