summaryrefslogtreecommitdiff
path: root/cmdline
diff options
context:
space:
mode:
Diffstat (limited to 'cmdline')
-rw-r--r--cmdline/apt-cache.cc142
-rw-r--r--cmdline/apt-get.cc327
-rwxr-xr-xcmdline/apt-mark7
3 files changed, 327 insertions, 149 deletions
diff --git a/cmdline/apt-cache.cc b/cmdline/apt-cache.cc
index 3f68579cc..10dbf44d2 100644
--- a/cmdline/apt-cache.cc
+++ b/cmdline/apt-cache.cc
@@ -14,7 +14,9 @@
/*}}}*/
// Include Files /*{{{*/
#include <apt-pkg/error.h>
+#include <cassert>
#include <apt-pkg/pkgcachegen.h>
+#include <apt-pkg/cachefile.h>
#include <apt-pkg/init.h>
#include <apt-pkg/progress.h>
#include <apt-pkg/sourcelist.h>
@@ -139,7 +141,7 @@ bool UnMet(CommandLine &CmdL)
// Oops, it failed..
if (Header == false)
ioprintf(cout,_("Package %s version %s has an unmet dep:\n"),
- P.Name(),V.VerStr());
+ P.FullName(true).c_str(),V.VerStr());
Header = true;
// Print out the dep type
@@ -149,7 +151,7 @@ bool UnMet(CommandLine &CmdL)
Start = RealStart;
do
{
- cout << Start.TargetPkg().Name();
+ cout << Start.TargetPkg().FullName(true);
if (Start.TargetVer() != 0)
cout << " (" << Start.CompType() << " " << Start.TargetVer() <<
")";
@@ -182,7 +184,7 @@ bool DumpPackage(CommandLine &CmdL)
continue;
}
- cout << "Package: " << Pkg.Name() << endl;
+ cout << "Package: " << Pkg.FullName(true) << endl;
cout << "Versions: " << endl;
for (pkgCache::VerIterator Cur = Pkg.VersionList(); Cur.end() != true; Cur++)
{
@@ -204,7 +206,7 @@ bool DumpPackage(CommandLine &CmdL)
cout << "Reverse Depends: " << endl;
for (pkgCache::DepIterator D = Pkg.RevDependsList(); D.end() != true; D++)
{
- cout << " " << D.ParentPkg().Name() << ',' << D.TargetPkg().Name();
+ cout << " " << D.ParentPkg().FullName(true) << ',' << D.TargetPkg().FullName(true);
if (D->Version != 0)
cout << ' ' << DeNull(D.TargetVer()) << endl;
else
@@ -216,7 +218,7 @@ bool DumpPackage(CommandLine &CmdL)
{
cout << Cur.VerStr() << " - ";
for (pkgCache::DepIterator Dep = Cur.DependsList(); Dep.end() != true; Dep++)
- cout << Dep.TargetPkg().Name() << " (" << (int)Dep->CompareOp << " " << DeNull(Dep.TargetVer()) << ") ";
+ cout << Dep.TargetPkg().FullName(true) << " (" << (int)Dep->CompareOp << " " << DeNull(Dep.TargetVer()) << ") ";
cout << endl;
}
@@ -225,12 +227,12 @@ bool DumpPackage(CommandLine &CmdL)
{
cout << Cur.VerStr() << " - ";
for (pkgCache::PrvIterator Prv = Cur.ProvidesList(); Prv.end() != true; Prv++)
- cout << Prv.ParentPkg().Name() << " ";
+ cout << Prv.ParentPkg().FullName(true) << " ";
cout << endl;
}
cout << "Reverse Provides: " << endl;
for (pkgCache::PrvIterator Prv = Pkg.ProvidesList(); Prv.end() != true; Prv++)
- cout << Prv.OwnerPkg().Name() << " " << Prv.OwnerVer().VerStr() << endl;
+ cout << Prv.OwnerPkg().FullName(true) << " " << Prv.OwnerVer().VerStr() << endl;
}
return true;
@@ -242,7 +244,9 @@ bool DumpPackage(CommandLine &CmdL)
bool Stats(CommandLine &Cmd)
{
pkgCache &Cache = *GCache;
- cout << _("Total package names: ") << Cache.Head().PackageCount << " (" <<
+ cout << _("Total package names: ") << Cache.Head().GroupCount << " (" <<
+ SizeToStr(Cache.Head().GroupCount*Cache.Head().GroupSz) << ')' << endl
+ << _("Total package structures: ") << Cache.Head().PackageCount << " (" <<
SizeToStr(Cache.Head().PackageCount*Cache.Head().PackageSz) << ')' << endl;
int Normal = 0;
@@ -353,13 +357,13 @@ bool Dump(CommandLine &Cmd)
for (pkgCache::PkgIterator P = Cache.PkgBegin(); P.end() == false; P++)
{
- cout << "Package: " << P.Name() << endl;
+ cout << "Package: " << P.FullName(true) << endl;
for (pkgCache::VerIterator V = P.VersionList(); V.end() == false; V++)
{
cout << " Version: " << V.VerStr() << endl;
cout << " File: " << V.FileList().File().FileName() << endl;
for (pkgCache::DepIterator D = V.DependsList(); D.end() == false; D++)
- cout << " Depends: " << D.TargetPkg().Name() << ' ' <<
+ cout << " Depends: " << D.TargetPkg().FullName(true) << ' ' <<
DeNull(D.TargetVer()) << endl;
for (pkgCache::DescIterator D = V.DescriptionList(); D.end() == false; D++)
{
@@ -570,11 +574,11 @@ bool Depends(CommandLine &CmdL)
pkgCache::VerIterator Ver = Pkg.VersionList();
if (Ver.end() == true)
{
- cout << '<' << Pkg.Name() << '>' << endl;
+ cout << '<' << Pkg.FullName(true) << '>' << endl;
continue;
}
- cout << Pkg.Name() << endl;
+ cout << Pkg.FullName(true) << endl;
for (pkgCache::DepIterator D = Ver.DependsList(); D.end() == false; D++)
{
@@ -596,9 +600,9 @@ bool Depends(CommandLine &CmdL)
// Show the package
if (Trg->VersionList == 0)
- cout << D.DepType() << ": <" << Trg.Name() << ">" << endl;
+ cout << D.DepType() << ": <" << Trg.FullName(true) << ">" << endl;
else
- cout << D.DepType() << ": " << Trg.Name() << endl;
+ cout << D.DepType() << ": " << Trg.FullName(true) << endl;
if (Recurse == true)
Colours[D.TargetPkg()->ID]++;
@@ -614,7 +618,7 @@ bool Depends(CommandLine &CmdL)
if (V != Cache.VerP + V.ParentPkg()->VersionList ||
V->ParentPkg == D->Package)
continue;
- cout << " " << V.ParentPkg().Name() << endl;
+ cout << " " << V.ParentPkg().FullName(true) << endl;
if (Recurse == true)
Colours[D.ParentPkg()->ID]++;
@@ -663,11 +667,11 @@ bool RDepends(CommandLine &CmdL)
pkgCache::VerIterator Ver = Pkg.VersionList();
if (Ver.end() == true)
{
- cout << '<' << Pkg.Name() << '>' << endl;
+ cout << '<' << Pkg.FullName(true) << '>' << endl;
continue;
}
- cout << Pkg.Name() << endl;
+ cout << Pkg.FullName(true) << endl;
cout << "Reverse Depends:" << endl;
for (pkgCache::DepIterator D = Pkg.RevDependsList(); D.end() == false; D++)
@@ -684,9 +688,9 @@ bool RDepends(CommandLine &CmdL)
cout << " ";
if (Trg->VersionList == 0)
- cout << D.DepType() << ": <" << Trg.Name() << ">" << endl;
+ cout << D.DepType() << ": <" << Trg.FullName(true) << ">" << endl;
else
- cout << Trg.Name() << endl;
+ cout << Trg.FullName(true) << endl;
if (Recurse == true)
Colours[D.ParentPkg()->ID]++;
@@ -702,7 +706,7 @@ bool RDepends(CommandLine &CmdL)
if (V != Cache.VerP + V.ParentPkg()->VersionList ||
V->ParentPkg == D->Package)
continue;
- cout << " " << V.ParentPkg().Name() << endl;
+ cout << " " << V.ParentPkg().FullName(true) << endl;
if (Recurse == true)
Colours[D.ParentPkg()->ID]++;
@@ -863,7 +867,7 @@ bool XVcg(CommandLine &CmdL)
// Only graph critical deps
if (D.IsCritical() == true)
{
- printf ("edge: { sourcename: \"%s\" targetname: \"%s\" class: 2 ",Pkg.Name(), D.TargetPkg().Name() );
+ printf ("edge: { sourcename: \"%s\" targetname: \"%s\" class: 2 ",Pkg.FullName(true).c_str(), D.TargetPkg().FullName(true).c_str() );
// Colour the node for recursion
if (Show[D.TargetPkg()->ID] <= DoneNR)
@@ -922,10 +926,10 @@ bool XVcg(CommandLine &CmdL)
continue;
if (Show[Pkg->ID] == DoneNR)
- printf("node: { title: \"%s\" label: \"%s\" color: orange shape: %s }\n", Pkg.Name(), Pkg.Name(),
+ printf("node: { title: \"%s\" label: \"%s\" color: orange shape: %s }\n", Pkg.FullName(true).c_str(), Pkg.FullName(true).c_str(),
Shapes[ShapeMap[Pkg->ID]]);
else
- printf("node: { title: \"%s\" label: \"%s\" shape: %s }\n", Pkg.Name(), Pkg.Name(),
+ printf("node: { title: \"%s\" label: \"%s\" shape: %s }\n", Pkg.FullName(true).c_str(), Pkg.FullName(true).c_str(),
Shapes[ShapeMap[Pkg->ID]]);
}
@@ -1084,7 +1088,7 @@ bool Dotty(CommandLine &CmdL)
// Only graph critical deps
if (D.IsCritical() == true)
{
- printf("\"%s\" -> \"%s\"",Pkg.Name(),D.TargetPkg().Name());
+ printf("\"%s\" -> \"%s\"",Pkg.FullName(true).c_str(),D.TargetPkg().FullName(true).c_str());
// Colour the node for recursion
if (Show[D.TargetPkg()->ID] <= DoneNR)
@@ -1138,10 +1142,10 @@ bool Dotty(CommandLine &CmdL)
// Orange box for early recursion stoppage
if (Show[Pkg->ID] == DoneNR)
- printf("\"%s\" [color=orange,shape=%s];\n",Pkg.Name(),
+ printf("\"%s\" [color=orange,shape=%s];\n",Pkg.FullName(true).c_str(),
Shapes[ShapeMap[Pkg->ID]]);
else
- printf("\"%s\" [shape=%s];\n",Pkg.Name(),
+ printf("\"%s\" [shape=%s];\n",Pkg.FullName(true).c_str(),
Shapes[ShapeMap[Pkg->ID]]);
}
@@ -1404,6 +1408,29 @@ bool Search(CommandLine &CmdL)
return _error->Error("Write to stdout failed");
return true;
}
+
+
+/* show automatically installed packages (sorted) */
+bool ShowAuto(CommandLine &CmdL)
+{
+ OpProgress op;
+ pkgDepCache DepCache(GCache);
+ DepCache.Init(&op);
+
+ std::vector<string> packages;
+ packages.reserve(GCache->HeaderP->PackageCount / 3);
+
+ for (pkgCache::PkgIterator P = GCache->PkgBegin(); P.end() == false; P++)
+ if (DepCache[P].Flags & pkgCache::Flag::Auto)
+ packages.push_back(P.Name());
+
+ std::sort(packages.begin(), packages.end());
+
+ for (vector<string>::iterator I = packages.begin(); I != packages.end(); I++)
+ cout << *I << "\n";
+
+ return true;
+}
/*}}}*/
// ShowPackage - Dump the package record to the screen /*{{{*/
// ---------------------------------------------------------------------
@@ -1417,11 +1444,15 @@ bool ShowPackage(CommandLine &CmdL)
for (const char **I = CmdL.FileList + 1; *I != 0; I++)
{
+ // FIXME: Handle the case in which pkgname name:arch is not found
pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
if (Pkg.end() == true)
{
- _error->Warning(_("Unable to locate package %s"),*I);
- continue;
+ Pkg = Cache.FindPkg(*I, "any");
+ if (Pkg.end() == true) {
+ _error->Warning(_("Unable to locate package %s"),*I);
+ continue;
+ }
}
++found;
@@ -1457,16 +1488,17 @@ bool ShowPackage(CommandLine &CmdL)
bool ShowPkgNames(CommandLine &CmdL)
{
pkgCache &Cache = *GCache;
- pkgCache::PkgIterator I = Cache.PkgBegin();
- bool All = _config->FindB("APT::Cache::AllNames","false");
-
+ pkgCache::GrpIterator I = Cache.GrpBegin();
+ bool const All = _config->FindB("APT::Cache::AllNames","false");
+
if (CmdL.FileList[1] != 0)
{
for (;I.end() != true; I++)
{
- if (All == false && I->VersionList == 0)
+ if (All == false && I->FirstPackage == 0)
+ continue;
+ if (I.FindPkg("any")->VersionList == 0)
continue;
-
if (strncmp(I.Name(),CmdL.FileList[1],strlen(CmdL.FileList[1])) == 0)
cout << I.Name() << endl;
}
@@ -1477,7 +1509,9 @@ bool ShowPkgNames(CommandLine &CmdL)
// Show all pkgs
for (;I.end() != true; I++)
{
- if (All == false && I->VersionList == 0)
+ if (All == false && I->FirstPackage == 0)
+ continue;
+ if (I.FindPkg("any")->VersionList == 0)
continue;
cout << I.Name() << endl;
}
@@ -1565,7 +1599,7 @@ bool Policy(CommandLine &CmdL)
continue;
// Print the package name and the version we are forcing to
- cout << " " << I.Name() << " -> ";
+ cout << " " << I.FullName(true) << " -> ";
pkgCache::VerIterator V = Plcy.GetMatch(I);
if (V.end() == true)
@@ -1576,28 +1610,43 @@ bool Policy(CommandLine &CmdL)
return true;
}
-
+
+ string const myArch = _config->Find("APT::Architecture");
+ char const * const msgInstalled = _(" Installed: ");
+ char const * const msgCandidate = _(" Candidate: ");
+ short const InstalledLessCandidate =
+ mbstowcs(NULL, msgInstalled, 0) - mbstowcs(NULL, msgCandidate, 0);
+ short const deepInstalled =
+ (InstalledLessCandidate < 0 ? (InstalledLessCandidate*-1) : 0) - 1;
+ short const deepCandidate =
+ (InstalledLessCandidate > 0 ? (InstalledLessCandidate) : 0) - 1;
+
// Print out detailed information for each package
for (const char **I = CmdL.FileList + 1; *I != 0; I++)
{
- pkgCache::PkgIterator Pkg = Cache.FindPkg(*I);
+ pkgCache::GrpIterator Grp = Cache.FindGrp(*I);
+ pkgCache::PkgIterator Pkg = Grp.FindPkg("any");
if (Pkg.end() == true)
{
_error->Warning(_("Unable to locate package %s"),*I);
continue;
}
-
- cout << Pkg.Name() << ":" << endl;
-
+
+ for (; Pkg.end() != true; Pkg = Grp.NextPkg(Pkg)) {
+ if (strcmp(Pkg.Arch(),"all") == 0)
+ continue;
+
+ cout << Pkg.FullName(true) << ":" << endl;
+
// Installed version
- cout << _(" Installed: ");
+ cout << msgInstalled << OutputInDepth(deepInstalled, " ");
if (Pkg->CurrentVer == 0)
cout << _("(none)") << endl;
else
cout << Pkg.CurrentVer().VerStr() << endl;
// Candidate Version
- cout << _(" Candidate: ");
+ cout << msgCandidate << OutputInDepth(deepCandidate, " ");
pkgCache::VerIterator V = Plcy.GetCandidateVer(Pkg);
if (V.end() == true)
cout << _("(none)") << endl;
@@ -1633,8 +1682,9 @@ bool Policy(CommandLine &CmdL)
return _error->Error(_("Cache is out of sync, can't x-ref a package file"));
printf(" %4i %s\n",Plcy.GetPriority(VF.File()),
Indx->Describe(true).c_str());
- }
- }
+ }
+ }
+ }
}
return true;
@@ -1684,7 +1734,7 @@ bool Madison(CommandLine &CmdL)
{
if ((*IF)->FindInCache(*(VF.File().Cache())) == VF.File())
{
- cout << setw(10) << Pkg.Name() << " | " << setw(10) << V.VerStr() << " | "
+ cout << setw(10) << Pkg.FullName(true) << " | " << setw(10) << V.VerStr() << " | "
<< (*IF)->Describe(true) << endl;
}
}
@@ -1752,6 +1802,7 @@ bool ShowHelp(CommandLine &Cmd)
" unmet - Show unmet dependencies\n"
" search - Search the package list for a regex pattern\n"
" show - Show a readable record for the package\n"
+ " showauto - Display a list of automatically installed packages\n"
" depends - Show raw dependency information for a package\n"
" rdepends - Show reverse dependency information for a package\n"
" pkgnames - List the names of all packages in the system\n"
@@ -1816,6 +1867,7 @@ int main(int argc,const char *argv[]) /*{{{*/
{"xvcg",&XVcg},
{"show",&ShowPackage},
{"pkgnames",&ShowPkgNames},
+ {"showauto",&ShowAuto},
{"policy",&Policy},
{"madison",&Madison},
{0,0}};
diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc
index 3c90354b0..44235e358 100644
--- a/cmdline/apt-get.cc
+++ b/cmdline/apt-get.cc
@@ -258,8 +258,8 @@ void ShowBroken(ostream &out,CacheFile &Cache,bool Now)
}
// Print out each package and the failed dependencies
- out <<" " << I.Name() << ":";
- unsigned Indent = strlen(I.Name()) + 3;
+ out << " " << I.FullName(true) << " :";
+ unsigned const Indent = I.FullName(true).size() + 3;
bool First = true;
pkgCache::VerIterator Ver;
@@ -312,7 +312,7 @@ void ShowBroken(ostream &out,CacheFile &Cache,bool Now)
out << ' ' << End.DepType() << ": ";
FirstOr = false;
- out << Start.TargetPkg().Name();
+ out << Start.TargetPkg().FullName(true);
// Show a quick summary of the version requirements
if (Start.TargetVer() != 0)
@@ -374,7 +374,9 @@ void ShowNew(ostream &out,CacheFile &Cache)
{
pkgCache::PkgIterator I(Cache,Cache.List[J]);
if (Cache[I].NewInstall() == true) {
- List += string(I.Name()) + " ";
+ if (Cache[I].CandidateVerIter(Cache).Pseudo() == true)
+ continue;
+ List += I.FullName(true) + " ";
VersionsList += string(Cache[I].CandVersion) + "\n";
}
}
@@ -396,10 +398,12 @@ void ShowDel(ostream &out,CacheFile &Cache)
pkgCache::PkgIterator I(Cache,Cache.List[J]);
if (Cache[I].Delete() == true)
{
+ if (Cache[I].CandidateVerIter(Cache).Pseudo() == true)
+ continue;
if ((Cache[I].iFlags & pkgDepCache::Purge) == pkgDepCache::Purge)
- List += string(I.Name()) + "* ";
+ List += I.FullName(true) + "* ";
else
- List += string(I.Name()) + " ";
+ List += I.FullName(true) + " ";
VersionsList += string(Cache[I].CandVersion)+ "\n";
}
@@ -424,7 +428,7 @@ void ShowKept(ostream &out,CacheFile &Cache)
I->CurrentVer == 0 || Cache[I].Delete() == true)
continue;
- List += string(I.Name()) + " ";
+ List += I.FullName(true) + " ";
VersionsList += string(Cache[I].CurVersion) + " => " + Cache[I].CandVersion + "\n";
}
ShowList(out,_("The following packages have been kept back:"),List,VersionsList);
@@ -444,8 +448,10 @@ void ShowUpgraded(ostream &out,CacheFile &Cache)
// Not interesting
if (Cache[I].Upgrade() == false || Cache[I].NewInstall() == true)
continue;
-
- List += string(I.Name()) + " ";
+ if (Cache[I].CandidateVerIter(Cache).Pseudo() == true)
+ continue;
+
+ List += I.FullName(true) + " ";
VersionsList += string(Cache[I].CurVersion) + " => " + Cache[I].CandVersion + "\n";
}
ShowList(out,_("The following packages will be upgraded:"),List,VersionsList);
@@ -465,8 +471,10 @@ bool ShowDowngraded(ostream &out,CacheFile &Cache)
// Not interesting
if (Cache[I].Downgrade() == false || Cache[I].NewInstall() == true)
continue;
-
- List += string(I.Name()) + " ";
+ if (Cache[I].CandidateVerIter(Cache).Pseudo() == true)
+ continue;
+
+ List += I.FullName(true) + " ";
VersionsList += string(Cache[I].CurVersion) + " => " + Cache[I].CandVersion + "\n";
}
return ShowList(out,_("The following packages will be DOWNGRADED:"),List,VersionsList);
@@ -484,7 +492,7 @@ bool ShowHold(ostream &out,CacheFile &Cache)
pkgCache::PkgIterator I(Cache,Cache.List[J]);
if (Cache[I].InstallVer != (pkgCache::Version *)I.CurrentVer() &&
I->SelectedState == pkgCache::State::Hold) {
- List += string(I.Name()) + " ";
+ List += I.FullName(true) + " ";
VersionsList += string(Cache[I].CurVersion) + " => " + Cache[I].CandVersion + "\n";
}
}
@@ -518,7 +526,7 @@ bool ShowEssential(ostream &out,CacheFile &Cache)
if (Added[I->ID] == false)
{
Added[I->ID] = true;
- List += string(I.Name()) + " ";
+ List += I.FullName(true) + " ";
//VersionsList += string(Cache[I].CurVersion) + "\n"; ???
}
}
@@ -542,7 +550,7 @@ bool ShowEssential(ostream &out,CacheFile &Cache)
Added[P->ID] = true;
char S[300];
- snprintf(S,sizeof(S),_("%s (due to %s) "),P.Name(),I.Name());
+ snprintf(S,sizeof(S),_("%s (due to %s) "),P.FullName(true).c_str(),I.FullName(true).c_str());
List += S;
//VersionsList += "\n"; ???
}
@@ -566,6 +574,9 @@ void Stats(ostream &out,pkgDepCache &Dep)
unsigned long ReInstall = 0;
for (pkgCache::PkgIterator I = Dep.PkgBegin(); I.end() == false; I++)
{
+ if (pkgCache::VerIterator(Dep, Dep[I].CandidateVer).Pseudo() == true)
+ continue;
+
if (Dep[I].NewInstall() == true)
Install++;
else
@@ -681,7 +692,7 @@ bool CacheFile::CheckDeps(bool AllowBroken)
}
else
{
- c1out << _("You might want to run `apt-get -f install' to correct these.") << endl;
+ c1out << _("You might want to run 'apt-get -f install' to correct these.") << endl;
ShowBroken(c1out,*this,true);
return _error->Error(_("Unmet dependencies. Try using -f."));
@@ -800,20 +811,19 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,
pkgRecords Recs(Cache);
if (_error->PendingError() == true)
return false;
-
- // Lock the archive directory
- FileFd Lock;
- if (_config->FindB("Debug::NoLocking",false) == false &&
- _config->FindB("APT::Get::Print-URIs") == false)
- {
- Lock.Fd(GetLock(_config->FindDir("Dir::Cache::Archives") + "lock"));
- if (_error->PendingError() == true)
- return _error->Error(_("Unable to lock the download directory"));
- }
-
+
// Create the download object
+ pkgAcquire Fetcher;
AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));
- pkgAcquire Fetcher(&Stat);
+ if (_config->FindB("APT::Get::Print-URIs", false) == true)
+ {
+ // force a hashsum for compatibility reasons
+ _config->CndSet("Acquire::ForceHash", "md5sum");
+ if (Fetcher.Setup(&Stat, "") == false)
+ return false;
+ }
+ else if (Fetcher.Setup(&Stat, _config->FindDir("Dir::Cache::Archives")) == false)
+ return false;
// Read the source list
pkgSourceList List;
@@ -1034,7 +1044,7 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,
if (Res == pkgPackageManager::Failed || _error->PendingError() == true)
return false;
if (Res == pkgPackageManager::Completed)
- return true;
+ break;
// Reload the fetcher object and loop again for media swapping
Fetcher.Shutdown();
@@ -1042,7 +1052,24 @@ bool InstallPackages(CacheFile &Cache,bool ShwKept,bool Ask = true,
return false;
_system->Lock();
- }
+ }
+
+ std::set<std::string> const disappearedPkgs = PM->GetDisappearedPackages();
+ if (disappearedPkgs.empty() == true)
+ return true;
+
+ string disappear;
+ for (std::set<std::string>::const_iterator d = disappearedPkgs.begin();
+ d != disappearedPkgs.end(); ++d)
+ disappear.append(*d).append(" ");
+
+ ShowList(c1out, P_("The following package disappeared from your system as\n"
+ "all files have been overwritten by other packages:",
+ "The following packages disappeared from your system as\n"
+ "all files have been overwritten by other packages:", disappearedPkgs.size()), disappear, "");
+ c0out << _("Note: This is done automatic and on purpose by dpkg.") << std::endl;
+
+ return true;
}
/*}}}*/
// TryToInstall - Try to install a single package /*{{{*/
@@ -1084,7 +1111,7 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
if (found_one == true)
{
ioprintf(c1out,_("Note, selecting %s instead of %s\n"),
- Prov.Name(),Pkg.Name());
+ Prov.FullName(true).c_str(),Pkg.FullName(true).c_str());
Pkg = Prov;
}
}
@@ -1095,10 +1122,20 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
{
if (AllowFail == true)
ioprintf(c1out,_("Skipping %s, it is already installed and upgrade is not set.\n"),
+ Pkg.FullName(true).c_str());
+ return true;
+ }
+
+ // Ignore request for install if package would be new
+ if (_config->FindB("APT::Get::Only-Upgrade", false) == true &&
+ Pkg->CurrentVer == 0)
+ {
+ if (AllowFail == true)
+ ioprintf(c1out,_("Skipping %s, it is not installed and only upgrades are requested.\n"),
Pkg.Name());
return true;
}
-
+
// Check if there is something at all to install
pkgDepCache::StateCache &State = Cache[Pkg];
if (Remove == true && Pkg->CurrentVer == 0)
@@ -1112,7 +1149,7 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
if (AllowFail == false)
return false;
- ioprintf(c1out,_("Package %s is not installed, so not removed\n"),Pkg.Name());
+ ioprintf(c1out,_("Package %s is not installed, so not removed\n"),Pkg.FullName(true).c_str());
return true;
}
@@ -1124,30 +1161,37 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
if (Pkg->ProvidesList != 0)
{
ioprintf(c1out,_("Package %s is a virtual package provided by:\n"),
- Pkg.Name());
+ Pkg.FullName(true).c_str());
pkgCache::PrvIterator I = Pkg.ProvidesList();
+ unsigned short provider = 0;
for (; I.end() == false; I++)
{
pkgCache::PkgIterator Pkg = I.OwnerPkg();
if (Cache[Pkg].CandidateVerIter(Cache) == I.OwnerVer())
{
+ c1out << " " << Pkg.FullName(true) << " " << I.OwnerVer().VerStr();
if (Cache[Pkg].Install() == true && Cache[Pkg].NewInstall() == false)
- c1out << " " << Pkg.Name() << " " << I.OwnerVer().VerStr() <<
- _(" [Installed]") << endl;
- else
- c1out << " " << Pkg.Name() << " " << I.OwnerVer().VerStr() << endl;
- }
+ c1out << _(" [Installed]");
+ c1out << endl;
+ ++provider;
+ }
}
- c1out << _("You should explicitly select one to install.") << endl;
+ // if we found no candidate which provide this package, show non-candidates
+ if (provider == 0)
+ for (I = Pkg.ProvidesList(); I.end() == false; I++)
+ c1out << " " << I.OwnerPkg().FullName(true) << " " << I.OwnerVer().VerStr()
+ << _(" [Not candidate version]") << endl;
+ else
+ c1out << _("You should explicitly select one to install.") << endl;
}
else
{
ioprintf(c1out,
_("Package %s is not available, but is referred to by another package.\n"
"This may mean that the package is missing, has been obsoleted, or\n"
- "is only available from another source\n"),Pkg.Name());
+ "is only available from another source\n"),Pkg.FullName(true).c_str());
string List;
string VersionsList;
@@ -1161,13 +1205,13 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
if (Seen[Dep.ParentPkg()->ID] == true)
continue;
Seen[Dep.ParentPkg()->ID] = true;
- List += string(Dep.ParentPkg().Name()) + " ";
+ List += Dep.ParentPkg().FullName(true) + " ";
//VersionsList += string(Dep.ParentPkg().CurVersion) + "\n"; ???
}
ShowList(c1out,_("However the following packages replace it:"),List,VersionsList);
}
- _error->Error(_("Package %s has no installation candidate"),Pkg.Name());
+ _error->Error(_("Package %s has no installation candidate"),Pkg.FullName(true).c_str());
return false;
}
@@ -1188,7 +1232,7 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
{
if (Pkg->CurrentVer == 0 || Pkg.CurrentVer().Downloadable() == false)
ioprintf(c1out,_("Reinstallation of %s is not possible, it cannot be downloaded.\n"),
- Pkg.Name());
+ Pkg.FullName(true).c_str());
else
Cache.SetReInstall(Pkg,true);
}
@@ -1196,7 +1240,7 @@ bool TryToInstall(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
{
if (AllowFail == true)
ioprintf(c1out,_("%s is already the newest version.\n"),
- Pkg.Name());
+ Pkg.FullName(true).c_str());
}
}
else
@@ -1225,18 +1269,23 @@ bool TryToChangeVer(pkgCache::PkgIterator Pkg,pkgDepCache &Cache,
{
if (IsRel == true)
return _error->Error(_("Release '%s' for '%s' was not found"),
- VerTag,Pkg.Name());
+ VerTag,Pkg.FullName(true).c_str());
return _error->Error(_("Version '%s' for '%s' was not found"),
- VerTag,Pkg.Name());
+ VerTag,Pkg.FullName(true).c_str());
}
if (strcmp(VerTag,Ver.VerStr()) != 0)
{
ioprintf(c1out,_("Selected version %s (%s) for %s\n"),
- Ver.VerStr(),Ver.RelStr().c_str(),Pkg.Name());
+ Ver.VerStr(),Ver.RelStr().c_str(),Pkg.FullName(true).c_str());
}
Cache.SetCandidateVersion(Ver);
+
+ // Set the all package to the same candidate
+ if (Ver.Pseudo() == true)
+ Cache.SetCandidateVersion(Match.Find(Pkg.Group().FindPkg("all")));
+
return true;
}
/*}}}*/
@@ -1270,12 +1319,30 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
{
if(VerTag.empty() == false || DefRel.empty() == false)
{
+ bool fuzzy = false;
// we have a default release, try to locate the pkg. we do it like
// this because GetCandidateVer() will not "downgrade", that means
// "apt-get source -t stable apt" won't work on a unstable system
- for (pkgCache::VerIterator Ver = Pkg.VersionList();
- Ver.end() == false; Ver++)
+ for (pkgCache::VerIterator Ver = Pkg.VersionList();; Ver++)
{
+ // try first only exact matches, later fuzzy matches
+ if (Ver.end() == true)
+ {
+ if (fuzzy == true)
+ break;
+ fuzzy = true;
+ Ver = Pkg.VersionList();
+ // exit right away from the Pkg.VersionList() loop if we
+ // don't have any versions
+ if (Ver.end() == true)
+ break;
+ }
+ // We match against a concrete version (or a part of this version)
+ if (VerTag.empty() == false &&
+ (fuzzy == true || Cache.VS().CmpVersion(VerTag, Ver.VerStr()) != 0) && // exact match
+ (fuzzy == false || strncmp(VerTag.c_str(), Ver.VerStr(), VerTag.size()) != 0)) // fuzzy match
+ continue;
+
for (pkgCache::VerFileIterator VF = Ver.FileList();
VF.end() == false; VF++)
{
@@ -1288,10 +1355,6 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
pkgCache::Flag::NotSource && Pkg.CurrentVer() != Ver)
continue;
- // We match against a concrete version (or a part of this version)
- if (VerTag.empty() == false && strncmp(VerTag.c_str(), Ver.VerStr(), VerTag.size()) != 0)
- continue;
-
// or we match against a release
if(VerTag.empty() == false ||
(VF.File().Archive() != 0 && VF.File().Archive() == DefRel) ||
@@ -1302,10 +1365,9 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
// no SourcePkg name, so it is the "binary" name
if (Src.empty() == true)
Src = TmpSrc;
- // no Version, so we try the Version of the SourcePkg -
- // and after that the version of the binary package
- if (VerTag.empty() == true)
- VerTag = Parse.SourceVer();
+ // the Version we have is possibly fuzzy or includes binUploads,
+ // so we use the Version of the SourcePkg (empty if same as package)
+ VerTag = Parse.SourceVer();
if (VerTag.empty() == true)
VerTag = Ver.VerStr();
break;
@@ -1371,7 +1433,8 @@ pkgSrcRecords::Parser *FindSrc(const char *Name,pkgRecords &Recs,
const string Ver = Parse->Version();
// Ignore all versions which doesn't fit
- if (VerTag.empty() == false && strncmp(VerTag.c_str(), Ver.c_str(), VerTag.size()) != 0)
+ if (VerTag.empty() == false &&
+ Cache.VS().CmpVersion(VerTag, Ver) != 0) // exact match
continue;
// Newer version or an exact match? Save the hit
@@ -1411,23 +1474,19 @@ bool DoUpdate(CommandLine &CmdL)
if (List.ReadMainList() == false)
return false;
- // Lock the list directory
- FileFd Lock;
- if (_config->FindB("Debug::NoLocking",false) == false)
- {
- Lock.Fd(GetLock(_config->FindDir("Dir::State::Lists") + "lock"));
- if (_error->PendingError() == true)
- return _error->Error(_("Unable to lock the list directory"));
- }
-
// Create the progress
AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));
// Just print out the uris an exit if the --print-uris flag was used
if (_config->FindB("APT::Get::Print-URIs") == true)
{
+ // force a hashsum for compatibility reasons
+ _config->CndSet("Acquire::ForceHash", "md5sum");
+
// get a fetcher
- pkgAcquire Fetcher(&Stat);
+ pkgAcquire Fetcher;
+ if (Fetcher.Setup(&Stat) == false)
+ return false;
// Populate it with the source selection and get all Indexes
// (GetAll=true)
@@ -1491,7 +1550,7 @@ bool DoAutomaticRemove(CacheFile &Cache)
{
if(Pkg.CurrentVer() != 0 || Cache[Pkg].Install())
if(Debug)
- std::cout << "We could delete %s" << Pkg.Name() << std::endl;
+ std::cout << "We could delete %s" << Pkg.FullName(true).c_str() << std::endl;
if (doAutoRemove)
{
@@ -1510,7 +1569,7 @@ bool DoAutomaticRemove(CacheFile &Cache)
// we don't need to fill the strings if we don't need them
if (smallList == false)
{
- autoremovelist += string(Pkg.Name()) + " ";
+ autoremovelist += Pkg.FullName(true) + " ";
autoremoveversions += string(Cache[Pkg].CandVersion) + "\n";
}
}
@@ -1746,11 +1805,14 @@ bool DoInstall(CommandLine &CmdL)
// Run over the matches
bool Hit = false;
- for (Pkg = Cache->PkgBegin(); Pkg.end() == false; Pkg++)
+ for (pkgCache::GrpIterator Grp = Cache->GrpBegin(); Grp.end() == false; ++Grp)
{
- if (regexec(&Pattern,Pkg.Name(),0,0,0) != 0)
+ if (regexec(&Pattern,Grp.Name(),0,0,0) != 0)
continue;
-
+ Pkg = Grp.FindPkg("native");
+ if (unlikely(Pkg.end() == true))
+ continue;
+
ioprintf(c1out,_("Note, selecting %s for regex '%s'\n"),
Pkg.Name(),S);
@@ -1781,10 +1843,11 @@ bool DoInstall(CommandLine &CmdL)
Cache[Pkg].Install() == false &&
(Cache[Pkg].Flags & pkgCache::Flag::Auto) &&
_config->FindB("APT::Get::ReInstall",false) == false &&
+ _config->FindB("APT::Get::Only-Upgrade",false) == false &&
_config->FindB("APT::Get::Download-Only",false) == false)
{
ioprintf(c1out,_("%s set to manually installed.\n"),
- Pkg.Name());
+ Pkg.FullName(true).c_str());
Cache->MarkAuto(Pkg,false);
AutoMarkChanged++;
}
@@ -1796,7 +1859,7 @@ bool DoInstall(CommandLine &CmdL)
packages */
if (BrokenFix == true && Cache->BrokenCount() != 0)
{
- c1out << _("You might want to run `apt-get -f install' to correct these:") << endl;
+ c1out << _("You might want to run 'apt-get -f install' to correct these:") << endl;
ShowBroken(c1out,Cache,false);
return _error->Error(_("Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution)."));
@@ -1853,7 +1916,7 @@ bool DoInstall(CommandLine &CmdL)
break;
if (*J == 0) {
- List += string(I.Name()) + " ";
+ List += I.FullName(true) + " ";
VersionsList += string(Cache[I].CandVersion) + "\n";
}
}
@@ -1889,10 +1952,11 @@ bool DoInstall(CommandLine &CmdL)
for(;;)
{
/* Skip if package is installed already, or is about to be */
- string target = string(Start.TargetPkg().Name()) + " ";
-
- if ((*Start.TargetPkg()).SelectedState == pkgCache::State::Install
- || Cache[Start.TargetPkg()].Install())
+ string target = Start.TargetPkg().FullName(true) + " ";
+ pkgCache::PkgIterator const TarPkg = Start.TargetPkg();
+ if (TarPkg->SelectedState == pkgCache::State::Install ||
+ TarPkg->SelectedState == pkgCache::State::Hold ||
+ Cache[Start.TargetPkg()].Install())
{
foundInstalledInOrGroup=true;
break;
@@ -1967,6 +2031,46 @@ bool DoInstall(CommandLine &CmdL)
return InstallPackages(Cache,false);
}
+
+/* mark packages as automatically/manually installed. */
+bool DoMarkAuto(CommandLine &CmdL)
+{
+ bool Action = true;
+ int AutoMarkChanged = 0;
+ OpTextProgress progress;
+ CacheFile Cache;
+ if (Cache.Open() == false)
+ return false;
+
+ if (strcasecmp(CmdL.FileList[0],"markauto") == 0)
+ Action = true;
+ else if (strcasecmp(CmdL.FileList[0],"unmarkauto") == 0)
+ Action = false;
+
+ for (const char **I = CmdL.FileList + 1; *I != 0; I++)
+ {
+ const char *S = *I;
+ // Locate the package
+ pkgCache::PkgIterator Pkg = Cache->FindPkg(S);
+ if (Pkg.end() == true) {
+ return _error->Error(_("Couldn't find package %s"),S);
+ }
+ else
+ {
+ if (!Action)
+ ioprintf(c1out,_("%s set to manually installed.\n"), Pkg.Name());
+ else
+ ioprintf(c1out,_("%s set to automatically installed.\n"),
+ Pkg.Name());
+
+ Cache->MarkAuto(Pkg,Action);
+ AutoMarkChanged++;
+ }
+ }
+ if (AutoMarkChanged && ! _config->FindB("APT::Get::Simulate",false))
+ return Cache->writeStateFile(NULL);
+ return false;
+}
/*}}}*/
// DoDistUpgrade - Automatic smart upgrader /*{{{*/
// ---------------------------------------------------------------------
@@ -2175,13 +2279,23 @@ bool DoSource(CommandLine &CmdL)
// Create the download object
AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));
- pkgAcquire Fetcher(&Stat);
+ pkgAcquire Fetcher;
+ if (Fetcher.Setup(&Stat) == false)
+ return false;
DscFile *Dsc = new DscFile[CmdL.FileSize()];
// insert all downloaded uris into this set to avoid downloading them
// twice
set<string> queued;
+
+ // Diff only mode only fetches .diff files
+ bool const diffOnly = _config->FindB("APT::Get::Diff-Only", false);
+ // Tar only mode only fetches .tar files
+ bool const tarOnly = _config->FindB("APT::Get::Tar-Only", false);
+ // Dsc only mode only fetches .dsc files
+ bool const dscOnly = _config->FindB("APT::Get::Dsc-Only", false);
+
// Load the requestd sources into the fetcher
unsigned J = 0;
for (const char **I = CmdL.FileList + 1; *I != 0; I++, J++)
@@ -2208,21 +2322,17 @@ bool DoSource(CommandLine &CmdL)
Dsc[J].Version = Last->Version();
Dsc[J].Dsc = flNotDir(I->Path);
}
-
- // Diff only mode only fetches .diff files
- if (_config->FindB("APT::Get::Diff-Only",false) == true &&
- I->Type != "diff")
- continue;
-
- // Tar only mode only fetches .tar files
- if (_config->FindB("APT::Get::Tar-Only",false) == true &&
- I->Type != "tar")
- continue;
- // Dsc only mode only fetches .dsc files
- if (_config->FindB("APT::Get::Dsc-Only",false) == true &&
- I->Type != "dsc")
- continue;
+ // Handle the only options so that multiple can be used at once
+ if (diffOnly == true || tarOnly == true || dscOnly == true)
+ {
+ if ((diffOnly == true && I->Type == "diff") ||
+ (tarOnly == true && I->Type == "tar") ||
+ (dscOnly == true && I->Type == "dsc"))
+ ; // Fine, we want this file downloaded
+ else
+ continue;
+ }
// don't download the same uri twice (should this be moved to
// the fetcher interface itself?)
@@ -2290,6 +2400,7 @@ bool DoSource(CommandLine &CmdL)
{
for (unsigned I = 0; I != J; I++)
ioprintf(cout,_("Fetch source %s\n"),Dsc[I].Package.c_str());
+ delete[] Dsc;
return true;
}
@@ -2300,6 +2411,7 @@ bool DoSource(CommandLine &CmdL)
for (; I != Fetcher.UriEnd(); I++)
cout << '\'' << I->URI << "' " << flNotDir(I->Owner->DestFile) << ' ' <<
I->Owner->FileSize << ' ' << I->Owner->HashSum() << endl;
+ delete[] Dsc;
return true;
}
@@ -2325,6 +2437,7 @@ bool DoSource(CommandLine &CmdL)
if (_config->FindB("APT::Get::Download-only",false) == true)
{
c1out << _("Download complete and in download only mode") << endl;
+ delete[] Dsc;
return true;
}
@@ -2333,6 +2446,7 @@ bool DoSource(CommandLine &CmdL)
if (Process == 0)
{
+ bool const fixBroken = _config->FindB("APT::Get::Fix-Broken", false);
for (unsigned I = 0; I != J; I++)
{
string Dir = Dsc[I].Package + '-' + Cache->VS().UpstreamVersion(Dsc[I].Version.c_str());
@@ -2345,7 +2459,7 @@ bool DoSource(CommandLine &CmdL)
// See if the package is already unpacked
struct stat Stat;
- if (stat(Dir.c_str(),&Stat) == 0 &&
+ if (fixBroken == false && stat(Dir.c_str(),&Stat) == 0 &&
S_ISDIR(Stat.st_mode) != 0)
{
ioprintf(c0out ,_("Skipping unpack of already unpacked source in %s\n"),
@@ -2386,7 +2500,8 @@ bool DoSource(CommandLine &CmdL)
_exit(0);
}
-
+ delete[] Dsc;
+
// Wait for the subprocess
int Status = 0;
while (waitpid(Process,&Status,0) != Process)
@@ -2428,7 +2543,9 @@ bool DoBuildDep(CommandLine &CmdL)
// Create the download object
AcqTextStatus Stat(ScreenWidth,_config->FindI("quiet",0));
- pkgAcquire Fetcher(&Stat);
+ pkgAcquire Fetcher;
+ if (Fetcher.Setup(&Stat) == false)
+ return false;
unsigned J = 0;
for (const char **I = CmdL.FileList + 1; *I != 0; I++, J++)
@@ -2440,7 +2557,7 @@ bool DoBuildDep(CommandLine &CmdL)
// Process the build-dependencies
vector<pkgSrcRecords::Parser::BuildDepRec> BuildDeps;
- if (Last->BuildDepends(BuildDeps, _config->FindB("APT::Get::Arch-Only",false)) == false)
+ if (Last->BuildDepends(BuildDeps, _config->FindB("APT::Get::Arch-Only",true)) == false)
return _error->Error(_("Unable to get build-dependency information for %s"),Src.c_str());
// Also ensure that build-essential packages are present
@@ -2539,7 +2656,7 @@ bool DoBuildDep(CommandLine &CmdL)
for (; Prv.end() != true; Prv++)
{
if (_config->FindB("Debug::BuildDeps",false) == true)
- cout << " Checking provider " << Prv.OwnerPkg().Name() << endl;
+ cout << " Checking provider " << Prv.OwnerPkg().FullName() << endl;
if ((*Cache)[Prv.OwnerPkg()].InstVerIter(*Cache).end() == false)
break;
@@ -2580,7 +2697,7 @@ bool DoBuildDep(CommandLine &CmdL)
if (Prv.end() == false)
{
if (_config->FindB("Debug::BuildDeps",false) == true)
- cout << " Is provided by installed package " << Prv.OwnerPkg().Name() << endl;
+ cout << " Is provided by installed package " << Prv.OwnerPkg().FullName() << endl;
skipAlternatives = hasAlternatives;
continue;
}
@@ -2605,7 +2722,7 @@ bool DoBuildDep(CommandLine &CmdL)
return _error->Error(_("Failed to satisfy %s dependency for %s: Installed package %s is too new"),
Last->BuildDepType((*D).Type),
Src.c_str(),
- Pkg.Name());
+ Pkg.FullName(true).c_str());
}
}
@@ -2654,7 +2771,6 @@ bool DoBuildDep(CommandLine &CmdL)
return true;
}
/*}}}*/
-
// DoMoo - Never Ask, Never Tell /*{{{*/
// ---------------------------------------------------------------------
/* */
@@ -2745,6 +2861,8 @@ bool ShowHelp(CommandLine &CmdL)
" clean - Erase downloaded archive files\n"
" autoclean - Erase old downloaded archive files\n"
" check - Verify that there are no broken dependencies\n"
+ " markauto - Mark the given packages as automatically installed\n"
+ " unmarkauto - Mark the given packages as manually installed\n"
"\n"
"Options:\n"
" -h This help text.\n"
@@ -2823,6 +2941,7 @@ int main(int argc,const char *argv[]) /*{{{*/
{0,"fix-missing","APT::Get::Fix-Missing",0},
{0,"ignore-hold","APT::Ignore-Hold",0},
{0,"upgrade","APT::Get::upgrade",0},
+ {0,"only-upgrade","APT::Get::Only-Upgrade",0},
{0,"force-yes","APT::Get::force-yes",0},
{0,"print-uris","APT::Get::Print-URIs",0},
{0,"diff-only","APT::Get::Diff-Only",0},
@@ -2850,6 +2969,8 @@ int main(int argc,const char *argv[]) /*{{{*/
{"purge",&DoInstall},
{"autoremove",&DoInstall},
{"purge",&DoInstall},
+ {"markauto",&DoMarkAuto},
+ {"unmarkauto",&DoMarkAuto},
{"dist-upgrade",&DoDistUpgrade},
{"dselect-upgrade",&DoDSelectUpgrade},
{"build-dep",&DoBuildDep},
diff --git a/cmdline/apt-mark b/cmdline/apt-mark
index 31383d987..c64d4356c 100755
--- a/cmdline/apt-mark
+++ b/cmdline/apt-mark
@@ -8,7 +8,7 @@ import os.path
try:
import apt_pkg
except ImportError:
- print "Error importing apt_pkg, is python-apt installed?"
+ print >> sys.stderr, "Error importing apt_pkg, is python-apt installed?"
sys.exit(1)
actions = { "markauto" : 1,
@@ -68,6 +68,7 @@ if __name__ == "__main__":
# option parsing
parser = OptionParser()
parser.usage = "%prog [options] {markauto|unmarkauto} packages..."
+ parser.epilog = "apt-mark is deprecated, use apt-get markauto/unmarkauto."
parser.add_option("-f", "--file", action="store", type="string",
dest="filename",
help="read/write a different file")
@@ -76,6 +77,10 @@ if __name__ == "__main__":
help="print verbose status messages to stdout")
(options, args) = parser.parse_args()
+ if not args:
+ parser.print_help()
+ sys.exit(1)
+
# get the state-file
if not options.filename:
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"