add missing integration test for "apt list"
[ntk/apt.git] / cmdline / apt.cc
1 // -*- mode: cpp; mode: fold -*-
2 // Description /*{{{*/
3 /* ######################################################################
4
5 apt - CLI UI for apt
6
7 Returns 100 on failure, 0 on success.
8
9 ##################################################################### */
10 /*}}}*/
11 // Include Files /*{{{*/
12 #include<config.h>
13
14 #include <cassert>
15 #include <locale.h>
16 #include <iostream>
17 #include <unistd.h>
18 #include <errno.h>
19 #include <regex.h>
20 #include <stdio.h>
21 #include <iomanip>
22 #include <algorithm>
23
24
25 #include <apt-pkg/error.h>
26 #include <apt-pkg/cachefile.h>
27 #include <apt-pkg/cacheset.h>
28 #include <apt-pkg/init.h>
29 #include <apt-pkg/progress.h>
30 #include <apt-pkg/sourcelist.h>
31 #include <apt-pkg/cmndline.h>
32 #include <apt-pkg/strutl.h>
33 #include <apt-pkg/fileutl.h>
34 #include <apt-pkg/pkgrecords.h>
35 #include <apt-pkg/srcrecords.h>
36 #include <apt-pkg/version.h>
37 #include <apt-pkg/policy.h>
38 #include <apt-pkg/tagfile.h>
39 #include <apt-pkg/algorithms.h>
40 #include <apt-pkg/sptr.h>
41 #include <apt-pkg/pkgsystem.h>
42 #include <apt-pkg/indexfile.h>
43 #include <apt-pkg/metaindex.h>
44 #include <apt-pkg/hashes.h>
45
46 #include <apti18n.h>
47
48 #include <apt-private/private-list.h>
49 #include <apt-private/private-search.h>
50 #include <apt-private/private-install.h>
51 #include <apt-private/private-output.h>
52 #include <apt-private/private-update.h>
53 #include <apt-private/private-cmndline.h>
54 #include <apt-private/private-moo.h>
55 #include <apt-private/private-upgrade.h>
56 #include <apt-private/private-show.h>
57 #include <apt-private/private-main.h>
58 #include <apt-private/private-utils.h>
59 #include <apt-private/private-sources.h>
60 /*}}}*/
61
62
63
64 bool ShowHelp(CommandLine &CmdL)
65 {
66 ioprintf(c1out,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION,
67 COMMON_ARCH,__DATE__,__TIME__);
68
69 // FIXME: generate from CommandLine
70 c1out <<
71 _("Usage: apt [options] command\n"
72 "\n"
73 "CLI for apt.\n"
74 "Commands: \n"
75 " list - list packages based on package names\n"
76 " search - search in package descriptions\n"
77 " show - show package details\n"
78 "\n"
79 " update - update list of available packages\n"
80 " install - install packages\n"
81 " upgrade - upgrade the systems packages\n"
82 "\n"
83 " edit-sources - edit the source information file\n"
84 );
85
86 return true;
87 }
88
89 // figure out what kind of upgrade the user wants
90 bool DoAptUpgrade(CommandLine &CmdL)
91 {
92 if (_config->FindB("Apt::Cmd::Dist-Upgrade"))
93 return DoDistUpgrade(CmdL);
94 else
95 return DoUpgradeWithAllowNewPackages(CmdL);
96 }
97
98 int main(int argc, const char *argv[]) /*{{{*/
99 {
100 CommandLine::Dispatch Cmds[] = {{"list",&List},
101 {"search", &FullTextSearch},
102 {"show", &APT::Cmd::ShowPackage},
103 // needs root
104 {"install",&DoInstall},
105 {"remove", &DoInstall},
106 {"update",&DoUpdate},
107 {"upgrade",&DoAptUpgrade},
108 // misc
109 {"edit-sources",&EditSources},
110 // helper
111 {"moo",&DoMoo},
112 {"help",&ShowHelp},
113 {0,0}};
114
115 std::vector<CommandLine::Args> Args = getCommandArgs("apt", CommandLine::GetCommand(Cmds, argc, argv));
116
117 InitOutput();
118
119 // Set up gettext support
120 setlocale(LC_ALL,"");
121 textdomain(PACKAGE);
122
123 if(pkgInitConfig(*_config) == false)
124 {
125 _error->DumpErrors();
126 return 100;
127 }
128
129 // FIXME: move into a new libprivate/private-install.cc:Install()
130 _config->Set("DPkgPM::Progress", "1");
131 _config->Set("Apt::Color", "1");
132
133 // Parse the command line and initialize the package library
134 CommandLine CmdL(Args.data(), _config);
135 if (CmdL.Parse(argc, argv) == false ||
136 pkgInitSystem(*_config, _system) == false)
137 {
138 _error->DumpErrors();
139 return 100;
140 }
141
142 if(!isatty(STDOUT_FILENO) &&
143 _config->FindB("Apt::Cmd::Disable-Script-Warning", false) == false)
144 {
145 std::cerr << std::endl
146 << "WARNING: " << argv[0] << " "
147 << "does not have a stable CLI interface yet. "
148 << "Use with caution in scripts."
149 << std::endl
150 << std::endl;
151 }
152 if (!isatty(STDOUT_FILENO) && _config->FindI("quiet", -1) == -1)
153 _config->Set("quiet","1");
154
155 // See if the help should be shown
156 if (_config->FindB("help") == true ||
157 _config->FindB("version") == true ||
158 CmdL.FileSize() == 0)
159 {
160 ShowHelp(CmdL);
161 return 0;
162 }
163
164 // see if we are in simulate mode
165 CheckSimulateMode(CmdL);
166
167 // parse args
168 CmdL.DispatchArg(Cmds);
169
170 // Print any errors or warnings found during parsing
171 bool const Errors = _error->PendingError();
172 if (_config->FindI("quiet",0) > 0)
173 _error->DumpErrors();
174 else
175 _error->DumpErrors(GlobalError::DEBUG);
176 return Errors == true ? 100 : 0;
177 }
178 /*}}}*/