TEST(argument_parsing, it_is_an_error_to_specify_log_twice)
{
  const parse_config_result r = parse_config({"--log", "-", "--log", "-"});

  ASSERT_FALSE(r.should_run_shell());
  ASSERT_TRUE(r.should_error_at_exit());
}
Beispiel #2
0
int main(int argc_, const char* argv_[])
{
  const std::string env_filename = "metashell_environment.hpp";

  try
  {
    using metashell::parse_config;
    using metashell::parse_config_result;

    const std::map<std::string, metashell::engine_entry> engines{
        {"internal", metashell::get_internal_templight_entry()},
        {"clang", metashell::get_engine_clang_entry()},
        {"null", metashell::get_engine_null_entry()},
        {"gcc", metashell::get_engine_gcc_entry()}};

    metashell::default_environment_detector det(argv_[0]);

    const parse_config_result r =
        parse_config(argc_, argv_, engines, det, &std::cout, &std::cerr);

    metashell::console_config ccfg(
        r.cfg.con_type, r.cfg.indent, r.cfg.syntax_highlight);

    metashell::fstream_file_writer file_writer;
    metashell::logger logger(ccfg.displayer(), file_writer);
    switch (r.cfg.log_mode)
    {
    case metashell::data::logging_mode::none:
      // do nothing
      break;
    case metashell::data::logging_mode::console:
      logger.log_to_console();
      break;
    case metashell::data::logging_mode::file:
      logger.log_into_file(r.cfg.log_file);
      break;
    }

    METASHELL_LOG(&logger, "Start logging");

    const auto eentry = engines.find(r.cfg.engine);
    if (eentry == engines.end())
    {
      throw std::runtime_error(
          "Engine " + r.cfg.engine + " not found. Available engines: " +
          boost::algorithm::join(engines | boost::adaptors::map_keys, ", "));
    }
    else
    {
      if (r.should_run_shell())
      {
        using boost::filesystem::path;

        METASHELL_LOG(&logger, "Running shell");

        just::temp::directory dir;

        const path shell_dir = path(dir.path()) / "shell";
        const path temp_dir = path(dir.path()) / "tmp";
        const path mdb_dir = path(dir.path()) / "mdb";

        create_directories(shell_dir);
        create_directories(temp_dir);
        create_directories(mdb_dir);

        auto shell = metashell::make_unique<metashell::shell>(
            r.cfg, ccfg.processor_queue(), shell_dir, env_filename, mdb_dir,
            eentry->second.build(r.cfg, shell_dir, temp_dir, env_filename, det,
                                 ccfg.displayer(), &logger),
            &logger);

        if (r.cfg.splash_enabled)
        {
          shell->display_splash(ccfg.displayer(), get_dependency_versions());
        }

        ccfg.processor_queue().push(move(shell));

        METASHELL_LOG(&logger, "Starting input loop");

        metashell::input_loop(
            ccfg.processor_queue(), ccfg.displayer(), ccfg.reader());

        METASHELL_LOG(&logger, "Input loop finished");
      }
      else
      {
        METASHELL_LOG(&logger, "Not running shell");
      }
      return r.should_error_at_exit() ? 1 : 0;
    }
  }
  catch (std::exception& e_)
  {
    std::cerr << "Error: " << e_.what() << std::endl;
    return 1;
  }
}