diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2019-03-25 17:23:06 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2019-03-25 17:23:06 +0200 |
commit | 7a1b9263d79005cd66ed7ebdd8b8e2842e7cd6b3 (patch) | |
tree | b402ba58d6f8f3d1f4ef5b58b256a74296dd7ecf | |
parent | cef8dafaf17b67c1b4836e22ef00c54f38237fe6 (diff) | |
download | mailutils-7a1b9263d79005cd66ed7ebdd8b8e2842e7cd6b3.tar.gz mailutils-7a1b9263d79005cd66ed7ebdd8b8e2842e7cd6b3.tar.bz2 |
Bugfixes in fsfolder
* libmailutils/mailbox/fsfolder.c (list_helper): Fix
depth cut off.
Fix the lookup in scn->records.
* libmailutils/tests/fsfolder.c: Implement two test
records.
New command: "scan".
-rw-r--r-- | libmailutils/mailbox/fsfolder.c | 4 | ||||
-rw-r--r-- | libmailutils/tests/fsfolder.c | 118 |
2 files changed, 117 insertions, 5 deletions
diff --git a/libmailutils/mailbox/fsfolder.c b/libmailutils/mailbox/fsfolder.c index 042ae6707..30a706c3b 100644 --- a/libmailutils/mailbox/fsfolder.c +++ b/libmailutils/mailbox/fsfolder.c @@ -212,3 +212,3 @@ list_helper (struct mu_folder_scanner *scn, - if (scn->max_level && level > scn->max_level) + if (scn->max_level && level >= scn->max_level) return 0; @@ -278,3 +278,3 @@ list_helper (struct mu_folder_scanner *scn, int rc; - rc = mu_list_locate (scn->records, &rec, NULL); + rc = mu_list_locate (scn->records, rec, NULL); if (rc) diff --git a/libmailutils/tests/fsfolder.c b/libmailutils/tests/fsfolder.c index 789569d9a..8c2579838 100644 --- a/libmailutils/tests/fsfolder.c +++ b/libmailutils/tests/fsfolder.c @@ -33,3 +33,4 @@ #include <mailutils/sys/registrar.h> -#include <mailutils/opt.h> +#include <mailutils/assoc.h> +#include <mailutils/iterator.h> #include "tesh.h" @@ -153,2 +154,85 @@ com_unsubscribe (int argc, char **argv, mu_assoc_t options, void *env) +static mu_record_t +find_record (char const *scheme) +{ + mu_iterator_t itr; + mu_record_t result = NULL; + + MU_ASSERT (mu_registrar_get_iterator (&itr)); + for (mu_iterator_first (itr); !mu_iterator_is_done (itr); + mu_iterator_next (itr)) + { + mu_record_t rec; + mu_iterator_current (itr, (void **)&rec); + if (strcmp (rec->scheme, scheme) == 0) + { + result = rec; + break; + } + } + mu_iterator_destroy (&itr); + return result; +} + +static int +com_scan (int argc, char **argv, mu_assoc_t options, void *env) +{ + mu_folder_t folder = env; + struct mu_folder_scanner scn = MU_FOLDER_SCANNER_INITIALIZER; + char *s; + int rc; + + if (argc > 1) + { + scn.refname = argv[1]; + if (argc == 3) + scn.pattern = argv[2]; + } + + mu_list_create (&scn.result); + + if (mu_assoc_lookup (options, "maxdepth", &s) == 0) + { + char *p; + errno = 0; + scn.max_level = strtoul (s, &p, 10); + if (errno || *p) + { + mu_error ("-maxdepth=%s: invalid depth", s); + return 0; + } + } + + if (mu_assoc_lookup (options, "type", &s) == 0) + { + mu_record_t rec = find_record (s); + + if (rec) + { + if (!scn.records) + MU_ASSERT (mu_list_create (&scn.records)); + MU_ASSERT (mu_list_append (scn.records, rec)); + } + else + { + mu_error ("%s: no such record found", s); + mu_list_destroy (&scn.records); + return 0; + } + } + + rc = mu_folder_scan (folder, &scn); + if (rc) + mu_diag_funcall (MU_DIAG_ERROR, "mu_folder_scan", NULL, rc); + else + { + if (sort_option) + mu_list_sort (scn.result, compare_response); + mu_list_foreach (scn.result, _print_list_entry, &prefix_len); + mu_list_destroy (&scn.result); + } + mu_list_destroy (&scn.records); + return 0; +} + static struct mu_tesh_command comtab[] = { @@ -159,2 +243,3 @@ static struct mu_tesh_command comtab[] = { { "unsubscribe", "MBX", com_unsubscribe }, + { "scan", "[-maxdepth=N] [-type=TYPE] [REF PATTERN]", com_scan }, { NULL } @@ -203,4 +288,4 @@ static struct _mu_record test_record = { - 0, - "file", + 10, + "any", MU_RECORD_LOCAL, @@ -220,2 +305,28 @@ static struct _mu_record test_record = +static int +_reg_is_scheme (mu_record_t record, mu_url_t url, int flags) +{ + return _always_is_scheme (record, url, flags) + & MU_FOLDER_ATTRIBUTE_FILE; +} + +static struct _mu_record reg_record = +{ + 0, + "reg", + MU_RECORD_LOCAL, + MU_URL_SCHEME | MU_URL_PATH, + MU_URL_PATH, + mu_url_expand_path, /* URL init. */ + NULL, /* Mailbox init. */ + NULL, /* Mailer init. */ + _mu_fsfolder_init, /* Folder init. */ + NULL, /* No need for an back pointer. */ + _reg_is_scheme, /* _is_scheme method. */ + NULL, /* _get_url method. */ + NULL, /* _get_mailbox method. */ + NULL, /* _get_mailer method. */ + NULL /* _get_folder method. */ +}; + int @@ -231,2 +342,3 @@ main (int argc, char **argv) mu_registrar_record (&test_record); + mu_registrar_record (®_record); |