Merge branch 'djcb:master' into master
This commit is contained in:
@ -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
|
||||||
|
|||||||
@ -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());
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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))
|
||||||
|
|||||||
@ -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))
|
||||||
|
|||||||
@ -396,22 +396,23 @@ As per issue #2198."
|
|||||||
|
|
||||||
(defun mu4e--version-check ()
|
(defun mu4e--version-check ()
|
||||||
;; sanity-check 1
|
;; sanity-check 1
|
||||||
(unless (and mu4e-mu-binary (file-executable-p mu4e-mu-binary))
|
(let ((default-directory temporary-file-directory)) ;;ensure it's local.
|
||||||
(mu4e-error
|
(unless (and mu4e-mu-binary (file-executable-p mu4e-mu-binary))
|
||||||
"Cannot find mu, please set `mu4e-mu-binary' to the mu executable path"))
|
|
||||||
;; sanity-check 2
|
|
||||||
(let ((version (let ((s (shell-command-to-string
|
|
||||||
(concat mu4e-mu-binary " --version"))))
|
|
||||||
(and (string-match "version \\([.0-9]+\\)" s)
|
|
||||||
(match-string 1 s)))))
|
|
||||||
(if (not (string= version mu4e-mu-version))
|
|
||||||
(mu4e-error
|
(mu4e-error
|
||||||
(concat
|
"Cannot find mu, please set `mu4e-mu-binary' to the mu executable path"))
|
||||||
"Found mu version %s, but mu4e needs version %s"
|
;; sanity-check 2
|
||||||
"; please set `mu4e-mu-binary' "
|
(let ((version (let ((s (shell-command-to-string
|
||||||
"accordingly")
|
(concat mu4e-mu-binary " --version"))))
|
||||||
version mu4e-mu-version)
|
(and (string-match "version \\([.0-9]+\\)" s)
|
||||||
(mu4e-message "Found mu version %s" version))))
|
(match-string 1 s)))))
|
||||||
|
(if (not (string= version mu4e-mu-version))
|
||||||
|
(mu4e-error
|
||||||
|
(concat
|
||||||
|
"Found mu version %s, but mu4e needs version %s"
|
||||||
|
"; please set `mu4e-mu-binary' "
|
||||||
|
"accordingly")
|
||||||
|
version mu4e-mu-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,24 +434,23 @@ 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
|
(args (mu4e--server-args)))
|
||||||
(args (mu4e--server-args)))
|
(setq mu4e--server-buf "")
|
||||||
(setq mu4e--server-buf "")
|
(mu4e-log 'misc "* invoking '%s' with parameters %s" mu4e-mu-binary
|
||||||
(mu4e-log 'misc "* invoking '%s' with parameters %s" mu4e-mu-binary
|
(mapconcat (lambda (arg) (format "'%s'" arg)) args " "))
|
||||||
(mapconcat (lambda (arg) (format "'%s'" arg)) args " "))
|
(setq mu4e--server-process (apply 'start-process
|
||||||
(setq mu4e--server-process (apply 'start-process
|
mu4e--server-name mu4e--server-name
|
||||||
mu4e--server-name mu4e--server-name
|
mu4e-mu-binary args))
|
||||||
mu4e-mu-binary args))
|
;; register a function for (:info ...) sexps
|
||||||
;; register a function for (:info ...) sexps
|
(unless mu4e--server-process
|
||||||
(unless mu4e--server-process
|
(mu4e-error "Failed to start the mu4e backend"))
|
||||||
(mu4e-error "Failed to start the mu4e backend"))
|
(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."
|
||||||
|
|||||||
Reference in New Issue
Block a user