summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog6
-rw-r--r--ftparchive/apt-ftparchive.cc19
-rw-r--r--ftparchive/writer.cc149
-rw-r--r--ftparchive/writer.h22
-rw-r--r--po/apt-all.pot121
5 files changed, 219 insertions, 98 deletions
diff --git a/debian/changelog b/debian/changelog
index 907af1b9a..9c85e89e6 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+apt (0.5.17) unstable; urgency=low
+
+ * Enable apt-ftparchive to generate Release files
+
+ --
+
apt (0.5.16) unstable; urgency=low
* po/de.po update from Michael Karcher <karcher@physik.fu-berlin.de>
diff --git a/ftparchive/apt-ftparchive.cc b/ftparchive/apt-ftparchive.cc
index 426ec5637..c811343b6 100644
--- a/ftparchive/apt-ftparchive.cc
+++ b/ftparchive/apt-ftparchive.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: apt-ftparchive.cc,v 1.8 2003/07/18 15:28:58 mdz Exp $
+// $Id: apt-ftparchive.cc,v 1.9 2003/12/26 20:08:56 mdz Exp $
/* ######################################################################
apt-scanpackages - Efficient work-alike for dpkg-scanpackages
@@ -223,6 +223,7 @@ bool PackageMap::GenPackages(Configuration &Setup,struct CacheDB::Stats &Stats)
return !_error->PendingError();
}
+
/*}}}*/
// PackageMap::GenSources - Actually generate a Source file /*{{{*/
// ---------------------------------------------------------------------
@@ -672,6 +673,21 @@ bool SimpleGenSources(CommandLine &CmdL)
return true;
}
/*}}}*/
+// SimpleGenRelease - Generate a Release file for a directory tree /*{{{*/
+// ---------------------------------------------------------------------
+bool SimpleGenRelease(CommandLine &CmdL)
+{
+ ReleaseWriter Release("");
+ if (_error->PendingError() == true)
+ return false;
+
+ if (Release.RecursiveScan(CmdL.FileList[1]) == false)
+ return false;
+
+ return true;
+}
+
+ /*}}}*/
// Generate - Full generate, using a config file /*{{{*/
// ---------------------------------------------------------------------
/* */
@@ -887,6 +903,7 @@ int main(int argc, const char *argv[])
CommandLine::Dispatch Cmds[] = {{"packages",&SimpleGenPackages},
{"contents",&SimpleGenContents},
{"sources",&SimpleGenSources},
+ {"release",&SimpleGenRelease},
{"generate",&Generate},
{"clean",&Clean},
{"help",&ShowHelp},
diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc
index 94d88388a..68fd85091 100644
--- a/ftparchive/writer.cc
+++ b/ftparchive/writer.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: writer.cc,v 1.7 2003/02/10 07:34:41 doogie Exp $
+// $Id: writer.cc,v 1.8 2003/12/26 20:08:56 mdz Exp $
/* ######################################################################
Writer
@@ -26,7 +26,9 @@
#include <sys/types.h>
#include <unistd.h>
+#include <ctime>
#include <ftw.h>
+#include <fnmatch.h>
#include <iostream>
#include "cachedb.h"
@@ -58,8 +60,6 @@ FTWScanner::FTWScanner()
{
ErrorPrinted = false;
NoLinkAct = !_config->FindB("APT::FTPArchive::DeLinkAct",true);
- TmpExt = 0;
- Ext[0] = 0;
RealPath = 0;
long PMax = pathconf(".",_PC_PATH_MAX);
if (PMax > 0)
@@ -85,16 +85,19 @@ int FTWScanner::Scanner(const char *File,const struct stat *sb,int Flag)
if (Flag != FTW_F)
return 0;
- // See if it is a .deb
- if (strlen(File) < 4)
- return 0;
-
- unsigned CurExt = 0;
- for (; Owner->Ext[CurExt] != 0; CurExt++)
- if (strcmp(File+strlen(File)-strlen(Owner->Ext[CurExt]),
- Owner->Ext[CurExt]) == 0)
- break;
- if (Owner->Ext[CurExt] == 0)
+ const char *LastComponent = strrchr(File, '/');
+ if (LastComponent == NULL)
+ LastComponent = File;
+ else
+ LastComponent++;
+
+ vector<string>::iterator I;
+ for(I = Owner->Patterns.begin(); I != Owner->Patterns.end(); ++I)
+ {
+ if (fnmatch((*I).c_str(), LastComponent, 0) == 0)
+ break;
+ }
+ if (I == Owner->Patterns.end())
return 0;
/* Process it. If the file is a link then resolve it into an absolute
@@ -277,17 +280,6 @@ bool FTWScanner::Delink(string &FileName,const char *OriginalPath,
return true;
}
/*}}}*/
-// FTWScanner::SetExts - Set extensions to support /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool FTWScanner::SetExts(string Vals)
-{
- delete [] TmpExt;
- TmpExt = new char[Vals.length()+1];
- strcpy(TmpExt,Vals.c_str());
- return TokSplitString(' ',TmpExt,(char **)Ext,sizeof(Ext)/sizeof(Ext[0]));
-}
- /*}}}*/
// PackagesWriter::PackagesWriter - Constructor /*{{{*/
// ---------------------------------------------------------------------
@@ -296,8 +288,7 @@ PackagesWriter::PackagesWriter(string DB,string Overrides,string ExtOverrides) :
Db(DB),Stats(Db.Stats)
{
Output = stdout;
- Ext[0] = ".deb";
- Ext[1] = 0;
+ AddPattern("*.deb");
DeLinkLimit = 0;
// Process the command line options
@@ -319,6 +310,28 @@ PackagesWriter::PackagesWriter(string DB,string Overrides,string ExtOverrides) :
_error->DumpErrors();
}
+ /*}}}*/
+// FTWScanner::SetExts - Set extensions to support /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool FTWScanner::SetExts(string Vals)
+{
+ ClearPatterns();
+ string::size_type Start = 0;
+ for(string::size_type space = Vals.find(' ');
+ space != string::npos;
+ space = Vals.find(' ', space))
+ {
+ if (space > 0)
+ {
+ AddPattern(string("*") + string(Start, space-1));
+ Start = space + 1;
+ }
+ }
+
+ return true;
+}
+
/*}}}*/
// PackagesWriter::DoPackage - Process a single package /*{{{*/
// ---------------------------------------------------------------------
@@ -449,8 +462,7 @@ SourcesWriter::SourcesWriter(string BOverrides,string SOverrides,
string ExtOverrides)
{
Output = stdout;
- Ext[0] = ".dsc";
- Ext[1] = 0;
+ AddPattern("*.dsc");
DeLinkLimit = 0;
Buffer = 0;
BufSize = 0;
@@ -686,8 +698,7 @@ ContentsWriter::ContentsWriter(string DB) :
Db(DB), Stats(Db.Stats)
{
- Ext[0] = ".deb";
- Ext[1] = 0;
+ AddPattern("*.deb");
Output = stdout;
}
/*}}}*/
@@ -777,4 +788,82 @@ bool ContentsWriter::ReadFromPkgs(string PkgFile,string PkgCompress)
return true;
}
+
/*}}}*/
+
+// ReleaseWriter::ReleaseWriter - Constructor /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+ReleaseWriter::ReleaseWriter(string DB)
+{
+ AddPattern("Packages");
+ AddPattern("Packages.gz");
+ Output = stdout;
+ time_t now = time(NULL);
+ char datestr[128];
+ if (strftime(datestr, sizeof(datestr), "%a, %d %b %Y %H:%M:%S UTC",
+ gmtime(&now)) == 0)
+ {
+ datestr[0] = '\0';
+ }
+
+ map<string,string> Fields;
+ Fields["Origin"] = "";
+ Fields["Label"] = "";
+ Fields["Suite"] = "";
+ Fields["Version"] = "";
+ Fields["Codename"] = "";
+ Fields["Date"] = datestr;
+ Fields["Architectures"] = "";
+ Fields["Components"] = "";
+ Fields["Description"] = "";
+
+ for(map<string,string>::const_iterator I = Fields.begin();
+ I != Fields.end();
+ ++I)
+ {
+ string Config = string("APT::FTPArchive::Release::") + (*I).first;
+ string Value = _config->Find(Config, (*I).second.c_str());
+ if (Value == "")
+ continue;
+
+ fprintf(Output, "%s: %s\n", (*I).first.c_str(), Value.c_str());
+ }
+
+ fprintf(Output, "MD5Sum:\n");
+}
+ /*}}}*/
+// ReleaseWriter::DoPackage - Process a single package /*{{{*/
+// ---------------------------------------------------------------------
+bool ReleaseWriter::DoPackage(string FileName)
+{
+ // Strip the DirStrip prefix from the FileName and add the PathPrefix
+ string NewFileName;
+ if (DirStrip.empty() == false &&
+ FileName.length() > DirStrip.length() &&
+ stringcmp(FileName.begin(),FileName.begin() + DirStrip.length(),
+ DirStrip.begin(),DirStrip.end()) == 0)
+ NewFileName = string(FileName.begin() + DirStrip.length(),FileName.end());
+ else
+ NewFileName = FileName;
+ if (PathPrefix.empty() == false)
+ NewFileName = flCombine(PathPrefix,NewFileName);
+
+ FileFd fd(FileName, FileFd::ReadOnly);
+
+ if (!fd.IsOpen())
+ {
+ return false;
+ }
+
+ MD5Summation MD5;
+ MD5.AddFD(fd.Fd(), fd.Size());
+
+ string MD5Sum = MD5.Result();
+ fprintf(Output, " %s %16d %s\n",
+ MD5Sum.c_str(), fd.Size(), FileName.c_str());
+
+ fd.Close();
+
+ return true;
+}
diff --git a/ftparchive/writer.h b/ftparchive/writer.h
index 854d3424b..6f728dd1b 100644
--- a/ftparchive/writer.h
+++ b/ftparchive/writer.h
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: writer.h,v 1.4 2001/06/26 02:50:27 jgg Exp $
+// $Id: writer.h,v 1.5 2003/12/26 20:08:56 mdz Exp $
/* ######################################################################
Writer
@@ -29,13 +29,12 @@
using std::string;
using std::cout;
using std::endl;
+using std::vector;
class FTWScanner
{
protected:
-
- char *TmpExt;
- const char *Ext[10];
+ vector<string> Patterns;
const char *OriginalPath;
char *RealPath;
bool ErrorPrinted;
@@ -66,10 +65,12 @@ class FTWScanner
virtual bool DoPackage(string FileName) = 0;
bool RecursiveScan(string Dir);
bool LoadFileList(string BaseDir,string File);
+ bool ClearPatterns() { Patterns.clear(); };
+ bool AddPattern(string Pattern) { Patterns.push_back(Pattern); };
bool SetExts(string Vals);
FTWScanner();
- virtual ~FTWScanner() {delete [] RealPath; delete [] TmpExt;};
+ virtual ~FTWScanner() {delete [] RealPath;};
};
class PackagesWriter : public FTWScanner
@@ -148,5 +149,16 @@ class SourcesWriter : public FTWScanner
virtual ~SourcesWriter() {free(Buffer);};
};
+class ReleaseWriter : public FTWScanner
+{
+public:
+ ReleaseWriter(string DB);
+ virtual bool DoPackage(string FileName);
+protected:
+ // General options
+ string PathPrefix;
+ string DirStrip;
+ FILE *Output;
+};
#endif
diff --git a/po/apt-all.pot b/po/apt-all.pot
index 3dd7073ef..221306fcb 100644
--- a/po/apt-all.pot
+++ b/po/apt-all.pot
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2003-12-20 15:27-0800\n"
+"POT-Creation-Date: 2003-12-26 12:05-0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -147,8 +147,8 @@ msgid " %4i %s\n"
msgstr ""
#: cmdline/apt-cache.cc:1581 cmdline/apt-cdrom.cc:731 cmdline/apt-config.cc:70
-#: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:544
-#: cmdline/apt-get.cc:2271 cmdline/apt-sortpkgs.cc:144
+#: cmdline/apt-extracttemplates.cc:225 ftparchive/apt-ftparchive.cc:545
+#: cmdline/apt-get.cc:2256 cmdline/apt-sortpkgs.cc:144
#, c-format
msgid "%s %s for %s %s compiled on %s %s\n"
msgstr ""
@@ -240,31 +240,31 @@ msgstr ""
msgid "Cannot get debconf version. Is debconf installed?"
msgstr ""
-#: ftparchive/apt-ftparchive.cc:163 ftparchive/apt-ftparchive.cc:336
+#: ftparchive/apt-ftparchive.cc:163 ftparchive/apt-ftparchive.cc:337
msgid "Package extension list is too long"
msgstr ""
#: ftparchive/apt-ftparchive.cc:165 ftparchive/apt-ftparchive.cc:179
-#: ftparchive/apt-ftparchive.cc:202 ftparchive/apt-ftparchive.cc:251
-#: ftparchive/apt-ftparchive.cc:265 ftparchive/apt-ftparchive.cc:287
+#: ftparchive/apt-ftparchive.cc:202 ftparchive/apt-ftparchive.cc:252
+#: ftparchive/apt-ftparchive.cc:266 ftparchive/apt-ftparchive.cc:288
#, c-format
msgid "Error Processing directory %s"
msgstr ""
-#: ftparchive/apt-ftparchive.cc:249
+#: ftparchive/apt-ftparchive.cc:250
msgid "Source extension list is too long"
msgstr ""
-#: ftparchive/apt-ftparchive.cc:366
+#: ftparchive/apt-ftparchive.cc:367
msgid "Error writing header to contents file"
msgstr ""
-#: ftparchive/apt-ftparchive.cc:396
+#: ftparchive/apt-ftparchive.cc:397
#, c-format
msgid "Error Processing Contents %s"
msgstr ""
-#: ftparchive/apt-ftparchive.cc:550
+#: ftparchive/apt-ftparchive.cc:551
msgid ""
"Usage: apt-ftparchive [options] command\n"
"Commands: packages binarypath [overridefile [pathprefix]]\n"
@@ -305,11 +305,11 @@ msgid ""
" -o=? Set an arbitary configuration option"
msgstr ""
-#: ftparchive/apt-ftparchive.cc:731
+#: ftparchive/apt-ftparchive.cc:747
msgid "No selections matched"
msgstr ""
-#: ftparchive/apt-ftparchive.cc:804
+#: ftparchive/apt-ftparchive.cc:820
#, c-format
msgid "Some files are missing in the package file group `%s'"
msgstr ""
@@ -347,73 +347,73 @@ msgstr ""
msgid "W: Unable to stat %s\n"
msgstr ""
-#: ftparchive/writer.cc:122
+#: ftparchive/writer.cc:125
msgid "E: "
msgstr ""
-#: ftparchive/writer.cc:124
+#: ftparchive/writer.cc:127
msgid "W: "
msgstr ""
-#: ftparchive/writer.cc:131
+#: ftparchive/writer.cc:134
msgid "E: Errors apply to file "
msgstr ""
-#: ftparchive/writer.cc:148 ftparchive/writer.cc:178
+#: ftparchive/writer.cc:151 ftparchive/writer.cc:181
#, c-format
msgid "Failed to resolve %s"
msgstr ""
-#: ftparchive/writer.cc:160
+#: ftparchive/writer.cc:163
msgid "Tree walking failed"
msgstr ""
-#: ftparchive/writer.cc:185
+#: ftparchive/writer.cc:188
#, c-format
msgid "Failed to open %s"
msgstr ""
-#: ftparchive/writer.cc:242
+#: ftparchive/writer.cc:245
#, c-format
msgid " DeLink %s [%s]\n"
msgstr ""
-#: ftparchive/writer.cc:250
+#: ftparchive/writer.cc:253
#, c-format
msgid "Failed to readlink %s"
msgstr ""
-#: ftparchive/writer.cc:254
+#: ftparchive/writer.cc:257
#, c-format
msgid "Failed to unlink %s"
msgstr ""
-#: ftparchive/writer.cc:261
+#: ftparchive/writer.cc:264
#, c-format
msgid "*** Failed to link %s to %s"
msgstr ""
-#: ftparchive/writer.cc:271
+#: ftparchive/writer.cc:274
#, c-format
msgid " DeLink limit of %sB hit.\n"
msgstr ""
-#: ftparchive/writer.cc:338 apt-inst/extract.cc:181 apt-inst/extract.cc:193
+#: ftparchive/writer.cc:351 apt-inst/extract.cc:181 apt-inst/extract.cc:193
#: apt-inst/extract.cc:210 apt-inst/deb/dpkgdb.cc:121
#, c-format
msgid "Failed to stat %s"
msgstr ""
-#: ftparchive/writer.cc:358
+#: ftparchive/writer.cc:371
msgid "Archive had no package field"
msgstr ""
-#: ftparchive/writer.cc:366 ftparchive/writer.cc:576
+#: ftparchive/writer.cc:379 ftparchive/writer.cc:588
#, c-format
msgid " %s has no override entry\n"
msgstr ""
-#: ftparchive/writer.cc:409 ftparchive/writer.cc:658
+#: ftparchive/writer.cc:422 ftparchive/writer.cc:670
#, c-format
msgid " %s maintainer is %s not %s\n"
msgstr ""
@@ -643,11 +643,11 @@ msgstr ""
msgid "Packages need to be removed but Remove is disabled."
msgstr ""
-#: cmdline/apt-get.cc:744 cmdline/apt-get.cc:1726 cmdline/apt-get.cc:1759
+#: cmdline/apt-get.cc:744 cmdline/apt-get.cc:1712 cmdline/apt-get.cc:1745
msgid "Unable to lock the download directory"
msgstr ""
-#: cmdline/apt-get.cc:754 cmdline/apt-get.cc:1807 cmdline/apt-get.cc:2018
+#: cmdline/apt-get.cc:754 cmdline/apt-get.cc:1793 cmdline/apt-get.cc:2004
#: apt-pkg/cachefile.cc:67
msgid "The list of sources could not be read."
msgstr ""
@@ -705,7 +705,7 @@ msgstr ""
msgid "Do you want to continue? [Y/n] "
msgstr ""
-#: cmdline/apt-get.cc:911 cmdline/apt-get.cc:1282 cmdline/apt-get.cc:1916
+#: cmdline/apt-get.cc:911 cmdline/apt-get.cc:1282 cmdline/apt-get.cc:1902
#, c-format
msgid "Failed to fetch %s %s\n"
msgstr ""
@@ -714,7 +714,7 @@ msgstr ""
msgid "Some files failed to download"
msgstr ""
-#: cmdline/apt-get.cc:930 cmdline/apt-get.cc:1925
+#: cmdline/apt-get.cc:930 cmdline/apt-get.cc:1911
msgid "Download complete and in download only mode"
msgstr ""
@@ -872,133 +872,130 @@ msgstr ""
msgid "The following extra packages will be installed:"
msgstr ""
-#: cmdline/apt-get.cc:1600
+#: cmdline/apt-get.cc:1586
msgid "Suggested packages:"
msgstr ""
-#: cmdline/apt-get.cc:1601
+#: cmdline/apt-get.cc:1587
msgid "Recommended packages:"
msgstr ""
-#: cmdline/apt-get.cc:1621
+#: cmdline/apt-get.cc:1607
msgid "Calculating Upgrade... "
msgstr ""
-#: cmdline/apt-get.cc:1624 methods/ftp.cc:702 methods/connect.cc:99
+#: cmdline/apt-get.cc:1610 methods/ftp.cc:702 methods/connect.cc:99
msgid "Failed"
msgstr ""
-#: cmdline/apt-get.cc:1629
+#: cmdline/apt-get.cc:1615
msgid "Done"
msgstr ""
-#: cmdline/apt-get.cc:1802
+#: cmdline/apt-get.cc:1788
msgid "Must specify at least one package to fetch source for"
msgstr ""
-#: cmdline/apt-get.cc:1829 cmdline/apt-get.cc:2036
+#: cmdline/apt-get.cc:1815 cmdline/apt-get.cc:2022
#, c-format
msgid "Unable to find a source package for %s"
msgstr ""
-#: cmdline/apt-get.cc:1876
+#: cmdline/apt-get.cc:1862
#, c-format
msgid "You don't have enough free space in %s"
msgstr ""
-#: cmdline/apt-get.cc:1881
+#: cmdline/apt-get.cc:1867
#, c-format
msgid "Need to get %sB/%sB of source archives.\n"
msgstr ""
-#: cmdline/apt-get.cc:1884
+#: cmdline/apt-get.cc:1870
#, c-format
msgid "Need to get %sB of source archives.\n"
msgstr ""
-#: cmdline/apt-get.cc:1890
+#: cmdline/apt-get.cc:1876
#, c-format
msgid "Fetch Source %s\n"
msgstr ""
-#: cmdline/apt-get.cc:1921
+#: cmdline/apt-get.cc:1907
msgid "Failed to fetch some archives."
msgstr ""
-#: cmdline/apt-get.cc:1949
+#: cmdline/apt-get.cc:1935
#, c-format
msgid "Skipping unpack of already unpacked source in %s\n"
msgstr ""
-#: cmdline/apt-get.cc:1961
+#: cmdline/apt-get.cc:1947
#, c-format
msgid "Unpack command '%s' failed.\n"
msgstr ""
-#: cmdline/apt-get.cc:1978
+#: cmdline/apt-get.cc:1964
#, c-format
msgid "Build command '%s' failed.\n"
msgstr ""
-#: cmdline/apt-get.cc:1997
+#: cmdline/apt-get.cc:1983
msgid "Child process failed"
msgstr ""
-#: cmdline/apt-get.cc:2013
+#: cmdline/apt-get.cc:1999
msgid "Must specify at least one package to check builddeps for"
msgstr ""
-#: cmdline/apt-get.cc:2041
+#: cmdline/apt-get.cc:2027
#, c-format
msgid "Unable to get build-dependency information for %s"
msgstr ""
-#: cmdline/apt-get.cc:2061
+#: cmdline/apt-get.cc:2047
#, c-format
msgid "%s has no build depends.\n"
msgstr ""
-#: cmdline/apt-get.cc:2113
+#: cmdline/apt-get.cc:2099
#, c-format
msgid ""
"%s dependency for %s cannot be satisfied because the package %s cannot be "
"found"
msgstr ""
-#: cmdline/apt-get.cc:2165
+#: cmdline/apt-get.cc:2151
#, c-format
msgid ""
"%s dependency for %s cannot be satisfied because no available versions of "
"package %s can satisfy version requirements"
msgstr ""
-#: cmdline/apt-get.cc:2200
+#: cmdline/apt-get.cc:2186
#, c-format
msgid "Failed to satisfy %s dependency for %s: Installed package %s is too new"
msgstr ""
-#: cmdline/apt-get.cc:2225
+#: cmdline/apt-get.cc:2211
#, c-format
msgid "Failed to satisfy %s dependency for %s: %s"
msgstr ""
-#: cmdline/apt-get.cc:2239
+#: cmdline/apt-get.cc:2225
#, c-format
-msgid ""
-"Some broken packages were found while trying to process build-dependencies "
-"for %s.\n"
-"You might want to run `apt-get -f install' to correct these."
+msgid "Build-dependencies for %s could not be satisfied."
msgstr ""
-#: cmdline/apt-get.cc:2244
+#: cmdline/apt-get.cc:2229
msgid "Failed to process build dependencies"
msgstr ""
-#: cmdline/apt-get.cc:2276
+#: cmdline/apt-get.cc:2261
msgid "Supported Modules:"
msgstr ""
-#: cmdline/apt-get.cc:2317
+#: cmdline/apt-get.cc:2302
msgid ""
"Usage: apt-get [options] command\n"
" apt-get [options] install|remove pkg1 [pkg2 ...]\n"