[PATCH 16/18] insert: add --create-folder option

2012-11-18 Thread Mark Walters

Hi

On Wed, 25 Jul 2012, Peter Wang  wrote:
> Support an option to create a new folder in the maildir.
> ---
>  notmuch-insert.c |   71 
> ++
>  1 files changed, 71 insertions(+), 0 deletions(-)
>
> diff --git a/notmuch-insert.c b/notmuch-insert.c
> index a69dfe6..380c520 100644
> --- a/notmuch-insert.c
> +++ b/notmuch-insert.c
> @@ -48,6 +48,70 @@ check_folder_name (const char *folder)
>  }
>  }
>  
> +static int
> +mkdir_parents (void *ctx, const char *path, int mode)
> +{
> +struct stat st;
> +char *pathcopy;
> +char *start;
> +char *end;
> +int ret;
> +
> +/* First check the common case: directory already exists. */
> +if (stat (path, ) == 0) {
> + return (S_ISDIR (st.st_mode)) ? 0 : -1;
> +}
> +
> +pathcopy = talloc_strdup (ctx, path);
> +ret = 0;
> +
> +for (start = pathcopy; *start != '\0'; start = end + 1) {
> + end = strchr (start + 1, '/');
> + if (!end) {
> + ret = mkdir (path, mode);
> + break;
> + }
> + *end = '\0';
> + ret = mkdir (pathcopy, mode);
> + if (ret != 0 && errno != EEXIST) {
> + break;
> + }
> + *end = '/';
> +}
I am a little confused by this: why is there a +1 in the start = end + 1
line and in the end = strchr line? I believe it doesn't matter but it
makes me wonder if I am missing something.

Best wishes

Mark



> +
> +talloc_free (pathcopy);
> +
> +return ret;
> +}
> +
> +static notmuch_bool_t
> +maildir_create (void *ctx, const char *dir)
> +{
> +const int mode = 0755;
> +char *subdir;
> +char *end;
> +
> +/* Create 'cur' directory, including parent directories. */
> +subdir = talloc_asprintf (ctx, "%s/cur", dir);
> +if (mkdir_parents (ctx, subdir, mode) != 0)
> + return FALSE;
> +
> +end = subdir + strlen (subdir);
> +
> +/* Create 'new' directory. */
> +strcpy (end - 3, "new");
> +if (mkdir (subdir, mode) != 0 && errno != EEXIST)
> + return FALSE;
> +
> +/* Create 'tmp' directory. */
> +strcpy (end - 3, "tmp");
> +if (mkdir (subdir, mode) != 0 && errno != EEXIST)
> + return FALSE;
> +
> +talloc_free (subdir);
> +return TRUE;
> +}
> +
>  static notmuch_bool_t
>  safe_gethostname (char *hostname, size_t hostname_size)
>  {
> @@ -253,6 +317,7 @@ notmuch_insert_command (void *ctx, int argc, char *argv[])
>  const char **new_tags;
>  size_t new_tags_length;
>  const char *folder = NULL;
> +notmuch_bool_t create_folder = FALSE;
>  tag_operation_t *tag_ops;
>  int tag_ops_count = 0;
>  char *maildir;
> @@ -262,6 +327,7 @@ notmuch_insert_command (void *ctx, int argc, char *argv[])
>  
>  notmuch_opt_desc_t options[] = {
>   { NOTMUCH_OPT_STRING, , "folder", 0, 0 },
> + { NOTMUCH_OPT_BOOLEAN, _folder, "create-folder", 0, 0 },
>   { NOTMUCH_OPT_END, 0, 0, 0, 0 }
>  };
>  
> @@ -328,6 +394,11 @@ notmuch_insert_command (void *ctx, int argc, char 
> *argv[])
>   return 1;
>   }
>   maildir = talloc_asprintf (ctx, "%s/%s", db_path, folder);
> + if (create_folder && ! maildir_create (ctx, maildir)) {
> + fprintf (stderr, "Error: creating maildir %s: %s\n",
> +  maildir, strerror (errno));
> + return 1;
> + }
>  } else {
>   maildir = talloc_asprintf (ctx, "%s", db_path);
>  }
> -- 
> 1.7.4.4
>
> ___
> notmuch mailing list
> notmuch at notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch


Re: [PATCH 16/18] insert: add --create-folder option

2012-11-18 Thread Mark Walters

Hi

On Wed, 25 Jul 2012, Peter Wang noval...@gmail.com wrote:
 Support an option to create a new folder in the maildir.
 ---
  notmuch-insert.c |   71 
 ++
  1 files changed, 71 insertions(+), 0 deletions(-)

 diff --git a/notmuch-insert.c b/notmuch-insert.c
 index a69dfe6..380c520 100644
 --- a/notmuch-insert.c
 +++ b/notmuch-insert.c
 @@ -48,6 +48,70 @@ check_folder_name (const char *folder)
  }
  }
  
 +static int
 +mkdir_parents (void *ctx, const char *path, int mode)
 +{
 +struct stat st;
 +char *pathcopy;
 +char *start;
 +char *end;
 +int ret;
 +
 +/* First check the common case: directory already exists. */
 +if (stat (path, st) == 0) {
 + return (S_ISDIR (st.st_mode)) ? 0 : -1;
 +}
 +
 +pathcopy = talloc_strdup (ctx, path);
 +ret = 0;
 +
 +for (start = pathcopy; *start != '\0'; start = end + 1) {
 + end = strchr (start + 1, '/');
 + if (!end) {
 + ret = mkdir (path, mode);
 + break;
 + }
 + *end = '\0';
 + ret = mkdir (pathcopy, mode);
 + if (ret != 0  errno != EEXIST) {
 + break;
 + }
 + *end = '/';
 +}
I am a little confused by this: why is there a +1 in the start = end + 1
line and in the end = strchr line? I believe it doesn't matter but it
makes me wonder if I am missing something.

Best wishes

Mark



 +
 +talloc_free (pathcopy);
 +
 +return ret;
 +}
 +
 +static notmuch_bool_t
 +maildir_create (void *ctx, const char *dir)
 +{
 +const int mode = 0755;
 +char *subdir;
 +char *end;
 +
 +/* Create 'cur' directory, including parent directories. */
 +subdir = talloc_asprintf (ctx, %s/cur, dir);
 +if (mkdir_parents (ctx, subdir, mode) != 0)
 + return FALSE;
 +
 +end = subdir + strlen (subdir);
 +
 +/* Create 'new' directory. */
 +strcpy (end - 3, new);
 +if (mkdir (subdir, mode) != 0  errno != EEXIST)
 + return FALSE;
 +
 +/* Create 'tmp' directory. */
 +strcpy (end - 3, tmp);
 +if (mkdir (subdir, mode) != 0  errno != EEXIST)
 + return FALSE;
 +
 +talloc_free (subdir);
 +return TRUE;
 +}
 +
  static notmuch_bool_t
  safe_gethostname (char *hostname, size_t hostname_size)
  {
 @@ -253,6 +317,7 @@ notmuch_insert_command (void *ctx, int argc, char *argv[])
  const char **new_tags;
  size_t new_tags_length;
  const char *folder = NULL;
 +notmuch_bool_t create_folder = FALSE;
  tag_operation_t *tag_ops;
  int tag_ops_count = 0;
  char *maildir;
 @@ -262,6 +327,7 @@ notmuch_insert_command (void *ctx, int argc, char *argv[])
  
  notmuch_opt_desc_t options[] = {
   { NOTMUCH_OPT_STRING, folder, folder, 0, 0 },
 + { NOTMUCH_OPT_BOOLEAN, create_folder, create-folder, 0, 0 },
   { NOTMUCH_OPT_END, 0, 0, 0, 0 }
  };
  
 @@ -328,6 +394,11 @@ notmuch_insert_command (void *ctx, int argc, char 
 *argv[])
   return 1;
   }
   maildir = talloc_asprintf (ctx, %s/%s, db_path, folder);
 + if (create_folder  ! maildir_create (ctx, maildir)) {
 + fprintf (stderr, Error: creating maildir %s: %s\n,
 +  maildir, strerror (errno));
 + return 1;
 + }
  } else {
   maildir = talloc_asprintf (ctx, %s, db_path);
  }
 -- 
 1.7.4.4

 ___
 notmuch mailing list
 notmuch@notmuchmail.org
 http://notmuchmail.org/mailman/listinfo/notmuch
___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch


[PATCH 16/18] insert: add --create-folder option

2012-07-26 Thread Peter Wang
Support an option to create a new folder in the maildir.
---
 notmuch-insert.c |   71 ++
 1 files changed, 71 insertions(+), 0 deletions(-)

diff --git a/notmuch-insert.c b/notmuch-insert.c
index a69dfe6..380c520 100644
--- a/notmuch-insert.c
+++ b/notmuch-insert.c
@@ -48,6 +48,70 @@ check_folder_name (const char *folder)
 }
 }

+static int
+mkdir_parents (void *ctx, const char *path, int mode)
+{
+struct stat st;
+char *pathcopy;
+char *start;
+char *end;
+int ret;
+
+/* First check the common case: directory already exists. */
+if (stat (path, ) == 0) {
+   return (S_ISDIR (st.st_mode)) ? 0 : -1;
+}
+
+pathcopy = talloc_strdup (ctx, path);
+ret = 0;
+
+for (start = pathcopy; *start != '\0'; start = end + 1) {
+   end = strchr (start + 1, '/');
+   if (!end) {
+   ret = mkdir (path, mode);
+   break;
+   }
+   *end = '\0';
+   ret = mkdir (pathcopy, mode);
+   if (ret != 0 && errno != EEXIST) {
+   break;
+   }
+   *end = '/';
+}
+
+talloc_free (pathcopy);
+
+return ret;
+}
+
+static notmuch_bool_t
+maildir_create (void *ctx, const char *dir)
+{
+const int mode = 0755;
+char *subdir;
+char *end;
+
+/* Create 'cur' directory, including parent directories. */
+subdir = talloc_asprintf (ctx, "%s/cur", dir);
+if (mkdir_parents (ctx, subdir, mode) != 0)
+   return FALSE;
+
+end = subdir + strlen (subdir);
+
+/* Create 'new' directory. */
+strcpy (end - 3, "new");
+if (mkdir (subdir, mode) != 0 && errno != EEXIST)
+   return FALSE;
+
+/* Create 'tmp' directory. */
+strcpy (end - 3, "tmp");
+if (mkdir (subdir, mode) != 0 && errno != EEXIST)
+   return FALSE;
+
+talloc_free (subdir);
+return TRUE;
+}
+
 static notmuch_bool_t
 safe_gethostname (char *hostname, size_t hostname_size)
 {
@@ -253,6 +317,7 @@ notmuch_insert_command (void *ctx, int argc, char *argv[])
 const char **new_tags;
 size_t new_tags_length;
 const char *folder = NULL;
+notmuch_bool_t create_folder = FALSE;
 tag_operation_t *tag_ops;
 int tag_ops_count = 0;
 char *maildir;
@@ -262,6 +327,7 @@ notmuch_insert_command (void *ctx, int argc, char *argv[])

 notmuch_opt_desc_t options[] = {
{ NOTMUCH_OPT_STRING, , "folder", 0, 0 },
+   { NOTMUCH_OPT_BOOLEAN, _folder, "create-folder", 0, 0 },
{ NOTMUCH_OPT_END, 0, 0, 0, 0 }
 };

@@ -328,6 +394,11 @@ notmuch_insert_command (void *ctx, int argc, char *argv[])
return 1;
}
maildir = talloc_asprintf (ctx, "%s/%s", db_path, folder);
+   if (create_folder && ! maildir_create (ctx, maildir)) {
+   fprintf (stderr, "Error: creating maildir %s: %s\n",
+maildir, strerror (errno));
+   return 1;
+   }
 } else {
maildir = talloc_asprintf (ctx, "%s", db_path);
 }
-- 
1.7.4.4



[PATCH 16/18] insert: add --create-folder option

2012-07-25 Thread Peter Wang
Support an option to create a new folder in the maildir.
---
 notmuch-insert.c |   71 ++
 1 files changed, 71 insertions(+), 0 deletions(-)

diff --git a/notmuch-insert.c b/notmuch-insert.c
index a69dfe6..380c520 100644
--- a/notmuch-insert.c
+++ b/notmuch-insert.c
@@ -48,6 +48,70 @@ check_folder_name (const char *folder)
 }
 }
 
+static int
+mkdir_parents (void *ctx, const char *path, int mode)
+{
+struct stat st;
+char *pathcopy;
+char *start;
+char *end;
+int ret;
+
+/* First check the common case: directory already exists. */
+if (stat (path, st) == 0) {
+   return (S_ISDIR (st.st_mode)) ? 0 : -1;
+}
+
+pathcopy = talloc_strdup (ctx, path);
+ret = 0;
+
+for (start = pathcopy; *start != '\0'; start = end + 1) {
+   end = strchr (start + 1, '/');
+   if (!end) {
+   ret = mkdir (path, mode);
+   break;
+   }
+   *end = '\0';
+   ret = mkdir (pathcopy, mode);
+   if (ret != 0  errno != EEXIST) {
+   break;
+   }
+   *end = '/';
+}
+
+talloc_free (pathcopy);
+
+return ret;
+}
+
+static notmuch_bool_t
+maildir_create (void *ctx, const char *dir)
+{
+const int mode = 0755;
+char *subdir;
+char *end;
+
+/* Create 'cur' directory, including parent directories. */
+subdir = talloc_asprintf (ctx, %s/cur, dir);
+if (mkdir_parents (ctx, subdir, mode) != 0)
+   return FALSE;
+
+end = subdir + strlen (subdir);
+
+/* Create 'new' directory. */
+strcpy (end - 3, new);
+if (mkdir (subdir, mode) != 0  errno != EEXIST)
+   return FALSE;
+
+/* Create 'tmp' directory. */
+strcpy (end - 3, tmp);
+if (mkdir (subdir, mode) != 0  errno != EEXIST)
+   return FALSE;
+
+talloc_free (subdir);
+return TRUE;
+}
+
 static notmuch_bool_t
 safe_gethostname (char *hostname, size_t hostname_size)
 {
@@ -253,6 +317,7 @@ notmuch_insert_command (void *ctx, int argc, char *argv[])
 const char **new_tags;
 size_t new_tags_length;
 const char *folder = NULL;
+notmuch_bool_t create_folder = FALSE;
 tag_operation_t *tag_ops;
 int tag_ops_count = 0;
 char *maildir;
@@ -262,6 +327,7 @@ notmuch_insert_command (void *ctx, int argc, char *argv[])
 
 notmuch_opt_desc_t options[] = {
{ NOTMUCH_OPT_STRING, folder, folder, 0, 0 },
+   { NOTMUCH_OPT_BOOLEAN, create_folder, create-folder, 0, 0 },
{ NOTMUCH_OPT_END, 0, 0, 0, 0 }
 };
 
@@ -328,6 +394,11 @@ notmuch_insert_command (void *ctx, int argc, char *argv[])
return 1;
}
maildir = talloc_asprintf (ctx, %s/%s, db_path, folder);
+   if (create_folder  ! maildir_create (ctx, maildir)) {
+   fprintf (stderr, Error: creating maildir %s: %s\n,
+maildir, strerror (errno));
+   return 1;
+   }
 } else {
maildir = talloc_asprintf (ctx, %s, db_path);
 }
-- 
1.7.4.4

___
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch