mu: implement init, info commands

'init' is for the inital database setup

'info' is for gettting information about the mu database.
This commit is contained in:
Dirk-Jan C. Binnema 2020-02-06 20:22:43 +02:00
parent 2575b2d0e3
commit f51846eefc
13 changed files with 363 additions and 355 deletions

View File

@ -1396,3 +1396,44 @@ mu_store_get_dirstamp (const MuStore *store, const char *dirpath, GError **err)
} }
void
mu_store_print_info (const MuStore *store, gboolean nocolor)
{
const auto green{nocolor ? "" : MU_COLOR_GREEN};
const auto def{nocolor ? "" : MU_COLOR_DEFAULT};
std::cout << "database-path : "
<< green << self(store)->database_path() << def << "\n"
<< "messages in store : "
<< green << self(store)->size() << def << "\n"
<< "schema-version : "
<< green << self(store)->schema_version() << def << "\n";
const auto created{mu_store_created (store)};
const auto tstamp{localtime (&created)};
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-y2k"
char tbuf[32];
strftime (tbuf, sizeof(tbuf), "%c", tstamp);
#pragma GCC diagnostic pop
std::cout << "created : " << green << tbuf << def << "\n"
<< "maildir : "
<< green << self(store)->root_maildir() << def << "\n";
std::cout << ("personal-addresses : ");
auto addrs{mu_store_personal_addresses (store)};
if (!addrs || g_strv_length(addrs) == 0)
std::cout << green << "<none>" << def << "\n";
else {
for (auto i = 0U; addrs[i]; ++i) {
std::cout << (i != 0 ? " " : "")
<< green << addrs[i] << def << "\n";
}
}
g_strfreev(addrs);
}

View File

@ -1,4 +1,4 @@
## Copyright (C) 2008-2019 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl> ## Copyright (C) 2008-2020 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
## ##
## This program is free software; you can redistribute it and/or modify ## 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 ## it under the terms of the GNU General Public License as published by
@ -25,6 +25,8 @@ dist_man_MANS = \
mu-find.1 \ mu-find.1 \
mu-help.1 \ mu-help.1 \
mu-index.1 \ mu-index.1 \
mu-info.1 \
mu-init.1 \
mu-mkdir.1 \ mu-mkdir.1 \
mu-query.7 \ mu-query.7 \
mu-remove.1 \ mu-remove.1 \

View File

@ -1,4 +1,4 @@
.TH MU-EASY 1 "December 2012" "User Manuals" .TH MU-EASY 1 "February 2020" "User Manuals"
.SH NAME .SH NAME
@ -6,25 +6,35 @@ mu easy \- a quick introduction to mu
.SH DESCRIPTION .SH DESCRIPTION
\fBmu\fR is a set of tools for dealing with e-mail messages in \fBmu\fR is a set of tools for dealing with e-mail messages in Maildirs. There
Maildirs. There are many options, which are all described in the man are many options, which are all described in the man pages for the various
pages for the various sub-commands. This man pages jumps over all of sub-commands. This man pages jumps over all of the details and gives examples of
the details and gives examples of some common use cases. If the use some common use cases. If the use cases described here do not precisely do what
cases described here do not precisely do what you want, please check you want, please check the more extensive information in the man page about the
the more extensive information in the man page about the sub-command sub-command you are using -- for example, the \fBmu-index\fR(1) or
you are using -- for example, the \fBmu-index\fR(1) or \fBmu-find\fR(1) \fBmu-find\fR(1) man pages.
man pages.
\fBNOTE\fR: the \fBindex\fR command (and therefore, the ones that \fBNOTE\fR: the \fBindex\fR command (and therefore, the ones that depend on
depend on that, such as \fBfind\fR), require that you store your mail that, such as \fBfind\fR), require that you store your mail in the
in the Maildir-format. If you don't do so, you can still use the other Maildir-format. If you don't do so, you can still use the other commands, but
commands, but you won't be able to index/search your mail. you won't be able to index/search your mail.
By default, \fBmu\fR uses colorized output when it thinks your terminal is
capable of doing so. If you don't like color, you can use the \fB--nocolor\fR
command-line option, or set either the \fBMU_NOCOLOR\fR or the \fBNO_COLOR\fR
environment variable to non-empty.
.SH SETTING THINGS UP
The first time you run the mu commands, you need to initialize it. This is done
with the \fBinit\fR command.
.nf
\fB$ mu init\fR
.fi
This uses the defaults (see \fBmu-init(1)\fR for details on how to change that).
By default, \fBmu\fR uses colorized output when it thinks your
terminal is capable of doing so. If you don't like color, you can use
the \fB--nocolor\fR command-line option, or set either the
\fBMU_NOCOLOR\fR or the \fBNO_COLOR\fR environment variable to
non-empty.
.SH INDEXING YOUR E-MAIL .SH INDEXING YOUR E-MAIL
@ -294,6 +304,7 @@ Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
.SH "SEE ALSO" .SH "SEE ALSO"
.BR mu (1), .BR mu (1),
.BR mu-init (1),
.BR mu-index (1), .BR mu-index (1),
.BR mu-find (1), .BR mu-find (1),
.BR mu-mfind (1), .BR mu-mfind (1),

View File

@ -1,4 +1,4 @@
.TH MU-INDEX 1 "July 2016" "User Manuals" .TH MU-INDEX 1 "February 2020" "User Manuals"
.SH NAME .SH NAME
@ -15,6 +15,9 @@ directories and storing the results in a Xapian database. The data can then be
queried using queried using
.BR mu-find (1)\. .BR mu-find (1)\.
Note that before the first time you run \fBmu index\fR, you must run \fBmu
init\fR to initialize the database.
\fBindex\fR understands Maildirs as defined by Daniel Bernstein for \fBindex\fR understands Maildirs as defined by Daniel Bernstein for
\fBqmail\fR(7). In addition, it understands recursive Maildirs (Maildirs \fBqmail\fR(7). In addition, it understands recursive Maildirs (Maildirs
within Maildirs), Maildir++. It can also deal with VFAT-based Maildirs within Maildirs), Maildir++. It can also deal with VFAT-based Maildirs
@ -61,22 +64,6 @@ more), \fBmu index\fR will terminate immediately.
Note, some of the general options are described in the \fBmu(1)\fR man-page Note, some of the general options are described in the \fBmu(1)\fR man-page
and not here, as they apply to multiple mu commands. and not here, as they apply to multiple mu commands.
.TP
\fB\-m\fR, \fB\-\-maildir\fR=\fI<maildir>\fR
starts searching at \fI<maildir>\fR. By default, \fBmu\fR uses whatever the
\fBMAILDIR\fR environment variable is set to; if it is not set, it tries
\fI~/Maildir\fR. See the note on mixing sub-maildirs below.
.TP
\fB\-\-my-address\fR=\fI<my-email-address>\fR
specifies that some e-mail address is 'my-address' (\fB\-\-my-address\fR can
be used multiple times). This is used by \fBmu cfind\fR -- any e-mail address
found in the address fields of a message which also has
\fI<my-email-address>\fR in one of its address fields is considered a
\fIpersonal\fR e-mail address. This allows you, for example, to filter out
(\fBmu cfind --personal\fR) addresses which were merely seen in mailing list
messages.
.TP .TP
\fB\-\-lazy-check\fR \fB\-\-lazy-check\fR
in lazy-check mode, \fBmu\fR does not consider messages for which the in lazy-check mode, \fBmu\fR does not consider messages for which the
@ -190,17 +177,6 @@ case-insensitve/accent-insensitive matching). The profiles are
dominated by operations in the Xapian database now. dominated by operations in the Xapian database now.
.SH FILES .SH FILES
By default, \fBmu index\fR stores its message database in \fI~/.mu/xapian\fR;
the database has an embedded version number, and \fBmu\fR will automatically
update it when it notices a different version. This allows for automatic
updating of \fBmu\fR-versions, without the need to clear out any old
databases.
However, note that versions of \fBmu\fR before 0.7 used a different scheme,
which puts the database in \fI~/.mu/xapian\-<version>\fR. These older
databases can safely be deleted. Starting from version 0.7, this manual
cleanup should no longer be needed.
\fBmu\fR stores logs of its operations and queries in \fI<muhome>/mu.log\fR \fBmu\fR stores logs of its operations and queries in \fI<muhome>/mu.log\fR
(by default, this is \fI~/.mu/mu.log\fR). Upon startup, \fBmu\fR checks the (by default, this is \fI~/.mu/mu.log\fR). Upon startup, \fBmu\fR checks the
size of this log file. If it exceeds 1 MB, it will be moved to size of this log file. If it exceeds 1 MB, it will be moved to
@ -232,5 +208,6 @@ Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
.BR maildir (5), .BR maildir (5),
.BR mu (1), .BR mu (1),
.BR mu-init (1),
.BR mu-find (1), .BR mu-find (1),
.BR mu-cfind (1) .BR mu-cfind (1)

46
man/mu-info.1 Normal file
View File

@ -0,0 +1,46 @@
.TH MU-INFO 1 "February 2020" "User Manuals"
.SH NAME
mu info \- show information about the mu database
.SH SYNOPSIS
.B mu info [options]
.SH DESCRIPTION
\fBmu info\fR is the \fBmu\fR command for getting information about the mu
database.
.SH OPTIONS
Note, some of the general options are described in the \fBmu(1)\fR man-page and
not here, as they apply to multiple mu commands.
.TP
\fB\-\-muhome\fR
use an alternative directory to store and read the database, write the logs,
etc. By default, \fBmu\fR uses XDG Base Directory Specification (e.g. on Linux
this defaults to \fI~/.cache/mu\fR, \fI~/.config/mu\fR). Earlier versions of
\fBmu\fR defaulted to \fI~/.mu\fR, which now requires \fI\-\-muhome=~/.mu\fR.
.SH RETURN VALUE
\fBmu init\fR returns 0 upon successful completion, or a non-zero exit code if
there was some error.
.SH BUGS
Please report bugs if you find them:
.BR https://github.com/djcb/mu/issues
.SH AUTHOR
Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
.SH "SEE ALSO"
.BR maildir (5),
.BR mu (1),
.BR mu-index (1)

68
man/mu-init.1 Normal file
View File

@ -0,0 +1,68 @@
.TH MU-INIT 1 "February 2020" "User Manuals"
.SH NAME
mu init \- initialize the mu message database
.SH SYNOPSIS
.B mu init [options]
.SH DESCRIPTION
\fBmu init\fR is the \fBmu\fR command for setting up the mu message
database. After \fBmu init\fR has completed, you can run \fBmu index\fR
.SH OPTIONS
Note, some of the general options are described in the \fBmu(1)\fR man-page and
not here, as they apply to multiple mu commands.
.TP
\fB\-\-muhome\fR
use an alternative directory to store and read the database, write the logs,
etc. By default, \fBmu\fR uses XDG Base Directory Specification (e.g. on Linux
this defaults to \fI~/.cache/mu\fR, \fI~/.config/mu\fR). Earlier versions of
\fBmu\fR defaulted to \fI~/.mu\fR, which now requires \fI\-\-muhome=~/.mu\fR.
.TP
\fB\-m\fR, \fB\-\-maildir\fR=\fI<maildir>\fR
starts searching at \fI<maildir>\fR. By default, \fBmu\fR uses whatever the
\fBMAILDIR\fR environment variable is set to; if it is not set, it tries
\fI~/Maildir\fR.
.TP
\fB\-\-my-address\fR=\fI<my-email-address>\fR
specifies that some e-mail addresses are 'my-address' (\fB\-\-my-address\fR can
be used multiple times). This is used by \fBmu cfind\fR -- any e-mail address
found in the address fields of a message which also has \fI<my-email-address>\fR
in one of its address fields is considered a \fIpersonal\fR e-mail address. This
allows you, for example, to filter out (\fBmu cfind --personal\fR) addresses
which were merely seen in mailing list messages.
.SH ENVIRONMENT
\fBmu init\fR uses \fBMAILDIR\fR to find the user's Maildir if it has not been
specified explicitly with \fB\-\-maildir\fR=\fI<maildir>\fR. If \fBMAILDIR\fR is
not set, \fBmu init\fR uses \fI~/Maildir\fR.
.SH RETURN VALUE
\fBmu init\fR returns 0 upon successful completion, or a non-zero exit code if
there was some error.
.SH BUGS
Please report bugs if you find them:
.BR https://github.com/djcb/mu/issues
.SH AUTHOR
Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
.SH "SEE ALSO"
.BR maildir (5),
.BR mu (1),
.BR mu-index (1)

View File

@ -1,4 +1,4 @@
.TH MU 1 "July 2019" "User Manuals" .TH MU 1 "February 2020" "User Manuals"
.SH NAME .SH NAME
@ -36,6 +36,14 @@ get help for some command. See
(re)index the messages in a Maildir. See (re)index the messages in a Maildir. See
.BR mu-index(1) .BR mu-index(1)
.B mu info [options]
show information about the mu database
.BR mu-info(1)
.B mu init [options]
initialize the mu database
.BR mu-init(1)
.B mu mkdir [options] <dir> [<dirs>] .B mu mkdir [options] <dir> [<dirs>]
create a new Maildir. See create a new Maildir. See
.BR mu-mkdir(1) .BR mu-mkdir(1)

View File

@ -251,51 +251,6 @@ cleanup_missing (MuIndex *midx, MuConfig *opts, MuIndexStats *stats,
return (rv == MU_OK || rv == MU_STOP) ? MU_OK: MU_G_ERROR_CODE(err); return (rv == MU_OK || rv == MU_STOP) ? MU_OK: MU_G_ERROR_CODE(err);
} }
static void
index_title (MuStore *store, MuConfig *opts)
{
const char *green, *def;
char **addrs;
int i;
time_t created;
struct tm *tstamp;
char tbuf[40];
green = opts->nocolor ? "" : MU_COLOR_GREEN;
def = opts->nocolor ? "" : MU_COLOR_DEFAULT;
g_print ("database : %s%s%s\n",
green, mu_store_database_path (store), def);
g_print ("schema-version : %s%s%s\n",
green, mu_store_schema_version(store), def);
created = mu_store_created (store);
tstamp = localtime (&created);
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-y2k"
strftime (tbuf, sizeof(tbuf), "%c", tstamp);
#pragma GCC diagnostic pop
g_print ("created : %s%s%s\n", green, tbuf, def);
g_print ("maildir : %s%s%s\n",
green, mu_store_root_maildir (store), def);
g_print ("personal-addresses : ");
addrs = mu_store_personal_addresses (store);
for (i = 0; addrs[i]; ++i) {
if (i != 0)
g_print (" ");
g_print ("%s%s%s\n", green, addrs[i], def);
}
g_strfreev(addrs);
g_print ("\n");
}
static MuError static MuError
cmd_index (MuIndex *midx, MuConfig *opts, MuIndexStats *stats, GError **err) cmd_index (MuIndex *midx, MuConfig *opts, MuIndexStats *stats, GError **err)
{ {
@ -347,7 +302,6 @@ init_mu_index (MuStore *store, MuConfig *opts, GError **err)
return midx; return midx;
} }
MuError MuError
mu_cmd_index (MuStore *store, MuConfig *opts, GError **err) mu_cmd_index (MuStore *store, MuConfig *opts, GError **err)
{ {
@ -369,7 +323,7 @@ mu_cmd_index (MuStore *store, MuConfig *opts, GError **err)
install_sig_handler (); install_sig_handler ();
if (!opts->quiet) if (!opts->quiet)
index_title (store, opts); mu_store_print_info (store, opts->nocolor);
t = time (NULL); t = time (NULL);
rv = cmd_index (midx, opts, &stats, err); rv = cmd_index (midx, opts, &stats, err);

View File

@ -1,6 +1,5 @@
/* -*-mode: c; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-*/
/* /*
** Copyright (C) 2010-2016 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl> ** Copyright (C) 2010-2020 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
@ -18,9 +17,7 @@
** **
*/ */
#if HAVE_CONFIG_H
#include "config.h" #include "config.h"
#endif /*HAVE_CONFIG_H*/
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
@ -243,8 +240,8 @@ view_params_valid (MuConfig *opts, GError **err)
} }
MuError static MuError
mu_cmd_view (MuConfig *opts, GError **err) cmd_view (MuConfig *opts, GError **err)
{ {
int i; int i;
gboolean rv; gboolean rv;
@ -275,9 +272,8 @@ leave:
return MU_OK; return MU_OK;
} }
static MuError
MuError cmd_mkdir (MuConfig *opts, GError **err)
mu_cmd_mkdir (MuConfig *opts, GError **err)
{ {
int i; int i;
@ -378,8 +374,8 @@ add_path_func (MuStore *store, const char *path, GError **err)
} }
MuError static MuError
mu_cmd_add (MuStore *store, MuConfig *opts, GError **err) cmd_add (MuStore *store, MuConfig *opts, GError **err)
{ {
g_return_val_if_fail (store, MU_ERROR_INTERNAL); g_return_val_if_fail (store, MU_ERROR_INTERNAL);
g_return_val_if_fail (opts, MU_ERROR_INTERNAL); g_return_val_if_fail (opts, MU_ERROR_INTERNAL);
@ -401,8 +397,8 @@ remove_path_func (MuStore *store, const char *path, GError **err)
return TRUE; return TRUE;
} }
MuError static MuError
mu_cmd_remove (MuStore *store, MuConfig *opts, GError **err) cmd_remove (MuStore *store, MuConfig *opts, GError **err)
{ {
g_return_val_if_fail (opts, MU_ERROR_INTERNAL); g_return_val_if_fail (opts, MU_ERROR_INTERNAL);
g_return_val_if_fail (opts->cmd == MU_CONFIG_CMD_REMOVE, g_return_val_if_fail (opts->cmd == MU_CONFIG_CMD_REMOVE,
@ -428,8 +424,8 @@ tickle_func (MuStore *store, const char *path, GError **err)
} }
MuError static MuError
mu_cmd_tickle (MuStore *store, MuConfig *opts, GError **err) cmd_tickle (MuStore *store, MuConfig *opts, GError **err)
{ {
g_return_val_if_fail (opts, MU_ERROR_INTERNAL); g_return_val_if_fail (opts, MU_ERROR_INTERNAL);
g_return_val_if_fail (opts->cmd == MU_CONFIG_CMD_TICKLE, g_return_val_if_fail (opts->cmd == MU_CONFIG_CMD_TICKLE,
@ -513,8 +509,8 @@ print_verdict (VData *vdata, gboolean color, gboolean verbose)
} }
MuError static MuError
mu_cmd_verify (MuConfig *opts, GError **err) cmd_verify (MuConfig *opts, GError **err)
{ {
MuMsg *msg; MuMsg *msg;
MuMsgOptions msgopts; MuMsgOptions msgopts;
@ -555,6 +551,40 @@ mu_cmd_verify (MuConfig *opts, GError **err)
MU_OK : MU_ERROR; MU_OK : MU_ERROR;
} }
static MuError
cmd_info (MuStore *store, MuConfig *opts, GError **err)
{
mu_store_print_info (store, opts->nocolor);
return MU_OK;
}
static MuError
cmd_init (MuConfig *opts, GError **err)
{
MuStore *store;
const char *path;
path = mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB);
store = mu_store_new_create (path,
opts->maildir,
(const char**)opts->my_addresses,
err);
if (!store)
return MU_G_ERROR_CODE(err);
if (!opts->quiet) {
mu_store_print_info (store, opts->nocolor);
g_print ("\nstore created.\n"
"now you can use the index command to index some messages.\n"
"see mu-index(1) for details\n");
}
mu_store_unref (store);
return MU_OK;
}
static void static void
show_usage (void) show_usage (void)
@ -570,81 +600,40 @@ typedef MuError (*store_func) (MuStore *, MuConfig *, GError **err);
static MuError static MuError
with_readonly_store (store_func func, MuConfig *opts, GError **err) with_store (store_func func, MuConfig *opts, gboolean read_only, GError **err)
{ {
MuError merr; MuError merr;
MuStore *store; MuStore *store;
const char *path; const char *path;
if (opts->rebuild) {
g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR,
"cannot rebuild a read-only database");
return MU_G_ERROR_CODE(err);
}
path = mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB); path = mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB);
store = mu_store_new_readable (path, err);
if (!store)
return MU_G_ERROR_CODE(err);
merr = func (store, opts, err);
mu_store_unref (store);
return merr;
}
static MuStore*
get_store (MuConfig *opts, gboolean read_only, GError **err)
{
if (opts->rebuild && read_only) {
g_set_error (err, MU_ERROR_DOMAIN, MU_ERROR,
"cannot rebuild a read-only database");
return NULL;
}
if (read_only) if (read_only)
return mu_store_new_readable ( store = mu_store_new_readable (path, err);
mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB), err); else
store = mu_store_new_writable (path, err);
if (!opts->rebuild)
return mu_store_new_writable
(mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB), err);
if (!opts->maildir) {
g_set_error (err, MU_ERROR_DOMAIN,
MU_ERROR_IN_PARAMETERS,
"missing --maildir parameter");
return NULL;
}
return mu_store_new_create (mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB),
opts->maildir,
(const char**)opts->my_addresses,
err);
}
static MuError
with_store (store_func func, MuConfig *opts, gboolean read_only,
GError **err)
{
MuStore *store;
MuError merr;
store = get_store (opts, read_only, err);
if (!store) if (!store)
return MU_G_ERROR_CODE(err); return MU_G_ERROR_CODE(err);
merr = func (store, opts, err); merr = func (store, opts, err);
mu_store_unref (store); mu_store_unref (store);
return merr; return merr;
} }
static MuError
with_readonly_store (store_func func, MuConfig *opts, GError **err)
{
return with_store (func, opts, TRUE, err);
}
static MuError
with_writable_store (store_func func, MuConfig *opts, GError **err)
{
return with_store (func, opts, FALSE, err);
}
static gboolean static gboolean
check_params (MuConfig *opts, GError **err) check_params (MuConfig *opts, GError **err)
{ {
@ -675,7 +664,6 @@ set_log_options (MuConfig *opts)
logopts |= MU_LOG_OPTIONS_DEBUG; logopts |= MU_LOG_OPTIONS_DEBUG;
} }
MuError MuError
mu_cmd_execute (MuConfig *opts, GError **err) mu_cmd_execute (MuConfig *opts, GError **err)
{ {
@ -689,34 +677,44 @@ mu_cmd_execute (MuConfig *opts, GError **err)
set_log_options (opts); set_log_options (opts);
switch (opts->cmd) { switch (opts->cmd) {
/* already handled in mu-config.c */ /* already handled in mu-config.c */
case MU_CONFIG_CMD_HELP: return MU_OK; case MU_CONFIG_CMD_HELP: return MU_OK;
case MU_CONFIG_CMD_MKDIR: merr = mu_cmd_mkdir (opts, err); break; /* no store needed */
case MU_CONFIG_CMD_MKDIR: merr = cmd_mkdir (opts, err); break;
case MU_CONFIG_CMD_SCRIPT: merr = mu_cmd_script (opts, err); break; case MU_CONFIG_CMD_SCRIPT: merr = mu_cmd_script (opts, err); break;
case MU_CONFIG_CMD_VIEW: merr = mu_cmd_view (opts, err); break; case MU_CONFIG_CMD_VIEW: merr = cmd_view (opts, err); break;
case MU_CONFIG_CMD_VERIFY: merr = mu_cmd_verify (opts, err); break; case MU_CONFIG_CMD_VERIFY: merr = cmd_verify (opts, err); break;
case MU_CONFIG_CMD_EXTRACT: merr = mu_cmd_extract (opts, err); break; case MU_CONFIG_CMD_EXTRACT: merr = mu_cmd_extract (opts, err); break;
/* read-only store */
case MU_CONFIG_CMD_CFIND: case MU_CONFIG_CMD_CFIND:
merr = with_readonly_store (mu_cmd_cfind, opts, err); break; merr = with_readonly_store (mu_cmd_cfind, opts, err); break;
case MU_CONFIG_CMD_FIND: case MU_CONFIG_CMD_FIND:
merr = with_readonly_store (mu_cmd_find, opts, err); break; merr = with_readonly_store (mu_cmd_find, opts, err); break;
case MU_CONFIG_CMD_INFO:
merr = with_readonly_store (cmd_info, opts, err); break;
/* writable store */
case MU_CONFIG_CMD_INDEX:
merr = with_store (mu_cmd_index, opts, FALSE, err); break;
case MU_CONFIG_CMD_ADD: case MU_CONFIG_CMD_ADD:
merr = with_store (mu_cmd_add, opts, FALSE, err); break; merr = with_writable_store (cmd_add, opts, err); break;
case MU_CONFIG_CMD_REMOVE: case MU_CONFIG_CMD_REMOVE:
merr = with_store (mu_cmd_remove, opts, FALSE, err); break; merr = with_writable_store (cmd_remove, opts, err); break;
case MU_CONFIG_CMD_TICKLE: case MU_CONFIG_CMD_TICKLE:
merr = with_store (mu_cmd_tickle, opts, FALSE, err); break; merr = with_writable_store (cmd_tickle, opts, err); break;
case MU_CONFIG_CMD_INDEX:
merr = with_writable_store (mu_cmd_index, opts, err); break;
/* commands instantiate store themselves */
case MU_CONFIG_CMD_INIT:
merr = cmd_init (opts,err); break;
case MU_CONFIG_CMD_SERVER: case MU_CONFIG_CMD_SERVER:
if (opts->commands) merr = mu_cmd_server (opts, err); break;
merr = mu_cmd_server (NULL, opts, err);
else
merr = with_store (mu_cmd_server, opts, FALSE, err);
break;
default: default:
merr = MU_ERROR_IN_PARAMETERS; break; merr = MU_ERROR_IN_PARAMETERS; break;
} }

View File

@ -1,7 +1,5 @@
/* -*-mode: c; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-*/
/* /*
** Copyright (C) 2008-2013 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl> ** Copyright (C) 2008-2020 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
@ -28,43 +26,6 @@
G_BEGIN_DECLS G_BEGIN_DECLS
/**
* execute the 'mkdir' command
*
* @param opts configuration options
* @param err receives error information, or NULL
*
* @return MU_OK (0) if the command succeeded,
* some error code otherwise
*/
MuError mu_cmd_mkdir (MuConfig *opts, GError **err);
/**
* execute the 'view' command
*
* @param opts configuration options
* @param err receives error information, or NULL
*
* @return MU_OK (0) if the command succeeded,
* some error code otherwise
*/
MuError mu_cmd_view (MuConfig *opts, GError **err);
/**
* execute the 'index' command
*
* @param store store object to use
* @param opts configuration options
* @param err receives error information, or NULL
*
* @return MU_OK (0) if the command succeeded,
* some error code otherwise
*/
MuError mu_cmd_index (MuStore *store, MuConfig *opt, GError **err);
/** /**
* execute the 'find' command * execute the 'find' command
* *
@ -91,18 +52,6 @@ MuError mu_cmd_find (MuStore *store, MuConfig *opts, GError **err);
MuError mu_cmd_extract (MuConfig *opts, GError **err); MuError mu_cmd_extract (MuConfig *opts, GError **err);
/**
* execute the 'mv' command
*
* @param opts configuration options
* @param err receives error information, or NULL
*
* @return MU_OK (0) if the command succeeds,
* some error code otherwise
*/
MuError mu_cmd_mv (MuConfig *opts, GError **err);
/** /**
* execute the 'script' command * execute the 'script' command
* *
@ -126,67 +75,6 @@ MuError mu_cmd_script (MuConfig *opts, GError **err);
*/ */
MuError mu_cmd_cfind (MuStore *store, MuConfig *opts, GError **err); MuError mu_cmd_cfind (MuStore *store, MuConfig *opts, GError **err);
/**
* execute the add command
*
* @param store store object to use
* @param opts configuration options
* @param err receives error information, or NULL
*
* @return MU_OK (0) if the command succeeds,
* some error code otherwise
*/
MuError mu_cmd_add (MuStore *store, MuConfig *opts, GError **err);
/**
* execute the remove command
*
* @param store store object to use
* @param opts configuration options
* @param err receives error information, or NULL
*
* @return MU_OK (0) if the command succeeds,
* some error code otherwise
*/
MuError mu_cmd_remove (MuStore *store, MuConfig *opts, GError **err);
/**
* execute the tickle command
*
* @param store store object to use
* @param opts configuration options
* @param err receives error information, or NULL
*
* @return MU_OK (0) if the command succeeds,
* some error code otherwise
*/
MuError mu_cmd_tickle (MuStore *store, MuConfig *opts, GError **err);
/**
* execute the server command
* @param store store object to use
* @param opts configuration options
*
* @return MU_OK (0) if the command succeeds,
* some error code otherwise
*/
MuError mu_cmd_server (MuStore *store, MuConfig *opts, GError**/*unused*/);
MuError mu_cmd_server2 (MuStore *store, MuConfig *opts, GError**/*unused*/);
/**
* execute the verify command (to verify signatures)
* @param store store object to use
* @param opts configuration options
* @param err receives error information, or NULL
*
* @return MU_OK (0) if the command succeeds,
* some error code otherwise
*/
MuError mu_cmd_verify (MuConfig *opts, GError **err);
/** /**
* execute some mu command, based on 'opts' * execute some mu command, based on 'opts'
* *
@ -197,6 +85,27 @@ MuError mu_cmd_verify (MuConfig *opts, GError **err);
*/ */
MuError mu_cmd_execute (MuConfig *opts, GError **err); MuError mu_cmd_execute (MuConfig *opts, GError **err);
/**
* execute the 'index' command
*
* @param store store object to use
* @param opts configuration options
* @param err receives error information, or NULL
*
* @return MU_OK (0) if the command succeeded,
* some error code otherwise
*/
MuError mu_cmd_index (MuStore *store, MuConfig *opt, GError **err);
/**
* execute the server command
* @param opts configuration options
* @param err receives error information, or NULL
*
* @return MU_OK (0) if the command succeeds, some error code otherwise
*/
MuError mu_cmd_server (MuConfig *opts, GError **err);
G_END_DECLS G_END_DECLS
#endif /*__MU_CMD_H__*/ #endif /*__MU_CMD_H__*/

View File

@ -63,20 +63,25 @@ get_output_format (const char *formatstr)
} }
#define expand_dir(D) \
if ((D)) { \
char *exp; \
exp = mu_util_dir_expand((D)); \
if (exp) { \
g_free((D)); \
(D) = exp; \
} \
}
static void static void
set_group_mu_defaults (void) set_group_mu_defaults (void)
{ {
/* If muhome is not set, we use the XDG Base Directory Specification /* If muhome is not set, we use the XDG Base Directory Specification
* locations. */ * locations. */
if (MU_CONFIG.muhome) { if (MU_CONFIG.muhome)
gchar *exp; expand_dir(MU_CONFIG.muhome);
exp = mu_util_dir_expand(MU_CONFIG.muhome);
if (exp) {
g_free(MU_CONFIG.muhome);
MU_CONFIG.muhome = exp;
}
}
/* check for the MU_NOCOLOR or NO_COLOR env vars; but in any case don't /* check for the MU_NOCOLOR or NO_COLOR env vars; but in any case don't
* use colors unless we're writing to a tty */ * use colors unless we're writing to a tty */
@ -118,35 +123,39 @@ config_options_group_mu (void)
return og; return og;
} }
#define expand_dir(D) \
if ((D)) { \
char *exp; \
exp = mu_util_dir_expand((D)); \
if (exp) { \
g_free((D)); \
(D) = exp; \
} \
}
static void static void
set_group_index_defaults (void) set_group_init_defaults (void)
{ {
if (!MU_CONFIG.maildir) if (!MU_CONFIG.maildir)
MU_CONFIG.maildir = mu_util_guess_maildir (); MU_CONFIG.maildir = mu_util_guess_maildir();
expand_dir (MU_CONFIG.maildir); expand_dir (MU_CONFIG.maildir);
} }
static GOptionGroup*
config_options_group_init (void)
{
GOptionGroup *og;
GOptionEntry entries[] = {
{"maildir", 'm', 0, G_OPTION_ARG_FILENAME, &MU_CONFIG.maildir,
"top of the maildir", "<maildir>"},
{"my-address", 0, 0, G_OPTION_ARG_STRING_ARRAY,
&MU_CONFIG.my_addresses, "my e-mail address; can be used multiple times",
"<address>"},
};
og = g_option_group_new("init", "Options for the 'index' command",
"", NULL, NULL);
g_option_group_add_entries(og, entries);
return og;
}
static GOptionGroup* static GOptionGroup*
config_options_group_index (void) config_options_group_index (void)
{ {
GOptionGroup *og; GOptionGroup *og;
GOptionEntry entries[] = { GOptionEntry entries[] = {
{"maildir", 'm', 0, G_OPTION_ARG_FILENAME, &MU_CONFIG.maildir,
"top of the maildir", "<maildir>"},
{"rebuild", 0, 0, G_OPTION_ARG_NONE, &MU_CONFIG.rebuild,
"rebuild the database from scratch (false)", NULL},
{"lazy-check", 0, 0, G_OPTION_ARG_NONE, &MU_CONFIG.lazycheck, {"lazy-check", 0, 0, G_OPTION_ARG_NONE, &MU_CONFIG.lazycheck,
"only check dir-timestamps (false)", NULL}, "only check dir-timestamps (false)", NULL},
{"my-address", 0, 0, G_OPTION_ARG_STRING_ARRAY, {"my-address", 0, 0, G_OPTION_ARG_STRING_ARRAY,
@ -155,9 +164,6 @@ config_options_group_index (void)
"<address>"}, "<address>"},
{"nocleanup", 0, 0, G_OPTION_ARG_NONE, &MU_CONFIG.nocleanup, {"nocleanup", 0, 0, G_OPTION_ARG_NONE, &MU_CONFIG.nocleanup,
"don't clean up the database after indexing (false)", NULL}, "don't clean up the database after indexing (false)", NULL},
{"max-msg-size", 0, 0, G_OPTION_ARG_INT,
&MU_CONFIG.max_msg_size,
"set the maximum size for message files", "<size>"},
{NULL, 0, 0, 0, NULL, NULL, NULL} {NULL, 0, 0, 0, NULL, NULL, NULL}
}; };
@ -267,7 +273,6 @@ config_options_group_mkdir (void)
return og; return og;
} }
static void static void
set_group_cfind_defaults (void) set_group_cfind_defaults (void)
{ {
@ -277,7 +282,6 @@ set_group_cfind_defaults (void)
MU_CONFIG.format = get_output_format (MU_CONFIG.formatstr); MU_CONFIG.format = get_output_format (MU_CONFIG.formatstr);
} }
static GOptionGroup * static GOptionGroup *
config_options_group_cfind (void) config_options_group_cfind (void)
{ {
@ -300,8 +304,6 @@ config_options_group_cfind (void)
return og; return og;
} }
static GOptionGroup * static GOptionGroup *
config_options_group_script (void) config_options_group_script (void)
{ {
@ -320,9 +322,6 @@ config_options_group_script (void)
return og; return og;
} }
static void static void
set_group_view_defaults (void) set_group_view_defaults (void)
{ {
@ -351,7 +350,6 @@ crypto_option_entries (void)
return entries; return entries;
} }
static GOptionGroup * static GOptionGroup *
config_options_group_view (void) config_options_group_view (void)
{ {
@ -377,8 +375,6 @@ config_options_group_view (void)
return og; return og;
} }
static void static void
set_group_extract_defaults (void) set_group_extract_defaults (void)
{ {
@ -389,7 +385,6 @@ set_group_extract_defaults (void)
} }
static GOptionGroup* static GOptionGroup*
config_options_group_extract (void) config_options_group_extract (void)
{ {
@ -471,6 +466,8 @@ cmd_from_string (const char *str)
{ "find", MU_CONFIG_CMD_FIND }, { "find", MU_CONFIG_CMD_FIND },
{ "help", MU_CONFIG_CMD_HELP }, { "help", MU_CONFIG_CMD_HELP },
{ "index", MU_CONFIG_CMD_INDEX }, { "index", MU_CONFIG_CMD_INDEX },
{ "info", MU_CONFIG_CMD_INFO },
{ "init", MU_CONFIG_CMD_INIT },
{ "mfind", MU_CONFIG_CMD_MFIND }, { "mfind", MU_CONFIG_CMD_MFIND },
{ "mkdir", MU_CONFIG_CMD_MKDIR }, { "mkdir", MU_CONFIG_CMD_MKDIR },
{ "remove", MU_CONFIG_CMD_REMOVE }, { "remove", MU_CONFIG_CMD_REMOVE },
@ -549,6 +546,8 @@ get_option_group (MuConfigCmd cmd)
return config_options_group_find(); return config_options_group_find();
case MU_CONFIG_CMD_INDEX: case MU_CONFIG_CMD_INDEX:
return config_options_group_index(); return config_options_group_index();
case MU_CONFIG_CMD_INIT:
return config_options_group_init();
case MU_CONFIG_CMD_MKDIR: case MU_CONFIG_CMD_MKDIR:
return config_options_group_mkdir(); return config_options_group_mkdir();
case MU_CONFIG_CMD_SERVER: case MU_CONFIG_CMD_SERVER:
@ -723,7 +722,7 @@ mu_config_init (int *argcp, char ***argvp, GError **err)
/* fill in the defaults if user did not specify */ /* fill in the defaults if user did not specify */
set_group_mu_defaults(); set_group_mu_defaults();
set_group_index_defaults(); set_group_init_defaults();
set_group_find_defaults(); set_group_find_defaults();
set_group_cfind_defaults(); set_group_cfind_defaults();
set_group_view_defaults(); set_group_view_defaults();

View File

@ -69,6 +69,8 @@ typedef enum {
MU_CONFIG_CMD_FIND, MU_CONFIG_CMD_FIND,
MU_CONFIG_CMD_HELP, MU_CONFIG_CMD_HELP,
MU_CONFIG_CMD_INDEX, MU_CONFIG_CMD_INDEX,
MU_CONFIG_CMD_INFO,
MU_CONFIG_CMD_INIT,
MU_CONFIG_CMD_MFIND, MU_CONFIG_CMD_MFIND,
MU_CONFIG_CMD_MKDIR, MU_CONFIG_CMD_MKDIR,
MU_CONFIG_CMD_REMOVE, MU_CONFIG_CMD_REMOVE,
@ -106,16 +108,18 @@ struct _MuConfig {
* in some output */ * in some output */
gboolean verbose; /* verbose output */ gboolean verbose; /* verbose output */
/* options for init */
gchar *maildir; /* where the mails are */
char** my_addresses; /* 'my e-mail address', for mu
* cfind; can be use multiple
* times */
/* options for indexing */ /* options for indexing */
gchar *maildir; /* where the mails are */
gboolean nocleanup; /* don't cleanup del'd mails from db */ gboolean nocleanup; /* don't cleanup del'd mails from db */
gboolean rebuild; /* empty the database before indexing */ gboolean rebuild; /* empty the database before indexing */
gboolean lazycheck; /* don't check dirs with up-to-date gboolean lazycheck; /* don't check dirs with up-to-date
* timestamps */ * timestamps */
int max_msg_size; /* maximum size for message files */ int max_msg_size; /* maximum size for message files */
char** my_addresses; /* 'my e-mail address', for mu
* cfind; can be use multiple
* times */
/* options for querying 'find' (and view-> 'summary') */ /* options for querying 'find' (and view-> 'summary') */
gchar *fields; /* fields to show in output */ gchar *fields; /* fields to show in output */

View File

@ -1,7 +1,5 @@
/* -*-mode: c++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8-*- */
/* /*
** Copyright (C) 2008-2019 Dirk-Jan C. Binnema <djcb@djcbsoftware.nl> ** Copyright (C) 2008-2020 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
@ -37,7 +35,7 @@ show_version (void)
{ {
const char* blurb = const char* blurb =
"mu (mail indexer/searcher) version " VERSION "\n" "mu (mail indexer/searcher) version " VERSION "\n"
"Copyright (C) 2008-2019 Dirk-Jan C. Binnema\n" "Copyright (C) 2008-2020 Dirk-Jan C. Binnema\n"
"License GPLv3+: GNU GPL version 3 or later " "License GPLv3+: GNU GPL version 3 or later "
"<http://gnu.org/licenses/gpl.html>.\n" "<http://gnu.org/licenses/gpl.html>.\n"
"This is free software: you are free to change " "This is free software: you are free to change "
@ -51,13 +49,9 @@ show_version (void)
static void static void
handle_error (MuConfig *conf, MuError merr, GError **err) handle_error (MuConfig *conf, MuError merr, GError **err)
{ {
const char *path;
if (!(err && *err)) if (!(err && *err))
return; return;
path = mu_runtime_path(MU_RUNTIME_PATH_XAPIANDB);
switch ((*err)->code) { switch ((*err)->code) {
case MU_ERROR_XAPIAN_CANNOT_GET_WRITELOCK: case MU_ERROR_XAPIAN_CANNOT_GET_WRITELOCK:
g_printerr ("maybe mu is already running?\n"); g_printerr ("maybe mu is already running?\n");
@ -76,15 +70,12 @@ handle_error (MuConfig *conf, MuError merr, GError **err)
"'mu script' for the scripts\n"); "'mu script' for the scripts\n");
break; break;
case MU_ERROR_XAPIAN_CANNOT_OPEN: case MU_ERROR_XAPIAN_CANNOT_OPEN:
g_printerr("Failed to open database @ %s, \n" g_printerr("Please (re)init mu with 'mu init' "
"Please (re)build the database, i.e., with\n" "see mu-init(1) for details");
"\tmu index --rebuild\n", path);
return; return;
case MU_ERROR_XAPIAN_SCHEMA_MISMATCH: case MU_ERROR_XAPIAN_SCHEMA_MISMATCH:
g_printerr("Failed to open database @ %s, \n" g_printerr("Please (re)init mu with 'mu init' "
"because the schema version does not match mu's.\n\n" "see mu-init(1) for details");
"Please rebuild the database, i.e., with\n"
"\tmu index --rebuild\n", path);
return; return;
default: default:
break; /* nothing to do */ break; /* nothing to do */