]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch-new.c
python: provide a Database.close function
[notmuch] / notmuch-new.c
index e79593cd092dd3345a8bac182234833ecfc92333..8dbebb33e5eb3c6843dd598fb4e09c6e013c0afb 100644 (file)
@@ -67,7 +67,11 @@ handle_sigint (unused (int sig))
 {
     static char msg[] = "Stopping...         \n";
 
-    write(2, msg, sizeof(msg)-1);
+    /* This write is "opportunistic", so it's okay to ignore the
+     * result.  It is not required for correctness, and if it does
+     * fail or produce a short write, we want to get out of the signal
+     * handler as quickly as possible, not retry it. */
+    IGNORE_RESULT (write (2, msg, sizeof(msg)-1));
     interrupted = 1;
 }
 
@@ -555,12 +559,14 @@ add_files_recursive (notmuch_database_t *notmuch,
   DONE:
     if (next)
        talloc_free (next);
-    if (entry)
-       free (entry);
     if (dir)
        closedir (dir);
-    if (fs_entries)
+    if (fs_entries) {
+       for (i = 0; i < num_fs_entries; i++)
+           free (fs_entries[i]);
+
        free (fs_entries);
+    }
     if (db_subdirs)
        notmuch_filenames_destroy (db_subdirs);
     if (db_files)
@@ -700,10 +706,12 @@ count_files (const char *path, int *count)
     }
 
   DONE:
-    if (entry)
-       free (entry);
-    if (fs_entries)
+    if (fs_entries) {
+       for (i = 0; i < num_fs_entries; i++)
+           free (fs_entries[i]);
+
         free (fs_entries);
+    }
 }
 
 static void
@@ -743,7 +751,9 @@ remove_filename (notmuch_database_t *notmuch,
     status = notmuch_database_begin_atomic (notmuch);
     if (status)
        return status;
-    message = notmuch_database_find_message_by_filename (notmuch, path);
+    status = notmuch_database_find_message_by_filename (notmuch, path, &message);
+    if (status || message == NULL)
+       return status;
     status = notmuch_database_remove_message (notmuch, path);
     if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) {
        add_files_state->renamed_messages++;
@@ -809,13 +819,18 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
     _filename_node_t *f;
     int i;
     notmuch_bool_t timer_is_active = FALSE;
+    notmuch_bool_t run_hooks = TRUE;
 
     add_files_state.verbose = 0;
     add_files_state.output_is_a_tty = isatty (fileno (stdout));
 
+    argc--; argv++; /* skip subcommand argument */
+
     for (i = 0; i < argc && argv[i][0] == '-'; i++) {
        if (STRNCMP_LITERAL (argv[i], "--verbose") == 0) {
            add_files_state.verbose = 1;
+       } else if (strcmp (argv[i], "--no-hooks") == 0) {
+           run_hooks = FALSE;
        } else {
            fprintf (stderr, "Unrecognized option: %s\n", argv[i]);
            return 1;
@@ -829,6 +844,12 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
     add_files_state.synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);
     db_path = notmuch_config_get_database_path (config);
 
+    if (run_hooks) {
+       ret = notmuch_run_hook (db_path, "pre-new");
+       if (ret)
+           return ret;
+    }
+
     dot_notmuch_path = talloc_asprintf (ctx, "%s/%s", db_path, ".notmuch");
 
     if (stat (dot_notmuch_path, &st)) {
@@ -977,5 +998,8 @@ notmuch_new_command (void *ctx, int argc, char *argv[])
 
     notmuch_database_close (notmuch);
 
+    if (run_hooks && !ret && !interrupted)
+       ret = notmuch_run_hook (db_path, "post-new");
+
     return ret || interrupted;
 }