}
}
+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");
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");
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... */
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;
}
"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);
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);