From: "Fernando J. Pereda" <ferdy@gentoo.org>
To: git@vger.kernel.org
Subject: [PATCH] Teach mailsplit about Maildir's
Date: Thu, 26 Apr 2007 21:24:39 +0200 [thread overview]
Message-ID: <20070426192439.GA6976@ferdyx.org> (raw)
Signed-off-by: Fernando J. Pereda <ferdy@gentoo.org>
---
builtin-mailsplit.c | 107 ++++++++++++++++++++++++++++++++++++++++++---------
builtin.h | 2 +-
2 files changed, 89 insertions(+), 20 deletions(-)
diff --git a/builtin-mailsplit.c b/builtin-mailsplit.c
index 3bca855..e0a283d 100644
--- a/builtin-mailsplit.c
+++ b/builtin-mailsplit.c
@@ -96,44 +96,93 @@ static int split_one(FILE *mbox, const char *name, int allow_bare)
exit(1);
}
-int split_mbox(const char **mbox, const char *dir, int allow_bare, int nr_prec, int skip)
+int split_maildir(const char *maildir, const char *dir, int nr_prec, int skip)
{
- char *name = xmalloc(strlen(dir) + 2 + 3 * sizeof(skip));
+ char file[PATH_MAX];
+ char curdir[PATH_MAX];
+ char name[PATH_MAX];
+ DIR *mddir;
+ struct dirent *maildent;
int ret = -1;
- while (*mbox) {
- const char *file = *mbox++;
- FILE *f = !strcmp(file, "-") ? stdin : fopen(file, "r");
- int file_done = 0;
+ snprintf(curdir, sizeof(curdir), "%s/cur", maildir);
+ if ((mddir = opendir(curdir)) == NULL) {
+ error("cannot diropen %s (%s)", curdir, strerror(errno));
+ goto out;
+ }
+
+ while ((maildent = readdir(mddir)) != NULL) {
+ FILE *f;
+
+ snprintf(file, sizeof(file), "%s/%s",
+ curdir, maildent->d_name);
+
+ if (maildent->d_name[0] == '.')
+ continue;
- if ( !f ) {
- error("cannot open mbox %s", file);
+ f = fopen(file, "r");
+ if (!f) {
+ error("cannot open mail %s (%s)", file, strerror(errno));
goto out;
}
if (fgets(buf, sizeof(buf), f) == NULL) {
- if (f == stdin)
- break; /* empty stdin is OK */
- error("cannot read mbox %s", file);
+ error("cannot read mail %s (%s)", file, strerror(errno));
goto out;
}
- while (!file_done) {
- sprintf(name, "%s/%0*d", dir, nr_prec, ++skip);
- file_done = split_one(f, name, allow_bare);
+ sprintf(name, "%s/%0*d", dir, nr_prec, ++skip);
+ split_one(f, name, 1);
+
+ fclose(f);
+ }
+
+ closedir(mddir);
+
+ ret = skip;
+out:
+ return ret;
+}
+
+int split_mbox(const char *file, const char *dir, int allow_bare,
+ int nr_prec, int skip)
+{
+ char name[PATH_MAX];
+ int ret = -1;
+
+ 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) {
+ /* empty stdin is OK */
+ if (f != stdin) {
+ error("cannot read mbox %s", file);
+ goto out;
}
+ file_done = 1;
+ }
- if (f != stdin)
- fclose(f);
+ 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, const char *prefix)
{
- int nr = 0, nr_prec = 4, ret;
+ int nr = 0, nr_prec = 4, ret = 0;
int allow_bare = 0;
const char *dir = NULL;
const char **argp;
@@ -186,7 +235,27 @@ int cmd_mailsplit(int argc, const char **argv, const char *prefix)
argp = stdin_only;
}
- ret = split_mbox(argp, dir, allow_bare, nr_prec, nr);
+ while (*argp) {
+ const char *arg = *argp++;
+ struct stat argstat;
+
+ if (arg[0] == '-' && arg[1] == 0) {
+ ret |= split_mbox(arg, dir, allow_bare, nr_prec, nr);
+ continue;
+ }
+
+ if (stat(arg, &argstat) == -1) {
+ error("cannot stat %s (%s)", arg, strerror(errno));
+ return 1;
+ }
+
+ if (S_ISDIR(argstat.st_mode)) {
+ ret |= split_maildir(arg, dir, nr_prec, nr);
+ } else {
+ ret |= split_mbox(arg, dir, allow_bare, nr_prec, nr);
+ }
+ }
+
if (ret != -1)
printf("%d\n", ret);
diff --git a/builtin.h b/builtin.h
index d3f3a74..39290d1 100644
--- a/builtin.h
+++ b/builtin.h
@@ -8,7 +8,7 @@ extern const char git_usage_string[];
extern void help_unknown_cmd(const char *cmd);
extern int mailinfo(FILE *in, FILE *out, int ks, const char *encoding, const char *msg, const char *patch);
-extern int split_mbox(const char **mbox, const char *dir, int allow_bare, int nr_prec, int skip);
+extern int split_mbox(const char *file, const char *dir, int allow_bare, int nr_prec, int skip);
extern void stripspace(FILE *in, FILE *out);
extern int write_tree(unsigned char *sha1, int missing_ok, const char *prefix);
extern void prune_packed_objects(int);
--
1.5.1.2
next reply other threads:[~2007-04-26 19:16 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-04-26 19:24 Fernando J. Pereda [this message]
2007-04-27 8:30 ` [PATCH] Teach mailsplit about Maildir's Fernando J. Pereda
2007-04-27 8:54 ` Junio C Hamano
2007-04-27 8:59 ` Fernando J. Pereda
-- strict thread matches above, loose matches on Subject: below --
2007-05-20 18:14 Fernando J. Pereda
2007-05-20 18:36 ` Junio C Hamano
2007-05-20 18:49 ` Alex Riesen
2007-05-20 19:00 ` Fernando J. Pereda
2007-05-20 20:35 ` Alex Riesen
2007-05-20 20:44 ` Fernando J. Pereda
2007-05-20 18:53 ` Johan Herland
2007-05-20 19:18 ` Fernando J. Pereda
2007-05-20 19:27 ` Johan Herland
2007-05-21 12:55 ` Johannes Schindelin
2007-05-21 3:15 ` Junio C Hamano
2007-05-21 12:56 ` Johannes Schindelin
2007-05-21 18:17 ` Fernando J. Pereda
2007-05-21 18:20 ` Fernando J. Pereda
2007-05-24 19:47 ` Junio C Hamano
2007-05-24 19:56 ` Fernando J. Pereda
2007-05-24 20:12 ` Junio C Hamano
2007-05-24 22:15 ` Fernando J. Pereda
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20070426192439.GA6976@ferdyx.org \
--to=ferdy@gentoo.org \
--cc=git@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).