unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [RFC PATCH] cli: factor out config handling code to get/set lists.
@ 2011-12-10 17:50 David Bremner
  2011-12-10 18:24 ` Austin Clements
  0 siblings, 1 reply; 15+ messages in thread
From: David Bremner @ 2011-12-10 17:50 UTC (permalink / raw)
  To: notmuch; +Cc: David Bremner

From: David Bremner <bremner@debian.org>

The code is already duplicated once, and I want to add a third
configuration item that is also a list.
---

Mainly I am curious if people think using macros to declare these
"getters" and "setters" makes the code less maintainable.

 notmuch-config.c |  112 +++++++++++++++++++----------------------------------
 1 files changed, 40 insertions(+), 72 deletions(-)

diff --git a/notmuch-config.c b/notmuch-config.c
index 1a7ed58..33778a7 100644
--- a/notmuch-config.c
+++ b/notmuch-config.c
@@ -520,93 +520,61 @@ notmuch_config_set_user_primary_email (notmuch_config_t *config,
     config->user_primary_email = NULL;
 }
 
-const char **
-notmuch_config_get_user_other_email (notmuch_config_t *config,
-				     size_t *length)
+static void
+_config_get_list (notmuch_config_t *config,
+		  const char *section, const char *key,
+		  const char ***outlist, size_t *length)
 {
-    char **emails;
-    size_t emails_length;
+    char **inlist;
     unsigned int i;
 
-    if (config->user_other_email == NULL) {
-	emails = g_key_file_get_string_list (config->key_file,
-					     "user", "other_email",
-					     &emails_length, NULL);
-	if (emails) {
-	    config->user_other_email = talloc_size (config,
-						    sizeof (char *) *
-						    (emails_length + 1));
-	    for (i = 0; i < emails_length; i++)
-		config->user_other_email[i] = talloc_strdup (config->user_other_email,
-							     emails[i]);
-	    config->user_other_email[i] = NULL;
-
-	    g_strfreev (emails);
-
-	    config->user_other_email_length = emails_length;
+    if (*outlist == NULL) {
+	inlist = g_key_file_get_string_list (config->key_file,
+					     section, key,
+					     length, NULL);
+	if (inlist) {
+	    *outlist = talloc_size (config, sizeof (char *) *
+				    (*length + 1));
+	    for (i = 0; i < *length; i++)
+		(*outlist)[i] = talloc_strdup (*outlist, inlist[i]);
+	    (*outlist)[i] = NULL;
+
+	    g_strfreev (inlist);
+
 	}
     }
 
-    *length = config->user_other_email_length;
-    return config->user_other_email;
 }
 
-void
-notmuch_config_set_user_other_email (notmuch_config_t *config,
-				     const char *other_email[],
-				     size_t length)
-{
-    g_key_file_set_string_list (config->key_file,
-				"user", "other_email",
-				other_email, length);
-
-    talloc_free (config->user_other_email);
-    config->user_other_email = NULL;
+#define _GET_LIST(list, group, name) \
+const char ** \
+notmuch_config_get_##list (notmuch_config_t *config, size_t *length) \
+{ \
+    _config_get_list (config, group, name, &(config->list),	\
+                      &(config->list##_length));		\
+    *length = config->list##_length;				\
+    return config->list; \
 }
 
-const char **
-notmuch_config_get_new_tags (notmuch_config_t *config,
-			     size_t *length)
-{
-    char **tags;
-    size_t tags_length;
-    unsigned int i;
+_GET_LIST (user_other_email, "user", "other_email");
+_GET_LIST (new_tags, "new", "tags");
 
-    if (config->new_tags == NULL) {
-	tags = g_key_file_get_string_list (config->key_file,
-					   "new", "tags",
-					   &tags_length, NULL);
-	if (tags) {
-	    config->new_tags = talloc_size (config,
-					    sizeof (char *) *
-					    (tags_length + 1));
-	    for (i = 0; i < tags_length; i++)
-		config->new_tags[i] = talloc_strdup (config->new_tags,
-						     tags[i]);
-	    config->new_tags[i] = NULL;
-
-	    g_strfreev (tags);
-
-	    config->new_tags_length = tags_length;
-	}
-    }
+#undef _GET_LIST
 
-    *length = config->new_tags_length;
-    return config->new_tags;
+#define _SET_LIST(list, group, name) \
+void \
+notmuch_config_set_##list (notmuch_config_t *config, const char *list[], \
+			   size_t length) \
+{ \
+    g_key_file_set_string_list (config->key_file, group, name, list, length); \
+    talloc_free (config->list);                                               \
+    config->list = NULL;                                                      \
 }
 
-void
-notmuch_config_set_new_tags (notmuch_config_t *config,
-			     const char *new_tags[],
-			     size_t length)
-{
-    g_key_file_set_string_list (config->key_file,
-				"new", "tags",
-				new_tags, length);
+_SET_LIST(user_other_email, "user", "other_email");
+_SET_LIST(new_tags, "new", "tags");
 
-    talloc_free (config->new_tags);
-    config->new_tags = NULL;
-}
+#undef _SET_LIST
 
 /* Given a configuration item of the form <group>.<key> return the
  * component group and key. If any error occurs, print a message on
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH] cli: factor out config handling code to get/set lists.
  2011-12-10 17:50 [RFC PATCH] cli: factor out config handling code to get/set lists David Bremner
@ 2011-12-10 18:24 ` Austin Clements
  2011-12-10 20:30   ` David Bremner
  0 siblings, 1 reply; 15+ messages in thread
From: Austin Clements @ 2011-12-10 18:24 UTC (permalink / raw)
  To: David Bremner; +Cc: notmuch, David Bremner

Deduplicating this code seems like a great idea, but I don't think
macros are the way to do it; especially not one that expands to an
important top-level construct like a function definition.

What about something like

const char **
notmuch_config_get_user_other_email (notmuch_config_t *config,
                                     size_t *length)
{
    return _config_get_list (config, "user", "other_email", 
                             &config->user_other_email, length);
}

where config->user_other_email is a, say, struct _notmuch_config_list
that combines together the cached string list and length?
_config_get_list would look a lot like what you have now, but outlist
would be a struct _notmuch_config_list* instead of a const char*** and
it would always set *length (in addition to setting it in the cached
value if necessary).

Set could be similarly simple

void
notmuch_config_set_user_other_email (notmuch_config_t *config,
                                     const char *other_email[],
                                     size_t length)
{
    _config_set_list (config, "user", "other_email", &config->user_other_email,
                      other_email, length);
}

Quoth David Bremner on Dec 10 at  1:50 pm:
> From: David Bremner <bremner@debian.org>
> 
> The code is already duplicated once, and I want to add a third
> configuration item that is also a list.
> ---
> 
> Mainly I am curious if people think using macros to declare these
> "getters" and "setters" makes the code less maintainable.
> 
>  notmuch-config.c |  112 +++++++++++++++++++----------------------------------
>  1 files changed, 40 insertions(+), 72 deletions(-)
> 
> diff --git a/notmuch-config.c b/notmuch-config.c
> index 1a7ed58..33778a7 100644
> --- a/notmuch-config.c
> +++ b/notmuch-config.c
> @@ -520,93 +520,61 @@ notmuch_config_set_user_primary_email (notmuch_config_t *config,
>      config->user_primary_email = NULL;
>  }
>  
> -const char **
> -notmuch_config_get_user_other_email (notmuch_config_t *config,
> -				     size_t *length)
> +static void
> +_config_get_list (notmuch_config_t *config,
> +		  const char *section, const char *key,
> +		  const char ***outlist, size_t *length)
>  {
> -    char **emails;
> -    size_t emails_length;
> +    char **inlist;
>      unsigned int i;
>  
> -    if (config->user_other_email == NULL) {
> -	emails = g_key_file_get_string_list (config->key_file,
> -					     "user", "other_email",
> -					     &emails_length, NULL);
> -	if (emails) {
> -	    config->user_other_email = talloc_size (config,
> -						    sizeof (char *) *
> -						    (emails_length + 1));
> -	    for (i = 0; i < emails_length; i++)
> -		config->user_other_email[i] = talloc_strdup (config->user_other_email,
> -							     emails[i]);
> -	    config->user_other_email[i] = NULL;
> -
> -	    g_strfreev (emails);
> -
> -	    config->user_other_email_length = emails_length;
> +    if (*outlist == NULL) {
> +	inlist = g_key_file_get_string_list (config->key_file,
> +					     section, key,
> +					     length, NULL);
> +	if (inlist) {
> +	    *outlist = talloc_size (config, sizeof (char *) *
> +				    (*length + 1));
> +	    for (i = 0; i < *length; i++)
> +		(*outlist)[i] = talloc_strdup (*outlist, inlist[i]);
> +	    (*outlist)[i] = NULL;
> +
> +	    g_strfreev (inlist);
> +
>  	}
>      }
>  
> -    *length = config->user_other_email_length;
> -    return config->user_other_email;
>  }
>  
> -void
> -notmuch_config_set_user_other_email (notmuch_config_t *config,
> -				     const char *other_email[],
> -				     size_t length)
> -{
> -    g_key_file_set_string_list (config->key_file,
> -				"user", "other_email",
> -				other_email, length);
> -
> -    talloc_free (config->user_other_email);
> -    config->user_other_email = NULL;
> +#define _GET_LIST(list, group, name) \
> +const char ** \
> +notmuch_config_get_##list (notmuch_config_t *config, size_t *length) \
> +{ \
> +    _config_get_list (config, group, name, &(config->list),	\
> +                      &(config->list##_length));		\
> +    *length = config->list##_length;				\
> +    return config->list; \
>  }
>  
> -const char **
> -notmuch_config_get_new_tags (notmuch_config_t *config,
> -			     size_t *length)
> -{
> -    char **tags;
> -    size_t tags_length;
> -    unsigned int i;
> +_GET_LIST (user_other_email, "user", "other_email");
> +_GET_LIST (new_tags, "new", "tags");
>  
> -    if (config->new_tags == NULL) {
> -	tags = g_key_file_get_string_list (config->key_file,
> -					   "new", "tags",
> -					   &tags_length, NULL);
> -	if (tags) {
> -	    config->new_tags = talloc_size (config,
> -					    sizeof (char *) *
> -					    (tags_length + 1));
> -	    for (i = 0; i < tags_length; i++)
> -		config->new_tags[i] = talloc_strdup (config->new_tags,
> -						     tags[i]);
> -	    config->new_tags[i] = NULL;
> -
> -	    g_strfreev (tags);
> -
> -	    config->new_tags_length = tags_length;
> -	}
> -    }
> +#undef _GET_LIST
>  
> -    *length = config->new_tags_length;
> -    return config->new_tags;
> +#define _SET_LIST(list, group, name) \
> +void \
> +notmuch_config_set_##list (notmuch_config_t *config, const char *list[], \
> +			   size_t length) \
> +{ \
> +    g_key_file_set_string_list (config->key_file, group, name, list, length); \
> +    talloc_free (config->list);                                               \
> +    config->list = NULL;                                                      \
>  }
>  
> -void
> -notmuch_config_set_new_tags (notmuch_config_t *config,
> -			     const char *new_tags[],
> -			     size_t length)
> -{
> -    g_key_file_set_string_list (config->key_file,
> -				"new", "tags",
> -				new_tags, length);
> +_SET_LIST(user_other_email, "user", "other_email");
> +_SET_LIST(new_tags, "new", "tags");
>  
> -    talloc_free (config->new_tags);
> -    config->new_tags = NULL;
> -}
> +#undef _SET_LIST
>  
>  /* Given a configuration item of the form <group>.<key> return the
>   * component group and key. If any error occurs, print a message on

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [RFC PATCH] cli: factor out config handling code to get/set lists.
  2011-12-10 18:24 ` Austin Clements
@ 2011-12-10 20:30   ` David Bremner
  2011-12-11 16:07     ` [PATCH] " David Bremner
  0 siblings, 1 reply; 15+ messages in thread
From: David Bremner @ 2011-12-10 20:30 UTC (permalink / raw)
  To: Austin Clements; +Cc: notmuch

On Sat, 10 Dec 2011 13:24:36 -0500, Austin Clements <amdragon@MIT.EDU> wrote:
> What about something like
> 
> const char **
> notmuch_config_get_user_other_email (notmuch_config_t *config,
>                                      size_t *length)
> {
>     return _config_get_list (config, "user", "other_email", 
>                              &config->user_other_email, length);
> }

Sounds good. 

d

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH] cli: factor out config handling code to get/set lists.
  2011-12-10 20:30   ` David Bremner
@ 2011-12-11 16:07     ` David Bremner
  2011-12-11 16:41       ` Dmitry Kurochkin
  0 siblings, 1 reply; 15+ messages in thread
From: David Bremner @ 2011-12-11 16:07 UTC (permalink / raw)
  To: notmuch; +Cc: David Bremner

From: David Bremner <bremner@debian.org>

Two new internal routines are created _config_get_list and
_config_set_list; the notmuch_config_get_* functions that deal with
lists are simply wrappers for these functions.
---
 notmuch-config.c |  130 +++++++++++++++++++++++++++--------------------------
 1 files changed, 66 insertions(+), 64 deletions(-)

diff --git a/notmuch-config.c b/notmuch-config.c
index 1a7ed58..e98b6a3 100644
--- a/notmuch-config.c
+++ b/notmuch-config.c
@@ -520,92 +520,94 @@ notmuch_config_set_user_primary_email (notmuch_config_t *config,
     config->user_primary_email = NULL;
 }
 
-const char **
-notmuch_config_get_user_other_email (notmuch_config_t *config,
-				     size_t *length)
+static const char **
+_config_get_list (notmuch_config_t *config,
+		  const char *section, const char *key,
+		  const char ***outlist, size_t *list_length, size_t *ret_length)
 {
-    char **emails;
-    size_t emails_length;
+    char **inlist;
     unsigned int i;
 
-    if (config->user_other_email == NULL) {
-	emails = g_key_file_get_string_list (config->key_file,
-					     "user", "other_email",
-					     &emails_length, NULL);
-	if (emails) {
-	    config->user_other_email = talloc_size (config,
-						    sizeof (char *) *
-						    (emails_length + 1));
-	    for (i = 0; i < emails_length; i++)
-		config->user_other_email[i] = talloc_strdup (config->user_other_email,
-							     emails[i]);
-	    config->user_other_email[i] = NULL;
-
-	    g_strfreev (emails);
-
-	    config->user_other_email_length = emails_length;
+    if (*outlist == NULL) {
+	inlist = g_key_file_get_string_list (config->key_file,
+					     section, key,
+					     list_length, NULL);
+	if (inlist) {
+	    *outlist = talloc_size (config, sizeof (char *) *
+				    (*list_length + 1));
+	    for (i = 0; i < *list_length; i++)
+		(*outlist)[i] = talloc_strdup (*outlist, inlist[i]);
+	    (*outlist)[i] = NULL;
+
+	    g_strfreev (inlist);
 	}
     }
 
-    *length = config->user_other_email_length;
-    return config->user_other_email;
+    if (ret_length) *ret_length = *list_length;
+    return *outlist;
 }
 
-void
-notmuch_config_set_user_other_email (notmuch_config_t *config,
-				     const char *other_email[],
-				     size_t length)
+const char **
+notmuch_config_get_user_other_email (notmuch_config_t *config,   size_t *length)
 {
-    g_key_file_set_string_list (config->key_file,
-				"user", "other_email",
-				other_email, length);
+    return _config_get_list (config, "user", "other_email",
+			     &(config->user_other_email),
+			     &(config->user_other_email_length), length);
+}
 
-    talloc_free (config->user_other_email);
-    config->user_other_email = NULL;
+const char **
+notmuch_config_get_new_tags (notmuch_config_t *config,   size_t *length)
+{
+    return _config_get_list (config, "new", "tags",
+			     &(config->new_tags),
+			     &(config->new_tags_length), length);
 }
 
 const char **
-notmuch_config_get_new_tags (notmuch_config_t *config,
-			     size_t *length)
+notmuch_config_get_log_subscribers (notmuch_config_t *config,   size_t *length)
 {
-    char **tags;
-    size_t tags_length;
-    unsigned int i;
+    return _config_get_list (config, "log", "subscribers",
+			     &(config->new_tags),
+			     &(config->new_tags_length), length);
+}
 
-    if (config->new_tags == NULL) {
-	tags = g_key_file_get_string_list (config->key_file,
-					   "new", "tags",
-					   &tags_length, NULL);
-	if (tags) {
-	    config->new_tags = talloc_size (config,
-					    sizeof (char *) *
-					    (tags_length + 1));
-	    for (i = 0; i < tags_length; i++)
-		config->new_tags[i] = talloc_strdup (config->new_tags,
-						     tags[i]);
-	    config->new_tags[i] = NULL;
-
-	    g_strfreev (tags);
-
-	    config->new_tags_length = tags_length;
-	}
-    }
 
-    *length = config->new_tags_length;
-    return config->new_tags;
+static void
+_config_set_list (notmuch_config_t *config,
+		  const char *group, const char *name,
+		  const char *list[],
+		  size_t length, const char ***config_var )
+{
+    g_key_file_set_string_list (config->key_file, group, name, list, length);
+    talloc_free (*config_var);
+    *config_var = NULL;
+}
+
+void
+notmuch_config_set_user_other_email (notmuch_config_t *config,
+				     const char *list[],
+				     size_t length)
+{
+    _config_set_list (config, "user", "other_email", list, length,
+		     &(config->user_other_email));
 }
 
 void
 notmuch_config_set_new_tags (notmuch_config_t *config,
-			     const char *new_tags[],
-			     size_t length)
+				     const char *list[],
+				     size_t length)
 {
-    g_key_file_set_string_list (config->key_file,
-				"new", "tags",
-				new_tags, length);
+    _config_set_list (config, "new", "tags", list, length,
+		     &(config->new_tags));
+}
 
-    talloc_free (config->new_tags);
-    config->new_tags = NULL;
+void
+notmuch_config_set_log_subscribers (notmuch_config_t *config,
+				    const char *list[],
+				    size_t length)
+{
+    _config_set_list (config, "log", "subscribers", list, length,
+		     &(config->log_subscribers));
 }
 
 /* Given a configuration item of the form <group>.<key> return the
-- 
1.7.7.3

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH] cli: factor out config handling code to get/set lists.
  2011-12-11 16:07     ` [PATCH] " David Bremner
@ 2011-12-11 16:41       ` Dmitry Kurochkin
  2011-12-12 18:26         ` David Bremner
  0 siblings, 1 reply; 15+ messages in thread
From: Dmitry Kurochkin @ 2011-12-11 16:41 UTC (permalink / raw)
  To: David Bremner, notmuch; +Cc: David Bremner

Hi David.

On Sun, 11 Dec 2011 12:07:51 -0400, David Bremner <david@tethera.net> wrote:
> From: David Bremner <bremner@debian.org>
> 
> Two new internal routines are created _config_get_list and
> _config_set_list; the notmuch_config_get_* functions that deal with
> lists are simply wrappers for these functions.

Looks good to me.  Some comments below.

> ---
>  notmuch-config.c |  130 +++++++++++++++++++++++++++--------------------------
>  1 files changed, 66 insertions(+), 64 deletions(-)
> 
> diff --git a/notmuch-config.c b/notmuch-config.c
> index 1a7ed58..e98b6a3 100644
> --- a/notmuch-config.c
> +++ b/notmuch-config.c
> @@ -520,92 +520,94 @@ notmuch_config_set_user_primary_email (notmuch_config_t *config,
>      config->user_primary_email = NULL;
>  }
>  
> -const char **
> -notmuch_config_get_user_other_email (notmuch_config_t *config,
> -				     size_t *length)
> +static const char **
> +_config_get_list (notmuch_config_t *config,
> +		  const char *section, const char *key,
> +		  const char ***outlist, size_t *list_length, size_t *ret_length)
>  {

It seems weird that the function both takes list as an output parameter
and returns it.  Having two length parameters which are set to the same
value is confusing as well.  I understand that it is done to make getter
functions smaller.  So perhaps it is ok.

> -    char **emails;
> -    size_t emails_length;
> +    char **inlist;
>      unsigned int i;
>  

Please move variable declarations inside the if (!*outlist) and if
(inlist) blocks.  (I saw other code in notmuch that does it, so it must
be ok.)

> -    if (config->user_other_email == NULL) {
> -	emails = g_key_file_get_string_list (config->key_file,
> -					     "user", "other_email",
> -					     &emails_length, NULL);
> -	if (emails) {
> -	    config->user_other_email = talloc_size (config,
> -						    sizeof (char *) *
> -						    (emails_length + 1));
> -	    for (i = 0; i < emails_length; i++)
> -		config->user_other_email[i] = talloc_strdup (config->user_other_email,
> -							     emails[i]);
> -	    config->user_other_email[i] = NULL;
> -
> -	    g_strfreev (emails);
> -
> -	    config->user_other_email_length = emails_length;
> +    if (*outlist == NULL) {
> +	inlist = g_key_file_get_string_list (config->key_file,
> +					     section, key,
> +					     list_length, NULL);
> +	if (inlist) {
> +	    *outlist = talloc_size (config, sizeof (char *) *
> +				    (*list_length + 1));
> +	    for (i = 0; i < *list_length; i++)
> +		(*outlist)[i] = talloc_strdup (*outlist, inlist[i]);
> +	    (*outlist)[i] = NULL;
> +
> +	    g_strfreev (inlist);
>  	}
>      }
>  
> -    *length = config->user_other_email_length;
> -    return config->user_other_email;
> +    if (ret_length) *ret_length = *list_length;

I would prefer to have this on separate lines.

> +    return *outlist;
>  }
>  
> -void
> -notmuch_config_set_user_other_email (notmuch_config_t *config,
> -				     const char *other_email[],
> -				     size_t length)
> +const char **
> +notmuch_config_get_user_other_email (notmuch_config_t *config,   size_t *length)
>  {
> -    g_key_file_set_string_list (config->key_file,
> -				"user", "other_email",
> -				other_email, length);
> +    return _config_get_list (config, "user", "other_email",
> +			     &(config->user_other_email),
> +			     &(config->user_other_email_length), length);
> +}
>  
> -    talloc_free (config->user_other_email);
> -    config->user_other_email = NULL;
> +const char **
> +notmuch_config_get_new_tags (notmuch_config_t *config,   size_t *length)
> +{
> +    return _config_get_list (config, "new", "tags",
> +			     &(config->new_tags),
> +			     &(config->new_tags_length), length);
>  }
>  
>  const char **
> -notmuch_config_get_new_tags (notmuch_config_t *config,
> -			     size_t *length)
> +notmuch_config_get_log_subscribers (notmuch_config_t *config,   size_t *length)
>  {
> -    char **tags;
> -    size_t tags_length;
> -    unsigned int i;
> +    return _config_get_list (config, "log", "subscribers",
> +			     &(config->new_tags),
> +			     &(config->new_tags_length), length);
> +}
>  

This should be part of a separate patch which adds the logging feature,
I guess.

Regards,
  Dmitry

> -    if (config->new_tags == NULL) {
> -	tags = g_key_file_get_string_list (config->key_file,
> -					   "new", "tags",
> -					   &tags_length, NULL);
> -	if (tags) {
> -	    config->new_tags = talloc_size (config,
> -					    sizeof (char *) *
> -					    (tags_length + 1));
> -	    for (i = 0; i < tags_length; i++)
> -		config->new_tags[i] = talloc_strdup (config->new_tags,
> -						     tags[i]);
> -	    config->new_tags[i] = NULL;
> -
> -	    g_strfreev (tags);
> -
> -	    config->new_tags_length = tags_length;
> -	}
> -    }
>  
> -    *length = config->new_tags_length;
> -    return config->new_tags;
> +static void
> +_config_set_list (notmuch_config_t *config,
> +		  const char *group, const char *name,
> +		  const char *list[],
> +		  size_t length, const char ***config_var )
> +{
> +    g_key_file_set_string_list (config->key_file, group, name, list, length);
> +    talloc_free (*config_var);
> +    *config_var = NULL;
> +}
> +
> +void
> +notmuch_config_set_user_other_email (notmuch_config_t *config,
> +				     const char *list[],
> +				     size_t length)
> +{
> +    _config_set_list (config, "user", "other_email", list, length,
> +		     &(config->user_other_email));
>  }
>  
>  void
>  notmuch_config_set_new_tags (notmuch_config_t *config,
> -			     const char *new_tags[],
> -			     size_t length)
> +				     const char *list[],
> +				     size_t length)
>  {
> -    g_key_file_set_string_list (config->key_file,
> -				"new", "tags",
> -				new_tags, length);
> +    _config_set_list (config, "new", "tags", list, length,
> +		     &(config->new_tags));
> +}
>  
> -    talloc_free (config->new_tags);
> -    config->new_tags = NULL;
> +void
> +notmuch_config_set_log_subscribers (notmuch_config_t *config,
> +				    const char *list[],
> +				    size_t length)
> +{
> +    _config_set_list (config, "log", "subscribers", list, length,
> +		     &(config->log_subscribers));
>  }
>  
>  /* Given a configuration item of the form <group>.<key> return the
> -- 
> 1.7.7.3
> 
> _______________________________________________
> notmuch mailing list
> notmuch@notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH] cli: factor out config handling code to get/set lists.
  2011-12-11 16:41       ` Dmitry Kurochkin
@ 2011-12-12 18:26         ` David Bremner
  2012-01-12 17:26           ` Pieter Praet
  0 siblings, 1 reply; 15+ messages in thread
From: David Bremner @ 2011-12-12 18:26 UTC (permalink / raw)
  To: Dmitry Kurochkin, notmuch

On Sun, 11 Dec 2011 20:41:53 +0400, Dmitry Kurochkin <dmitry.kurochkin@gmail.com> wrote:
> Hi David.
> 
> On Sun, 11 Dec 2011 12:07:51 -0400, David Bremner <david@tethera.net> wrote:
> > From: David Bremner <bremner@debian.org>
> > 
> > Two new internal routines are created _config_get_list and
> > _config_set_list; the notmuch_config_get_* functions that deal with
> > lists are simply wrappers for these functions.

Updated version pushed. I'm not completely happy with _config_get_list's
weird API, but I don't have a better idea now.

d

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH] cli: factor out config handling code to get/set lists.
  2011-12-12 18:26         ` David Bremner
@ 2012-01-12 17:26           ` Pieter Praet
  2012-01-12 17:30             ` [PATCH] test: cli: getting/setting/removing config values Pieter Praet
  0 siblings, 1 reply; 15+ messages in thread
From: Pieter Praet @ 2012-01-12 17:26 UTC (permalink / raw)
  To: David Bremner, Dmitry Kurochkin, notmuch

On Mon, 12 Dec 2011 14:26:21 -0400, David Bremner <david@tethera.net> wrote:
> On Sun, 11 Dec 2011 20:41:53 +0400, Dmitry Kurochkin <dmitry.kurochkin@gmail.com> wrote:
> > Hi David.
> > 
> > On Sun, 11 Dec 2011 12:07:51 -0400, David Bremner <david@tethera.net> wrote:
> > > From: David Bremner <bremner@debian.org>
> > > 
> > > Two new internal routines are created _config_get_list and
> > > _config_set_list; the notmuch_config_get_* functions that deal with
> > > lists are simply wrappers for these functions.
> 
> Updated version pushed. I'm not completely happy with _config_get_list's
> weird API, but I don't have a better idea now.
> 
> d
> _______________________________________________
> notmuch mailing list
> notmuch@notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch

Much cleaner!

However... this would preferrably have been preceded by tests.

Patch follows.


Peace

-- 
Pieter

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH] test: cli: getting/setting/removing config values
  2012-01-12 17:26           ` Pieter Praet
@ 2012-01-12 17:30             ` Pieter Praet
  2012-01-13  3:42               ` David Bremner
  0 siblings, 1 reply; 15+ messages in thread
From: Pieter Praet @ 2012-01-12 17:30 UTC (permalink / raw)
  To: David Bremner, Dmitry Kurochkin; +Cc: Notmuch Mail

Should have come before commit 1df71b55

---
 test/config       |   88 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 test/notmuch-test |    1 +
 2 files changed, 89 insertions(+), 0 deletions(-)
 create mode 100755 test/config

diff --git a/test/config b/test/config
new file mode 100755
index 0000000..ee3126c
--- /dev/null
+++ b/test/config
@@ -0,0 +1,88 @@
+#!/usr/bin/env bash
+test_description='notmuch config'
+. ./test-lib.sh
+
+
+config_options=(
+    "database.path"
+    "user.name"
+    "user.primary_email"
+    "user.other_email"
+    "new.tags"
+    "maildir.synchronize_flags"
+)
+
+
+test_begin_subtest 'getting config: "config get <section>.<item>"'
+echo -n "" > OUTPUT
+for i in ${config_options[*]} ; do
+    notmuch config get "${i}"
+done >> OUTPUT
+cat >EXPECTED <<EOF
+${MAIL_DIR}
+Notmuch Test Suite
+test_suite@notmuchmail.org
+test_suite_other@notmuchmail.org
+test_suite@otherdomain.org
+unread
+inbox
+true
+EOF
+test_expect_equal_file OUTPUT EXPECTED
+
+
+test_begin_subtest 'setting config: "config set <section>.<item> [values ...]"'
+notmuch config set database.path /path/to/maildir
+notmuch config set user.name "User Name"
+notmuch config set user.primary_email primary_email@notmuchmail.org
+notmuch config set user.other_email alt1@notmuchmail.org alt2@notmuchmail.org
+notmuch config set new.tags tag1 tag2 tag3
+notmuch config set maildir.synchronize_flags false
+echo -n "" > OUTPUT
+for i in ${config_options[*]} ; do
+    notmuch config get "${i}"
+done >> OUTPUT
+cat >EXPECTED <<EOF
+/path/to/maildir
+User Name
+primary_email@notmuchmail.org
+alt1@notmuchmail.org
+alt2@notmuchmail.org
+tag1
+tag2
+tag3
+false
+EOF
+test_expect_equal_file OUTPUT EXPECTED
+
+
+test_begin_subtest 'removing config: "config set <section>.<item>"'
+notmuch config set database.path
+notmuch config set user.name
+notmuch config set user.primary_email
+notmuch config set user.other_email
+notmuch config set new.tags
+notmuch config set maildir.synchronize_flags
+echo -n "" > OUTPUT
+for i in ${config_options[*]} ; do
+    notmuch config get "${i}"
+done >> OUTPUT
+
+# FIXME: Not the most robust nor portable solution here...
+# Especially `hostname --domain' may have unwanted effects on
+# some platforms, e.g. setting your hostname to "--domain" ;)
+fallback_name="$(grep $(id -un) /etc/passwd | cut -d ":" -f 5 | cut -d "," -f 1)"
+fallback_email="$(id -un)@$(hostname).$(hostname --domain)"
+
+cat >EXPECTED <<EOF
+${HOME}/mail
+${fallback_name}
+${fallback_email}
+unread
+inbox
+true
+EOF
+test_expect_equal_file OUTPUT EXPECTED
+
+
+test_done
diff --git a/test/notmuch-test b/test/notmuch-test
index e40ef86..f0c1d7c 100755
--- a/test/notmuch-test
+++ b/test/notmuch-test
@@ -18,6 +18,7 @@ cd $(dirname "$0")
 
 TESTS="
   basic
+  config
   help-test
   new
   count
-- 
1.7.8.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH] test: cli: getting/setting/removing config values
  2012-01-12 17:30             ` [PATCH] test: cli: getting/setting/removing config values Pieter Praet
@ 2012-01-13  3:42               ` David Bremner
  2012-01-14  8:54                 ` Pieter Praet
  0 siblings, 1 reply; 15+ messages in thread
From: David Bremner @ 2012-01-13  3:42 UTC (permalink / raw)
  To: Pieter Praet; +Cc: Notmuch Mail

On Thu, 12 Jan 2012 18:30:01 +0100, Pieter Praet <pieter@praet.org> wrote:
> Should have come before commit 1df71b55

This doesn't seem like an especially helpful commit
message. Editorializing is ok, I guess, but maybe keep it below the
'---' ?

d

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH] test: cli: getting/setting/removing config values
  2012-01-13  3:42               ` David Bremner
@ 2012-01-14  8:54                 ` Pieter Praet
  2012-01-14  8:57                   ` Pieter Praet
  0 siblings, 1 reply; 15+ messages in thread
From: Pieter Praet @ 2012-01-14  8:54 UTC (permalink / raw)
  To: David Bremner; +Cc: Notmuch Mail

On Thu, 12 Jan 2012 23:42:04 -0400, David Bremner <david@tethera.net> wrote:
> On Thu, 12 Jan 2012 18:30:01 +0100, Pieter Praet <pieter@praet.org> wrote:
> > Should have come before commit 1df71b55
> 
> This doesn't seem like an especially helpful commit
> message. Editorializing is ok, I guess, but maybe keep it below the
> '---' ?
> 

You're right.  The message I was trying to convey (quite tersely),
was that these tests were written in response to commit 1df71b55
(and should probably be retroactively ran on 1df71b55~1).

I realize now that it could potentially be wrongly interpreted as
criticism of sorts, which of course wasn't my intention.

Anyways, I ran the tests on both 1df71b55~1 and 1df71b55, and
-as expected- everything checks out fine.

Amended patch follows.

> d


Peace

-- 
Pieter

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH] test: cli: getting/setting/removing config values
  2012-01-14  8:54                 ` Pieter Praet
@ 2012-01-14  8:57                   ` Pieter Praet
  2012-01-14 12:16                     ` David Bremner
  0 siblings, 1 reply; 15+ messages in thread
From: Pieter Praet @ 2012-01-14  8:57 UTC (permalink / raw)
  To: David Bremner; +Cc: Notmuch Mail

Full test coverage for getting, setting and removing options in
notmuch(1)'s config file ($NOTMUCH_CONFIG or $HOME/.notmuch-config).

---
Please *do* take note of the FIXME in the last test!

 test/config       |   88 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 test/notmuch-test |    1 +
 2 files changed, 89 insertions(+), 0 deletions(-)
 create mode 100755 test/config

diff --git a/test/config b/test/config
new file mode 100755
index 0000000..ee3126c
--- /dev/null
+++ b/test/config
@@ -0,0 +1,88 @@
+#!/usr/bin/env bash
+test_description='notmuch config'
+. ./test-lib.sh
+
+
+config_options=(
+    "database.path"
+    "user.name"
+    "user.primary_email"
+    "user.other_email"
+    "new.tags"
+    "maildir.synchronize_flags"
+)
+
+
+test_begin_subtest 'getting config: "config get <section>.<item>"'
+echo -n "" > OUTPUT
+for i in ${config_options[*]} ; do
+    notmuch config get "${i}"
+done >> OUTPUT
+cat >EXPECTED <<EOF
+${MAIL_DIR}
+Notmuch Test Suite
+test_suite@notmuchmail.org
+test_suite_other@notmuchmail.org
+test_suite@otherdomain.org
+unread
+inbox
+true
+EOF
+test_expect_equal_file OUTPUT EXPECTED
+
+
+test_begin_subtest 'setting config: "config set <section>.<item> [values ...]"'
+notmuch config set database.path /path/to/maildir
+notmuch config set user.name "User Name"
+notmuch config set user.primary_email primary_email@notmuchmail.org
+notmuch config set user.other_email alt1@notmuchmail.org alt2@notmuchmail.org
+notmuch config set new.tags tag1 tag2 tag3
+notmuch config set maildir.synchronize_flags false
+echo -n "" > OUTPUT
+for i in ${config_options[*]} ; do
+    notmuch config get "${i}"
+done >> OUTPUT
+cat >EXPECTED <<EOF
+/path/to/maildir
+User Name
+primary_email@notmuchmail.org
+alt1@notmuchmail.org
+alt2@notmuchmail.org
+tag1
+tag2
+tag3
+false
+EOF
+test_expect_equal_file OUTPUT EXPECTED
+
+
+test_begin_subtest 'removing config: "config set <section>.<item>"'
+notmuch config set database.path
+notmuch config set user.name
+notmuch config set user.primary_email
+notmuch config set user.other_email
+notmuch config set new.tags
+notmuch config set maildir.synchronize_flags
+echo -n "" > OUTPUT
+for i in ${config_options[*]} ; do
+    notmuch config get "${i}"
+done >> OUTPUT
+
+# FIXME: Not the most robust nor portable solution here...
+# Especially `hostname --domain' may have unwanted effects on
+# some platforms, e.g. setting your hostname to "--domain" ;)
+fallback_name="$(grep $(id -un) /etc/passwd | cut -d ":" -f 5 | cut -d "," -f 1)"
+fallback_email="$(id -un)@$(hostname).$(hostname --domain)"
+
+cat >EXPECTED <<EOF
+${HOME}/mail
+${fallback_name}
+${fallback_email}
+unread
+inbox
+true
+EOF
+test_expect_equal_file OUTPUT EXPECTED
+
+
+test_done
diff --git a/test/notmuch-test b/test/notmuch-test
index e40ef86..f0c1d7c 100755
--- a/test/notmuch-test
+++ b/test/notmuch-test
@@ -18,6 +18,7 @@ cd $(dirname "$0")
 
 TESTS="
   basic
+  config
   help-test
   new
   count
-- 
1.7.8.1

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH] test: cli: getting/setting/removing config values
  2012-01-14  8:57                   ` Pieter Praet
@ 2012-01-14 12:16                     ` David Bremner
  2012-01-16 10:31                       ` Pieter Praet
  0 siblings, 1 reply; 15+ messages in thread
From: David Bremner @ 2012-01-14 12:16 UTC (permalink / raw)
  To: Pieter Praet; +Cc: Notmuch Mail

On Sat, 14 Jan 2012 09:57:56 +0100, Pieter Praet <pieter@praet.org> wrote:
> Full test coverage for getting, setting and removing options in
> notmuch(1)'s config file ($NOTMUCH_CONFIG or $HOME/.notmuch-config).
> 
> ---
> +
> +# FIXME: Not the most robust nor portable solution here...
> +# Especially `hostname --domain' may have unwanted effects on
> +# some platforms, e.g. setting your hostname to "--domain" ;)
> +fallback_name="$(grep $(id -un) /etc/passwd | cut -d ":" -f 5 | cut -d "," -f 1)"
> +fallback_email="$(id -un)@$(hostname).$(hostname --domain)"

I'm not sure how portable it is, but maybe dnsdomainname would at least
have better failure modes.

I also wondered about using getent instead of grep.

d

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH] test: cli: getting/setting/removing config values
  2012-01-14 12:16                     ` David Bremner
@ 2012-01-16 10:31                       ` Pieter Praet
  2012-01-16 11:37                         ` David Bremner
  0 siblings, 1 reply; 15+ messages in thread
From: Pieter Praet @ 2012-01-16 10:31 UTC (permalink / raw)
  To: David Bremner; +Cc: Notmuch Mail

On Sat, 14 Jan 2012 08:16:30 -0400, David Bremner <david@tethera.net> wrote:
> On Sat, 14 Jan 2012 09:57:56 +0100, Pieter Praet <pieter@praet.org> wrote:
> > Full test coverage for getting, setting and removing options in
> > notmuch(1)'s config file ($NOTMUCH_CONFIG or $HOME/.notmuch-config).
> > 
> > ---
> > +
> > +# FIXME: Not the most robust nor portable solution here...
> > +# Especially `hostname --domain' may have unwanted effects on
> > +# some platforms, e.g. setting your hostname to "--domain" ;)
> > +fallback_name="$(grep $(id -un) /etc/passwd | cut -d ":" -f 5 | cut -d "," -f 1)"
> > +fallback_email="$(id -un)@$(hostname).$(hostname --domain)"
> 
> I'm not sure how portable it is, but maybe dnsdomainname would at least
> have better failure modes.
> 

Hmmm, `dnsdomainname' returns "(none)" here;  Does it work for you?

Running `domainname' instead seems to do the right thing though...


It would probably be safest to simply mirror how it's done @
notmuch-config.c:313, but that seems rather excessive.

> I also wondered about using getent instead of grep.
> 

Agreed, much safer;  `grep' might return multiple results.

> d

How about this? :

  #+begin_src sh
    fallback_name="$(getent passwd ${USER} | cut -d ":" -f 5 | cut -d "," -f 1)"
    test -n "${EMAIL}" \
        && fallback_email="${EMAIL}" \
        || fallback_email="${USER}@$(hostname).$(domainname)"
  #+end_src


Peace

-- 
Pieter

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH] test: cli: getting/setting/removing config values
  2012-01-16 10:31                       ` Pieter Praet
@ 2012-01-16 11:37                         ` David Bremner
  2012-01-16 16:48                           ` Pieter Praet
  0 siblings, 1 reply; 15+ messages in thread
From: David Bremner @ 2012-01-16 11:37 UTC (permalink / raw)
  To: Pieter Praet; +Cc: Notmuch Mail

On Mon, 16 Jan 2012 11:31:11 +0100, Pieter Praet <pieter@praet.org> wrote:
> 
> Hmmm, `dnsdomainname' returns "(none)" here;  Does it work for you?
> 
> Running `domainname' instead seems to do the right thing though...
> 

I make no claims to have "correctly" configured this machine on my home
network, but here it is the opposite.  The docs refer to NIS for
domainname, which I guess is not _that_ common for home networks (or at
all anymore?).

d

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH] test: cli: getting/setting/removing config values
  2012-01-16 11:37                         ` David Bremner
@ 2012-01-16 16:48                           ` Pieter Praet
  0 siblings, 0 replies; 15+ messages in thread
From: Pieter Praet @ 2012-01-16 16:48 UTC (permalink / raw)
  To: David Bremner; +Cc: Notmuch Mail

On Mon, 16 Jan 2012 07:37:13 -0400, David Bremner <david@tethera.net> wrote:
> On Mon, 16 Jan 2012 11:31:11 +0100, Pieter Praet <pieter@praet.org> wrote:
> > 
> > Hmmm, `dnsdomainname' returns "(none)" here;  Does it work for you?
> > 
> > Running `domainname' instead seems to do the right thing though...
> > 
> 
> I make no claims to have "correctly" configured this machine on my home
> network, [...]

Same here :)

> [...] but here it is the opposite.  The docs refer to NIS for
> domainname, which I guess is not _that_ common for home networks (or at
> all anymore?).
> 

$ grep hosts /etc/nsswitch.conf
hosts: files dns

I guess that's a no.

> d


Perhaps others could chime in?


Peace

-- 
Pieter

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2012-01-16 16:50 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-10 17:50 [RFC PATCH] cli: factor out config handling code to get/set lists David Bremner
2011-12-10 18:24 ` Austin Clements
2011-12-10 20:30   ` David Bremner
2011-12-11 16:07     ` [PATCH] " David Bremner
2011-12-11 16:41       ` Dmitry Kurochkin
2011-12-12 18:26         ` David Bremner
2012-01-12 17:26           ` Pieter Praet
2012-01-12 17:30             ` [PATCH] test: cli: getting/setting/removing config values Pieter Praet
2012-01-13  3:42               ` David Bremner
2012-01-14  8:54                 ` Pieter Praet
2012-01-14  8:57                   ` Pieter Praet
2012-01-14 12:16                     ` David Bremner
2012-01-16 10:31                       ` Pieter Praet
2012-01-16 11:37                         ` David Bremner
2012-01-16 16:48                           ` Pieter Praet

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).