Re: [DRAFT PATCH] notmuch new: do not ignore '.notmuch' in non-toplevel directories

Subject:Re: [DRAFT PATCH] notmuch new: do not ignore '.notmuch' in non-toplevel directories

Date:Mon, 24 Feb 2014 00:22:10 +0200

To:Tomi Ollila ,notmuch@notmuchmail.org

Cc:tomi.ollila@iki.fi

From:Jani Nikula


On Sun, 23 Feb 2014, Tomi Ollila <tomi.ollila@iki.fi> wrote:
> So that users may have email in subdir/.notmuch directories.
> ---
>
> Compiles, current tests pass. might ignore database_path/.notmuch and
> might descent into database_path/.../.notmuch :D
>
> Tomi
>
>
>  notmuch-new.c | 18 ++++++++++--------
>  1 file changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/notmuch-new.c b/notmuch-new.c
> index 8529fdd..b17bd75 100644
> --- a/notmuch-new.c
> +++ b/notmuch-new.c
> @@ -344,7 +344,8 @@ add_file (notmuch_database_t *notmuch, const char *filename,
>  static notmuch_status_t
>  add_files (notmuch_database_t *notmuch,
>  	   const char *path,
> -	   add_files_state_t *state)
> +	   add_files_state_t *state,
> +	   int dirlevel)

I think this is ugly and makes the interface harder to use for indexing
arbitrary paths.

Instead, I suggest

diff --git a/notmuch-new.c b/notmuch-new.c
index 8529fdd3eac7..20bc33fca4bd 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -469,7 +469,8 @@ add_files (notmuch_database_t *notmuch,
 	if (strcmp (entry->d_name, ".") == 0 ||
 	    strcmp (entry->d_name, "..") == 0 ||
 	    (is_maildir && strcmp (entry->d_name, "tmp") == 0) ||
-	    strcmp (entry->d_name, ".notmuch") == 0)
+	    (strcmp (entry->d_name, ".notmuch") == 0 &&
+	     strcmp (path, notmuch_database_get_path (notmuch)) == 0))
 	    continue;
 
 	next = talloc_asprintf (notmuch, "%s/%s", path, entry->d_name);

And similarly in count_files(), with the root db path passed as first
argument (as the db is not open yet).


BR,
Jani.



>  {
>      DIR *dir = NULL;
>      struct dirent *entry = NULL;
> @@ -469,11 +470,11 @@ add_files (notmuch_database_t *notmuch,
>  	if (strcmp (entry->d_name, ".") == 0 ||
>  	    strcmp (entry->d_name, "..") == 0 ||
>  	    (is_maildir && strcmp (entry->d_name, "tmp") == 0) ||
> -	    strcmp (entry->d_name, ".notmuch") == 0)
> +	    (dirlevel == 0 && strcmp (entry->d_name, ".notmuch") == 0))
>  	    continue;
>  
>  	next = talloc_asprintf (notmuch, "%s/%s", path, entry->d_name);
> -	status = add_files (notmuch, next, state);
> +	status = add_files (notmuch, next, state, dirlevel + 1);
>  	if (status) {
>  	    ret = status;
>  	    goto DONE;
> @@ -702,7 +703,8 @@ stop_progress_printing_timer (void)
>   * initialized to zero by the top-level caller before calling
>   * count_files). */
>  static void
> -count_files (const char *path, int *count, add_files_state_t *state)
> +count_files (const char *path, int *count, add_files_state_t *state,
> +	     int dirlevel)
>  {
>      struct dirent *entry = NULL;
>      char *next;
> @@ -725,7 +727,7 @@ count_files (const char *path, int *count, add_files_state_t *state)
>  	 */
>  	if (strcmp (entry->d_name, ".") == 0 ||
>  	    strcmp (entry->d_name, "..") == 0 ||
> -	    strcmp (entry->d_name, ".notmuch") == 0 ||
> +	    (dirlevel == 0 && strcmp (entry->d_name, ".notmuch") == 0) ||
>  	    _entry_in_ignore_list (entry->d_name, state))
>  	{
>  	    if (state->debug && _entry_in_ignore_list (entry->d_name, state))
> @@ -750,7 +752,7 @@ count_files (const char *path, int *count, add_files_state_t *state)
>  		fflush (stdout);
>  	    }
>  	} else if (entry_type == S_IFDIR) {
> -	    count_files (next, count, state);
> +	    count_files (next, count, state, dirlevel + 1);
>  	}
>  
>  	free (next);
> @@ -962,7 +964,7 @@ notmuch_new_command (notmuch_config_t *config, int argc, char *argv[])
>  	int count;
>  
>  	count = 0;
> -	count_files (db_path, &count, &add_files_state);
> +	count_files (db_path, &count, &add_files_state, 0);
>  	if (interrupted)
>  	    return EXIT_FAILURE;
>  
> @@ -1021,7 +1023,7 @@ notmuch_new_command (notmuch_config_t *config, int argc, char *argv[])
>  	timer_is_active = TRUE;
>      }
>  
> -    ret = add_files (notmuch, db_path, &add_files_state);
> +    ret = add_files (notmuch, db_path, &add_files_state, 0);
>      if (ret)
>  	goto DONE;
>  
> -- 
> 1.8.4.2
>
> _______________________________________________
> notmuch mailing list
> notmuch@notmuchmail.org
> http://notmuchmail.org/mailman/listinfo/notmuch

Thread: