commit 4ce9b9a45da2885ee3d6884fec408de45720b0a4
parent 1a7555f59e6207f6f81dee03f69954ecfce93708
Author: Colin Leroy <colin@colino.net>
Date: Fri, 24 Aug 2018 09:58:09 +0200
Filtering: add date_before and date_after
Diffstat:
5 files changed, 79 insertions(+), 0 deletions(-)
diff --git a/src/advsearch.c b/src/advsearch.c
@@ -157,6 +157,8 @@ gchar *advsearch_expand_search_string(const gchar *search_string)
{ "c", "cc", 1, TRUE, TRUE },
{ "C", "to_or_cc", 1, TRUE, TRUE },
{ "D", "deleted", 0, FALSE, FALSE },
+ { "da", "date_after", 1, FALSE, TRUE },
+ { "db", "date_before", 1, FALSE, TRUE },
{ "e", "header \"Sender\"", 1, TRUE, TRUE },
{ "E", "execute", 1, FALSE, TRUE },
{ "f", "from", 1, TRUE, TRUE },
diff --git a/src/gtk/quicksearch.c b/src/gtk/quicksearch.c
@@ -485,6 +485,10 @@ static gchar *search_descr_strings[] = {
"c S", N_("messages carbon-copied to S"),
"C S", N_("message is either To: or Cc: to S"),
"D", N_("deleted messages"), /** how I can filter deleted messages **/
+ "da \"YYYY-MM-dd HH:mm:ss\"", N_("messages whose date is after requested date "
+ "(time is optional)"),
+ "db \"YYYY-MM-dd HH:mm:ss\"", N_("messages whose date is before requested date "
+ "(time is optional)"),
"e S", N_("messages which contain S in the Sender field"),
"E S", N_("true if execute \"S\" succeeds"),
"f S", N_("messages originating from user S"),
diff --git a/src/matcher.c b/src/matcher.c
@@ -112,6 +112,8 @@ static const MatchParser matchparser_tab[] = {
{MATCHCRITERIA_AGE_LOWER, "age_lower"},
{MATCHCRITERIA_AGE_GREATER_HOURS, "age_greater_hours"},
{MATCHCRITERIA_AGE_LOWER_HOURS, "age_lower_hours"},
+ {MATCHCRITERIA_DATE_AFTER, "date_after"},
+ {MATCHCRITERIA_DATE_BEFORE, "date_before"},
{MATCHCRITERIA_NEWSGROUPS, "newsgroups"},
{MATCHCRITERIA_NOT_NEWSGROUPS, "~newsgroups"},
{MATCHCRITERIA_MESSAGEID, "messageid"},
@@ -932,6 +934,27 @@ static gboolean matcherprop_match(MatcherProp *prop,
}
return ret;
}
+ case MATCHCRITERIA_DATE_AFTER:
+ {
+ gboolean ret;
+
+ ret = prop->value < info->date_t;
+
+ /* debug output */
+ if (debug_filtering_session
+ && prefs_common.filtering_debug_level >= FILTERING_DEBUG_LEVEL_HIGH) {
+ if (ret) {
+ log_print(LOG_DEBUG_FILTERING,
+ "message date [ %ld ] is after [ %d ]\n",
+ info->date_t, prop->value);
+ } else {
+ log_print(LOG_DEBUG_FILTERING,
+ "message date [ %ld ] is not after [ %d ]\n",
+ info->date_t, prop->value);
+ }
+ }
+ return ret;
+ }
case MATCHCRITERIA_AGE_LOWER:
age_mult_hours = 24;
/* Fallthrough intended */
@@ -959,6 +982,27 @@ static gboolean matcherprop_match(MatcherProp *prop,
}
return ret;
}
+ case MATCHCRITERIA_DATE_BEFORE:
+ {
+ gboolean ret;
+
+ ret = prop->value > info->date_t;
+
+ /* debug output */
+ if (debug_filtering_session
+ && prefs_common.filtering_debug_level >= FILTERING_DEBUG_LEVEL_HIGH) {
+ if (ret) {
+ log_print(LOG_DEBUG_FILTERING,
+ "message date [ %ld ] is before [ %d ]\n",
+ info->date_t, prop->value);
+ } else {
+ log_print(LOG_DEBUG_FILTERING,
+ "message date [ %ld ] is not before [ %d ]\n",
+ info->date_t, prop->value);
+ }
+ }
+ return ret;
+ }
case MATCHCRITERIA_SCORE_GREATER:
{
gboolean ret = (info->score > prop->value);
@@ -1912,6 +1956,8 @@ gboolean matcherlist_match(MatcherList *matchers, MsgInfo *info)
case MATCHCRITERIA_AGE_LOWER:
case MATCHCRITERIA_AGE_GREATER_HOURS:
case MATCHCRITERIA_AGE_LOWER_HOURS:
+ case MATCHCRITERIA_DATE_AFTER:
+ case MATCHCRITERIA_DATE_BEFORE:
case MATCHCRITERIA_NEWSGROUPS:
case MATCHCRITERIA_NOT_NEWSGROUPS:
case MATCHCRITERIA_MESSAGEID:
@@ -2104,6 +2150,8 @@ gchar *matcherprop_to_string(MatcherProp *matcher)
return g_strdup(criteria_str);
case MATCHCRITERIA_TEST:
case MATCHCRITERIA_NOT_TEST:
+ case MATCHCRITERIA_DATE_AFTER:
+ case MATCHCRITERIA_DATE_BEFORE:
quoted_expr = matcher_quote_str(matcher->expr);
matcher_str = g_strdup_printf("%s \"%s\"",
criteria_str, quoted_expr);
diff --git a/src/matcher.h b/src/matcher.h
@@ -88,6 +88,7 @@ enum {
MC_(TO_OR_CC), MC_(NOT_TO_AND_NOT_CC),
MC_(AGE_GREATER), MC_(AGE_LOWER),
MC_(AGE_GREATER_HOURS), MC_(AGE_LOWER_HOURS),
+ MC_(DATE_AFTER), MC_(DATE_BEFORE),
MC_(NEWSGROUPS), MC_(NOT_NEWSGROUPS),
MC_(MESSAGEID), MC_(NOT_MESSAGEID),
MC_(INREPLYTO), MC_(NOT_INREPLYTO),
diff --git a/src/matcher_parser_parse.y b/src/matcher_parser_parse.y
@@ -25,6 +25,7 @@
#include "utils.h"
#include "filtering.h"
+#include "procheader.h"
#include "matcher.h"
#include "matcher_parser.h"
#include "matcher_parser_lex.h"
@@ -326,6 +327,7 @@ int matcher_parserwrap(void)
%token MATCHER_CC MATCHER_NOT_CC MATCHER_TO_OR_CC MATCHER_NOT_TO_AND_NOT_CC
%token MATCHER_AGE_GREATER MATCHER_AGE_LOWER MATCHER_NEWSGROUPS
%token MATCHER_AGE_GREATER_HOURS MATCHER_AGE_LOWER_HOURS
+%token MATCHER_DATE_AFTER MATCHER_DATE_BEFORE
%token MATCHER_NOT_NEWSGROUPS MATCHER_INREPLYTO MATCHER_NOT_INREPLYTO
%token MATCHER_MESSAGEID MATCHER_NOT_MESSAGEID
%token MATCHER_REFERENCES MATCHER_NOT_REFERENCES MATCHER_SCORE_GREATER
@@ -989,6 +991,28 @@ MATCHER_ALL
value = strtol($2, NULL, 0);
prop = matcherprop_new(criteria, NULL, 0, NULL, value);
}
+| MATCHER_DATE_AFTER MATCHER_STRING
+{
+ gint criteria = 0;
+ gchar *expr = NULL;
+ time_t value;
+
+ criteria = MATCHCRITERIA_DATE_AFTER;
+ expr = $2;
+ value = procheader_date_parse(NULL, expr, 0);
+ prop = matcherprop_new(criteria, NULL, 0, expr, value);
+}
+| MATCHER_DATE_BEFORE MATCHER_STRING
+{
+ gint criteria = 0;
+ gchar *expr = NULL;
+ time_t value;
+
+ criteria = MATCHCRITERIA_DATE_BEFORE;
+ expr = $2;
+ value = procheader_date_parse(NULL, expr, 0);
+ prop = matcherprop_new(criteria, NULL, 0, expr, value);
+}
| MATCHER_NEWSGROUPS match_type MATCHER_STRING
{
gint criteria = 0;