Browse Source

merged from lp:~donkult/apt/sid

debian/1.8.y
Michael Vogt 12 years ago
parent
commit
d44b706c2d
  1. 14
      apt-inst/dirstream.cc
  2. 2
      apt-pkg/acquire-item.cc
  3. 247
      apt-pkg/acquire-method.cc
  4. 3
      apt-pkg/acquire-method.h
  5. 11
      apt-pkg/acquire-worker.cc
  6. 35
      apt-pkg/algorithms.cc
  7. 1
      apt-pkg/cacheiterators.h
  8. 26
      apt-pkg/cacheset.h
  9. 88
      apt-pkg/cdrom.cc
  10. 16
      apt-pkg/contrib/cdromutl.cc
  11. 2
      apt-pkg/contrib/error.cc
  12. 8
      apt-pkg/contrib/mmap.cc
  13. 12
      apt-pkg/contrib/netrc.cc
  14. 5
      apt-pkg/deb/debmetaindex.cc
  15. 5
      apt-pkg/deb/dpkgpm.cc
  16. 130
      apt-pkg/depcache.cc
  17. 18
      apt-pkg/orderlist.cc
  18. 44
      apt-pkg/packagemanager.cc
  19. 2
      apt-pkg/packagemanager.h
  20. 32
      apt-pkg/pkgcache.cc
  21. 17
      apt-pkg/policy.cc
  22. 24
      cmdline/apt-cache.cc
  23. 32
      cmdline/apt-get.cc
  24. 101
      cmdline/apt-mark
  25. 373
      cmdline/apt-mark.cc
  26. 9
      cmdline/makefile
  27. 6
      debian/apt-utils.symbols
  28. 3
      debian/apt.lintian-overrides
  29. 83
      debian/apt.symbols
  30. 58
      debian/changelog
  31. 3
      debian/rules
  32. 67
      doc/apt-mark.8.xml
  33. 2
      doc/po/de.po
  34. 33
      methods/http.cc
  35. 4
      po/apt-all.pot
  36. 4
      po/ar.po
  37. 4
      po/ast.po
  38. 4
      po/bg.po
  39. 4
      po/bs.po
  40. 4
      po/ca.po
  41. 4
      po/cs.po
  42. 4
      po/cy.po
  43. 4
      po/da.po
  44. 4
      po/de.po
  45. 4
      po/dz.po
  46. 4
      po/el.po
  47. 4
      po/es.po
  48. 4
      po/eu.po
  49. 4
      po/fi.po
  50. 4
      po/fr.po
  51. 4
      po/gl.po
  52. 4
      po/he.po
  53. 4
      po/hu.po
  54. 4
      po/it.po
  55. 4
      po/ja.po
  56. 4
      po/km.po
  57. 4
      po/ko.po
  58. 4
      po/ku.po
  59. 4
      po/lt.po
  60. 4
      po/mr.po
  61. 4
      po/nb.po
  62. 4
      po/ne.po
  63. 4
      po/nl.po
  64. 4
      po/nn.po
  65. 4
      po/pl.po
  66. 4
      po/pt.po
  67. 4
      po/pt_BR.po
  68. 4
      po/ro.po
  69. 4
      po/ru.po
  70. 4
      po/sk.po
  71. 4
      po/sl.po
  72. 4
      po/sv.po
  73. 4
      po/th.po
  74. 4
      po/tl.po
  75. 4
      po/uk.po
  76. 4
      po/vi.po
  77. 4
      po/zh_CN.po
  78. 4
      po/zh_TW.po
  79. 75
      test/integration/framework
  80. 36
      test/integration/skip-bug-602412-dequote-redirect
  81. 172
      test/integration/test-bug-470115-new-and-tighten-recommends
  82. 6
      test/integration/test-bug-612557-garbage-upgrade
  83. 32
      test/integration/test-bug-618288-multiarch-same-lockstep
  84. 108
      test/integration/test-handling-broken-orgroups
  85. 38
      test/integration/test-ubuntu-bug-761175-remove-purge
  86. 7
      test/testextract.cc
  87. 12
      test/versions.lst

14
apt-inst/dirstream.cc

@ -43,11 +43,17 @@ bool pkgDirStream::DoItem(Item &Itm,int &Fd)
// fchmod deals with umask and fchown sets the ownership
if (fchmod(iFd,Itm.Mode) != 0)
return _error->Errno("fchmod",_("Failed to write file %s"),
Itm.Name);
{
_error->Errno("fchmod",_("Failed to write file %s"), Itm.Name);
close(iFd);
return false;
}
if (fchown(iFd,Itm.UID,Itm.GID) != 0 && errno != EPERM)
return _error->Errno("fchown",_("Failed to write file %s"),
Itm.Name);
{
return _error->Errno("fchown",_("Failed to write file %s"), Itm.Name);
close(iFd);
return false;
}
Fd = iFd;
return true;
}

2
apt-pkg/acquire-item.cc

@ -1645,7 +1645,7 @@ pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
// Select a source
if (QueueNext() == false && _error->PendingError() == false)
_error->Error(_("I wasn't able to locate file for the %s package. "
_error->Error(_("I wasn't able to locate a file for the %s package. "
"This might mean you need to manually fix this package."),
Version.ParentPkg().Name());
}

247
apt-pkg/acquire-method.cc

@ -23,9 +23,7 @@
#include <apt-pkg/hashes.h>
#include <iostream>
#include <stdarg.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/signal.h>
/*}}}*/
@ -36,32 +34,28 @@ using namespace std;
/* This constructs the initialization text */
pkgAcqMethod::pkgAcqMethod(const char *Ver,unsigned long Flags)
{
char S[300] = "";
char *End = S;
strcat(End,"100 Capabilities\n");
sprintf(End+strlen(End),"Version: %s\n",Ver);
std::cout << "100 Capabilities\n"
<< "Version: " << Ver << "\n";
if ((Flags & SingleInstance) == SingleInstance)
strcat(End,"Single-Instance: true\n");
std::cout << "Single-Instance: true\n";
if ((Flags & Pipeline) == Pipeline)
strcat(End,"Pipeline: true\n");
std::cout << "Pipeline: true\n";
if ((Flags & SendConfig) == SendConfig)
strcat(End,"Send-Config: true\n");
std::cout << "Send-Config: true\n";
if ((Flags & LocalOnly) == LocalOnly)
strcat(End,"Local-Only: true\n");
std::cout <<"Local-Only: true\n";
if ((Flags & NeedsCleanup) == NeedsCleanup)
strcat(End,"Needs-Cleanup: true\n");
std::cout << "Needs-Cleanup: true\n";
if ((Flags & Removable) == Removable)
strcat(End,"Removable: true\n");
strcat(End,"\n");
std::cout << "Removable: true\n";
if (write(STDOUT_FILENO,S,strlen(S)) != (signed)strlen(S))
exit(100);
std::cout << "\n" << std::flush;
SetNonBlock(STDIN_FILENO,true);
@ -94,13 +88,11 @@ void pkgAcqMethod::Fail(string Err,bool Transient)
if (*I == '\n')
*I = ' ';
}
char S[1024];
char *End = S;
if (Queue != 0)
{
End += snprintf(S,sizeof(S)-50,"400 URI Failure\nURI: %s\n"
"Message: %s %s\n",Queue->Uri.c_str(), Err.c_str(), IP.c_str());
std::cout << "400 URI Failure\nURI: " << Queue->Uri << "\n"
<< "Message: " << Err << " " << IP << "\n";
// Dequeue
FetchItem *Tmp = Queue;
Queue = Queue->Next;
@ -109,22 +101,17 @@ void pkgAcqMethod::Fail(string Err,bool Transient)
QueueBack = Queue;
}
else
{
End += snprintf(S,sizeof(S)-50,"400 URI Failure\nURI: <UNKNOWN>\n"
"Message: %s\n",Err.c_str());
}
std::cout << "400 URI Failure\nURI: <UNKNOWN>\nMessage: " << Err << "\n";
if(FailReason.empty() == false)
End += snprintf(End,sizeof(S)-50 - (End - S),"FailReason: %s\n",FailReason.c_str());
std::cout << "FailReason: " << FailReason << "\n";
if (UsedMirror.empty() == false)
End += snprintf(End,sizeof(S)-50 - (End - S),"UsedMirror: %s\n",UsedMirror.c_str());
// Set the transient flag
std::cout << "UsedMirror: " << UsedMirror << "\n";
// Set the transient flag
if (Transient == true)
strcat(S,"Transient-Failure: true\n\n");
else
strcat(S,"\n");
if (write(STDOUT_FILENO,S,strlen(S)) != (signed)strlen(S))
exit(100);
std::cout << "Transient-Failure: true\n";
std::cout << "\n" << std::flush;
}
/*}}}*/
// AcqMethod::URIStart - Indicate a download is starting /*{{{*/
@ -134,27 +121,22 @@ void pkgAcqMethod::URIStart(FetchResult &Res)
{
if (Queue == 0)
abort();
char S[1024] = "";
char *End = S;
End += snprintf(S,sizeof(S),"200 URI Start\nURI: %s\n",Queue->Uri.c_str());
std::cout << "200 URI Start\n"
<< "URI: " << Queue->Uri << "\n";
if (Res.Size != 0)
End += snprintf(End,sizeof(S)-4 - (End - S),"Size: %lu\n",Res.Size);
std::cout << "Size: " << Res.Size << "\n";
if (Res.LastModified != 0)
End += snprintf(End,sizeof(S)-4 - (End - S),"Last-Modified: %s\n",
TimeRFC1123(Res.LastModified).c_str());
std::cout << "Last-Modified: " << TimeRFC1123(Res.LastModified) << "\n";
if (Res.ResumePoint != 0)
End += snprintf(End,sizeof(S)-4 - (End - S),"Resume-Point: %lu\n",
Res.ResumePoint);
std::cout << "Resume-Point: " << Res.ResumePoint << "\n";
if (UsedMirror.empty() == false)
End += snprintf(End,sizeof(S)-4 - (End - S),"UsedMirror: %s\n",UsedMirror.c_str());
strcat(End,"\n");
if (write(STDOUT_FILENO,S,strlen(S)) != (signed)strlen(S))
exit(100);
std::cout << "UsedMirror: " << UsedMirror << "\n";
std::cout << "\n" << std::flush;
}
/*}}}*/
// AcqMethod::URIDone - A URI is finished /*{{{*/
@ -164,76 +146,65 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt)
{
if (Queue == 0)
abort();
char S[1024] = "";
char *End = S;
End += snprintf(S,sizeof(S),"201 URI Done\nURI: %s\n",Queue->Uri.c_str());
std::cout << "201 URI Done\n"
<< "URI: " << Queue->Uri << "\n";
if (Res.Filename.empty() == false)
End += snprintf(End,sizeof(S)-50 - (End - S),"Filename: %s\n",Res.Filename.c_str());
std::cout << "Filename: " << Res.Filename << "\n";
if (Res.Size != 0)
End += snprintf(End,sizeof(S)-50 - (End - S),"Size: %lu\n",Res.Size);
std::cout << "Size: " << Res.Size << "\n";
if (Res.LastModified != 0)
End += snprintf(End,sizeof(S)-50 - (End - S),"Last-Modified: %s\n",
TimeRFC1123(Res.LastModified).c_str());
std::cout << "Last-Modified: " << TimeRFC1123(Res.LastModified) << "\n";
if (Res.MD5Sum.empty() == false)
{
End += snprintf(End,sizeof(S)-50 - (End - S),"MD5-Hash: %s\n",Res.MD5Sum.c_str());
End += snprintf(End,sizeof(S)-50 - (End - S),"MD5Sum-Hash: %s\n",Res.MD5Sum.c_str());
}
std::cout << "MD5-Hash: " << Res.MD5Sum << "\n"
<< "MD5Sum-Hash: " << Res.MD5Sum << "\n";
if (Res.SHA1Sum.empty() == false)
End += snprintf(End,sizeof(S)-50 - (End - S),"SHA1-Hash: %s\n",Res.SHA1Sum.c_str());
std::cout << "SHA1-Hash: " << Res.SHA1Sum << "\n";
if (Res.SHA256Sum.empty() == false)
End += snprintf(End,sizeof(S)-50 - (End - S),"SHA256-Hash: %s\n",Res.SHA256Sum.c_str());
std::cout << "SHA256-Hash: " << Res.SHA256Sum << "\n";
if (UsedMirror.empty() == false)
End += snprintf(End,sizeof(S)-50 - (End - S),"UsedMirror: %s\n",UsedMirror.c_str());
if (Res.GPGVOutput.size() > 0)
End += snprintf(End,sizeof(S)-50 - (End - S),"GPGVOutput:\n");
for (vector<string>::iterator I = Res.GPGVOutput.begin();
I != Res.GPGVOutput.end(); I++)
End += snprintf(End,sizeof(S)-50 - (End - S), " %s\n", (*I).c_str());
std::cout << "UsedMirror: " << UsedMirror << "\n";
if (Res.GPGVOutput.empty() == false)
{
std::cout << "GPGVOutput:\n";
for (vector<string>::const_iterator I = Res.GPGVOutput.begin();
I != Res.GPGVOutput.end(); ++I)
std::cout << " " << *I << "\n";
}
if (Res.ResumePoint != 0)
End += snprintf(End,sizeof(S)-50 - (End - S),"Resume-Point: %lu\n",
Res.ResumePoint);
std::cout << "Resume-Point: " << Res.ResumePoint << "\n";
if (Res.IMSHit == true)
strcat(End,"IMS-Hit: true\n");
End = S + strlen(S);
std::cout << "IMS-Hit: true\n";
if (Alt != 0)
{
if (Alt->Filename.empty() == false)
End += snprintf(End,sizeof(S)-50 - (End - S),"Alt-Filename: %s\n",Alt->Filename.c_str());
std::cout << "Alt-Filename: " << Alt->Filename << "\n";
if (Alt->Size != 0)
End += snprintf(End,sizeof(S)-50 - (End - S),"Alt-Size: %lu\n",Alt->Size);
std::cout << "Alt-Size: " << Alt->Size << "\n";
if (Alt->LastModified != 0)
End += snprintf(End,sizeof(S)-50 - (End - S),"Alt-Last-Modified: %s\n",
TimeRFC1123(Alt->LastModified).c_str());
std::cout << "Alt-Last-Modified: " << TimeRFC1123(Alt->LastModified) << "\n";
if (Alt->MD5Sum.empty() == false)
End += snprintf(End,sizeof(S)-50 - (End - S),"Alt-MD5-Hash: %s\n",
Alt->MD5Sum.c_str());
std::cout << "Alt-MD5-Hash: " << Alt->MD5Sum << "\n";
if (Alt->SHA1Sum.empty() == false)
End += snprintf(End,sizeof(S)-50 - (End - S),"Alt-SHA1-Hash: %s\n",
Alt->SHA1Sum.c_str());
std::cout << "Alt-SHA1-Hash: " << Alt->SHA1Sum << "\n";
if (Alt->SHA256Sum.empty() == false)
End += snprintf(End,sizeof(S)-50 - (End - S),"Alt-SHA256-Hash: %s\n",
Alt->SHA256Sum.c_str());
std::cout << "Alt-SHA256-Hash: " << Alt->SHA256Sum << "\n";
if (Alt->IMSHit == true)
strcat(End,"Alt-IMS-Hit: true\n");
std::cout << "Alt-IMS-Hit: true\n";
}
strcat(End,"\n");
if (write(STDOUT_FILENO,S,strlen(S)) != (signed)strlen(S))
exit(100);
std::cout << "\n" << std::flush;
// Dequeue
FetchItem *Tmp = Queue;
@ -249,13 +220,10 @@ void pkgAcqMethod::URIDone(FetchResult &Res, FetchResult *Alt)
to be ackd */
bool pkgAcqMethod::MediaFail(string Required,string Drive)
{
char S[1024];
snprintf(S,sizeof(S),"403 Media Failure\nMedia: %s\nDrive: %s\n\n",
fprintf(stdout, "403 Media Failure\nMedia: %s\nDrive: %s\n",
Required.c_str(),Drive.c_str());
std::cout << "\n" << std::flush;
if (write(STDOUT_FILENO,S,strlen(S)) != (signed)strlen(S))
exit(100);
vector<string> MyMessages;
/* Here we read messages until we find a 603, each non 603 message is
@ -406,30 +374,34 @@ int pkgAcqMethod::Run(bool Single)
return 0;
}
/*}}}*/
// AcqMethod::Log - Send a log message /*{{{*/
// AcqMethod::PrintStatus - privately really send a log/status message /*{{{*/
// ---------------------------------------------------------------------
/* */
void pkgAcqMethod::Log(const char *Format,...)
void pkgAcqMethod::PrintStatus(char const * const header, const char* Format,
va_list &args) const
{
string CurrentURI = "<UNKNOWN>";
if (Queue != 0)
CurrentURI = Queue->Uri;
if (UsedMirror.empty() == true)
fprintf(stdout, "%s\nURI: %s\nMessage: ",
header, CurrentURI.c_str());
else
fprintf(stdout, "%s\nURI: %s\nUsedMirror: %s\nMessage: ",
header, CurrentURI.c_str(), UsedMirror.c_str());
vfprintf(stdout,Format,args);
std::cout << "\n\n" << std::flush;
}
/*}}}*/
// AcqMethod::Log - Send a log message /*{{{*/
// ---------------------------------------------------------------------
/* */
void pkgAcqMethod::Log(const char *Format,...)
{
va_list args;
va_start(args,Format);
// sprintf the description
char S[1024];
unsigned int Len = snprintf(S,sizeof(S)-4,"101 Log\n"
"URI: %s\n"
"UsedMirror: %s\n"
"Message: ", UsedMirror.c_str(),
CurrentURI.c_str());
vsnprintf(S+Len,sizeof(S)-4-Len,Format,args);
strcat(S,"\n\n");
if (write(STDOUT_FILENO,S,strlen(S)) != (signed)strlen(S))
exit(100);
PrintStatus("101 Log", Format, args);
va_end(args);
}
/*}}}*/
// AcqMethod::Status - Send a status message /*{{{*/
@ -437,26 +409,10 @@ void pkgAcqMethod::Log(const char *Format,...)
/* */
void pkgAcqMethod::Status(const char *Format,...)
{
string CurrentURI = "<UNKNOWN>";
if (Queue != 0)
CurrentURI = Queue->Uri;
va_list args;
va_start(args,Format);
// sprintf the description
char S[1024];
unsigned int Len = snprintf(S,sizeof(S)-4,"102 Status\n"
"URI: %s\n"
"UsedMirror: %s\n"
"Message: ",UsedMirror.c_str(),
CurrentURI.c_str());
vsnprintf(S+Len,sizeof(S)-4-Len,Format,args);
strcat(S,"\n\n");
if (write(STDOUT_FILENO,S,strlen(S)) != (signed)strlen(S))
exit(100);
PrintStatus("102 Status", Format, args);
va_end(args);
}
/*}}}*/
// AcqMethod::Redirect - Send a redirect message /*{{{*/
@ -465,16 +421,13 @@ void pkgAcqMethod::Status(const char *Format,...)
to keep the pipeline synchronized. */
void pkgAcqMethod::Redirect(const string &NewURI)
{
string CurrentURI = "<UNKNOWN>";
std::cout << "103 Redirect\nURI: ";
if (Queue != 0)
CurrentURI = Queue->Uri;
char S[1024];
snprintf(S, sizeof(S)-50, "103 Redirect\nURI: %s\nNew-URI: %s\n\n",
CurrentURI.c_str(), NewURI.c_str());
if (write(STDOUT_FILENO,S,strlen(S)) != (ssize_t)strlen(S))
exit(100);
std::cout << Queue->Uri << "\n";
else
std::cout << "<UNKNOWN>\n";
std::cout << "New-URI: " << NewURI << "\n"
<< "\n" << std::flush;
// Change the URI for the request.
Queue->Uri = NewURI;

3
apt-pkg/acquire-method.h

@ -23,6 +23,7 @@
#include <apt-pkg/configuration.h>
#include <apt-pkg/strutl.h>
#include <stdarg.h>
class Hashes;
class pkgAcqMethod
@ -78,6 +79,8 @@ class pkgAcqMethod
bool MediaFail(string Required,string Drive);
virtual void Exit() {};
void PrintStatus(char const * const header, const char* Format, va_list &args) const;
public:
enum CnfFlags {SingleInstance = (1<<0),
Pipeline = (1<<1), SendConfig = (1<<2),

11
apt-pkg/acquire-worker.cc

@ -287,10 +287,10 @@ bool pkgAcquire::Worker::RunMessages()
Log->Pulse(Owner->GetOwner());
OwnerQ->ItemDone(Itm);
if (TotalSize != 0 &&
(unsigned)atoi(LookupTag(Message,"Size","0").c_str()) != TotalSize)
_error->Warning("Bizarre Error - File size is not what the server reported %s %lu",
LookupTag(Message,"Size","0").c_str(),TotalSize);
unsigned long const ServerSize = atol(LookupTag(Message,"Size","0").c_str());
if (TotalSize != 0 && ServerSize != TotalSize)
_error->Warning("Size of file %s is not what the server reported %s %lu",
Owner->DestFile.c_str(), LookupTag(Message,"Size","0").c_str(),TotalSize);
// see if there is a hash to verify
string RecivedHash;
@ -309,8 +309,7 @@ bool pkgAcquire::Worker::RunMessages()
<< endl << endl;
}
}
Owner->Done(Message,atoi(LookupTag(Message,"Size","0").c_str()),
RecivedHash.c_str(), Config);
Owner->Done(Message, ServerSize, RecivedHash.c_str(), Config);
ItemDone();
// Log that we are done

35
apt-pkg/algorithms.cc

@ -101,9 +101,7 @@ bool pkgSimulate::Install(PkgIterator iPkg,string /*File*/)
DepIterator Start;
DepIterator End;
D.GlobOr(Start,End);
if (Start->Type == pkgCache::Dep::Conflicts ||
Start->Type == pkgCache::Dep::DpkgBreaks ||
Start->Type == pkgCache::Dep::Obsoletes ||
if (Start.IsNegative() == true ||
End->Type == pkgCache::Dep::PreDepends)
{
if ((Sim[End] & pkgDepCache::DepGInstall) == 0)
@ -647,12 +645,10 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg)
// Compute a single dependency element (glob or)
pkgCache::DepIterator Start = D;
pkgCache::DepIterator End = D;
unsigned char State = 0;
for (bool LastOR = true; D.end() == false && LastOR == true;)
{
State |= Cache[D];
LastOR = (D->CompareOp & pkgCache::Dep::Or) == pkgCache::Dep::Or;
D++;
++D;
if (LastOR == true)
End = D;
}
@ -697,9 +693,7 @@ bool pkgProblemResolver::DoUpgrade(pkgCache::PkgIterator Pkg)
{
/* We let the algorithm deal with conflicts on its next iteration,
it is much smarter than us */
if (Start->Type == pkgCache::Dep::Conflicts ||
Start->Type == pkgCache::Dep::DpkgBreaks ||
Start->Type == pkgCache::Dep::Obsoletes)
if (Start.IsNegative() == true)
break;
if (Debug == true)
@ -928,9 +922,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
if a package has a dep on another package that cant be found */
SPtrArray<pkgCache::Version *> VList = Start.AllTargets();
if (*VList == 0 && (Flags[I->ID] & Protected) != Protected &&
Start->Type != pkgCache::Dep::Conflicts &&
Start->Type != pkgCache::Dep::DpkgBreaks &&
Start->Type != pkgCache::Dep::Obsoletes &&
Start.IsNegative() == false &&
Cache[I].NowBroken() == false)
{
if (InOr == true)
@ -955,10 +947,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
at is not the currently selected version of the
package, which means it is not necessary to
remove/keep */
if (Cache[Pkg].InstallVer != Ver &&
(Start->Type == pkgCache::Dep::Conflicts ||
Start->Type == pkgCache::Dep::DpkgBreaks ||
Start->Type == pkgCache::Dep::Obsoletes))
if (Cache[Pkg].InstallVer != Ver && Start.IsNegative() == true)
{
if (Debug)
clog << " Conflicts//Breaks against version "
@ -976,9 +965,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
fiddle with the VList package */
if (Scores[I->ID] <= Scores[Pkg->ID] ||
((Cache[Start] & pkgDepCache::DepNow) == 0 &&
End->Type != pkgCache::Dep::Conflicts &&
End->Type != pkgCache::Dep::DpkgBreaks &&
End->Type != pkgCache::Dep::Obsoletes))
End.IsNegative() == false))
{
// Try a little harder to fix protected packages..
if ((Flags[I->ID] & Protected) == Protected)
@ -1085,10 +1072,8 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
}
// Hm, nothing can possibly satisify this dep. Nuke it.
if (VList[0] == 0 &&
Start->Type != pkgCache::Dep::Conflicts &&
Start->Type != pkgCache::Dep::DpkgBreaks &&
Start->Type != pkgCache::Dep::Obsoletes &&
if (VList[0] == 0 &&
Start.IsNegative() == false &&
(Flags[I->ID] & Protected) != Protected)
{
bool Installed = Cache[I].Install();
@ -1134,9 +1119,7 @@ bool pkgProblemResolver::Resolve(bool BrokenFix)
Change = true;
if ((Cache[J->Dep] & pkgDepCache::DepGNow) == 0)
{
if (J->Dep->Type == pkgCache::Dep::Conflicts ||
J->Dep->Type == pkgCache::Dep::DpkgBreaks ||
J->Dep->Type == pkgCache::Dep::Obsoletes)
if (J->Dep.IsNegative() == true)
{
if (Debug == true)
clog << " Fixing " << I.FullName(false) << " via remove of " << J->Pkg.FullName(false) << endl;

1
apt-pkg/cacheiterators.h

@ -287,6 +287,7 @@ class pkgCache::DepIterator : public Iterator<Dependency, DepIterator> {
inline PkgIterator ParentPkg() const {return PkgIterator(*Owner,Owner->PkgP + Owner->VerP[S->ParentVer].ParentPkg);};
inline bool Reverse() const {return Type == DepRev;};
bool IsCritical() const;
bool IsNegative() const;
void GlobOr(DepIterator &Start,DepIterator &End);
Version **AllTargets() const;
bool SmartTargetPkg(PkgIterator &Result) const;

26
apt-pkg/cacheset.h

@ -135,7 +135,7 @@ public: /*{{{*/
static APT::PackageSet FromTask(pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper);
static APT::PackageSet FromTask(pkgCacheFile &Cache, std::string const &pattern) {
CacheSetHelper helper;
return APT::PackageSet::FromTask(Cache, pattern, helper);
return FromTask(Cache, pattern, helper);
}
/** \brief returns all packages in the cache whose name matchs a given pattern
@ -149,7 +149,7 @@ public: /*{{{*/
static APT::PackageSet FromRegEx(pkgCacheFile &Cache, std::string pattern, CacheSetHelper &helper);
static APT::PackageSet FromRegEx(pkgCacheFile &Cache, std::string const &pattern) {
CacheSetHelper helper;
return APT::PackageSet::FromRegEx(Cache, pattern, helper);
return FromRegEx(Cache, pattern, helper);
}
/** \brief returns all packages specified by a string
@ -160,7 +160,7 @@ public: /*{{{*/
static APT::PackageSet FromString(pkgCacheFile &Cache, std::string const &string, CacheSetHelper &helper);
static APT::PackageSet FromString(pkgCacheFile &Cache, std::string const &string) {
CacheSetHelper helper;
return APT::PackageSet::FromString(Cache, string, helper);
return FromString(Cache, string, helper);
}
/** \brief returns a package specified by a string
@ -171,7 +171,7 @@ public: /*{{{*/
static pkgCache::PkgIterator FromName(pkgCacheFile &Cache, std::string const &string, CacheSetHelper &helper);
static pkgCache::PkgIterator FromName(pkgCacheFile &Cache, std::string const &string) {
CacheSetHelper helper;
return APT::PackageSet::FromName(Cache, string, helper);
return FromName(Cache, string, helper);
}
/** \brief returns all packages specified on the commandline
@ -184,7 +184,7 @@ public: /*{{{*/
static APT::PackageSet FromCommandLine(pkgCacheFile &Cache, const char **cmdline, CacheSetHelper &helper);
static APT::PackageSet FromCommandLine(pkgCacheFile &Cache, const char **cmdline) {
CacheSetHelper helper;
return APT::PackageSet::FromCommandLine(Cache, cmdline, helper);
return FromCommandLine(Cache, cmdline, helper);
}
struct Modifier {
@ -215,7 +215,7 @@ public: /*{{{*/
std::list<PackageSet::Modifier> const &mods,
unsigned short const &fallback) {
CacheSetHelper helper;
return APT::PackageSet::GroupedFromCommandLine(Cache, cmdline,
return GroupedFromCommandLine(Cache, cmdline,
mods, fallback, helper);
}
@ -309,10 +309,10 @@ public: /*{{{*/
static APT::VersionSet FromCommandLine(pkgCacheFile &Cache, const char **cmdline,
APT::VersionSet::Version const &fallback) {
CacheSetHelper helper;
return APT::VersionSet::FromCommandLine(Cache, cmdline, fallback, helper);
return FromCommandLine(Cache, cmdline, fallback, helper);
}
static APT::VersionSet FromCommandLine(pkgCacheFile &Cache, const char **cmdline) {
return APT::VersionSet::FromCommandLine(Cache, cmdline, CANDINST);
return FromCommandLine(Cache, cmdline, CANDINST);
}
static APT::VersionSet FromString(pkgCacheFile &Cache, std::string pkg,
@ -321,10 +321,10 @@ public: /*{{{*/
static APT::VersionSet FromString(pkgCacheFile &Cache, std::string pkg,
APT::VersionSet::Version const &fallback) {
CacheSetHelper helper;
return APT::VersionSet::FromString(Cache, pkg, fallback, helper);
return FromString(Cache, pkg, fallback, helper);
}
static APT::VersionSet FromString(pkgCacheFile &Cache, std::string pkg) {
return APT::VersionSet::FromString(Cache, pkg, CANDINST);
return FromString(Cache, pkg, CANDINST);
}
/** \brief returns all versions specified for the package
@ -338,10 +338,10 @@ public: /*{{{*/
static APT::VersionSet FromPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &P,
APT::VersionSet::Version const &fallback) {
CacheSetHelper helper;
return APT::VersionSet::FromPackage(Cache, P, fallback, helper);
return FromPackage(Cache, P, fallback, helper);
}
static APT::VersionSet FromPackage(pkgCacheFile &Cache, pkgCache::PkgIterator const &P) {
return APT::VersionSet::FromPackage(Cache, P, CANDINST);
return FromPackage(Cache, P, CANDINST);
}
struct Modifier {
@ -364,7 +364,7 @@ public: /*{{{*/
std::list<VersionSet::Modifier> const &mods,
unsigned short const &fallback) {
CacheSetHelper helper;
return APT::VersionSet::GroupedFromCommandLine(Cache, cmdline,
return GroupedFromCommandLine(Cache, cmdline,
mods, fallback, helper);
}
/*}}}*/

88
apt-pkg/cdrom.cc

@ -155,7 +155,11 @@ bool pkgCdrom::FindPackages(string CD,
break;
if (chdir(CD.c_str()) != 0)
return _error->Errno("chdir","Unable to change to %s",CD.c_str());
{
_error->Errno("chdir","Unable to change to %s", CD.c_str());
closedir(D);
return false;
}
};
closedir(D);
@ -257,8 +261,10 @@ bool pkgCdrom::DropRepeats(vector<string> &List,const char *Name)
Inodes[I] = Buf.st_ino;
}
if (_error->PendingError() == true)
if (_error->PendingError() == true) {
delete[] Inodes;
return false;
}
// Look for dups
for (unsigned int I = 0; I != List.size(); I++)
@ -513,7 +519,8 @@ bool pkgCdrom::Ident(string &ident, pkgCdromStatus *log) /*{{{*/
if (CDROM[0] == '.')
CDROM= SafeGetCWD() + '/' + CDROM;
if(log) {
if (log != NULL)
{
msg.str("");
ioprintf(msg, _("Using CD-ROM mount point %s\nMounting CD-ROM\n"),
CDROM.c_str());
@ -523,7 +530,7 @@ bool pkgCdrom::Ident(string &ident, pkgCdromStatus *log) /*{{{*/
return _error->Error("Failed to mount the cdrom.");
// Hash the CD to get an ID
if(log)
if (log != NULL)
log->Update(_("Identifying.. "));
@ -533,10 +540,12 @@ bool pkgCdrom::Ident(string &ident, pkgCdromStatus *log) /*{{{*/
return false;
}
msg.str("");
ioprintf(msg, "[%s]\n",ident.c_str());
log->Update(msg.str());
if (log != NULL)
{
msg.str("");
ioprintf(msg, "[%s]\n",ident.c_str());
log->Update(msg.str());
}
// Read the database
Configuration Database;
@ -547,7 +556,8 @@ bool pkgCdrom::Ident(string &ident, pkgCdromStatus *log) /*{{{*/
return _error->Error("Unable to read the cdrom database %s",
DFile.c_str());
}
if(log) {
if (log != NULL)
{
msg.str("");
ioprintf(msg, _("Stored label: %s\n"),
Database.Find("CD::"+ident).c_str());
@ -555,8 +565,10 @@ bool pkgCdrom::Ident(string &ident, pkgCdromStatus *log) /*{{{*/
}
// Unmount and finish
if (_config->FindB("APT::CDROM::NoMount",false) == false) {
log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
if (_config->FindB("APT::CDROM::NoMount",false) == false)
{
if (log != NULL)
log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
UnmountCdrom(CDROM);
}
@ -572,7 +584,8 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
if (CDROM[0] == '.')
CDROM= SafeGetCWD() + '/' + CDROM;
if(log) {
if(log != NULL)
{
log->SetTotal(STEP_LAST);
msg.str("");
ioprintf(msg, _("Using CD-ROM mount point %s\n"), CDROM.c_str());
@ -592,11 +605,12 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
// Unmount the CD and get the user to put in the one they want
if (_config->FindB("APT::CDROM::NoMount",false) == false)
{
if(log)
if(log != NULL)
log->Update(_("Unmounting CD-ROM\n"), STEP_UNMOUNT);
UnmountCdrom(CDROM);
if(log) {
if(log != NULL)
{
log->Update(_("Waiting for disc...\n"), STEP_WAIT);
if(!log->ChangeCdrom()) {
// user aborted
@ -605,26 +619,29 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
}
// Mount the new CDROM
log->Update(_("Mounting CD-ROM...\n"), STEP_MOUNT);
if(log != NULL)
log->Update(_("Mounting CD-ROM...\n"), STEP_MOUNT);
if (MountCdrom(CDROM) == false)
return _error->Error("Failed to mount the cdrom.");
}
// Hash the CD to get an ID
if(log)
if(log != NULL)
log->Update(_("Identifying.. "), STEP_IDENT);
string ID;
if (IdentCdrom(CDROM,ID) == false)
{
log->Update("\n");
if (log != NULL)
log->Update("\n");
return false;
}
if(log)
if(log != NULL)
{
log->Update("["+ID+"]\n");
if(log)
log->Update(_("Scanning disc for index files..\n"),STEP_SCAN);
}
// Get the CD structure
vector<string> List;
vector<string> SourceList;
@ -634,7 +651,8 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
string InfoDir;
if (FindPackages(CDROM,List,SourceList, SigList,TransList,InfoDir,log) == false)
{
log->Update("\n");
if (log != NULL)
log->Update("\n");
return false;
}
@ -661,7 +679,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
DropRepeats(SourceList,"Sources");
DropRepeats(SigList,"Release.gpg");
DropRepeats(TransList,"");
if(log) {
if(log != NULL) {
msg.str("");
ioprintf(msg, _("Found %zu package indexes, %zu source indexes, "
"%zu translation indexes and %zu signatures\n"),
@ -698,7 +716,8 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
if (*J == '"' || *J == ']' || *J == '[')
*J = '_';
if(log) {
if(log != NULL)
{
msg.str("");
ioprintf(msg, _("Found label '%s'\n"), Name.c_str());
log->Update(msg.str());
@ -710,7 +729,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
if (_config->FindB("APT::CDROM::Rename",false) == true ||
Name.empty() == true)
{
if(!log)
if(log == NULL)
{
if (_config->FindB("APT::CDROM::NoMount",false) == false)
UnmountCdrom(CDROM);
@ -743,13 +762,13 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
*J = '_';
Database.Set("CD::" + ID,Name);
if(log) {
if(log != NULL)
{
msg.str("");
ioprintf(msg, _("This disc is called: \n'%s'\n"), Name.c_str());
log->Update(msg.str());
log->Update(_("Copying package lists..."), STEP_COPY);
}
log->Update(_("Copying package lists..."), STEP_COPY);
// take care of the signatures and copy them if they are ok
// (we do this before PackageCopy as it modifies "List" and "SourceList")
SigVerify SignVerify;
@ -774,16 +793,15 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
if (WriteDatabase(Database) == false)
return false;
if(log) {
if(log != NULL)
log->Update(_("Writing new source list\n"), STEP_WRITE);
}
if (WriteSourceList(Name,List,false) == false ||
WriteSourceList(Name,SourceList,true) == false)
return false;
}
// Print the sourcelist entries
if(log)
if(log != NULL)
log->Update(_("Source list entries for this disc are:\n"));
for (vector<string>::iterator I = List.begin(); I != List.end(); I++)
@ -796,7 +814,8 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
return _error->Error("Internal error");
}
if(log) {
if(log != NULL)
{
msg.str("");
msg << "deb cdrom:[" << Name << "]/" << string(*I,0,Space) <<
" " << string(*I,Space+1) << endl;
@ -814,7 +833,7 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
return _error->Error("Internal error");
}
if(log) {
if(log != NULL) {
msg.str("");
msg << "deb-src cdrom:[" << Name << "]/" << string(*I,0,Space) <<
" " << string(*I,Space+1) << endl;
@ -824,7 +843,8 @@ bool pkgCdrom::Add(pkgCdromStatus *log) /*{{{*/
// Unmount and finish
if (_config->FindB("APT::CDROM::NoMount",false) == false) {
log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
if (log != NULL)
log->Update(_("Unmounting CD-ROM...\n"), STEP_LAST);
UnmountCdrom(CDROM);
}

16
apt-pkg/contrib/cdromutl.cc

@ -20,7 +20,6 @@
#include <apti18n.h>
#include <sys/wait.h>
#include <sys/errno.h>
#include <sys/statvfs.h>
#include <dirent.h>
#include <fcntl.h>
@ -206,8 +205,11 @@ bool IdentCdrom(string CD,string &Res,unsigned int Version)
Hash.Add(Dir->d_name);
};
if (chdir(StartDir.c_str()) != 0)
return _error->Errno("chdir",_("Unable to change to %s"),StartDir.c_str());
if (chdir(StartDir.c_str()) != 0) {
_error->Errno("chdir",_("Unable to change to %s"),StartDir.c_str());
closedir(D);
return false;
}
closedir(D);
// Some stats from the fsys
@ -236,7 +238,7 @@ bool IdentCdrom(string CD,string &Res,unsigned int Version)
}
/*}}}*/
// FindMountPointForDevice - Find mountpoint for the given device /*{{{*/
// FindMountPointForDevice - Find mountpoint for the given device /*{{{*/
string FindMountPointForDevice(const char *devnode)
{
char buf[255];
@ -254,7 +256,10 @@ string FindMountPointForDevice(const char *devnode)
while ( fgets(buf, sizeof(buf), f) != NULL) {
if (strncmp(buf, devnode, strlen(devnode)) == 0) {
if(TokSplitString(' ', buf, out, 10))
{
fclose(f);
return string(out[1]);
}
}
}
fclose(f);
@ -263,5 +268,4 @@ string FindMountPointForDevice(const char *devnode)
return string();
}
/*}}}*/

2
apt-pkg/contrib/error.cc

@ -107,6 +107,7 @@ bool GlobalError::InsertErrno(MsgType type, const char* Function,
msgSize = n + 1;
else
msgSize *= 2;
free(S);
return true;
}
@ -160,6 +161,7 @@ bool GlobalError::Insert(MsgType type, const char* Description,
msgSize = n + 1;
else
msgSize *= 2;
free(S);
return true;
}

8
apt-pkg/contrib/mmap.cc

@ -237,11 +237,19 @@ DynamicMMap::DynamicMMap(unsigned long Flags,unsigned long const &WorkSpace,
if ((this->Flags & Fallback) != Fallback) {
// Set the permissions.
int Prot = PROT_READ;
#ifdef MAP_ANONYMOUS
int Map = MAP_PRIVATE | MAP_ANONYMOUS;
#else
int Map = MAP_PRIVATE | MAP_ANON;
#endif
if ((this->Flags & ReadOnly) != ReadOnly)
Prot |= PROT_WRITE;
if ((this->Flags & Public) == Public)
#ifdef MAP_ANONYMOUS
Map = MAP_SHARED | MAP_ANONYMOUS;
#else
Map = MAP_SHARED | MAP_ANON;
#endif
// use anonymous mmap() to get the memory
Base = (unsigned char*) mmap(0, WorkSpace, Prot, Map, -1, 0);

12
apt-pkg/contrib/netrc.cc

@ -160,10 +160,10 @@ void maybe_add_auth (URI &Uri, string NetRCFile)
{
char login[64] = "";
char password[64] = "";
char *netrcfile = strdupa (NetRCFile.c_str ());
char *netrcfile = strdup(NetRCFile.c_str());
// first check for a generic host based netrc entry
char *host = strdupa (Uri.Host.c_str ());
char *host = strdup(Uri.Host.c_str());
if (host && parsenetrc (host, login, password, netrcfile) == 0)
{
if (_config->FindB("Debug::Acquire::netrc", false) == true)
@ -173,13 +173,16 @@ void maybe_add_auth (URI &Uri, string NetRCFile)
<< std::endl;
Uri.User = string (login);
Uri.Password = string (password);
free(netrcfile);
free(host);
return;
}
free(host);
// if host did not work, try Host+Path next, this will trigger
// a lookup uri.startswith(host) in the netrc file parser (because
// of the "/"
char *hostpath = strdupa (string(Uri.Host+Uri.Path).c_str ());
char *hostpath = strdup(string(Uri.Host+Uri.Path).c_str());
if (hostpath && parsenetrc (hostpath, login, password, netrcfile) == 0)
{
if (_config->FindB("Debug::Acquire::netrc", false) == true)
@ -189,8 +192,9 @@ void maybe_add_auth (URI &Uri, string NetRCFile)
<< std::endl;
Uri.User = string (login);
Uri.Password = string (password);
return;
}
free(netrcfile);
free(hostpath);
}
}
}

5
apt-pkg/deb/debmetaindex.cc

@ -195,11 +195,14 @@ vector <struct IndexTarget *>* debReleaseIndex::ComputeIndexTargets() const {
}
}
std::vector<std::string> const lang = APT::Configuration::getLanguages(true);
if (lang.empty() == true)
return IndexTargets;
// get the Translations:
// - if its a dists-style repository get the i18n/Index first
// - if its flat try to acquire files by guessing
if (Dist[Dist.size() - 1] == '/') {
std::vector<std::string> const lang = APT::Configuration::getLanguages(true);
for (std::set<std::string>::const_iterator s = sections.begin();
s != sections.end(); ++s) {
for (std::vector<std::string>::const_iterator l = lang.begin();

5
apt-pkg/deb/dpkgpm.cc

@ -391,8 +391,9 @@ void pkgDPkgPM::DoTerminalPty(int master)
{
// this happens when the child is about to exit, we
// give it time to actually exit, otherwise we run
// into a race
usleep(500000);
// into a race so we sleep for half a second.
struct timespec sleepfor = { 0, 500000000 };
nanosleep(&sleepfor, NULL);
return;
}
if(len <= 0)

130
apt-pkg/depcache.cc

@ -339,8 +339,7 @@ bool pkgDepCache::CheckDep(DepIterator Dep,int Type,PkgIterator &Res)
/* Check simple depends. A depends -should- never self match but
we allow it anyhow because dpkg does. Technically it is a packaging
bug. Conflicts may never self match */
if (Dep.TargetPkg() != Dep.ParentPkg() ||
(Dep->Type != Dep::Conflicts && Dep->Type != Dep::DpkgBreaks && Dep->Type != Dep::Obsoletes))
if (Dep.TargetPkg() != Dep.ParentPkg() || Dep.IsNegative() == false)
{
PkgIterator Pkg = Dep.TargetPkg();
// Check the base package
@ -370,8 +369,7 @@ bool pkgDepCache::CheckDep(DepIterator Dep,int Type,PkgIterator &Res)
{
/* Provides may never be applied against the same package (or group)
if it is a conflicts. See the comment above. */
if (P.OwnerPkg()->Group == Pkg->Group &&
(Dep->Type == Dep::Conflicts || Dep->Type == Dep::DpkgBreaks))
if (P.OwnerPkg()->Group == Pkg->Group && Dep.IsNegative() == true)
continue;
// Check if the provides is a hit
@ -549,7 +547,7 @@ void pkgDepCache::AddStates(const PkgIterator &Pkg,int Add)
// Not installed
if (Pkg->CurrentVer == 0)
{
if (State.Mode == ModeDelete &&
if (State.Mode == ModeDelete &&
(State.iFlags & Purge) == Purge && Pkg.Purge() == false)
iDelCount += Add;
@ -594,9 +592,7 @@ void pkgDepCache::BuildGroupOrs(VerIterator const &V)
/* Invert for Conflicts. We have to do this twice to get the
right sense for a conflicts group */
if (D->Type == Dep::Conflicts ||
D->Type == Dep::DpkgBreaks ||
D->Type == Dep::Obsoletes)
if (D.IsNegative() == true)
State = ~State;
// Add to the group if we are within an or..
@ -607,9 +603,7 @@ void pkgDepCache::BuildGroupOrs(VerIterator const &V)
Group = 0;
// Invert for Conflicts
if (D->Type == Dep::Conflicts ||
D->Type == Dep::DpkgBreaks ||
D->Type == Dep::Obsoletes)
if (D.IsNegative() == true)
State = ~State;
}
}
@ -742,9 +736,7 @@ void pkgDepCache::Update(OpProgress *Prog)
Group = 0;
// Invert for Conflicts
if (D->Type == Dep::Conflicts ||
D->Type == Dep::DpkgBreaks ||
D->Type == Dep::Obsoletes)
if (D.IsNegative() == true)
State = ~State;
}
}
@ -774,9 +766,7 @@ void pkgDepCache::Update(DepIterator D)
State = DependencyState(D);
// Invert for Conflicts
if (D->Type == Dep::Conflicts ||
D->Type == Dep::DpkgBreaks ||
D->Type == Dep::Obsoletes)
if (D.IsNegative() == true)
State = ~State;
RemoveStates(D.ParentPkg());
@ -1088,7 +1078,22 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
*/
if (IsImportantDep(Start) == false)
continue;
/* If we are in an or group locate the first or that can
succeed. We have already cached this.. */
for (; Ors > 1 && (DepState[Start->ID] & DepCVer) != DepCVer; --Ors)
++Start;
if (Ors == 1 && (DepState[Start->ID] &DepCVer) != DepCVer && Start.IsNegative() == false)
{
if(DebugAutoInstall == true)
std::clog << OutputInDepth(Depth) << Start << " can't be satisfied!" << std::endl;
if (Start.IsCritical() == false)
continue;
// if the dependency was critical, we can't install it, so remove it again
MarkDelete(Pkg,false,Depth + 1, false);
return;
}
/* Check if any ImportantDep() (but not Critical) were added
* since we installed the package. Also check for deps that
* were satisfied in the past: for instance, if a version
@ -1096,57 +1101,49 @@ void pkgDepCache::MarkInstall(PkgIterator const &Pkg,bool AutoInst,
* package should follow that Recommends rather than causing the
* dependency to be removed. (bug #470115)
*/
bool isNewImportantDep = false;
bool isPreviouslySatisfiedImportantDep = false;
if(!ForceImportantDeps && !Start.IsCritical())
if (Pkg->CurrentVer != 0 && ForceImportantDeps == false && Start.IsCritical() == false)
{
bool found=false;
VerIterator instVer = Pkg.CurrentVer();
if(!instVer.end())
bool isNewImportantDep = true;
bool isPreviouslySatisfiedImportantDep = false;
for (DepIterator D = Pkg.CurrentVer().DependsList(); D.end() != true; ++D)
{
//FIXME: Should we handle or-group better here?
// We do not check if the package we look for is part of the same or-group
// we might find while searching, but could that really be a problem?
if (D.IsCritical() == true || IsImportantDep(D) == false ||