From: Tomi Ollila Date: Mon, 6 Feb 2012 09:28:24 +0000 (+0200) Subject: [PATCH v6 2/3] add support for user-specified files & directories to ignore X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=f774c1cbc553a16348249c9832d56d7bfedf77e4;p=notmuch-archives.git [PATCH v6 2/3] add support for user-specified files & directories to ignore --- diff --git a/b5/e05917addc5b9e1024ff08eff03096f3301382 b/b5/e05917addc5b9e1024ff08eff03096f3301382 new file mode 100644 index 000000000..832945195 --- /dev/null +++ b/b5/e05917addc5b9e1024ff08eff03096f3301382 @@ -0,0 +1,290 @@ +Return-Path: +X-Original-To: notmuch@notmuchmail.org +Delivered-To: notmuch@notmuchmail.org +Received: from localhost (localhost [127.0.0.1]) + by olra.theworths.org (Postfix) with ESMTP id B99C8431FAF + for ; Mon, 6 Feb 2012 01:28:26 -0800 (PST) +X-Virus-Scanned: Debian amavisd-new at olra.theworths.org +X-Spam-Flag: NO +X-Spam-Score: 0 +X-Spam-Level: +X-Spam-Status: No, score=0 tagged_above=-999 required=5 tests=[none] + autolearn=disabled +Received: from olra.theworths.org ([127.0.0.1]) + by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) + with ESMTP id DtzXO9tiwWkV for ; + Mon, 6 Feb 2012 01:28:25 -0800 (PST) +Received: from guru.guru-group.fi (guru-group.fi [87.108.86.66]) + by olra.theworths.org (Postfix) with ESMTP id 1E460431FAE + for ; Mon, 6 Feb 2012 01:28:25 -0800 (PST) +Received: by guru.guru-group.fi (Postfix, from userid 501) + id 3837B68056; Mon, 6 Feb 2012 11:28:27 +0200 (EET) +From: Tomi Ollila +To: notmuch@notmuchmail.org +Subject: [PATCH v6 2/3] add support for user-specified files & directories to + ignore +Date: Mon, 6 Feb 2012 11:28:24 +0200 +Message-Id: <1328520505-26382-2-git-send-email-tomi.ollila@iki.fi> +X-Mailer: git-send-email 1.7.6.1 +In-Reply-To: <1328520505-26382-1-git-send-email-tomi.ollila@iki.fi> +References: <1315949524-4948-1-git-send-email-tomi.ollila@iki.fi> + <1328520505-26382-1-git-send-email-tomi.ollila@iki.fi> +Cc: Tomi Ollila +X-BeenThere: notmuch@notmuchmail.org +X-Mailman-Version: 2.1.13 +Precedence: list +List-Id: "Use and development of the notmuch mail system." + +List-Unsubscribe: , + +List-Archive: +List-Post: +List-Help: +List-Subscribe: , + +X-List-Received-Date: Mon, 06 Feb 2012 09:28:26 -0000 + +A new configuration key 'new.ignore' is used to determine which +files and directories user wants not to be scanned as new mails. + +Mark the corresponding test as no longer broken. + +This work merges my previous attempts and Andreas Amann's work +in id:"ylp7hi23mw8.fsf@tyndall.ie" +--- + notmuch-client.h | 9 +++++++++ + notmuch-config.c | 30 +++++++++++++++++++++++++++++- + notmuch-new.c | 45 +++++++++++++++++++++++++++++++++------------ + test/new | 1 - + 4 files changed, 71 insertions(+), 14 deletions(-) + +diff --git a/notmuch-client.h b/notmuch-client.h +index e0eb594..f1762ae 100644 +--- a/notmuch-client.h ++++ b/notmuch-client.h +@@ -250,6 +250,15 @@ notmuch_config_set_new_tags (notmuch_config_t *config, + const char *new_tags[], + size_t length); + ++const char ** ++notmuch_config_get_new_ignore (notmuch_config_t *config, ++ size_t *length); ++ ++void ++notmuch_config_set_new_ignore (notmuch_config_t *config, ++ const char *new_ignore[], ++ size_t length); ++ + notmuch_bool_t + notmuch_config_get_maildir_synchronize_flags (notmuch_config_t *config); + +diff --git a/notmuch-config.c b/notmuch-config.c +index a124e34..1f01128 100644 +--- a/notmuch-config.c ++++ b/notmuch-config.c +@@ -44,7 +44,10 @@ static const char new_config_comment[] = + " The following options are supported here:\n" + "\n" + "\ttags A list (separated by ';') of the tags that will be\n" +- "\t added to all messages incorporated by \"notmuch new\".\n"; ++ "\t added to all messages incorporated by \"notmuch new\".\n" ++ "\n" ++ "\tignore A list (separated by ';') of file and directory names\n" ++ "\t that will not be searched for messages by \"notmuch new\".\n"; + + static const char user_config_comment[] = + " User configuration\n" +@@ -105,6 +108,8 @@ struct _notmuch_config { + size_t user_other_email_length; + const char **new_tags; + size_t new_tags_length; ++ const char **new_ignore; ++ size_t new_ignore_length; + notmuch_bool_t maildir_synchronize_flags; + const char **search_exclude_tags; + size_t search_exclude_tags_length; +@@ -264,6 +269,8 @@ notmuch_config_open (void *ctx, + config->user_other_email_length = 0; + config->new_tags = NULL; + config->new_tags_length = 0; ++ config->new_ignore = NULL; ++ config->new_ignore_length = 0; + config->maildir_synchronize_flags = TRUE; + config->search_exclude_tags = NULL; + config->search_exclude_tags_length = 0; +@@ -361,6 +368,10 @@ notmuch_config_open (void *ctx, + notmuch_config_set_new_tags (config, tags, 2); + } + ++ if (notmuch_config_get_new_ignore (config, &tmp) == NULL) { ++ notmuch_config_set_new_ignore (config, NULL, 0); ++ } ++ + if (notmuch_config_get_search_exclude_tags (config, &tmp) == NULL) { + if (is_new) { + const char *tags[] = { "deleted", "spam" }; +@@ -609,6 +620,14 @@ notmuch_config_get_new_tags (notmuch_config_t *config, size_t *length) + &(config->new_tags_length), length); + } + ++const char ** ++notmuch_config_get_new_ignore (notmuch_config_t *config, size_t *length) ++{ ++ return _config_get_list (config, "new", "ignore", ++ &(config->new_ignore), ++ &(config->new_ignore_length), length); ++} ++ + void + notmuch_config_set_user_other_email (notmuch_config_t *config, + const char *list[], +@@ -627,6 +646,15 @@ notmuch_config_set_new_tags (notmuch_config_t *config, + &(config->new_tags)); + } + ++void ++notmuch_config_set_new_ignore (notmuch_config_t *config, ++ const char *list[], ++ size_t length) ++{ ++ _config_set_list (config, "new", "ignore", list, length, ++ &(config->new_ignore)); ++} ++ + const char ** + notmuch_config_get_search_exclude_tags (notmuch_config_t *config, size_t *length) + { +diff --git a/notmuch-new.c b/notmuch-new.c +index a569a54..8a615e6 100644 +--- a/notmuch-new.c ++++ b/notmuch-new.c +@@ -39,6 +39,8 @@ typedef struct { + int verbose; + const char **new_tags; + size_t new_tags_length; ++ const char **new_ignore; ++ size_t new_ignore_length; + + int total_files; + int processed_files; +@@ -181,6 +183,20 @@ _entries_resemble_maildir (struct dirent **entries, int count) + return 0; + } + ++/* 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) ++{ ++ size_t i; ++ ++ for (i = 0; i < state->new_ignore_length; i++) ++ if (strcmp (entry, state->new_ignore[i]) == 0) ++ return TRUE; ++ ++ return FALSE; ++} ++ + /* Examine 'path' recursively as follows: + * + * o Ask the filesystem for the mtime of 'path' (fs_mtime) +@@ -320,15 +336,15 @@ add_files_recursive (notmuch_database_t *notmuch, + } + + /* Ignore special directories to avoid infinite recursion. +- * Also ignore the .notmuch directory and any "tmp" directory +- * that appears within a maildir. ++ * Also ignore the .notmuch directory, any "tmp" directory ++ * that appears within a maildir and files/directories ++ * the user has configured to be ignored. + */ +- /* XXX: Eventually we'll want more sophistication to let the +- * user specify files to be ignored. */ + 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 || ++ _entry_in_ignore_list (entry->d_name, state)) + { + continue; + } +@@ -369,6 +385,10 @@ add_files_recursive (notmuch_database_t *notmuch, + + entry = fs_entries[i]; + ++ /* Ignore files & directories user has configured to be ignored */ ++ if (_entry_in_ignore_list (entry->d_name, state)) ++ continue; ++ + /* Check if we've walked past any names in db_files or + * db_subdirs. If so, these have been deleted. */ + while (notmuch_filenames_valid (db_files) && +@@ -648,7 +668,7 @@ add_files (notmuch_database_t *notmuch, + * initialized to zero by the top-level caller before calling + * count_files). */ + static void +-count_files (const char *path, int *count) ++count_files (const char *path, int *count, add_files_state_t *state) + { + struct dirent *entry = NULL; + char *next; +@@ -670,13 +690,13 @@ count_files (const char *path, int *count) + entry = fs_entries[i++]; + + /* Ignore special directories to avoid infinite recursion. +- * Also ignore the .notmuch directory. ++ * Also ignore the .notmuch directory and files/directories ++ * the user has configured to be ignored. + */ +- /* XXX: Eventually we'll want more sophistication to let the +- * user specify files to be ignored. */ + if (strcmp (entry->d_name, ".") == 0 || + strcmp (entry->d_name, "..") == 0 || +- strcmp (entry->d_name, ".notmuch") == 0) ++ strcmp (entry->d_name, ".notmuch") == 0 || ++ _entry_in_ignore_list (entry->d_name, state)) + { + continue; + } +@@ -697,7 +717,7 @@ count_files (const char *path, int *count) + fflush (stdout); + } + } else if (S_ISDIR (st.st_mode)) { +- count_files (next, count); ++ count_files (next, count, state); + } + + free (next); +@@ -837,6 +857,7 @@ notmuch_new_command (void *ctx, int argc, char *argv[]) + return 1; + + 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); + +@@ -852,7 +873,7 @@ notmuch_new_command (void *ctx, int argc, char *argv[]) + int count; + + count = 0; +- count_files (db_path, &count); ++ count_files (db_path, &count, &add_files_state); + if (interrupted) + return 1; + +diff --git a/test/new b/test/new +index 5ce8811..2af63a1 100755 +--- a/test/new ++++ b/test/new +@@ -167,7 +167,6 @@ Note: Ignoring non-mail file: ${MAIL_DIR}/ignored_file + Added 1 new message to the database." + + test_begin_subtest "Ignore files and directories specified in new.ignore" +-test_subtest_known_broken + generate_message + notmuch config set new.ignore .git ignored_file .ignored_hidden_file + touch "${MAIL_DIR}"/.git # change .git's mtime for notmuch new to rescan. +-- +1.7.6.5 +