unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH 0/6] cli: support regex in new.ignore
@ 2017-09-01 15:53 Jani Nikula
  2017-09-01 15:53 ` [PATCH 1/6] cli/new: use the same style for fs entry loops Jani Nikula
                   ` (5 more replies)
  0 siblings, 6 replies; 14+ messages in thread
From: Jani Nikula @ 2017-09-01 15:53 UTC (permalink / raw)
  To: notmuch

I dusted off some of my old patches to add support for /regex/ in
new.ignore. Regex instead of globbing because we now have prefix
searches with regex, so this is perhaps more in line. Some cleanups for
starters.

BR,
Jani.


Jani Nikula (6):
  cli/new: use the same style for fs entry loops
  cli/new: abstract special directory check
  cli/new: check for special directories earlier in pass 1
  cli/new: ignore special directories also in pass 2
  cli/new: support /<regex>/ in new.ignore
  test: test regexp based new.ignore

 doc/man1/notmuch-config.rst |  20 ++++--
 notmuch-new.c               | 144 ++++++++++++++++++++++++++++++++++++--------
 test/T050-new.sh            |  22 +++++++
 3 files changed, 155 insertions(+), 31 deletions(-)

-- 
2.11.0

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

* [PATCH 1/6] cli/new: use the same style for fs entry loops
  2017-09-01 15:53 [PATCH 0/6] cli: support regex in new.ignore Jani Nikula
@ 2017-09-01 15:53 ` Jani Nikula
  2017-09-13 12:08   ` David Bremner
  2017-09-01 15:53 ` [PATCH 2/6] cli/new: abstract special directory check Jani Nikula
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Jani Nikula @ 2017-09-01 15:53 UTC (permalink / raw)
  To: notmuch

Just to please the eyes. No functional changes.
---
 notmuch-new.c | 11 ++---------
 1 file changed, 2 insertions(+), 9 deletions(-)

diff --git a/notmuch-new.c b/notmuch-new.c
index e011788da590..c6a741fefa03 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -443,10 +443,7 @@ add_files (notmuch_database_t *notmuch,
     /* Pass 1: Recurse into all sub-directories. */
     is_maildir = _entries_resemble_maildir (path, fs_entries, num_fs_entries);
 
-    for (i = 0; i < num_fs_entries; i++) {
-	if (interrupted)
-	    break;
-
+    for (i = 0; i < num_fs_entries && ! interrupted; i++) {
 	entry = fs_entries[i];
 
 	/* Ignore any files/directories the user has configured to
@@ -514,11 +511,7 @@ add_files (notmuch_database_t *notmuch,
     }
 
     /* Pass 2: Scan for new files, removed files, and removed directories. */
-    for (i = 0; i < num_fs_entries; i++)
-    {
-	if (interrupted)
-	    break;
-
+    for (i = 0; i < num_fs_entries && ! interrupted; i++) {
         entry = fs_entries[i];
 
 	/* Ignore files & directories user has configured to be ignored */
-- 
2.11.0

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

* [PATCH 2/6] cli/new: abstract special directory check
  2017-09-01 15:53 [PATCH 0/6] cli: support regex in new.ignore Jani Nikula
  2017-09-01 15:53 ` [PATCH 1/6] cli/new: use the same style for fs entry loops Jani Nikula
@ 2017-09-01 15:53 ` Jani Nikula
  2017-09-01 15:53 ` [PATCH 3/6] cli/new: check for special directories earlier in pass 1 Jani Nikula
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 14+ messages in thread
From: Jani Nikula @ 2017-09-01 15:53 UTC (permalink / raw)
  To: notmuch

Add an abstraction for . and .. directory checks. No functional
changes.
---
 notmuch-new.c | 12 ++++++++----
 1 file changed, 8 insertions(+), 4 deletions(-)

diff --git a/notmuch-new.c b/notmuch-new.c
index c6a741fefa03..faeb8f0a5896 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -234,6 +234,12 @@ _entries_resemble_maildir (const char *path, struct dirent **entries, int count)
     return 0;
 }
 
+static notmuch_bool_t
+_special_directory (const char *entry)
+{
+    return strcmp (entry, ".") == 0 || strcmp (entry, "..") == 0;
+}
+
 /* Test if the file/directory is to be ignored.
  */
 static notmuch_bool_t
@@ -475,8 +481,7 @@ add_files (notmuch_database_t *notmuch,
 	 * Also ignore the .notmuch directory and any "tmp" directory
 	 * that appears within a maildir.
 	 */
-	if (strcmp (entry->d_name, ".") == 0 ||
-	    strcmp (entry->d_name, "..") == 0 ||
+	if (_special_directory (entry->d_name) ||
 	    (is_maildir && strcmp (entry->d_name, "tmp") == 0) ||
 	    strcmp (entry->d_name, ".notmuch") == 0)
 	    continue;
@@ -738,8 +743,7 @@ count_files (const char *path, int *count, add_files_state_t *state)
 	/* Ignore special directories to avoid infinite recursion.
 	 * Also ignore the .notmuch directory.
 	 */
-	if (strcmp (entry->d_name, ".") == 0 ||
-	    strcmp (entry->d_name, "..") == 0 ||
+	if (_special_directory (entry->d_name) ||
 	    strcmp (entry->d_name, ".notmuch") == 0)
 	    continue;
 
-- 
2.11.0

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

* [PATCH 3/6] cli/new: check for special directories earlier in pass 1
  2017-09-01 15:53 [PATCH 0/6] cli: support regex in new.ignore Jani Nikula
  2017-09-01 15:53 ` [PATCH 1/6] cli/new: use the same style for fs entry loops Jani Nikula
  2017-09-01 15:53 ` [PATCH 2/6] cli/new: abstract special directory check Jani Nikula
@ 2017-09-01 15:53 ` Jani Nikula
  2017-10-02 11:05   ` David Bremner
  2017-09-01 15:53 ` [PATCH 4/6] cli/new: ignore special directories also in pass 2 Jani Nikula
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 14+ messages in thread
From: Jani Nikula @ 2017-09-01 15:53 UTC (permalink / raw)
  To: notmuch

Avoid passing . and .. to ignore check. We don't need to check their
dirent type either.
---
 notmuch-new.c | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/notmuch-new.c b/notmuch-new.c
index faeb8f0a5896..378bf4c2a15a 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -452,6 +452,10 @@ add_files (notmuch_database_t *notmuch,
     for (i = 0; i < num_fs_entries && ! interrupted; i++) {
 	entry = fs_entries[i];
 
+	/* Ignore special directories to avoid infinite recursion. */
+	if (_special_directory (entry->d_name))
+	    continue;
+
 	/* Ignore any files/directories the user has configured to
 	 * ignore.  We do this before dirent_type both for performance
 	 * and because we don't care if dirent_type fails on entries
@@ -477,12 +481,10 @@ add_files (notmuch_database_t *notmuch,
 	    continue;
 	}
 
-	/* Ignore special directories to avoid infinite recursion.
-	 * Also ignore the .notmuch directory and any "tmp" directory
+	/* Ignore the .notmuch directory and any "tmp" directory
 	 * that appears within a maildir.
 	 */
-	if (_special_directory (entry->d_name) ||
-	    (is_maildir && strcmp (entry->d_name, "tmp") == 0) ||
+	if ((is_maildir && strcmp (entry->d_name, "tmp") == 0) ||
 	    strcmp (entry->d_name, ".notmuch") == 0)
 	    continue;
 
-- 
2.11.0

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

* [PATCH 4/6] cli/new: ignore special directories also in pass 2
  2017-09-01 15:53 [PATCH 0/6] cli: support regex in new.ignore Jani Nikula
                   ` (2 preceding siblings ...)
  2017-09-01 15:53 ` [PATCH 3/6] cli/new: check for special directories earlier in pass 1 Jani Nikula
@ 2017-09-01 15:53 ` Jani Nikula
  2017-09-01 15:53 ` [PATCH 5/6] cli/new: support /<regex>/ in new.ignore Jani Nikula
  2017-09-01 15:53 ` [PATCH 6/6] test: test regexp based new.ignore Jani Nikula
  5 siblings, 0 replies; 14+ messages in thread
From: Jani Nikula @ 2017-09-01 15:53 UTC (permalink / raw)
  To: notmuch

Avoid passing . and .. to ignore check. We also don't need to check
their dirent type either.
---
 notmuch-new.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/notmuch-new.c b/notmuch-new.c
index 378bf4c2a15a..2ce3af872f0e 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -521,6 +521,10 @@ add_files (notmuch_database_t *notmuch,
     for (i = 0; i < num_fs_entries && ! interrupted; i++) {
         entry = fs_entries[i];
 
+	/* Ignore special directories early. */
+	if (_special_directory (entry->d_name))
+	    continue;
+
 	/* Ignore files & directories user has configured to be ignored */
 	if (_entry_in_ignore_list (entry->d_name, state)) {
 	    if (state->debug)
-- 
2.11.0

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

* [PATCH 5/6] cli/new: support /<regex>/ in new.ignore
  2017-09-01 15:53 [PATCH 0/6] cli: support regex in new.ignore Jani Nikula
                   ` (3 preceding siblings ...)
  2017-09-01 15:53 ` [PATCH 4/6] cli/new: ignore special directories also in pass 2 Jani Nikula
@ 2017-09-01 15:53 ` Jani Nikula
  2017-09-26  2:13   ` David Bremner
  2017-09-01 15:53 ` [PATCH 6/6] test: test regexp based new.ignore Jani Nikula
  5 siblings, 1 reply; 14+ messages in thread
From: Jani Nikula @ 2017-09-01 15:53 UTC (permalink / raw)
  To: notmuch

Add support for using /<regex>/ style regular expressions in
new.ignore, mixed with the old style verbatim file and directory
basenames. The regex is matched against the relative path from the
database path.
---
 doc/man1/notmuch-config.rst |  20 ++++++--
 notmuch-new.c               | 109 ++++++++++++++++++++++++++++++++++++++++----
 2 files changed, 114 insertions(+), 15 deletions(-)

diff --git a/doc/man1/notmuch-config.rst b/doc/man1/notmuch-config.rst
index 6a51e64f1517..aab0676b1578 100644
--- a/doc/man1/notmuch-config.rst
+++ b/doc/man1/notmuch-config.rst
@@ -75,11 +75,21 @@ The available configuration items are described below.
         Default: ``unread;inbox``.
 
     **new.ignore**
-        A list of file and directory names, without path, that will not
-        be searched for messages by **notmuch new**. All the files and
-        directories matching any of the names specified here will be
-        ignored, regardless of the location in the mail store directory
-        hierarchy.
+        A list to specify files and directories that will not be
+        searched for messages by **notmuch new**. Each entry in the
+        list is either:
+
+	  A file or a directory name, without path, that will be
+	  ignored, regardless of the location in the mail store
+	  directory hierarchy.
+
+	Or:
+
+	  A regular expression delimited with // that will be matched
+	  against the path of the file or directory relative to the
+	  database path. The beginning and end of string must be
+	  explictly anchored. For example, /.*/foo$/ would match
+	  "bar/foo" and "bar/baz/foo", but not "foo" or "bar/foobar".
 
         Default: empty list.
 
diff --git a/notmuch-new.c b/notmuch-new.c
index 2ce3af872f0e..8146c99413b8 100644
--- a/notmuch-new.c
+++ b/notmuch-new.c
@@ -42,13 +42,17 @@ enum verbosity {
 };
 
 typedef struct {
+    const char *db_path;
+
     int output_is_a_tty;
     enum verbosity verbosity;
     notmuch_bool_t debug;
     const char **new_tags;
     size_t new_tags_length;
-    const char **new_ignore;
-    size_t new_ignore_length;
+    const char **ignore_verbatim;
+    size_t ignore_verbatim_length;
+    regex_t *ignore_regex;
+    size_t ignore_regex_length;
 
     int total_files;
     int processed_files;
@@ -240,18 +244,102 @@ _special_directory (const char *entry)
     return strcmp (entry, ".") == 0 || strcmp (entry, "..") == 0;
 }
 
+static notmuch_bool_t
+_setup_ignore (notmuch_config_t *config, add_files_state_t *state)
+{
+    const char **ignore_list, **ignore;
+    int nregex = 0, nverbatim = 0;
+    const char **verbatim = NULL;
+    regex_t *regex = NULL;
+
+    ignore_list = notmuch_config_get_new_ignore (config, NULL);
+    if (! ignore_list)
+	return TRUE;
+
+    for (ignore = ignore_list; *ignore; ignore++) {
+	const char *s = *ignore;
+	size_t len = strlen (s);
+
+	if (len > 2 && s[0] == '/' && s[len - 1] == '/') {
+	    regex_t *preg;
+	    char *r = talloc_strndup (config, s + 1, len - 2);
+
+	    regex = talloc_realloc (config, regex, regex_t, nregex + 1);
+	    preg = &regex[nregex];
+
+	    if (xregcomp (preg, r, REG_EXTENDED | REG_NOSUB) == 0)
+		nregex++;
+
+	    talloc_free (r);
+	} else {
+	    verbatim = talloc_realloc (config, verbatim, const char *,
+				       nverbatim + 1);
+	    verbatim[nverbatim++] = s;
+	}
+    }
+
+    state->ignore_regex = regex;
+    state->ignore_regex_length = nregex;
+    state->ignore_verbatim = verbatim;
+    state->ignore_verbatim_length = nverbatim;
+
+    return TRUE;
+}
+
+static char *
+_get_relative_path (const char *db_path, const char *dirpath, const char *entry)
+{
+    size_t db_path_len = strlen (db_path);
+
+    /* paranoia? */
+    if (strncmp (dirpath, db_path, db_path_len) != 0) {
+	fprintf (stderr, "Warning: '%s' is not a subdirectory of '%s'\n",
+		 dirpath, db_path);
+	return NULL;
+    }
+
+    dirpath += db_path_len;
+    while (*dirpath == '/')
+	dirpath++;
+
+    if (*dirpath)
+	return talloc_asprintf (NULL, "%s/%s", dirpath, entry);
+    else
+	return talloc_strdup (NULL, entry);
+}
+
 /* Test if the file/directory is to be ignored.
  */
 static notmuch_bool_t
-_entry_in_ignore_list (const char *entry, add_files_state_t *state)
+_entry_in_ignore_list (add_files_state_t *state, const char *dirpath,
+		       const char *entry)
 {
+    notmuch_bool_t ret = FALSE;
     size_t i;
+    char *path;
 
-    for (i = 0; i < state->new_ignore_length; i++)
-	if (strcmp (entry, state->new_ignore[i]) == 0)
+    for (i = 0; i < state->ignore_verbatim_length; i++) {
+	if (strcmp (entry, state->ignore_verbatim[i]) == 0)
 	    return TRUE;
+    }
+
+    if (! state->ignore_regex_length)
+	return FALSE;
 
-    return FALSE;
+    path = _get_relative_path (state->db_path, dirpath, entry);
+    if (! path)
+	return FALSE;
+
+    for (i = 0; i < state->ignore_regex_length; i++) {
+	if (regexec (&state->ignore_regex[i], path, 0, NULL, 0) == 0) {
+	    ret = TRUE;
+	    break;
+	}
+    }
+
+    talloc_free (path);
+
+    return ret;
 }
 
 /* Add a single file to the database. */
@@ -461,7 +549,7 @@ add_files (notmuch_database_t *notmuch,
 	 * and because we don't care if dirent_type fails on entries
 	 * that are explicitly ignored.
 	 */
-	if (_entry_in_ignore_list (entry->d_name, state)) {
+	if (_entry_in_ignore_list (state, path, entry->d_name)) {
 	    if (state->debug)
 		printf ("(D) add_files, pass 1: explicitly ignoring %s/%s\n",
 			path, entry->d_name);
@@ -526,7 +614,7 @@ add_files (notmuch_database_t *notmuch,
 	    continue;
 
 	/* Ignore files & directories user has configured to be ignored */
-	if (_entry_in_ignore_list (entry->d_name, state)) {
+	if (_entry_in_ignore_list (state, path, entry->d_name)) {
 	    if (state->debug)
 		printf ("(D) add_files, pass 2: explicitly ignoring %s/%s\n",
 			path, entry->d_name);
@@ -756,7 +844,7 @@ count_files (const char *path, int *count, add_files_state_t *state)
 	/* Ignore any files/directories the user has configured to be
 	 * ignored
 	 */
-	if (_entry_in_ignore_list (entry->d_name, state)) {
+	if (_entry_in_ignore_list (state, path, entry->d_name)) {
 	    if (state->debug)
 		printf ("(D) count_files: explicitly ignoring %s/%s\n",
 			path, entry->d_name);
@@ -980,9 +1068,10 @@ notmuch_new_command (notmuch_config_t *config, int argc, char *argv[])
 	add_files_state.verbosity = VERBOSITY_VERBOSE;
 
     add_files_state.new_tags = notmuch_config_get_new_tags (config, &add_files_state.new_tags_length);
-    add_files_state.new_ignore = notmuch_config_get_new_ignore (config, &add_files_state.new_ignore_length);
     add_files_state.synchronize_flags = notmuch_config_get_maildir_synchronize_flags (config);
     db_path = notmuch_config_get_database_path (config);
+    add_files_state.db_path = db_path;
+    _setup_ignore (config, &add_files_state);
 
     for (i = 0; i < add_files_state.new_tags_length; i++) {
 	const char *error_msg;
-- 
2.11.0

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

* [PATCH 6/6] test: test regexp based new.ignore
  2017-09-01 15:53 [PATCH 0/6] cli: support regex in new.ignore Jani Nikula
                   ` (4 preceding siblings ...)
  2017-09-01 15:53 ` [PATCH 5/6] cli/new: support /<regex>/ in new.ignore Jani Nikula
@ 2017-09-01 15:53 ` Jani Nikula
  2017-10-02  0:57   ` David Bremner
  5 siblings, 1 reply; 14+ messages in thread
From: Jani Nikula @ 2017-09-01 15:53 UTC (permalink / raw)
  To: notmuch

Just some basics.
---
 test/T050-new.sh | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/test/T050-new.sh b/test/T050-new.sh
index 272ed417aa2e..ee9ce08c8e86 100755
--- a/test/T050-new.sh
+++ b/test/T050-new.sh
@@ -259,6 +259,28 @@ ln -s i_do_not_exist "${MAIL_DIR}"/broken_link
 output=$(NOTMUCH_NEW 2>&1)
 test_expect_equal "$output" "No new mail."
 
+test_begin_subtest "Ignore files and directories specified in new.ignore (regexp)"
+notmuch config set new.ignore ".git" "/^bro.*ink\$/" "/ignored.*file/"
+output=$(NOTMUCH_NEW --debug 2>&1 | sort)
+test_expect_equal "$output" \
+"(D) add_files, pass 1: explicitly ignoring ${MAIL_DIR}/.git
+(D) add_files, pass 1: explicitly ignoring ${MAIL_DIR}/.ignored_hidden_file
+(D) add_files, pass 1: explicitly ignoring ${MAIL_DIR}/broken_link
+(D) add_files, pass 1: explicitly ignoring ${MAIL_DIR}/ignored_file
+(D) add_files, pass 1: explicitly ignoring ${MAIL_DIR}/one/ignored_file
+(D) add_files, pass 1: explicitly ignoring ${MAIL_DIR}/one/two/ignored_file
+(D) add_files, pass 1: explicitly ignoring ${MAIL_DIR}/one/two/three/.git
+(D) add_files, pass 1: explicitly ignoring ${MAIL_DIR}/one/two/three/ignored_file
+(D) add_files, pass 2: explicitly ignoring ${MAIL_DIR}/.git
+(D) add_files, pass 2: explicitly ignoring ${MAIL_DIR}/.ignored_hidden_file
+(D) add_files, pass 2: explicitly ignoring ${MAIL_DIR}/broken_link
+(D) add_files, pass 2: explicitly ignoring ${MAIL_DIR}/ignored_file
+(D) add_files, pass 2: explicitly ignoring ${MAIL_DIR}/one/ignored_file
+(D) add_files, pass 2: explicitly ignoring ${MAIL_DIR}/one/two/ignored_file
+(D) add_files, pass 2: explicitly ignoring ${MAIL_DIR}/one/two/three/.git
+(D) add_files, pass 2: explicitly ignoring ${MAIL_DIR}/one/two/three/ignored_file
+No new mail."
+
 test_begin_subtest "Quiet: No new mail."
 output=$(NOTMUCH_NEW --quiet)
 test_expect_equal "$output" ""
-- 
2.11.0

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

* Re: [PATCH 1/6] cli/new: use the same style for fs entry loops
  2017-09-01 15:53 ` [PATCH 1/6] cli/new: use the same style for fs entry loops Jani Nikula
@ 2017-09-13 12:08   ` David Bremner
  0 siblings, 0 replies; 14+ messages in thread
From: David Bremner @ 2017-09-13 12:08 UTC (permalink / raw)
  To: Jani Nikula, notmuch

Jani Nikula <jani@nikula.org> writes:

> Just to please the eyes. No functional changes.

first two patches in the series pushed to master

d

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

* Re: [PATCH 5/6] cli/new: support /<regex>/ in new.ignore
  2017-09-01 15:53 ` [PATCH 5/6] cli/new: support /<regex>/ in new.ignore Jani Nikula
@ 2017-09-26  2:13   ` David Bremner
  2017-09-26 19:11     ` Jani Nikula
  0 siblings, 1 reply; 14+ messages in thread
From: David Bremner @ 2017-09-26  2:13 UTC (permalink / raw)
  To: Jani Nikula, notmuch

Jani Nikula <jani@nikula.org> writes:

> +	  A regular expression delimited with // that will be matched
> +	  against the path of the file or directory relative to the
> +	  database path. The beginning and end of string must be
> +	  explictly anchored. For example, /.*/foo$/ would match
> +	  "bar/foo" and "bar/baz/foo", but not "foo" or "bar/foobar".

Is it worth remarking that '/' does not need to be escaped? or more
interestingly, what happens if it is escaped, do things break?
>  
> +static notmuch_bool_t
> +_setup_ignore (notmuch_config_t *config, add_files_state_t *state)
> +{

Would be nice to document what this return value means.

> +    const char **ignore_list, **ignore;
> +    int nregex = 0, nverbatim = 0;
> +    const char **verbatim = NULL;
> +    regex_t *regex = NULL;
> +
> +    ignore_list = notmuch_config_get_new_ignore (config, NULL);
> +    if (! ignore_list)
> +	return TRUE;
> +
> +    for (ignore = ignore_list; *ignore; ignore++) {
> +	const char *s = *ignore;
> +	size_t len = strlen (s);
> +
> +	if (len > 2 && s[0] == '/' && s[len - 1] == '/') {

One thing we eventually settled on in the query parser is that an
opening '/' without a trailing '/' is an errror. But perhaps it's fine
to take a more permissive approach here.

> +
> +    if (! state->ignore_regex_length)
> +	return FALSE;

It's a nitpick, even by the standards of this review, but I'd prefer an
explicit '> 0' check.

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

* Re: [PATCH 5/6] cli/new: support /<regex>/ in new.ignore
  2017-09-26  2:13   ` David Bremner
@ 2017-09-26 19:11     ` Jani Nikula
  2017-10-02  1:00       ` David Bremner
  0 siblings, 1 reply; 14+ messages in thread
From: Jani Nikula @ 2017-09-26 19:11 UTC (permalink / raw)
  To: David Bremner, notmuch

On Mon, 25 Sep 2017, David Bremner <david@tethera.net> wrote:
> Jani Nikula <jani@nikula.org> writes:
>
>> +	  A regular expression delimited with // that will be matched
>> +	  against the path of the file or directory relative to the
>> +	  database path. The beginning and end of string must be
>> +	  explictly anchored. For example, /.*/foo$/ would match
>> +	  "bar/foo" and "bar/baz/foo", but not "foo" or "bar/foobar".
>
> Is it worth remarking that '/' does not need to be escaped? or more
> interestingly, what happens if it is escaped, do things break?

It just gets passed down to regcomp() with the escape and all. I'm not
sure it's worth trying to exhaustively explain everything.

>>  
>> +static notmuch_bool_t
>> +_setup_ignore (notmuch_config_t *config, add_files_state_t *state)
>> +{
>
> Would be nice to document what this return value means.

Something like:

/* Jani forgot to do anything useful with the return value */

I think it was originally meant to return false on illegal input
(e.g. opening '/' without closing '/') or regcomp() failing, but then I
opted for the more lax approach. xregcomp() warns about failures though.

>
>> +    const char **ignore_list, **ignore;
>> +    int nregex = 0, nverbatim = 0;
>> +    const char **verbatim = NULL;
>> +    regex_t *regex = NULL;
>> +
>> +    ignore_list = notmuch_config_get_new_ignore (config, NULL);
>> +    if (! ignore_list)
>> +	return TRUE;
>> +
>> +    for (ignore = ignore_list; *ignore; ignore++) {
>> +	const char *s = *ignore;
>> +	size_t len = strlen (s);
>> +
>> +	if (len > 2 && s[0] == '/' && s[len - 1] == '/') {
>
> One thing we eventually settled on in the query parser is that an
> opening '/' without a trailing '/' is an errror. But perhaps it's fine
> to take a more permissive approach here.

I'm fine either way, I just chose to be permissive.

So do I make the function void and drop the return values, or make it
check and return errors?

>
>> +
>> +    if (! state->ignore_regex_length)
>> +	return FALSE;
>
> It's a nitpick, even by the standards of this review, but I'd prefer an
> explicit '> 0' check.

ITYM (state->ignore_regex_length == 0) but ack.

BR,
Jani.

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

* Re: [PATCH 6/6] test: test regexp based new.ignore
  2017-09-01 15:53 ` [PATCH 6/6] test: test regexp based new.ignore Jani Nikula
@ 2017-10-02  0:57   ` David Bremner
  2017-10-02  8:56     ` David Bremner
  0 siblings, 1 reply; 14+ messages in thread
From: David Bremner @ 2017-10-02  0:57 UTC (permalink / raw)
  To: Jani Nikula, notmuch

[-- Attachment #1: Type: text/plain, Size: 263 bytes --]

Jani Nikula <jani@nikula.org> writes:

> Just some basics.
> ---
>  test/T050-new.sh | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)

Tests fail after applying this patch (output attached).

It sortof looks like the regexp ignore is not working?


[-- Attachment #2: T50.out --]
[-- Type: application/octet-stream, Size: 4324 bytes --]


T050-new: Testing "notmuch new" in several variations
 PASS   No new messages
 PASS   Single new message
 PASS   Multiple new messages
 PASS   No new messages (non-empty DB)
 PASS   New directories
 PASS   Alternate inode order
 PASS   Message moved in
 PASS   Renamed message
 PASS   Deleted message
 PASS   Renamed directory
 PASS   Deleted directory
 PASS   New directory (at end of list)
 PASS   Deleted directory (end of list)
 PASS   New symlink to directory
 PASS   New symlink to a file
 PASS   Broken symlink aborts
 PASS   New two-level directory
 PASS   Deleted two-level directory
 PASS   One character directory at top level
 PASS   Support single-message mbox
 PASS   Skip and report non-mail files
 PASS   Ignore files and directories specified in new.ignore
 PASS   Ignore files and directories specified in new.ignore (multiple occurrences)
 PASS   Don't stop for ignored broken symlinks
 FAIL   Ignore files and directories specified in new.ignore (regexp)
	--- T050-new.25.expected	2017-10-02 00:53:44.077523808 +0000
	+++ T050-new.25.output	2017-10-02 00:53:44.077523808 +0000
	@@ -1,17 +1,4 @@
	 (D) add_files, pass 1: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/.git
	-(D) add_files, pass 1: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/.ignored_hidden_file
	-(D) add_files, pass 1: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/broken_link
	-(D) add_files, pass 1: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/ignored_file
	-(D) add_files, pass 1: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/one/ignored_file
	-(D) add_files, pass 1: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/one/two/ignored_file
	-(D) add_files, pass 1: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/one/two/three/.git
	-(D) add_files, pass 1: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/one/two/three/ignored_file
	-(D) add_files, pass 2: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/.git
	-(D) add_files, pass 2: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/.ignored_hidden_file
	-(D) add_files, pass 2: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/broken_link
	-(D) add_files, pass 2: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/ignored_file
	-(D) add_files, pass 2: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/one/ignored_file
	-(D) add_files, pass 2: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/one/two/ignored_file
	-(D) add_files, pass 2: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/one/two/three/.git
	-(D) add_files, pass 2: explicitly ignoring /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/one/two/three/ignored_file
	+Error reading file /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/broken_link: No such file or directory
	 No new mail.
	+Note: A fatal error was encountered: Something went wrong trying to read or write a file
 PASS   Quiet: No new mail.
 PASS   Quiet: new, removed and renamed messages.
 PASS   Empty tags in new.tags are forbidden
 PASS   Tags starting with '-' in new.tags are forbidden
 PASS   Invalid tags set exit code
 PASS   Xapian exception: read only files
 FAIL   Handle files vanishing between scandir and add_file
	--- T050-new.32.EXPECTED	2017-10-02 00:53:44.721523264 +0000
	+++ T050-new.32.OUTPUT	2017-10-02 00:53:44.725523262 +0000
	@@ -1,4 +1,3 @@
	-Unexpected error with file /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/vanish
	-add_file: Something went wrong trying to read or write a file
	-Error opening /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/vanish: No such file or directory
	-exit status: 75
	+Error reading file /home/bremner/software/upstream/notmuch/test/tmp.T050-new/mail/broken_link: No such file or directory
	+Note: A fatal error was encountered: Something went wrong trying to read or write a file
	+exit status: 1

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

* Re: [PATCH 5/6] cli/new: support /<regex>/ in new.ignore
  2017-09-26 19:11     ` Jani Nikula
@ 2017-10-02  1:00       ` David Bremner
  0 siblings, 0 replies; 14+ messages in thread
From: David Bremner @ 2017-10-02  1:00 UTC (permalink / raw)
  To: Jani Nikula, notmuch

Jani Nikula <jani@nikula.org> writes:
>>
>> One thing we eventually settled on in the query parser is that an
>> opening '/' without a trailing '/' is an errror. But perhaps it's fine
>> to take a more permissive approach here.
>
> I'm fine either way, I just chose to be permissive.
>
> So do I make the function void and drop the return values, or make it
> check and return errors?

I think I'd prefer to start strict, it's easier to become permissive later.

>
>>
>>> +
>>> +    if (! state->ignore_regex_length)
>>> +	return FALSE;
>>
>> It's a nitpick, even by the standards of this review, but I'd prefer an
>> explicit '> 0' check.
>
> ITYM (state->ignore_regex_length == 0) but ack.
>

yeah, thought of that after just after I sent it, but yes.

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

* Re: [PATCH 6/6] test: test regexp based new.ignore
  2017-10-02  0:57   ` David Bremner
@ 2017-10-02  8:56     ` David Bremner
  0 siblings, 0 replies; 14+ messages in thread
From: David Bremner @ 2017-10-02  8:56 UTC (permalink / raw)
  To: Jani Nikula, notmuch

David Bremner <david@tethera.net> writes:

> Jani Nikula <jani@nikula.org> writes:
>
>> Just some basics.
>> ---
>>  test/T050-new.sh | 22 ++++++++++++++++++++++
>>  1 file changed, 22 insertions(+)
>
> Tests fail after applying this patch (output attached).
>
> It sortof looks like the regexp ignore is not working?

Oh, never mind, I out clevered myself managing patches and skipped the
one that actually enabled the regexp ignore handling.

d

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

* Re: [PATCH 3/6] cli/new: check for special directories earlier in pass 1
  2017-09-01 15:53 ` [PATCH 3/6] cli/new: check for special directories earlier in pass 1 Jani Nikula
@ 2017-10-02 11:05   ` David Bremner
  0 siblings, 0 replies; 14+ messages in thread
From: David Bremner @ 2017-10-02 11:05 UTC (permalink / raw)
  To: Jani Nikula, notmuch

Jani Nikula <jani@nikula.org> writes:

> Avoid passing . and .. to ignore check. We don't need to check their
> dirent type either.

pushed 3 and 4

d

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

end of thread, other threads:[~2017-10-02 11:05 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-09-01 15:53 [PATCH 0/6] cli: support regex in new.ignore Jani Nikula
2017-09-01 15:53 ` [PATCH 1/6] cli/new: use the same style for fs entry loops Jani Nikula
2017-09-13 12:08   ` David Bremner
2017-09-01 15:53 ` [PATCH 2/6] cli/new: abstract special directory check Jani Nikula
2017-09-01 15:53 ` [PATCH 3/6] cli/new: check for special directories earlier in pass 1 Jani Nikula
2017-10-02 11:05   ` David Bremner
2017-09-01 15:53 ` [PATCH 4/6] cli/new: ignore special directories also in pass 2 Jani Nikula
2017-09-01 15:53 ` [PATCH 5/6] cli/new: support /<regex>/ in new.ignore Jani Nikula
2017-09-26  2:13   ` David Bremner
2017-09-26 19:11     ` Jani Nikula
2017-10-02  1:00       ` David Bremner
2017-09-01 15:53 ` [PATCH 6/6] test: test regexp based new.ignore Jani Nikula
2017-10-02  0:57   ` David Bremner
2017-10-02  8:56     ` David Bremner

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).