summaryrefslogtreecommitdiff
path: root/src/main.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.cc')
-rw-r--r--src/main.cc204
1 files changed, 92 insertions, 112 deletions
diff --git a/src/main.cc b/src/main.cc
index e7007243..47b305d4 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -440,7 +440,9 @@ namespace
{
// ForTranslators: both the translated and the untranslated
// log level names are accepted here.
- _error->Error(_("Unknown log level name \"%s\" (expected \"trace\", \"debug\", \"info\", \"warn\", \"error\", \"fatal\", or \"off\")."),
+ _error->Error(_("Unknown log level name \"%s\" (expected \"trace\","
+ " \"debug\", \"info\", \"warn\", \"error\","
+ " \"fatal\", or \"off\")."),
level_name.c_str());
return;
}
@@ -449,7 +451,7 @@ namespace
if(!targetLogger)
{
- _error->Error(_("Invalid logger name \"%s\"."),
+ _error->Error(_("Invalid logger name \"%s\""),
logger_name.c_str());
return;
}
@@ -511,27 +513,6 @@ namespace
}
}
-// Ensure that the cache is always closed when main() exits. Without
-// this, there might be dangling flyweights hanging around, and those
-// can trigger aborts when the static flyweight pool is destroyed.
-//
-// TBH, I think it might be worth writing our own flyweight stand-in
-// to avoid this particular bit of stupid. On the other hand, it
-// might be better to fully shut down the cache all the time, to
-// better detect leaks and so on? I'm undecided -- and it shouldn't
-// take too long to clear out the cache.
-struct close_cache_on_exit
-{
- close_cache_on_exit()
- {
- }
-
- ~close_cache_on_exit()
- {
- apt_shutdown();
- }
-};
-
void do_message_logged(std::ostream &out,
const char *sourceFilename,
int sourceLineNumber,
@@ -628,7 +609,16 @@ int main(int argc, const char *argv[])
const char * const rootdir = getenv("APT_ROOT_DIR");
apt_preinit(rootdir);
- close_cache_on_exit close_on_exit;
+ // Ensure that the cache is always closed when main() exits. Without
+ // this, there might be dangling flyweights hanging around, and those
+ // can trigger aborts when the static flyweight pool is destroyed.
+ //
+ // TBH, I think it might be worth writing our own flyweight stand-in
+ // to avoid this particular bit of stupid. On the other hand, it
+ // might be better to fully shut down the cache all the time, to
+ // better detect leaks and so on? I'm undecided -- and it shouldn't
+ // take too long to clear out the cache.
+ atexit(&apt_shutdown);
// NOTE: this can of course be spoofed. Anyone bothering to is off their
// rocker.
@@ -664,7 +654,7 @@ int main(int argc, const char *argv[])
if(cmdl.Parse(argc, argv) == false)
{
_error->DumpErrors();
- return 1;
+ return 100;
}
if(aptcfg->FindB("help", false) == true)
@@ -755,10 +745,10 @@ int main(int argc, const char *argv[])
if(read_user_tag_applications(user_tags) == false)
{
_error->DumpErrors();
- return 1;
+ return 100;
}
- group_by_option group_by_mode;
+ group_by_option group_by_mode = group_by_auto;
try
{
group_by_mode = parse_group_by_option(group_by_mode_string);
@@ -766,10 +756,9 @@ int main(int argc, const char *argv[])
catch(std::exception &ex)
{
_error->Error("%s", ex.what());
- group_by_mode = group_by_auto;
}
- show_package_names_option show_package_names_mode;
+ show_package_names_option show_package_names_mode = show_package_names_auto;
if(show_package_names_mode_string == "never" ||
show_package_names_mode_string == P_("--show-package-names|never"))
show_package_names_mode = show_package_names_never;
@@ -780,14 +769,11 @@ int main(int argc, const char *argv[])
show_package_names_mode_string == P_("--show-package-names|always"))
show_package_names_mode = show_package_names_always;
else
- {
- _error->Error("%s",
- (boost::format(_("Invalid package names display mode \"%s\" (should be \"never\", \"auto\", or \"always\")."))
- % show_package_names_mode_string).str().c_str());
- show_package_names_mode = show_package_names_auto;
- }
+ _error->Error(_("Invalid package names display mode \"%s\" (should be"
+ " \"never\", \"auto\", or \"always\")."),
+ show_package_names_mode_string.c_str());
- aptitude::why::roots_string_mode why_display_mode;
+ aptitude::why::roots_string_mode why_display_mode = aptitude::why::no_summary;
if(show_why_summary_mode == "no-summary" || show_why_summary_mode == _("no-summary"))
why_display_mode = aptitude::why::no_summary;
else if(show_why_summary_mode == "first-package" || show_why_summary_mode == _("first-package"))
@@ -799,13 +785,13 @@ int main(int argc, const char *argv[])
else if(show_why_summary_mode == "all-packages-with-dep-versions" || show_why_summary_mode == _("all-packages-with-dep-versions"))
why_display_mode = aptitude::why::show_chain_with_versions;
else
- {
- // ForTranslators: "why" here is the aptitude command name and
- // should not be translated.
- _error->Error(_("Invalid \"why\" summary mode \"%s\": expected \"no-summary\", \"first-package\", \"first-package-and-type\", \"all-packages\", or \"all-packages-with-dep-versions\"."),
- show_why_summary_mode.c_str());
- why_display_mode = aptitude::why::no_summary;
- }
+ // ForTranslators: "why" here is the aptitude command name and
+ // should not be translated.
+ _error->Error(_("Invalid \"why\" summary mode \"%s\": expected"
+ " \"no-summary\", \"first-package\","
+ " \"first-package-and-type\", \"all-packages\","
+ " or \"all-packages-with-dep-versions\"."),
+ show_why_summary_mode.c_str());
apply_config_file_logging_levels(aptcfg);
@@ -840,28 +826,21 @@ int main(int argc, const char *argv[])
++num_startup_actions;
if(num_startup_actions > 1)
- {
- fprintf(stderr, "%s",
- _("Only one of --auto-clean-on-startup, --clean-on-startup, -i, and -u may be specified\n"));
- usage();
- exit(1);
- }
+ _error->Error(_("Only one of --auto-clean-on-startup,"
+ " --clean-on-startup, -i, and -u may be specified"));
}
if((update_only || install_only || autoclean_only || clean_only)
&& cmdline_mode == true)
- {
- fprintf(stderr, "%s\n",
- _("-u, -i, and --clean-on-startup may not be specified in command-line mode (eg, with 'install')"));
- usage();
- exit(1);
- }
+ _error->Error(_("-u, -i, --clean-on-startup, and --autoclean-on-startup"
+ " may not be specified in command-line mode (eg, with"
+ " 'install')"));
// Abort now if there were any errors.
if(_error->PendingError() == true)
{
_error->DumpErrors();
- return 1;
+ return 100;
}
_error->MergeWithStack();
@@ -869,44 +848,41 @@ int main(int argc, const char *argv[])
// Possibly run off and do other commands.
if(cmdline_mode == true)
{
+ using namespace aptitude::cmdline;
+
try
{
// Connect up the "please consume errors" routine for the
// command-line.
- consume_errors.connect(sigc::mem_fun(_error, (void (GlobalError::*)()) &GlobalError::DumpErrors));
-
- if(update_only || install_only || autoclean_only || clean_only)
- {
- fprintf(stderr, "%s\n",
- _("-u, -i, and --clean-on-startup may not be specified with a command"));
- usage();
- exit(1);
- }
+ consume_errors.connect(
+ sigc::mem_fun(_error,
+ (void (GlobalError::*)()) &GlobalError::PushToStack));
int filec = cmdl.FileSize();
char **filev = const_cast<char **>(cmdl.FileList);
+ int rval = 0;
// TODO: warn the user if they passed --full-resolver to
// something other than "upgrade" or do_action.
if(!strcasecmp(filev[0], "update"))
- return cmdline_update(filec, filev, verbose);
+ rval = cmdline_update(filec, filev, verbose);
else if(!strcasecmp(filev[0], "clean"))
- return cmdline_clean(filec, filev, simulate);
+ rval = cmdline_clean(filec, filev, simulate);
else if(!strcasecmp(filev[0], "autoclean"))
- return cmdline_autoclean(filec, filev, simulate);
+ rval = cmdline_autoclean(filec, filev, simulate);
else if(!strcasecmp(filev[0], "forget-new"))
- return cmdline_forget_new(filec, filev,
+ rval = cmdline_forget_new(filec, filev,
status_fname, simulate);
else if(!strcasecmp(filev[0], "search"))
- return cmdline_search(filec, filev,
+ rval = cmdline_search(filec, filev,
status_fname,
package_display_format, width,
sort_policy,
disable_columns,
debug_search);
else if(!strcasecmp(filev[0], "versions"))
- return cmdline_versions(filec, filev,
+ rval = cmdline_versions(filec, filev,
status_fname,
version_display_format, width,
sort_policy,
@@ -915,11 +891,11 @@ int main(int argc, const char *argv[])
group_by_mode,
show_package_names_mode);
else if(!strcasecmp(filev[0], "why"))
- return cmdline_why(filec, filev,
+ rval = cmdline_why(filec, filev,
status_fname, verbose,
why_display_mode, false);
else if(!strcasecmp(filev[0], "why-not"))
- return cmdline_why(filec, filev,
+ rval = cmdline_why(filec, filev,
status_fname, verbose,
why_display_mode, true);
else if( (!strcasecmp(filev[0], "install")) ||
@@ -939,71 +915,75 @@ int main(int argc, const char *argv[])
(!strcasecmp(filev[0], "keep-all")) ||
(!strcasecmp(filev[0], "build-dep")) ||
(!strcasecmp(filev[0], "build-depends")))
- {
- return cmdline_do_action(filec, filev,
- status_fname,
- simulate, assume_yes, download_only,
- fix_broken, showvers, showdeps,
- showsize, showwhy,
- visual_preview, always_prompt,
- resolver_mode, safe_resolver_show_resolver_actions,
- safe_resolver_no_new_installs, safe_resolver_no_new_upgrades,
- user_tags,
- arch_only, queue_only, verbose);
- }
+ rval = cmdline_do_action(filec, filev,
+ status_fname,
+ simulate, assume_yes, download_only,
+ fix_broken, showvers, showdeps,
+ showsize, showwhy,
+ visual_preview, always_prompt,
+ resolver_mode, safe_resolver_show_resolver_actions,
+ safe_resolver_no_new_installs, safe_resolver_no_new_upgrades,
+ user_tags,
+ arch_only, queue_only, verbose);
else if(!strcasecmp(filev[0], "add-user-tag") ||
!strcasecmp(filev[0], "remove-user-tag"))
- return aptitude::cmdline::cmdline_user_tag(filec, filev,
- quiet, verbose);
+ rval = cmdline_user_tag(filec, filev,
+ quiet, verbose);
else if(!strcasecmp(filev[0], "extract-cache-subset"))
- return aptitude::cmdline::extract_cache_subset(filec,
- filev);
+ rval = extract_cache_subset(filec, filev);
else if(!strcasecmp(filev[0], "download"))
- return cmdline_download(filec, filev);
+ rval = cmdline_download(filec, filev);
else if(!strcasecmp(filev[0], "changelog"))
- return cmdline_changelog(filec, filev);
+ rval = cmdline_changelog(filec, filev);
else if(!strcasecmp(filev[0], "moo"))
- return cmdline_moo(filec, filev, verbose);
+ rval = cmdline_moo(filec, filev, verbose);
else if(!strcasecmp(filev[0], "show"))
- return cmdline_show(filec, filev, verbose);
+ rval = cmdline_show(filec, filev, verbose);
else if(!strcasecmp(filev[0], "dump-resolver"))
- return cmdline_dump_resolver(filec, filev, status_fname);
+ rval = cmdline_dump_resolver(filec, filev, status_fname);
else if(!strcasecmp(filev[0], "check-resolver"))
- return cmdline_check_resolver(filec, filev, status_fname);
+ rval = cmdline_check_resolver(filec, filev, status_fname);
else if(!strcasecmp(filev[0], "help"))
- {
- usage();
- exit(0);
- }
+ usage();
// Debugging/profiling commands:
else if(!strcasecmp(filev[0], "nop"))
{
OpTextProgress p(aptcfg->FindI("Quiet", 0));
- _error->DumpErrors();
apt_init(&p, true);
- exit(0);
}
else if(!strcasecmp(filev[0], "nop-noselections"))
{
OpTextProgress p(aptcfg->FindI("Quiet", 0));
- _error->DumpErrors();
apt_init(&p, false);
- exit(0);
}
else if(!strcasecmp(filev[0], "dump-config"))
{
OpTextProgress p(aptcfg->FindI("Quiet", 0));
apt_init(&p, false);
_config->Dump(std::cout);
- _error->DumpErrors();
- exit(0);
}
else
{
- fprintf(stderr, _("Unknown command \"%s\"\n"), filev[0]);
- usage();
- exit(1);
+ _error->Error(_("Unknown command \"%s\""), filev[0]);
+ rval = 100;
}
+
+ while(_error->StackCount() > 0)
+ _error->MergeWithStack();
+
+ if(_error->PendingError() == true && rval == 0)
+ rval = 100;
+
+ // Do not dump errors if user aborted.
+ if(rval == 1)
+ return rval;
+
+ if(aptcfg->FindI("quiet", 0) > 0)
+ _error->DumpErrors();
+ else
+ _error->DumpErrors(GlobalError::DEBUG);
+
+ return rval;
}
catch(StdinEOFException)
{
@@ -1017,7 +997,7 @@ int main(int argc, const char *argv[])
std::string backtrace = e.get_backtrace();
if(!backtrace.empty())
fprintf(stderr, _("Backtrace:\n%s\n"), backtrace.c_str());
- return -1;
+ return 100;
}
}
@@ -1103,11 +1083,11 @@ int main(int argc, const char *argv[])
if(!backtrace.empty())
fprintf(stderr, _("Backtrace:\n%s\n"), backtrace.c_str());
- return -1;
+ return 100;
}
- // The cache is closed when the close_on_exit object declared
- // above is destroyed.
+ // The cache is closed by apt_shutdown, which was registered
+ // earlier with atexit(3).
return 0;
}