/* ** Copyright (C) 2008-2021 Dirk-Jan C. Binnema ** ** 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 ** Free Software Foundation; either version 3, or (at your option) any ** later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program; if not, write to the Free Software Foundation, ** Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. ** */ #include #include #include #include #include "mu-config.hh" #include "mu-cmd.hh" #include "mu-runtime.hh" #include "utils/mu-utils.hh" using namespace Mu; static void show_version (void) { const char* blurb = "mu (mail indexer/searcher) version " VERSION "\n" "Copyright (C) 2008-2021 Dirk-Jan C. Binnema\n" "License GPLv3+: GNU GPL version 3 or later " ".\n" "This is free software: you are free to change " "and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law."; g_print ("%s\n", blurb); } static void handle_error (MuConfig *conf, MuError merr, GError **err) { if (!(err && *err)) return; using Color = MaybeAnsi::Color; MaybeAnsi col{conf ? !conf->nocolor : false}; if (*err) std::cerr << col.fg(Color::Red) << "error" << col.reset() << ": " << col.fg(Color::BrightYellow) << ((*err) ? (*err)->message : "something when wrong") << "\n"; std::cerr << col.fg(Color::Green); switch ((*err)->code) { case MU_ERROR_XAPIAN_CANNOT_GET_WRITELOCK: std::cerr << "Maybe mu is already running?\n"; break; case MU_ERROR_XAPIAN_NEEDS_REINDEX: std::cerr << "Database needs (re)indexing.\n" << "try 'mu index' " << "(see mu-index(1) for details)\n"; return; case MU_ERROR_IN_PARAMETERS: if (conf && mu_config_cmd_is_valid(conf->cmd)) mu_config_show_help (conf->cmd); break; case MU_ERROR_SCRIPT_NOT_FOUND: std::cerr << "See the mu manpage for commands, or " << "'mu script' for the scripts\n"; break; case MU_ERROR_XAPIAN_CANNOT_OPEN: std::cerr << "Please (re)initialize mu with 'mu init' " << "see mu-init(1) for details\n"; return; case MU_ERROR_XAPIAN_SCHEMA_MISMATCH: std::cerr << "Please (re)initialize mu with 'mu init' " << "see mu-init(1) for details\n"; return; default: break; /* nothing to do */ } std::cerr << col.reset(); } int main (int argc, char *argv[]) { GError *err; MuError rv; MuConfig *conf; setlocale (LC_ALL, ""); err = NULL; rv = MU_OK; conf = mu_config_init (&argc, &argv, &err); if (!conf) { rv = err ? (MuError)err->code : MU_ERROR; goto cleanup; } else if (conf->version) { show_version (); goto cleanup; } /* nothing to do */ if (conf->cmd == MU_CONFIG_CMD_NONE) return 0; if (!mu_runtime_init (conf->muhome, PACKAGE_NAME, conf->debug)) { mu_config_uninit (conf); return 1; } rv = mu_cmd_execute (conf, &err); cleanup: handle_error (conf, rv, &err); g_clear_error (&err); mu_config_uninit (conf); mu_runtime_uninit (); return rv; }