notmuch_database_create/open: Fix to handle NULL as documented.
authorCarl Worth <cworth@cworth.org>
Tue, 20 Oct 2009 16:56:25 +0000 (09:56 -0700)
committerCarl Worth <cworth@cworth.org>
Tue, 20 Oct 2009 16:58:40 +0000 (09:58 -0700)
When documenting these functions I described support for a
NOTMUCH_BASE environment variable to be consulted in the case
of a NULL path. Only, I had forgotten to actually write the
code.

This code exists now, with a new, exported function:

     notmuch_database_default_path

database.cc
notmuch.c
notmuch.h

index 70f80f9fccf257ebf7d27cf7d1b154afc1e02f70..528ae1154b48d9b4428c214355700e96f5123564 100644 (file)
@@ -379,24 +379,38 @@ parse_references (GPtrArray *array,
     }
 }
 
+char *
+notmuch_database_default_path (void)
+{
+    if (getenv ("NOTMUCH_BASE"))
+       return strdup (getenv ("NOTMUCH_BASE"));
+
+    return g_strdup_printf ("%s/mail", getenv ("HOME"));
+}
+
 notmuch_database_t *
 notmuch_database_create (const char *path)
 {
-    char *notmuch_path;
+    notmuch_database_t *notmuch = NULL;
+    char *notmuch_path = NULL;
     struct stat st;
     int err;
+    char *local_path = NULL;
+
+    if (path == NULL)
+       path = local_path = notmuch_database_default_path ();
 
     err = stat (path, &st);
     if (err) {
        fprintf (stderr, "Error: Cannot create database at %s: %s.\n",
                 path, strerror (errno));
-       return NULL;
+       goto DONE;
     }
 
     if (! S_ISDIR (st.st_mode)) {
        fprintf (stderr, "Error: Cannot create database at %s: Not a directory.\n",
                 path);
-       return NULL;
+       goto DONE;
     }
 
     notmuch_path = g_strdup_printf ("%s/%s", path, ".notmuch");
@@ -406,22 +420,31 @@ notmuch_database_create (const char *path)
     if (err) {
        fprintf (stderr, "Error: Cannot create directory %s: %s.\n",
                 notmuch_path, strerror (errno));
-       free (notmuch_path);
-       return NULL;
+       goto DONE;
     }
 
-    free (notmuch_path);
+    notmuch = notmuch_database_open (path);
+
+  DONE:
+    if (notmuch_path)
+       free (notmuch_path);
+    if (local_path)
+       free (local_path);
 
-    return notmuch_database_open (path);
+    return notmuch;
 }
 
 notmuch_database_t *
 notmuch_database_open (const char *path)
 {
-    notmuch_database_t *notmuch;
-    char *notmuch_path, *xapian_path;
+    notmuch_database_t *notmuch = NULL;
+    char *notmuch_path = NULL, *xapian_path = NULL;
     struct stat st;
     int err;
+    char *local_path = NULL;
+
+    if (path == NULL)
+       path = local_path = notmuch_database_default_path ();
 
     notmuch_path = g_strdup_printf ("%s/%s", path, ".notmuch");
 
@@ -429,12 +452,10 @@ notmuch_database_open (const char *path)
     if (err) {
        fprintf (stderr, "Error: Cannot stat %s: %s\n",
                 notmuch_path, strerror (err));
-       free (notmuch_path);
-       return NULL;
+       goto DONE;
     }
 
     xapian_path = g_strdup_printf ("%s/%s", notmuch_path, "xapian");
-    free (notmuch_path);
 
     /* C++ is so nasty in requiring these casts. I'm almost tempted to
      * write a C wrapper for Xapian... */
@@ -449,7 +470,13 @@ notmuch_database_open (const char *path)
                 error.get_msg().c_str());
     }
     
-    free (xapian_path);
+  DONE:
+    if (local_path)
+       free (local_path);
+    if (notmuch_path)
+       free (notmuch_path);
+    if (xapian_path)
+       free (xapian_path);
 
     return notmuch;
 }
index 05aa52dce1d5b4e57949635b5bf2bc293f6c5174..dac19d8955ec231bf9177df2f2e358adfd24b587 100644 (file)
--- a/notmuch.c
+++ b/notmuch.c
@@ -310,25 +310,19 @@ setup_command (int argc, char *argv[])
            "such as mb2md. In that case, press Control-C now and run notmuch again\n"
            "once the conversion is complete.\n\n");
 
-    printf ("Top-level mail directory [~/mail]: ");
-    fflush (stdout);
+    {
+       char *default_path = notmuch_database_default_path ();
+       printf ("Top-level mail directory [%s]: ", default_path);
+       free (default_path);
+       fflush (stdout);
+    }
 
     mail_directory = read_line ();
 
     if (mail_directory == NULL || strlen (mail_directory) == 0) {
-       char *home;
-
        if (mail_directory)
            free (mail_directory);
-
-       home = getenv ("HOME");
-       if (!home) {
-           fprintf (stderr, "Error: No mail directory provided HOME environment variable is not set.\n");
-           fprintf (stderr, "Cowardly refusing to just guess where your mail might be.\n");
-           exit (1);
-       }
-
-       mail_directory = g_strdup_printf ("%s/mail", home);
+       mail_directory = notmuch_database_default_path ();
     }
 
     notmuch = notmuch_database_create (mail_directory);
index e0b57db27fd0d8429ead19aa3ec47d0856a59dde..b63a7d77b7616ae1f8bf12d3a68b7022d49fa28a 100644 (file)
--- a/notmuch.h
+++ b/notmuch.h
@@ -110,6 +110,23 @@ notmuch_database_open (const char *path);
 void
 notmuch_database_close (notmuch_database_t *database);
 
+/* Lookup the default database path.
+ *
+ * This is the path that will be used by notmuch_database_create and
+ * notmuch_database_open if given a NULL path. Specifically it will be
+ * the value of the NOTMUCH_BASE environment variable if set,
+ * otherwise ${HOME}/mail
+ *
+ * Returns a newly allocated string which the caller should free()
+ * when finished with it.
+ */
+char *
+notmuch_database_default_path (void);
+
+/* Return the database path of the given database.
+ *
+ * The return value is a string owned by notmuch so should not be
+ * modified nor freed by the caller. */
 const char *
 notmuch_database_get_path (notmuch_database_t *database);