Merge branch 'djcb:master' into master

This commit is contained in:
Babak Farrokhi
2023-03-30 15:50:51 +02:00
committed by GitHub
7 changed files with 77 additions and 69 deletions

View File

@ -1,5 +1,5 @@
/* /*
** Copyright (C) 2008-2022 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl> ** Copyright (C) 2008-2023 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
** **
** This program is free software; you can redistribute it and/or modify it ** This program is free software; you can redistribute it and/or modify it
** under the terms of the GNU General Public License as published by the ** under the terms of the GNU General Public License as published by the
@ -21,6 +21,7 @@
#define MU_TEST_UTILS_HH__ #define MU_TEST_UTILS_HH__
#include <string> #include <string>
#include <utils/mu-utils.hh>
namespace Mu { namespace Mu {
@ -29,7 +30,10 @@ namespace Mu {
* *
* @return a random dir name, g_free when it's no longer needed * @return a random dir name, g_free when it's no longer needed
*/ */
char* test_mu_common_get_random_tmpdir(); char* test_mu_common_get_random_tmpdir(void);
static inline std::string test_random_tmpdir() {
return to_string_gchar(test_mu_common_get_random_tmpdir());
}
/** /**
* mu wrapper for g_test_init * mu wrapper for g_test_init

View File

@ -156,7 +156,12 @@ handle_msg(const std::string& fname, const Options& opts)
{ {
using Format = Options::View::Format; using Format = Options::View::Format;
auto message{Message::make_from_path(fname, message_options(opts.view))}; // make absolute.
const auto fpath{to_string_opt_gchar(g_canonicalize_filename(fname.c_str(), NULL))};
if (!fpath)
return Err(Error::Code::File, "invalid file '%s'", fname.c_str());
auto message{Message::make_from_path(*fpath, message_options(opts.view))};
if (!message) if (!message)
return Err(message.error()); return Err(message.error());

View File

@ -25,6 +25,7 @@
#include <errno.h> #include <errno.h>
#include <stdlib.h> #include <stdlib.h>
#include <type_traits>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
@ -33,6 +34,7 @@
#include "mu-query.hh" #include "mu-query.hh"
#include "utils/mu-result.hh" #include "utils/mu-result.hh"
#include "utils/mu-utils.hh" #include "utils/mu-utils.hh"
#include "utils/mu-utils-file.hh"
using namespace Mu; using namespace Mu;
@ -227,59 +229,59 @@ test_mu_find_03()
g_free(cmdline); g_free(cmdline);
} }
G_GNUC_UNUSED static void static void
test_mu_find_links(void) test_mu_find_links(void)
{ {
gchar *cmdline, *output, *erroutput, *tmpdir; char *output, *erroutput;
const auto tmpdir{test_random_tmpdir()};
tmpdir = test_mu_common_get_random_tmpdir(); auto cmdline = format("%s find --muhome=%s --format=links --linksdir=%s "
"mime:message/rfc822", MU_PROGRAM, DBPATH.c_str(), tmpdir.c_str());
cmdline = g_strdup_printf("%s find --muhome=%s --format=links --linksdir=%s "
"mime:message/rfc822",
MU_PROGRAM,
DBPATH.c_str(),
tmpdir);
if (g_test_verbose()) if (g_test_verbose())
g_print("cmdline: %s\n", cmdline); g_print("cmdline: %s\n", cmdline.c_str());
g_assert(g_spawn_command_line_sync(cmdline, &output, &erroutput, NULL, NULL)); g_assert(g_spawn_command_line_sync(cmdline.c_str(), &output, &erroutput, NULL, NULL));
/* there should be no errors */ /* there should be no errors */
g_assert_cmpuint(newlines_in_output(output), ==, 0); g_assert_cmpuint(newlines_in_output(output), ==, 0);
g_assert_cmpuint(newlines_in_output(erroutput), ==, 0); g_assert_cmpuint(newlines_in_output(erroutput), ==, 0);
g_free(output); g_free(output);
g_free(erroutput); g_free(erroutput);
output = erroutput = NULL;
/* furthermore, two symlinks should be there */
const auto f1{format("%s/cur/3419760385_rfc822.1", tmpdir.c_str())};
const auto f2{format("%s/cur/3419760386_rfc822.2", tmpdir.c_str())};
g_assert_cmpuint(determine_dtype(f1.c_str(), true), ==, DT_LNK);
g_assert_cmpuint(determine_dtype(f2.c_str(), true), ==, DT_LNK);
/* now we try again, we should get a line of error output, /* now we try again, we should get a line of error output,
* when we find the first target file already exists */ * when we find the first target file already exists */
if (g_test_verbose()) if (g_test_verbose())
g_print("cmdline: %s\n", cmdline); g_print("cmdline: %s\n", cmdline.c_str());
g_assert(g_spawn_command_line_sync(cmdline, &output, &erroutput, NULL, NULL)); g_assert(g_spawn_command_line_sync(cmdline.c_str(), &output, &erroutput, NULL, NULL));
g_assert_cmpuint(newlines_in_output(output), ==, 0); g_assert_cmpuint(newlines_in_output(output), ==, 0);
g_assert_cmpuint(newlines_in_output(erroutput), ==, 1); g_assert_cmpuint(newlines_in_output(erroutput), ==, 1);
g_free(output); g_free(output);
g_free(erroutput); g_free(erroutput);
output = erroutput = NULL;
/* now we try again with --clearlinks, and the we should be /* now we try again with --clearlinks, and the we should be
* back to 0 errors */ * back to 0 errors */
g_free(cmdline); cmdline = format("%s find --muhome=%s --format=links --linksdir=%s --clearlinks "
cmdline = g_strdup_printf("%s find --muhome=%s --format=links --linksdir=%s --clearlinks " "mime:message/rfc822", MU_PROGRAM, DBPATH.c_str(), tmpdir.c_str());
"mime:message/rfc822",
MU_PROGRAM, g_assert(g_spawn_command_line_sync(cmdline.c_str(), &output, &erroutput, NULL, NULL));
DBPATH.c_str(),
tmpdir);
g_assert(g_spawn_command_line_sync(cmdline, &output, &erroutput, NULL, NULL));
if (g_test_verbose()) if (g_test_verbose())
g_print("cmdline: %s\n", cmdline); g_print("cmdline: %s\n", cmdline.c_str());
g_assert_cmpuint(newlines_in_output(output), ==, 0); g_assert_cmpuint(newlines_in_output(output), ==, 0);
g_assert_cmpuint(newlines_in_output(erroutput), ==, 0); g_assert_cmpuint(newlines_in_output(erroutput), ==, 0);
g_free(output); g_free(output);
g_free(erroutput); g_free(erroutput);
g_free(cmdline); g_assert_cmpuint(determine_dtype(f1.c_str(), true), ==, DT_LNK);
g_free(tmpdir); g_assert_cmpuint(determine_dtype(f2.c_str(), true), ==, DT_LNK);
} }
/* some more tests */ /* some more tests */
@ -837,11 +839,8 @@ main(int argc, char* argv[])
g_test_add_func("/mu-cmd/test-mu-find-file", test_mu_find_file); g_test_add_func("/mu-cmd/test-mu-find-file", test_mu_find_file);
g_test_add_func("/mu-cmd/test-mu-find-mime", test_mu_find_mime); g_test_add_func("/mu-cmd/test-mu-find-mime", test_mu_find_mime);
/* recently, this test breaks _sometimes_ when run on Travis; but it
* seems related to the setup there, as nothing has changed in the code. g_test_add_func ("/mu-cmd/test-mu-find-links", test_mu_find_links);
* turn off for now. */
/* g_test_add_func ("/mu-cmd/test-mu-find-links",
* test_mu_find_links); */
g_test_add_func("/mu-cmd/test-mu-find-text-in-rfc822", test_mu_find_text_in_rfc822); g_test_add_func("/mu-cmd/test-mu-find-text-in-rfc822", test_mu_find_text_in_rfc822);

View File

@ -53,11 +53,9 @@
Each of the list elements is a plist with at least: Each of the list elements is a plist with at least:
`:name' - the name of the query `:name' - the name of the query
`:query' - the query expression string (not a function) `:query' - the query expression string or function
`:key' - the shortcut key (single character) `:key' - the shortcut key (single character)
Note that the :query parameter can be a function/lambda.
Optionally, you can add the following: Optionally, you can add the following:
- `:favorite' - if t, monitor the results of this query, and make - `:favorite' - if t, monitor the results of this query, and make

View File

@ -175,6 +175,7 @@ bookmark or maildir."
(query (if (equal type 'maildirs) (query (if (equal type 'maildirs)
(format "maildir:\"%s\"" maildir) (format "maildir:\"%s\"" maildir)
(plist-get item :query))) (plist-get item :query)))
(query (if (functionp query) (funcall query) query))
(name (plist-get item :name)) (name (plist-get item :name))
;; it is possible that the user has a rewrite function ;; it is possible that the user has a rewrite function
(effective-query (funcall mu4e-query-rewrite-function query)) (effective-query (funcall mu4e-query-rewrite-function query))

View File

@ -203,6 +203,7 @@ the search."
(or expr (or expr
(mu4e-ask-bookmark (mu4e-ask-bookmark
(if edit "Select bookmark: " "Bookmark: ")))) (if edit "Select bookmark: " "Bookmark: "))))
(expr (if (functionp expr) (funcall expr) expr))
(fav (mu4e--bookmark-query (mu4e-bookmark-favorite)))) (fav (mu4e--bookmark-query (mu4e-bookmark-favorite))))
;; reset baseline when searching for the favorite bookmark query ;; reset baseline when searching for the favorite bookmark query
(when (and fav (string= fav expr)) (when (and fav (string= fav expr))

View File

@ -396,6 +396,7 @@ As per issue #2198."
(defun mu4e--version-check () (defun mu4e--version-check ()
;; sanity-check 1 ;; sanity-check 1
(let ((default-directory temporary-file-directory)) ;;ensure it's local.
(unless (and mu4e-mu-binary (file-executable-p mu4e-mu-binary)) (unless (and mu4e-mu-binary (file-executable-p mu4e-mu-binary))
(mu4e-error (mu4e-error
"Cannot find mu, please set `mu4e-mu-binary' to the mu executable path")) "Cannot find mu, please set `mu4e-mu-binary' to the mu executable path"))
@ -411,7 +412,7 @@ As per issue #2198."
"; please set `mu4e-mu-binary' " "; please set `mu4e-mu-binary' "
"accordingly") "accordingly")
version mu4e-mu-version) version mu4e-mu-version)
(mu4e-message "Found mu version %s" version)))) (mu4e-message "Found mu version %s" version)))))
(defun mu4e-server-repl () (defun mu4e-server-repl ()
"Start a mu4e-server repl. "Start a mu4e-server repl.
@ -433,7 +434,6 @@ You cannot run the repl when mu4e is running (or vice-versa)."
(defun mu4e--server-start () (defun mu4e--server-start ()
"Start the mu server process." "Start the mu server process."
(mu4e--version-check) (mu4e--version-check)
(let ((default-directory temporary-file-directory)) ;;ensure it's local.
;; kill old/stale servers, if any. ;; kill old/stale servers, if any.
(mu4e--kill-stale) (mu4e--kill-stale)
(let* ((process-connection-type nil) ;; use a pipe (let* ((process-connection-type nil) ;; use a pipe
@ -450,7 +450,7 @@ You cannot run the repl when mu4e is running (or vice-versa)."
(set-process-query-on-exit-flag mu4e--server-process nil) (set-process-query-on-exit-flag mu4e--server-process nil)
(set-process-coding-system mu4e--server-process 'binary 'utf-8-unix) (set-process-coding-system mu4e--server-process 'binary 'utf-8-unix)
(set-process-filter mu4e--server-process 'mu4e--server-filter) (set-process-filter mu4e--server-process 'mu4e--server-filter)
(set-process-sentinel mu4e--server-process 'mu4e--server-sentinel)))) (set-process-sentinel mu4e--server-process 'mu4e--server-sentinel)))
(defun mu4e--server-kill () (defun mu4e--server-kill ()
"Kill the mu server process." "Kill the mu server process."