]> git.saurik.com Git - apt.git/commitdiff
streamline display of --help in all tools
authorDavid Kalnischkies <david@kalnischkies.de>
Sat, 8 Nov 2014 17:14:46 +0000 (18:14 +0100)
committerDavid Kalnischkies <david@kalnischkies.de>
Sun, 9 Nov 2014 00:26:07 +0000 (01:26 +0100)
By convention, if I run a tool with --help or --version I expect it to
exit successfully with the usage, while if I do call it wrong (like
without any parameters) I expect the usage message shown with a non-zero
exit.

21 files changed:
apt-pkg/contrib/cmndline.cc
apt-pkg/contrib/cmndline.h
apt-private/private-cmndline.cc
apt-private/private-cmndline.h
cmdline/apt-cache.cc
cmdline/apt-cdrom.cc
cmdline/apt-config.cc
cmdline/apt-extracttemplates.cc
cmdline/apt-get.cc
cmdline/apt-helper.cc
cmdline/apt-internal-solver.cc
cmdline/apt-mark.cc
cmdline/apt-sortpkgs.cc
cmdline/apt.cc
cmdline/makefile
debian/tests/run-tests
ftparchive/apt-ftparchive.cc
ftparchive/makefile
prepare-release
test/integration/framework
test/integration/test-00-commands-have-help [new file with mode: 0755]

index 93c1f46647d47f7b0e42769e95ca98dcfe2b4f50..ff8b09ebc0b6c6f7eb36ced66c3c6024c64c896a 100644 (file)
@@ -33,6 +33,9 @@ using namespace std;
 CommandLine::CommandLine(Args *AList,Configuration *Conf) : ArgList(AList), 
                                  Conf(Conf), FileList(0)
 {
+}
+CommandLine::CommandLine() : ArgList(NULL), Conf(NULL), FileList(0)
+{
 }
                                                                        /*}}}*/
 // CommandLine::~CommandLine - Destructor                              /*{{{*/
index 143df58b23d1ebdc331631c3f9eb8913e213edb9..58cbaa8c38c4bca9e437aeb8fc712d2d61e7a207 100644 (file)
@@ -91,6 +91,7 @@ class CommandLine
    static CommandLine::Args MakeArgs(char ShortOpt, char const *LongOpt,
         char const *ConfName, unsigned long Flags) APT_CONST;
 
+   CommandLine();
    CommandLine(Args *AList,Configuration *Conf);
    ~CommandLine();
 };
index aa01be757c0f1305148a88f81f5253e4c9552985..bb9a00803ea7930ab601a83ff242579b45e8ebd5 100644 (file)
@@ -2,12 +2,17 @@
 #include <config.h>
 
 #include <apt-pkg/cmndline.h>
+#include <apt-pkg/configuration.h>
+#include <apt-pkg/pkgsystem.h>
+#include <apt-pkg/init.h>
+#include <apt-pkg/error.h>
 
 #include <apt-private/private-cmndline.h>
 
 #include <vector>
 #include <stdarg.h>
 #include <string.h>
+#include <stdlib.h>
 
 #include <apti18n.h>
                                                                        /*}}}*/
@@ -287,3 +292,31 @@ std::vector<CommandLine::Args> getCommandArgs(char const * const Program, char c
                                                                        /*}}}*/
 #undef CmdMatches
 #undef addArg
+void ParseCommandLine(CommandLine &CmdL, CommandLine::Dispatch * const Cmds, CommandLine::Args * const Args,/*{{{*/
+      Configuration * const * const Cnf, pkgSystem ** const Sys, int const argc, const char *argv[], bool(*ShowHelp)(CommandLine &CmdL))
+{
+   CmdL = CommandLine(Args,_config);
+   if ((Cnf != NULL && pkgInitConfig(**Cnf) == false) ||
+       CmdL.Parse(argc,argv) == false ||
+       (Sys != NULL && pkgInitSystem(*_config, *Sys) == false))
+   {
+      if (_config->FindB("version") == true)
+        ShowHelp(CmdL);
+
+      _error->DumpErrors();
+      exit(100);
+   }
+
+   // See if the help should be shown
+   if (_config->FindB("help") == true || _config->FindB("version") == true)
+   {
+      ShowHelp(CmdL);
+      exit(0);
+   }
+   if (Cmds != NULL && CmdL.FileSize() == 0)
+   {
+      ShowHelp(CmdL);
+      exit(1);
+   }
+}
+                                                                       /*}}}*/
index d0af16782f697c754f9ff22daf40184160a58a5f..7b468456b857123bb8e91f0d49f43526fca656c3 100644 (file)
@@ -6,6 +6,12 @@
 
 #include <vector>
 
+class Configuration;
+class pkgSystem;
+
 APT_PUBLIC std::vector<CommandLine::Args> getCommandArgs(char const * const Program, char const * const Cmd);
+APT_PUBLIC void ParseCommandLine(CommandLine &CmdL, CommandLine::Dispatch * const Cmds, CommandLine::Args * const Args,
+      Configuration * const * const Cnf, pkgSystem ** const Sys, int const argc, const char * argv[],
+      bool(*ShowHelp)(CommandLine &CmdL));
 
 #endif
index 9bac45029787e92bd853bd38e34d5f9ec1d82f2a..12ed4f719b2f159e2127e6b3bd1ff56c90ee5924 100644 (file)
@@ -1896,23 +1896,9 @@ int main(int argc,const char *argv[])                                    /*{{{*/
    textdomain(PACKAGE);
 
    // Parse the command line and initialize the package library
-   CommandLine CmdL(Args.data(),_config);
-   if (pkgInitConfig(*_config) == false ||
-       CmdL.Parse(argc,argv) == false ||
-       pkgInitSystem(*_config,_system) == false)
-   {
-      _error->DumpErrors();
-      return 100;
-   }
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp);
 
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       CmdL.FileSize() == 0)
-   {
-      ShowHelp(CmdL);
-      return 0;
-   }
-   
    // Deal with stdout not being a tty
    if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
       _config->Set("quiet","1");
index 53efe65b89afcfeac2d5abbab55c291aaf261b67..8ac73fd7ed4869ad48faaf36f7629e6d933f6c8b 100644 (file)
@@ -249,19 +249,8 @@ int main(int argc,const char *argv[])                                      /*{{{*/
    textdomain(PACKAGE);
 
    // Parse the command line and initialize the package library
-   CommandLine CmdL(Args.data(),_config);
-   if (pkgInitConfig(*_config) == false ||
-       CmdL.Parse(argc,argv) == false ||
-       pkgInitSystem(*_config,_system) == false)
-   {
-      _error->DumpErrors();
-      return 100;
-   }
-
-   // See if the help should be shown
-   if (_config->FindB("help") == true || _config->FindB("version") == true ||
-       CmdL.FileSize() == 0)
-      return ShowHelp(CmdL);
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp);
 
    // Deal with stdout not being a tty
    if (isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
index 40ba468eb3eb5e7ee03d721f59b7064db4bc0494..e0b8a624eeb7efdea1c598f58a8bc398bffe5bbe 100644 (file)
@@ -115,19 +115,8 @@ int main(int argc,const char *argv[])                                      /*{{{*/
    textdomain(PACKAGE);
 
    // Parse the command line and initialize the package library
-   CommandLine CmdL(Args.data(),_config);
-   if (pkgInitConfig(*_config) == false ||
-       CmdL.Parse(argc,argv) == false ||
-       pkgInitSystem(*_config,_system) == false)
-   {
-      _error->DumpErrors();
-      return 100;
-   }
-
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       CmdL.FileSize() == 0)
-      return ShowHelp(CmdL);
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp);
 
    std::vector<std::string> const langs = APT::Configuration::getLanguages(true);
    _config->Clear("Acquire::Languages");
index f95b9e5ba2eff3ec8943127a60f317541cec89d1..5211ee027e9af25d4374fd3d1939e2d9b6f18383 100644 (file)
@@ -33,6 +33,8 @@
 #include <apt-pkg/dirstream.h>
 #include <apt-pkg/mmap.h>
 
+#include <apt-private/private-cmndline.h>
+
 #include <iostream>
 #include <stdio.h>
 #include <string.h>
@@ -215,15 +217,15 @@ bool DebFile::ParseInfo()
 // ShowHelp - show a short help text                                   /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-static int ShowHelp(void)
+static bool ShowHelp(CommandLine &)
 {
-       ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
+       ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
            COMMON_ARCH,__DATE__,__TIME__);
 
-       if (_config->FindB("version") == true) 
-               return 0;
+       if (_config->FindB("version") == true)
+               return true;
 
-       cout << 
+       cout <<
                _("Usage: apt-extracttemplates file1 [file2 ...]\n"
                "\n"
                "apt-extracttemplates is a tool to extract config and template info\n"
@@ -234,7 +236,7 @@ static int ShowHelp(void)
                "  -t   Set the temp dir\n"
                "  -c=? Read this configuration file\n"
                "  -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n");
-       return 0;
+       return true;
 }
                                                                        /*}}}*/
 // WriteFile - write the contents of the passed string to a file       /*{{{*/
@@ -356,20 +358,10 @@ int main(int argc, const char **argv)                                     /*{{{*/
        textdomain(PACKAGE);
 
        // Parse the command line and initialize the package library
-       CommandLine CmdL(Args,_config);
-       if (pkgInitConfig(*_config) == false ||
-           CmdL.Parse(argc,argv) == false ||
-           pkgInitSystem(*_config,_system) == false)
-       {
-               _error->DumpErrors();
-               return 100;
-       }
-       
-       // See if the help should be shown
-       if (_config->FindB("help") == true ||
-           CmdL.FileSize() == 0)
-               return ShowHelp();
-       
+       CommandLine::Dispatch Cmds[] = {{NULL, NULL}};
+       CommandLine CmdL;
+       ParseCommandLine(CmdL, Cmds, Args, &_config, &_system, argc, argv, ShowHelp);
+
        Go(CmdL);
 
        // Print any errors or warnings found during operation
index eca4a723b28f35e3d806a4ef0677c58a3c03a5fc..a9053bdfdea978cf61ef59cbdcc3d4f9efb769ee 100644 (file)
@@ -1746,26 +1746,8 @@ int main(int argc,const char *argv[])                                    /*{{{*/
    textdomain(PACKAGE);
 
    // Parse the command line and initialize the package library
-   CommandLine CmdL(Args.data(),_config);
-   if (pkgInitConfig(*_config) == false ||
-       CmdL.Parse(argc,argv) == false ||
-       pkgInitSystem(*_config,_system) == false)
-   {
-      if (_config->FindB("version") == true)
-        ShowHelp(CmdL);
-        
-      _error->DumpErrors();
-      return 100;
-   }
-
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       _config->FindB("version") == true ||
-       CmdL.FileSize() == 0)
-   {
-      ShowHelp(CmdL);
-      return 0;
-   }
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp);
 
    // see if we are in simulate mode
    CheckSimulateMode(CmdL);
index 27abb2013bdd122b4c91b0681917960e201560a5..1b832f1654ad9bde9a6c7e0252d12b4521aaff69 100644 (file)
@@ -108,25 +108,8 @@ int main(int argc,const char *argv[])                                      /*{{{*/
    textdomain(PACKAGE);
 
    // Parse the command line and initialize the package library
-   CommandLine CmdL(Args.data(),_config);
-   if (pkgInitConfig(*_config) == false ||
-       CmdL.Parse(argc,argv) == false ||
-       pkgInitSystem(*_config,_system) == false)
-   {
-      if (_config->FindB("version") == true)
-        ShowHelp(CmdL);
-      _error->DumpErrors();
-      return 100;
-   }
-
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       _config->FindB("version") == true ||
-       CmdL.FileSize() == 0)
-   {
-      ShowHelp(CmdL);
-      return 0;
-   }
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp);
 
    InitOutput();
 
index 92a4429e5789a408a7b4c8350b11300c3c18327e..4fabeb02fc683f5a3d70d1c477dc8b3f5f041c91 100644 (file)
@@ -24,7 +24,9 @@
 #include <apt-pkg/depcache.h>
 #include <apt-pkg/pkgcache.h>
 #include <apt-pkg/cacheiterators.h>
+
 #include <apt-private/private-output.h>
+#include <apt-private/private-cmndline.h>
 
 #include <string.h>
 #include <iostream>
@@ -79,19 +81,8 @@ int main(int argc,const char *argv[])                                        /*{{{*/
         // we really don't need anything
         DropPrivileges();
 
-       CommandLine CmdL(Args,_config);
-       if (pkgInitConfig(*_config) == false ||
-           CmdL.Parse(argc,argv) == false) {
-               _error->DumpErrors();
-               return 2;
-       }
-
-       // See if the help should be shown
-       if (_config->FindB("help") == true ||
-           _config->FindB("version") == true) {
-               ShowHelp(CmdL);
-               return 1;
-       }
+       CommandLine CmdL;
+       ParseCommandLine(CmdL, NULL, Args, &_config, NULL, argc, argv, ShowHelp);
 
        if (CmdL.FileList[0] != 0 && strcmp(CmdL.FileList[0], "scenario") == 0)
        {
index ed348358aad0b6a3d870bc6ac73025ac76595a29..487f3d8a1e26f3efaa5af36469d76ee52d1430db 100644 (file)
@@ -441,26 +441,8 @@ int main(int argc,const char *argv[])                                      /*{{{*/
    setlocale(LC_ALL,"");
    textdomain(PACKAGE);
 
-   // Parse the command line and initialize the package library
-   CommandLine CmdL(Args.data(),_config);
-   if (pkgInitConfig(*_config) == false ||
-       CmdL.Parse(argc,argv) == false ||
-       pkgInitSystem(*_config,_system) == false)
-   {
-      if (_config->FindB("version") == true)
-        ShowHelp(CmdL);
-      _error->DumpErrors();
-      return 100;
-   }
-
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       _config->FindB("version") == true ||
-       CmdL.FileSize() == 0)
-   {
-      ShowHelp(CmdL);
-      return 0;
-   }
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args.data(), &_config, &_system, argc, argv, ShowHelp);
 
    // Deal with stdout not being a tty
    if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
index c2b11890a1453a0a186e37a3d56036cf438f3118..9b66ad4db1e6da4c1660d00388722b1ace0ac97f 100644 (file)
@@ -23,6 +23,8 @@
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/pkgsystem.h>
 
+#include <apt-private/private-cmndline.h>
+
 #include <vector>
 #include <algorithm>
 #include <stdio.h>
@@ -142,12 +144,12 @@ static bool DoIt(string InFile)
 // ShowHelp - Show the help text                                       /*{{{*/
 // ---------------------------------------------------------------------
 /* */
-static int ShowHelp()
+static bool ShowHelp(CommandLine &)
 {
    ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
            COMMON_ARCH,__DATE__,__TIME__);
    if (_config->FindB("version") == true)
-      return 0;
+      return true;
    
    cout <<
     _("Usage: apt-sortpkgs [options] file1 [file2 ...]\n"
@@ -161,7 +163,7 @@ static int ShowHelp()
       "  -c=? Read this configuration file\n"
       "  -o=? Set an arbitrary configuration option, eg -o dir::cache=/tmp\n");
 
-   return 0;
+   return true;
 }
                                                                        /*}}}*/
 int main(int argc,const char *argv[])                                  /*{{{*/
@@ -179,19 +181,9 @@ int main(int argc,const char *argv[])                                      /*{{{*/
    textdomain(PACKAGE);
 
    // Parse the command line and initialize the package library
-   CommandLine CmdL(Args,_config);
-   if (pkgInitConfig(*_config) == false ||
-       CmdL.Parse(argc,argv) == false ||
-       pkgInitSystem(*_config,_system) == false)
-   {
-      _error->DumpErrors();
-      return 100;
-   }
-
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       CmdL.FileSize() == 0)
-      return ShowHelp();
+   CommandLine::Dispatch Cmds[] = {{NULL, NULL}};
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args, &_config, &_system, argc, argv, ShowHelp);
 
    // Match the operation
    for (unsigned int I = 0; I != CmdL.FileSize(); I++)
index 2cfdf8e8e4e046da431f911bc14fb1ee3567cddf..056cd213f44800e07f72b6254325f02772f8fd4d 100644 (file)
@@ -119,15 +119,10 @@ int main(int argc, const char *argv[])                                    /*{{{*/
    _config->CndSet("APT::Cmd::Show-Update-Stats", true);
 
    // Parse the command line and initialize the package library
-   CommandLine CmdL(Args.data(), _config);
-   if (CmdL.Parse(argc, argv) == false ||
-       pkgInitSystem(*_config, _system) == false)
-   {
-      _error->DumpErrors();
-      return 100;
-   }
+   CommandLine CmdL;
+   ParseCommandLine(CmdL, Cmds, Args.data(), NULL, &_system, argc, argv, ShowHelp);
 
-   if(!isatty(STDOUT_FILENO) && 
+   if(!isatty(STDOUT_FILENO) &&
       _config->FindB("Apt::Cmd::Disable-Script-Warning", false) == false)
    {
       std::cerr << std::endl
@@ -138,15 +133,6 @@ int main(int argc, const char *argv[])                                     /*{{{*/
                 << std::endl;
    }
 
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       _config->FindB("version") == true ||
-       CmdL.FileSize() == 0)
-   {
-      ShowHelp(CmdL);
-      return 0;
-   }
-
    // see if we are in simulate mode
    CheckSimulateMode(CmdL);
 
index b7c35ddd1c04086c1fc5669a4dc741dd9b6a3a1c..816038c3b381045148fff4c0c814568a7768a0c0 100644 (file)
@@ -67,15 +67,15 @@ APT_DOMAIN:=apt-utils
 
 # The apt-sortpkgs program
 PROGRAM=apt-sortpkgs
-SLIBS = -lapt-pkg $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile
+SLIBS = -lapt-pkg -lapt-private $(INTLLIBS)
+LIB_MAKES = apt-pkg/makefile apt-private/makefile
 SOURCE = apt-sortpkgs.cc
 include $(PROGRAM_H)
 
 # The apt-extracttemplates program
 PROGRAM=apt-extracttemplates
-SLIBS = -lapt-pkg -lapt-inst $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile apt-inst/makefile
+SLIBS = -lapt-pkg -lapt-inst -lapt-private $(INTLLIBS)
+LIB_MAKES = apt-pkg/makefile apt-inst/makefile apt-private/makefile
 SOURCE = apt-extracttemplates.cc 
 include $(PROGRAM_H)
 
index 9d7c484fce66f68673c8166144bd0ef33d20498e..7cc37f618f5776a022b82d4b8acb22928b9320f8 100644 (file)
@@ -15,6 +15,7 @@ APT_INTEGRATION_TESTS_WEBSERVER_BIN_DIR=$(pwd)/build/bin \
 APT_INTEGRATION_TESTS_METHODS_DIR=/usr/lib/apt/methods \
 APT_INTEGRATION_TESTS_LIBEXEC_DIR=/usr/lib/apt/ \
 APT_INTEGRATION_TESTS_INTERNAL_SOLVER=/usr/lib/apt/solvers/apt \
+APT_INTEGRATION_TESTS_DUMP_SOLVER=/usr/lib/apt/solvers/dump \
 APT_INTEGRATION_TESTS_BUILD_DIR=/usr/bin \
 APT_INTEGRATION_TESTS_LIBRARY_PATH=/dev/null/does/not/exist \
 ./test/integration/run-tests
index ebf99a8f8541a031a4b1399fda4f3ca20503b17a..7d9af41789d9f58bedad19b29bb0f5fabbc84a27 100644 (file)
@@ -19,6 +19,8 @@
 #include <apt-pkg/init.h>
 #include <apt-pkg/fileutl.h>
 
+#include <apt-private/private-cmndline.h>
+
 #include <algorithm>
 #include <climits>
 #include <sys/time.h>
@@ -1060,21 +1062,8 @@ int main(int argc, const char *argv[])
 
    // Parse the command line and initialize the package library
    CommandLine CmdL(Args,_config);
-   if (pkgInitConfig(*_config) == false || CmdL.Parse(argc,argv) == false)
-   {
-      _error->DumpErrors();
-      return 100;
-   }
-   
-   // See if the help should be shown
-   if (_config->FindB("help") == true ||
-       _config->FindB("version") == true ||
-       CmdL.FileSize() == 0)
-   {
-      ShowHelp(CmdL);
-      return 0;
-   }
-   
+   ParseCommandLine(CmdL, Cmds, Args, &_config, NULL, argc, argv, ShowHelp);
+
    // Setup the output streams
    c0out.rdbuf(clog.rdbuf());
    c1out.rdbuf(clog.rdbuf());
index d1ffe182a2c4ebe7c74fe2a0db00a46dac5b8ce0..e67272e1e8f016d2d0e9543fbe610f4c6d62fe8a 100644 (file)
@@ -9,8 +9,8 @@ include ../buildlib/defaults.mak
 ifdef BDBLIB
 APT_DOMAIN:=apt-utils
 PROGRAM=apt-ftparchive
-SLIBS = -lapt-pkg -lapt-inst $(BDBLIB) $(INTLLIBS)
-LIB_MAKES = apt-pkg/makefile apt-inst/makefile
+SLIBS = -lapt-pkg -lapt-inst -lapt-private $(BDBLIB) $(INTLLIBS)
+LIB_MAKES = apt-pkg/makefile apt-inst/makefile apt-private/makefile
 SOURCE = apt-ftparchive.cc cachedb.cc writer.cc contents.cc override.cc \
          multicompress.cc sources.cc
 include $(PROGRAM_H)
index e61266eef82f190a35cfaaf52286f0ef4ede74b9..67f4638d60327e7bd5af3d89ad71d53eb0ff14fe 100755 (executable)
@@ -130,8 +130,8 @@ elif [ "$1" = 'coverage' ]; then
        LCOVRC='--rc geninfo_checksum=1 --rc lcov_branch_coverage=1'
        mkdir "$DIR"
        lcov --no-external --directory . --capture --initial --output-file "${DIR}/apt.coverage.init" ${LCOVRC}
-       make test
-       ./test/integration/run-tests -q
+       make test || true
+       ./test/integration/run-tests -q || true
        lcov --no-external --directory . --capture --output-file "${DIR}/apt.coverage.run" ${LCOVRC}
        lcov -a "${DIR}/apt.coverage.init" -a "${DIR}/apt.coverage.run"  -o "${DIR}/apt.coverage.total" ${LCOVRC}
        cp "${DIR}/apt.coverage.total" "${DIR}/apt.coverage.fixed"
index 153c5bb255d856469426a400050d348538e34435..dd66f2a0c54dfe6ec2d97755277361e387ade446 100644 (file)
@@ -128,6 +128,7 @@ aptwebserver() { runapt "${APTWEBSERVERBINDIR}/aptwebserver" "$@"; }
 aptitude() { runapt aptitude "$@"; }
 aptextracttemplates() { runapt apt-extracttemplates "$@"; }
 aptinternalsolver() { runapt "${APTINTERNALSOLVER}" "$@"; }
+aptdumpsolver() { runapt "${APTDUMPSOLVER}" "$@"; }
 
 dpkg() {
        command dpkg --root=${TMPWORKINGDIRECTORY}/rootdir --force-not-root --force-bad-path --log=${TMPWORKINGDIRECTORY}/rootdir/var/log/dpkg.log "$@"
@@ -194,6 +195,7 @@ setupenvironment() {
         APTHELPERBINDIR=${APT_INTEGRATION_TESTS_LIBEXEC_DIR:-"${BUILDDIRECTORY}"}
         APTWEBSERVERBINDIR=${APT_INTEGRATION_TESTS_WEBSERVER_BIN_DIR:-"${BUILDDIRECTORY}"}
         APTINTERNALSOLVER=${APT_INTEGRATION_TESTS_INTERNAL_SOLVER:-"${BUILDDIRECTORY}/apt-internal-solver"}
+       APTDUMPSOLVER=${APT_INTEGRATION_TESTS_DUMP_SOLVER:-"${BUILDDIRECTORY}/apt-dump-solver"}
        test -x "${BUILDDIRECTORY}/apt-get" || msgdie "You need to build tree first"
         # -----
 
diff --git a/test/integration/test-00-commands-have-help b/test/integration/test-00-commands-have-help
new file mode 100755 (executable)
index 0000000..ebf8b8c
--- /dev/null
@@ -0,0 +1,52 @@
+#!/bin/sh
+set -e
+
+TESTDIR=$(readlink -f $(dirname $0))
+. $TESTDIR/framework
+
+setupenvironment
+configarchitecture 'amd64'
+
+# this test does double duty: The obvious is checking for --help and co,
+# but it also checks if the binary can find all methods in the library.
+# The later is quite handy for manual testing of non-abibreaking changes
+export LD_BIND_NOW=1
+
+checkversionmessage() {
+       testsuccess grep '^apt .* compiled on ' ${1}-help.output
+}
+
+checkhelpmessage() {
+       checkversionmessage "$1"
+       testsuccess grep '^Usage:' ${1}-help.output
+}
+
+checkoptions() {
+       testsuccess $1 --help
+       cp -f rootdir/tmp/testsuccess.output ${1}-help.output
+       checkhelpmessage "$1"
+
+       testsuccess $1 --version
+       cp -f rootdir/tmp/testsuccess.output ${1}-help.output
+       checkversionmessage "$1"
+}
+
+for CMD in 'apt-cache' 'apt-cdrom' 'apt-config' \
+       'apt-extracttemplates' 'apt-get' 'apt-helper' \
+       'apt-mark' 'apt-sortpkgs' 'apt' 'apt-ftparchive'; do
+       cmd="$(echo "$CMD" | tr -d '-')"
+       msgtest 'Test for failure with no parameters calling' "$CMD"
+       if $cmd > ${cmd}-help.output 2>&1; then
+               echo
+               cat ${cmd}-help.output
+               msgfail 'zero exit'
+       else
+               msgpass
+       fi
+       checkhelpmessage "$cmd"
+       checkoptions "$cmd"
+done
+
+for CMD in 'apt-dump-solver'  'apt-internal-solver'; do
+       checkoptions "$(echo "$CMD" | tr -d '-')"
+done