]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-setup.c
perf-test: split basic into 00-new, 01-dump-restore, and 02-tag
[notmuch] / notmuch-setup.c
index 2c3404ff67b6c0d36c511b997185400713d8dd09..94d0aa7bace6e96a8eb417ace7a71a8a8ed800d5 100644 (file)
 
 #include "notmuch-client.h"
 
 
 #include "notmuch-client.h"
 
-static notmuch_status_t
-add_all_files (notmuch_database_t *notmuch,
-              const char *mail_directory,
-              int num_files)
-{
-    add_files_state_t add_files_state;
-    double elapsed;
-    struct timeval tv_now;
-    notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS;
-
-    add_files_state.ignore_read_only_directories = FALSE;
-    add_files_state.saw_read_only_directory = FALSE;
-    add_files_state.total_files = num_files;
-    add_files_state.processed_files = 0;
-    add_files_state.added_messages = 0;
-    add_files_state.callback = NULL;
-    gettimeofday (&add_files_state.tv_start, NULL);
-
-    ret = add_files (notmuch, mail_directory, &add_files_state);
-
-    gettimeofday (&tv_now, NULL);
-    elapsed = notmuch_time_elapsed (add_files_state.tv_start,
-                                   tv_now);
-    printf ("Processed %d %s in ", add_files_state.processed_files,
-           add_files_state.processed_files == 1 ?
-           "file" : "total files");
-    notmuch_time_print_formatted_seconds (elapsed);
-    if (elapsed > 1) {
-       printf (" (%d files/sec.).                 \n",
-               (int) (add_files_state.processed_files / elapsed));
-    } else {
-       printf (".                    \n");
-    }
-    if (add_files_state.added_messages) {
-       printf ("Added %d %s to the database.\n\n",
-               add_files_state.added_messages,
-               add_files_state.added_messages == 1 ?
-               "message" : "unique messages");
-    }
-
-    return ret;
-}
-
-
-/* XXX: This should be merged with the existing add_files function in
- * add-files.c. */
-/* Recursively count all regular files in path and all sub-direcotries
- * of path.  The result is added to *count (which should be
- * initialized to zero by the top-level caller before calling
- * count_files). */
-static void
-count_files (const char *path, int *count)
-{
-    DIR *dir;
-    struct dirent *e, *entry = NULL;
-    int entry_length;
-    int err;
-    char *next;
-    struct stat st;
-
-    dir = opendir (path);
-
-    if (dir == NULL) {
-       fprintf (stderr, "Warning: failed to open directory %s: %s\n",
-                path, strerror (errno));
-       goto DONE;
-    }
-
-    entry_length = offsetof (struct dirent, d_name) +
-       pathconf (path, _PC_NAME_MAX) + 1;
-    entry = malloc (entry_length);
-
-    while (1) {
-       err = readdir_r (dir, entry, &e);
-       if (err) {
-           fprintf (stderr, "Error reading directory: %s\n",
-                    strerror (errno));
-           free (entry);
-           goto DONE;
-       }
-
-       if (e == NULL)
-           break;
-
-       /* Ignore special directories to avoid infinite recursion.
-        * Also ignore the .notmuch directory.
-        */
-       /* XXX: Eventually we'll want more sophistication to let the
-        * user specify files to be ignored. */
-       if (strcmp (entry->d_name, ".") == 0 ||
-           strcmp (entry->d_name, "..") == 0 ||
-           strcmp (entry->d_name, ".notmuch") == 0)
-       {
-           continue;
-       }
-
-       if (asprintf (&next, "%s/%s", path, entry->d_name) == -1) {
-           next = NULL;
-           fprintf (stderr, "Error descending from %s to %s: Out of memory\n",
-                    path, entry->d_name);
-           continue;
-       }
-
-       stat (next, &st);
-
-       if (S_ISREG (st.st_mode)) {
-           *count = *count + 1;
-           if (*count % 1000 == 0) {
-               printf ("Found %d files so far.\r", *count);
-               fflush (stdout);
-           }
-       } else if (S_ISDIR (st.st_mode)) {
-           count_files (next, count);
-       }
-
-       free (next);
-    }
-
-  DONE:
-    if (entry)
-       free (entry);
-
-    closedir (dir);
-}
-
 static const char *
 make_path_absolute (void *ctx, const char *path)
 {
 static const char *
 make_path_absolute (void *ctx, const char *path)
 {
@@ -201,7 +76,8 @@ welcome_message_post_setup (void)
 "Notmuch is now configured, and the configuration settings are saved in\n"
 "a file in your home directory named .notmuch-config . If you'd like to\n"
 "change the configuration in the future, you can either edit that file\n"
 "Notmuch is now configured, and the configuration settings are saved in\n"
 "a file in your home directory named .notmuch-config . If you'd like to\n"
 "change the configuration in the future, you can either edit that file\n"
-"directly or run \"notmuch setup\".\n\n"
+"directly or run \"notmuch setup\".  To choose an alternate configuration\n"
+"location, set ${NOTMUCH_CONFIG}.\n\n"
 
 "The next step is to run \"notmuch new\" which will create a database\n"
 "that indexes all of your mail. Depending on the amount of mail you have\n"
 
 "The next step is to run \"notmuch new\" which will create a database\n"
 "that indexes all of your mail. Depending on the amount of mail you have\n"
@@ -211,25 +87,64 @@ welcome_message_post_setup (void)
 "have sufficient storage space available now.\n\n");
 }
 
 "have sufficient storage space available now.\n\n");
 }
 
+static void
+print_tag_list (const char **tags, size_t tags_len)
+{
+    unsigned int i;
+    for (i = 0; i < tags_len; i++) {
+       if (i != 0)
+           printf (" ");
+       printf ("%s", tags[i]);
+    }
+}
+
+static GPtrArray *
+parse_tag_list (void *ctx, char *response)
+{
+    GPtrArray *tags = g_ptr_array_new ();
+    char *tag = response;
+    char *space;
+
+    while (tag && *tag) {
+       space = strchr (tag, ' ');
+       if (space)
+           g_ptr_array_add (tags, talloc_strndup (ctx, tag, space - tag));
+       else
+           g_ptr_array_add (tags, talloc_strdup (ctx, tag));
+       tag = space;
+       while (tag && *tag == ' ')
+           tag++;
+    }
+
+    return tags;
+}
+
 int
 notmuch_setup_command (unused (void *ctx),
                       unused (int argc), unused (char *argv[]))
 {
     char *response = NULL;
 int
 notmuch_setup_command (unused (void *ctx),
                       unused (int argc), unused (char *argv[]))
 {
     char *response = NULL;
-    size_t response_size;
+    size_t response_size = 0;
     notmuch_config_t *config;
     notmuch_config_t *config;
-    char **old_other_emails;
+    const char **old_other_emails;
     size_t old_other_emails_len;
     GPtrArray *other_emails;
     unsigned int i;
     int is_new;
     size_t old_other_emails_len;
     GPtrArray *other_emails;
     unsigned int i;
     int is_new;
-
-#define prompt(format, ...)                            \
-    do {                                               \
-       printf (format, ##__VA_ARGS__);                 \
-       fflush (stdout);                                \
-       getline (&response, &response_size, stdin);     \
-       chomp_newline (response);                       \
+    const char **new_tags;
+    size_t new_tags_len;
+    const char **search_exclude_tags;
+    size_t search_exclude_tags_len;
+
+#define prompt(format, ...)                                    \
+    do {                                                       \
+       printf (format, ##__VA_ARGS__);                         \
+       fflush (stdout);                                        \
+       if (getline (&response, &response_size, stdin) < 0) {   \
+           printf ("Exiting.\n");                              \
+           exit (1);                                           \
+       }                                                       \
+       chomp_newline (response);                               \
     } while (0)
 
     config = notmuch_config_open (ctx, NULL, &is_new);
     } while (0)
 
     config = notmuch_config_open (ctx, NULL, &is_new);
@@ -280,10 +195,44 @@ notmuch_setup_command (unused (void *ctx),
        notmuch_config_set_database_path (config, absolute_path);
     }
 
        notmuch_config_set_database_path (config, absolute_path);
     }
 
-    notmuch_config_save (config);
+    new_tags = notmuch_config_get_new_tags (config, &new_tags_len);
 
 
-    if (is_new)
-       welcome_message_post_setup ();
+    printf ("Tags to apply to all new messages (separated by spaces) [");
+    print_tag_list (new_tags, new_tags_len);
+    prompt ("]: ");
+
+    if (strlen (response)) {
+       GPtrArray *tags = parse_tag_list (ctx, response);
+
+       notmuch_config_set_new_tags (config, (const char **) tags->pdata,
+                                    tags->len);
+
+       g_ptr_array_free (tags, TRUE);
+    }
 
 
-    return 0;
+
+    search_exclude_tags = notmuch_config_get_search_exclude_tags (config, &search_exclude_tags_len);
+
+    printf ("Tags to exclude when searching messages (separated by spaces) [");
+    print_tag_list (search_exclude_tags, search_exclude_tags_len);
+    prompt ("]: ");
+
+    if (strlen (response)) {
+       GPtrArray *tags = parse_tag_list (ctx, response);
+
+       notmuch_config_set_search_exclude_tags (config,
+                                               (const char **) tags->pdata,
+                                               tags->len);
+
+       g_ptr_array_free (tags, TRUE);
+    }
+
+
+    if (! notmuch_config_save (config)) {
+       if (is_new)
+         welcome_message_post_setup ();
+       return 0;
+    } else {
+       return 1;
+    }
 }
 }