mirror of https://github.com/djcb/mu.git
* WIP: basic 'mu cfind' command + start of man page
This commit is contained in:
parent
6226754a25
commit
86971d53d8
|
@ -19,6 +19,7 @@ include $(top_srcdir)/gtest.mk
|
||||||
dist_man_MANS = \
|
dist_man_MANS = \
|
||||||
mu-cleanup.1 \
|
mu-cleanup.1 \
|
||||||
mu-bookmarks.5 \
|
mu-bookmarks.5 \
|
||||||
|
mu-cfind.1 \
|
||||||
mu-easy.1 \
|
mu-easy.1 \
|
||||||
mu-extract.1 \
|
mu-extract.1 \
|
||||||
mu-find.1 \
|
mu-find.1 \
|
||||||
|
|
|
@ -0,0 +1,74 @@
|
||||||
|
.TH MU CFIND 1 "March 2011" "User Manuals"
|
||||||
|
|
||||||
|
.SH NAME
|
||||||
|
|
||||||
|
mu cfind \- find contacts in the
|
||||||
|
.B mu
|
||||||
|
database and/or export
|
||||||
|
|
||||||
|
.SH SYNOPSIS
|
||||||
|
|
||||||
|
.B mu cfind [options] [<pattern>]
|
||||||
|
|
||||||
|
.SH DESCRIPTION
|
||||||
|
|
||||||
|
\fBmu cfind\fR is the \fBmu\fR command for finding contacts (i.e., people who
|
||||||
|
were either the sender or receiver of mail).
|
||||||
|
|
||||||
|
.SH SEARCHING CONTACTS
|
||||||
|
|
||||||
|
When you index your messages (see \fBmu index\fR), \fBmu\fR creates a list of
|
||||||
|
all unique e-mail addresses found, and the accompanying name. In case the same
|
||||||
|
e-mail address is used with different names, the most recent one is used.
|
||||||
|
|
||||||
|
\fBmu cfind\fR starts a search for contacts that match a \fIregular
|
||||||
|
expression\fR. For example:
|
||||||
|
|
||||||
|
.nf
|
||||||
|
$ mu cfind '@gmail\.com'
|
||||||
|
.fi
|
||||||
|
|
||||||
|
would find all contacts with a gmail-address, while
|
||||||
|
|
||||||
|
.nf
|
||||||
|
$ mu cfind Mary
|
||||||
|
.fi
|
||||||
|
|
||||||
|
would find all contact with Mary in either name or e-mail address.
|
||||||
|
|
||||||
|
.SH OPTIONS
|
||||||
|
|
||||||
|
.TP
|
||||||
|
\fB\-\-format\fR=
|
||||||
|
set the file access mode for the new maildir(s) as in \fBchmod(1)\fR.
|
||||||
|
|
||||||
|
|
||||||
|
.SH RETURN VALUE
|
||||||
|
|
||||||
|
\fBmu find\fR return 0 upon successful completion; if it the a search was
|
||||||
|
performed, there needs to be a least one match. Anything else leads to a
|
||||||
|
non-zero return value, for example:
|
||||||
|
|
||||||
|
.sh
|
||||||
|
| code | meaning |
|
||||||
|
|------+--------------------------------|
|
||||||
|
| 0 | ok |
|
||||||
|
| 1 | general error |
|
||||||
|
| 2 | no matches (for 'mu cfind') |
|
||||||
|
.si
|
||||||
|
|
||||||
|
.SH BUGS
|
||||||
|
|
||||||
|
Please report bugs if you find them:
|
||||||
|
.BR http://code.google.com/p/mu0/issues/list
|
||||||
|
If you have specific messages which are not matched correctly, please attach
|
||||||
|
them (appropriately censored of course).
|
||||||
|
|
||||||
|
.SH AUTHOR
|
||||||
|
|
||||||
|
Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
|
||||||
|
|
||||||
|
.SH "SEE ALSO"
|
||||||
|
|
||||||
|
.BR mu(1)
|
||||||
|
.BR mu-index(1)
|
73
src/mu-cmd.c
73
src/mu-cmd.c
|
@ -131,10 +131,62 @@ mu_cmd_mkdir (MuConfig *opts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
enum _OutputFormat {
|
||||||
each_contact (const char *email, const char *name, time_t tstamp, gpointer data)
|
FORMAT_PLAIN,
|
||||||
|
FORMAT_MUTT,
|
||||||
|
FORMAT_WL,
|
||||||
|
FORMAT_CSV,
|
||||||
|
FORMAT_ORG_CONTACT,
|
||||||
|
|
||||||
|
FORMAT_NONE
|
||||||
|
};
|
||||||
|
typedef enum _OutputFormat OutputFormat;
|
||||||
|
|
||||||
|
static OutputFormat
|
||||||
|
get_output_format (const char *formatstr)
|
||||||
{
|
{
|
||||||
g_print ("%u: %s %s\n", (unsigned)tstamp, email, name ? name : "");
|
int i;
|
||||||
|
struct {
|
||||||
|
const char* name;
|
||||||
|
OutputFormat format;
|
||||||
|
} formats [] = {
|
||||||
|
{MU_CONFIG_FORMAT_PLAIN, FORMAT_PLAIN},
|
||||||
|
{MU_CONFIG_FORMAT_MUTT, FORMAT_MUTT},
|
||||||
|
{MU_CONFIG_FORMAT_WL, FORMAT_WL},
|
||||||
|
{MU_CONFIG_FORMAT_CSV, FORMAT_CSV},
|
||||||
|
{MU_CONFIG_FORMAT_ORG_CONTACT, FORMAT_ORG_CONTACT}
|
||||||
|
};
|
||||||
|
|
||||||
|
for (i = 0; i != G_N_ELEMENTS(formats); i++)
|
||||||
|
if (g_strcmp0 (formats[i].name, formatstr) == 0)
|
||||||
|
return formats[i].format;
|
||||||
|
|
||||||
|
return FORMAT_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
each_contact (const char *email, const char *name, time_t tstamp,
|
||||||
|
OutputFormat format)
|
||||||
|
{
|
||||||
|
switch (format) {
|
||||||
|
case FORMAT_MUTT:
|
||||||
|
if (name)
|
||||||
|
g_print ("alias %s <%s>\n", name, email);
|
||||||
|
break;
|
||||||
|
case FORMAT_WL:
|
||||||
|
if (name)
|
||||||
|
g_print ("%s \"%s\"\n", email, name);
|
||||||
|
break;
|
||||||
|
case FORMAT_ORG_CONTACT:
|
||||||
|
if (name)
|
||||||
|
g_print ("* %s\n:PROPERTIES:\n:EMAIL: %s\n:END:\n\n",
|
||||||
|
name, email);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_print ("%u: %s %s\n", (unsigned)tstamp, email, name ? name : "");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -143,14 +195,23 @@ each_contact (const char *email, const char *name, time_t tstamp, gpointer data)
|
||||||
MuExitCode
|
MuExitCode
|
||||||
mu_cmd_cfind (MuConfig *opts)
|
mu_cmd_cfind (MuConfig *opts)
|
||||||
{
|
{
|
||||||
|
OutputFormat format;
|
||||||
MuContacts *contacts;
|
MuContacts *contacts;
|
||||||
|
|
||||||
g_return_val_if_fail (opts, MU_EXITCODE_ERROR);
|
g_return_val_if_fail (opts, MU_EXITCODE_ERROR);
|
||||||
g_return_val_if_fail (opts->cmd == MU_CONFIG_CMD_CFIND,
|
g_return_val_if_fail (opts->cmd == MU_CONFIG_CMD_CFIND,
|
||||||
MU_EXITCODE_ERROR);
|
MU_EXITCODE_ERROR);
|
||||||
|
|
||||||
|
format = get_output_format (opts->formatstr);
|
||||||
|
if (format == FORMAT_NONE) {
|
||||||
|
g_warning ("invalid output format %s",
|
||||||
|
opts->formatstr ? opts->formatstr : "<none>");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* if (!opts->params[1]) { */
|
/* if (!opts->params[1]) { */
|
||||||
/* g_warning ("usage: mu cfind [ptrn] "); */
|
/* g_warning ("usage: mu cfind [OPTIONS] [<ptrn>]"); */
|
||||||
/* return MU_EXITCODE_ERROR; */
|
/* return MU_EXITCODE_ERROR; */
|
||||||
/* } */
|
/* } */
|
||||||
|
|
||||||
|
@ -160,8 +221,8 @@ mu_cmd_cfind (MuConfig *opts)
|
||||||
return MU_EXITCODE_ERROR;
|
return MU_EXITCODE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
mu_contacts_foreach (contacts, (MuContactsForeachFunc)each_contact, NULL,
|
mu_contacts_foreach (contacts, (MuContactsForeachFunc)each_contact,
|
||||||
opts->params[1]);
|
GINT_TO_POINTER(format), opts->params[1]);
|
||||||
mu_contacts_destroy (contacts);
|
mu_contacts_destroy (contacts);
|
||||||
|
|
||||||
return MU_OK;
|
return MU_OK;
|
||||||
|
|
|
@ -162,7 +162,7 @@ config_options_group_find (MuConfig *opts)
|
||||||
"clear old links before filling a linksdir (false)", NULL},
|
"clear old links before filling a linksdir (false)", NULL},
|
||||||
{"format", 'o', 0, G_OPTION_ARG_STRING, &opts->formatstr,
|
{"format", 'o', 0, G_OPTION_ARG_STRING, &opts->formatstr,
|
||||||
"output format ('plain'(*), 'links', 'xml',"
|
"output format ('plain'(*), 'links', 'xml',"
|
||||||
"'json', 'sexp', 'xquery') (plain)", NULL},
|
"'json', 'sexp', 'xquery')", NULL},
|
||||||
{"xquery", 0, 0, G_OPTION_ARG_NONE, &opts->xquery,
|
{"xquery", 0, 0, G_OPTION_ARG_NONE, &opts->xquery,
|
||||||
"obsolete, use --format=xquery instead", NULL},
|
"obsolete, use --format=xquery instead", NULL},
|
||||||
|
|
||||||
|
@ -197,6 +197,35 @@ config_options_group_mkdir (MuConfig *opts)
|
||||||
return og;
|
return og;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_group_cfind_defaults (MuConfig *opts)
|
||||||
|
{
|
||||||
|
if (!opts->formatstr) /* by default, use plain output */
|
||||||
|
opts->formatstr = MU_CONFIG_FORMAT_PLAIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static GOptionGroup *
|
||||||
|
config_options_group_cfind (MuConfig *opts)
|
||||||
|
{
|
||||||
|
GOptionGroup *og;
|
||||||
|
GOptionEntry entries[] = {
|
||||||
|
{"format", 'o', 0, G_OPTION_ARG_STRING, &opts->formatstr,
|
||||||
|
"output format ('plain'(*), 'mutt', 'wanderlust',"
|
||||||
|
"'org-contact', 'csv')", NULL},
|
||||||
|
{NULL, 0, 0, 0, NULL, NULL, NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
og = g_option_group_new("cfind", "options for the 'cfind' command",
|
||||||
|
"", NULL, NULL);
|
||||||
|
g_option_group_add_entries(og, entries);
|
||||||
|
|
||||||
|
return og;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static GOptionGroup*
|
static GOptionGroup*
|
||||||
config_options_group_extract(MuConfig *opts)
|
config_options_group_extract(MuConfig *opts)
|
||||||
{
|
{
|
||||||
|
@ -281,7 +310,6 @@ parse_params (MuConfig *opts, int *argcp, char ***argvp)
|
||||||
context = g_option_context_new("- mu general option");
|
context = g_option_context_new("- mu general option");
|
||||||
g_option_context_set_main_group(context,
|
g_option_context_set_main_group(context,
|
||||||
config_options_group_mu(opts));
|
config_options_group_mu(opts));
|
||||||
|
|
||||||
switch (opts->cmd) {
|
switch (opts->cmd) {
|
||||||
case MU_CONFIG_CMD_INDEX:
|
case MU_CONFIG_CMD_INDEX:
|
||||||
g_option_context_add_group(context, config_options_group_index(opts));
|
g_option_context_add_group(context, config_options_group_index(opts));
|
||||||
|
@ -295,6 +323,9 @@ parse_params (MuConfig *opts, int *argcp, char ***argvp)
|
||||||
case MU_CONFIG_CMD_EXTRACT:
|
case MU_CONFIG_CMD_EXTRACT:
|
||||||
g_option_context_add_group(context, config_options_group_extract(opts));
|
g_option_context_add_group(context, config_options_group_extract(opts));
|
||||||
break;
|
break;
|
||||||
|
case MU_CONFIG_CMD_CFIND:
|
||||||
|
g_option_context_add_group(context, config_options_group_cfind(opts));
|
||||||
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,9 +355,10 @@ mu_config_new (int *argcp, char ***argvp)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* fill in the defaults if user did not specify */
|
/* fill in the defaults if user did not specify */
|
||||||
set_group_mu_defaults(config);
|
set_group_mu_defaults (config);
|
||||||
set_group_index_defaults(config);
|
set_group_index_defaults (config);
|
||||||
set_group_find_defaults(config);
|
set_group_find_defaults (config);
|
||||||
|
set_group_cfind_defaults (config);
|
||||||
/* set_group_mkdir_defaults (config); */
|
/* set_group_mkdir_defaults (config); */
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
|
@ -338,11 +370,11 @@ mu_config_destroy (MuConfig *opts)
|
||||||
if (!opts)
|
if (!opts)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_free(opts->muhome);
|
g_free (opts->muhome);
|
||||||
g_free(opts->maildir);
|
g_free (opts->maildir);
|
||||||
g_free(opts->linksdir);
|
g_free (opts->linksdir);
|
||||||
g_free(opts->targetdir);
|
g_free (opts->targetdir);
|
||||||
g_strfreev(opts->params);
|
g_strfreev (opts->params);
|
||||||
g_free (opts);
|
g_free (opts);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,6 +34,16 @@ G_BEGIN_DECLS
|
||||||
#define MU_CONFIG_FORMAT_SEXP "sexp" /* output sexps */
|
#define MU_CONFIG_FORMAT_SEXP "sexp" /* output sexps */
|
||||||
#define MU_CONFIG_FORMAT_XQUERY "xquery" /* output the xapian query */
|
#define MU_CONFIG_FORMAT_XQUERY "xquery" /* output the xapian query */
|
||||||
|
|
||||||
|
/* for cfind */
|
||||||
|
#define MU_CONFIG_FORMAT_MUTT "mutt" /* output in mutt alias style */
|
||||||
|
#define MU_CONFIG_FORMAT_WL "wl" /* output in Wanderlust
|
||||||
|
* address-book style */
|
||||||
|
#define MU_CONFIG_FORMAT_CSV "csv" /* output in
|
||||||
|
* comma-separated
|
||||||
|
* values */
|
||||||
|
#define MU_CONFIG_FORMAT_ORG_CONTACT "org-contact" /* org-contact
|
||||||
|
* format */
|
||||||
|
|
||||||
enum _MuConfigCmd {
|
enum _MuConfigCmd {
|
||||||
MU_CONFIG_CMD_INDEX,
|
MU_CONFIG_CMD_INDEX,
|
||||||
MU_CONFIG_CMD_FIND,
|
MU_CONFIG_CMD_FIND,
|
||||||
|
@ -78,7 +88,7 @@ struct _MuConfig {
|
||||||
* default */
|
* default */
|
||||||
int max_msg_size; /* maximum size for message files */
|
int max_msg_size; /* maximum size for message files */
|
||||||
|
|
||||||
/* options for querying */
|
/* options for querying */
|
||||||
gboolean xquery; /* (obsolete) give the Xapian
|
gboolean xquery; /* (obsolete) give the Xapian
|
||||||
query instead of search
|
query instead of search
|
||||||
results */
|
results */
|
||||||
|
|
Loading…
Reference in New Issue