#include <dirent.h>
#include <errno.h>
-#include <glib.h>
+#include <glib.h> /* GIOChannel */
#define ARRAY_SIZE(arr) (sizeof (arr) / sizeof (arr[0]))
}
typedef struct {
- int messages_total;
+ int total_messages;
int count;
- int count_last;
struct timeval tv_start;
- struct timeval tv_last;
} add_files_state_t;
/* Compute the number of seconds elapsed from start to end. */
if (seconds > 3600) {
hours = (int) seconds / 3600;
- printf ("%d:", hours);
+ printf ("%dh ", hours);
seconds -= hours * 3600;
}
- if (seconds > 60)
+ if (seconds > 60) {
minutes = (int) seconds / 60;
- else
- minutes = 0;
-
- printf ("%02d:", minutes);
- seconds -= minutes * 60;
+ printf ("%dm ", minutes);
+ seconds -= minutes * 60;
+ }
- printf ("%02d", (int) seconds);
+ printf ("%02ds", (int) seconds);
}
void
add_files_print_progress (add_files_state_t *state)
{
struct timeval tv_now;
- double ratio_complete;
- double elapsed_current, rate_current;
- double elapsed_overall;
+ double elapsed_overall, rate_overall;
gettimeofday (&tv_now, NULL);
- ratio_complete = (double) state->count / state->messages_total;
- elapsed_current = tv_elapsed (state->tv_last, tv_now);
- rate_current = (state->count - state->count_last) / elapsed_current;
elapsed_overall = tv_elapsed (state->tv_start, tv_now);
+ rate_overall = (state->count) / elapsed_overall;
- printf ("Added %d messages at %d messages/sec. ",
- state->count, (int) rate_current);
- print_formatted_seconds (elapsed_overall);
- printf ("/");
- print_formatted_seconds (elapsed_overall / ratio_complete);
- printf (" elapsed (%.2f%%). \r", 100 * ratio_complete);
+ printf ("Added %d of %d messages (",
+ state->count, state->total_messages);
+ print_formatted_seconds ((state->total_messages - state->count) /
+ rate_overall);
+ printf (" remaining).\r");
fflush (stdout);
-
- state->tv_last = tv_now;
- state->count_last = state->count;
}
/* Recursively find all regular files in 'path' and add them to the
int err;
char *next;
struct stat st;
+ notmuch_status_t status;
dir = opendir (path);
stat (next, &st);
if (S_ISREG (st.st_mode)) {
- notmuch_database_add_message (notmuch, next);
- state->count++;
+ status = notmuch_database_add_message (notmuch, next);
+ if (status == NOTMUCH_STATUS_FILE_NOT_EMAIL) {
+ fprintf (stderr, "Note: Ignoring non-mail file: %s\n",
+ next);
+ } else {
+ state->count++;
+ }
if (state->count % 1000 == 0)
add_files_print_progress (state);
} else if (S_ISDIR (st.st_mode)) {
int count;
add_files_state_t add_files_state;
double elapsed;
+ struct timeval tv_now;
printf ("Welcome to notmuch!\n\n");
printf ("Notmuch needs to know the top-level directory of your email archive,\n"
"(where you already have mail stored and where messages will be delivered\n"
"in the future). This directory can contain any number of sub-directories\n"
- "but the only files it contains should be individual email messages.\n"
- "Either maildir or mh format directories are fine, but you will want to\n"
- "move away any auxiliary files maintained by other email programs.\n\n");
+ "and primarily just files with indvidual email messages (eg. maildir or mh\n"
+ "archives are perfect). If there are other, non-email files (such as\n"
+ "indexes maintained by other email programs) then notmuch will do its\n"
+ "best to detect those and ignore them.\n\n");
printf ("Mail storage that uses mbox format, (where one mbox file contains many\n"
"messages), will not work with notmuch. If that's how your mail is currently\n"
printf ("Next, we'll inspect the messages and create a database of threads:\n");
- add_files_state.messages_total = count;
+ add_files_state.total_messages = count;
add_files_state.count = 0;
- add_files_state.count_last = 0;
gettimeofday (&add_files_state.tv_start, NULL);
- add_files_state.tv_last = add_files_state.tv_start;
add_files (notmuch, mail_directory, &add_files_state);
- gettimeofday (&add_files_state.tv_last, NULL);
+ gettimeofday (&tv_now, NULL);
elapsed = tv_elapsed (add_files_state.tv_start,
- add_files_state.tv_last);
+ tv_now);
printf ("Added %d total messages in ", add_files_state.count);
print_formatted_seconds (elapsed);
printf (" (%d messages/sec.). \n", (int) (add_files_state.count / elapsed));