summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArch Librarian <arch@canonical.com>2004-09-20 16:51:32 +0000
committerArch Librarian <arch@canonical.com>2004-09-20 16:51:32 +0000
commit30e1eab53324523297a24c18819b27aba7ce1fb4 (patch)
treea783232e885e67e7d4e2850be380015a1ab9b648
parent94235cfb1980f4056638fe9abaef162f8c6fe38c (diff)
downloadapt-30e1eab53324523297a24c18819b27aba7ce1fb4.tar.gz
By gosh, I think it works
Author: jgg Date: 1998-11-22 03:20:30 GMT By gosh, I think it works
-rw-r--r--apt-pkg/acquire-item.cc43
-rw-r--r--apt-pkg/acquire-item.h14
-rw-r--r--apt-pkg/deb/dpkgpm.cc42
-rw-r--r--apt-pkg/init.cc3
-rw-r--r--apt-pkg/packagemanager.cc30
-rw-r--r--apt-pkg/packagemanager.h3
-rw-r--r--cmdline/apt-get.cc54
-rw-r--r--doc/Bugs9
-rw-r--r--doc/examples/apt.conf5
9 files changed, 147 insertions, 56 deletions
diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc
index 532d4e6f..cfd0e5d0 100644
--- a/apt-pkg/acquire-item.cc
+++ b/apt-pkg/acquire-item.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: acquire-item.cc,v 1.12 1998/11/13 07:08:48 jgg Exp $
+// $Id: acquire-item.cc,v 1.13 1998/11/22 03:20:30 jgg Exp $
/* ######################################################################
Acquire Item - Item to acquire
@@ -224,6 +224,14 @@ void pkgAcqIndex::Done(string Message,unsigned long Size,string MD5)
Mode = "gzip";
}
/*}}}*/
+// AcqIndex::Describe - Describe the Item /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+string pkgAcqIndex::Describe()
+{
+ return Location->PackagesURI();
+}
+ /*}}}*/
// AcqIndexRel::pkgAcqIndexRel - Constructor /*{{{*/
// ---------------------------------------------------------------------
@@ -302,13 +310,23 @@ void pkgAcqIndexRel::Done(string Message,unsigned long Size,string MD5)
Rename(DestFile,FinalFile);
}
/*}}}*/
+// AcqIndexRel::Describe - Describe the Item /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+string pkgAcqIndexRel::Describe()
+{
+ return Location->ReleaseURI();
+}
+ /*}}}*/
// AcqArchive::AcqArchive - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
- pkgRecords *Recs,pkgCache::VerIterator const &Version) :
- Item(Owner), Version(Version), Sources(Sources), Recs(Recs)
+ pkgRecords *Recs,pkgCache::VerIterator const &Version,
+ string &StoreFilename) :
+ Item(Owner), Version(Version), Sources(Sources), Recs(Recs),
+ StoreFilename(StoreFilename)
{
// Select a source
pkgCache::VerFileIterator Vf = Version.FileList();
@@ -355,7 +373,7 @@ pkgAcqArchive::pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
Complete = true;
Local = true;
Status = StatDone;
- DestFile = FinalFile;
+ StoreFilename = DestFile = FinalFile;
return;
}
@@ -415,11 +433,11 @@ void pkgAcqArchive::Done(string Message,unsigned long Size,string Md5Hash)
}
Complete = true;
-
- // We have to copy it into place
+
+ // Reference filename
if (FileName != DestFile)
{
- DestFile = FileName;
+ StoreFilename = DestFile = FileName;
Local = true;
return;
}
@@ -429,7 +447,16 @@ void pkgAcqArchive::Done(string Message,unsigned long Size,string Md5Hash)
FinalFile += flNotDir(DestFile);
Rename(DestFile,FinalFile);
- DestFile = FinalFile;
+ StoreFilename = DestFile = FinalFile;
Complete = true;
}
/*}}}*/
+// AcqArchive::Describe - Describe the Item /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+string pkgAcqArchive::Describe()
+{
+ return Desc.URI;
+}
+ /*}}}*/
+
diff --git a/apt-pkg/acquire-item.h b/apt-pkg/acquire-item.h
index 67e20235..d550b33d 100644
--- a/apt-pkg/acquire-item.h
+++ b/apt-pkg/acquire-item.h
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: acquire-item.h,v 1.9 1998/11/13 07:08:50 jgg Exp $
+// $Id: acquire-item.h,v 1.10 1998/11/22 03:20:31 jgg Exp $
/* ######################################################################
Acquire Item - Item to acquire
@@ -46,7 +46,7 @@ class pkgAcquire::Item
unsigned long ID;
bool Complete;
bool Local;
-
+
// Number of queues we are inserted into
unsigned int QueueCounter;
@@ -56,7 +56,8 @@ class pkgAcquire::Item
virtual void Failed(string Message);
virtual void Done(string Message,unsigned long Size,string Md5Hash);
virtual void Start(string Message,unsigned long Size);
-
+ virtual string Describe() = 0;
+
virtual string Custom600Headers() {return string();};
Item(pkgAcquire *Owner);
@@ -77,6 +78,7 @@ class pkgAcqIndex : public pkgAcquire::Item
virtual void Done(string Message,unsigned long Size,string Md5Hash);
virtual string Custom600Headers();
+ virtual string Describe();
pkgAcqIndex(pkgAcquire *Owner,const pkgSourceList::Item *Location);
};
@@ -93,6 +95,7 @@ class pkgAcqIndexRel : public pkgAcquire::Item
virtual void Done(string Message,unsigned long Size,string Md5Hash);
virtual string Custom600Headers();
+ virtual string Describe();
pkgAcqIndexRel(pkgAcquire *Owner,const pkgSourceList::Item *Location);
};
@@ -107,13 +110,16 @@ class pkgAcqArchive : public pkgAcquire::Item
pkgSourceList *Sources;
pkgRecords *Recs;
string MD5;
+ string &StoreFilename;
public:
virtual void Done(string Message,unsigned long Size,string Md5Hash);
+ virtual string Describe();
pkgAcqArchive(pkgAcquire *Owner,pkgSourceList *Sources,
- pkgRecords *Recs,pkgCache::VerIterator const &Version);
+ pkgRecords *Recs,pkgCache::VerIterator const &Version,
+ string &StoreFilename);
};
#endif
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc
index 75a5c77b..dfdc0c4b 100644
--- a/apt-pkg/deb/dpkgpm.cc
+++ b/apt-pkg/deb/dpkgpm.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: dpkgpm.cc,v 1.1 1998/11/13 04:23:39 jgg Exp $
+// $Id: dpkgpm.cc,v 1.2 1998/11/22 03:20:35 jgg Exp $
/* ######################################################################
DPKG Package Manager - Provide an interface to dpkg
@@ -83,45 +83,67 @@ bool pkgDPkgPM::Go()
{
vector<Item>::iterator J = I;
for (; J != List.end() && J->Op == I->Op; J++);
-
+
// Generate the argument list
const char *Args[400];
if (J - I > 350)
J = I + 350;
- int n= 0;
- Args[n++] = "dpkg";
+ unsigned int n = 0;
+ unsigned long Size = 0;
+ Args[n++] = _config->Find("Dir::Bin::dpkg","dpkg").c_str();
+ Size += strlen(Args[n-1]);
switch (I->Op)
{
case Item::Remove:
Args[n++] = "--force-depends";
+ Size += strlen(Args[n-1]);
Args[n++] = "--force-remove-essential";
+ Size += strlen(Args[n-1]);
Args[n++] = "--remove";
+ Size += strlen(Args[n-1]);
break;
case Item::Configure:
Args[n++] = "--configure";
+ Size += strlen(Args[n-1]);
break;
case Item::Install:
Args[n++] = "--unpack";
+ Size += strlen(Args[n-1]);
break;
}
// Write in the file or package names
if (I->Op == Item::Install)
- for (;I != J; I++)
+ {
+ for (;I != J && Size < 1024; I++)
+ {
Args[n++] = I->File.c_str();
+ Size += strlen(Args[n-1]);
+ }
+ }
else
- for (;I != J; I++)
+ {
+ for (;I != J && Size < 1024; I++)
+ {
Args[n++] = I->Pkg.Name();
+ Size += strlen(Args[n-1]);
+ }
+ }
Args[n] = 0;
+ J = I;
+
+ if (_config->FindB("Debug::pkgDPkgPM",false) == true)
+ {
+ for (unsigned int k = 0; k != n; k++)
+ clog << Args[k] << ' ';
+ clog << endl;
+ continue;
+ }
-/* for (int k = 0; k != n; k++)
- cout << Args[k] << ' ';
- cout << endl;*/
-
cout << flush;
clog << flush;
cerr << flush;
diff --git a/apt-pkg/init.cc b/apt-pkg/init.cc
index e0ab4682..3343e197 100644
--- a/apt-pkg/init.cc
+++ b/apt-pkg/init.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: init.cc,v 1.12 1998/11/06 02:52:21 jgg Exp $
+// $Id: init.cc,v 1.13 1998/11/22 03:20:32 jgg Exp $
/* ######################################################################
Init - Initialize the package library
@@ -45,6 +45,7 @@ bool pkgInitialize(Configuration &Cnf)
Cnf.Set("Dir::Etc::sourcelist","sources.list");
Cnf.Set("Dir::Etc::main","apt.conf");
Cnf.Set("Dir::Bin::methods","/usr/lib/apt/methods");
+ Cnf.Set("Dir::Bin::dpkg","/usr/bin/dpkg");
// Read the main config file
string FName = Cnf.FindFile("Dir::Etc::main");
diff --git a/apt-pkg/packagemanager.cc b/apt-pkg/packagemanager.cc
index 2b47d425..e6222f00 100644
--- a/apt-pkg/packagemanager.cc
+++ b/apt-pkg/packagemanager.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: packagemanager.cc,v 1.5 1998/11/13 04:23:30 jgg Exp $
+// $Id: packagemanager.cc,v 1.6 1998/11/22 03:20:33 jgg Exp $
/* ######################################################################
Package Manager - Abstacts the package manager
@@ -22,6 +22,8 @@
#include <apt-pkg/error.h>
#include <apt-pkg/version.h>
#include <apt-pkg/acquire-item.h>
+#include <apt-pkg/algorithms.h>
+#include <apt-pkg/configuration.h>
/*}}}*/
// PM::PackageManager - Constructor /*{{{*/
@@ -31,6 +33,7 @@ pkgPackageManager::pkgPackageManager(pkgDepCache &Cache) : Cache(Cache)
{
FileNames = new string[Cache.Head().PackageCount];
List = 0;
+ Debug = _config->FindB("Debug::pkgPackageManager",false);
}
/*}}}*/
// PM::PackageManager - Destructor /*{{{*/
@@ -57,7 +60,8 @@ bool pkgPackageManager::GetArchives(pkgAcquire *Owner,pkgSourceList *Sources,
Cache[I].Delete() == true)
continue;
- new pkgAcqArchive(Owner,Sources,Recs,Cache[I].InstVerIter(Cache));
+ new pkgAcqArchive(Owner,Sources,Recs,Cache[I].InstVerIter(Cache),
+ FileNames[I->ID]);
}
return true;
}
@@ -68,16 +72,11 @@ bool pkgPackageManager::GetArchives(pkgAcquire *Owner,pkgSourceList *Sources,
be downloaded. */
bool pkgPackageManager::FixMissing()
{
- unsigned char *Touch = new unsigned char[Cache.Head().PackageCount];
+ pkgProblemResolver Resolve(Cache);
+
for (PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
{
- // Create the status list that ResolveConflicts needs
- if ((Cache[I].DepState & pkgDepCache::DepNowMin) == pkgDepCache::DepNowMin)
- Touch[I->ID] = (1 << 0) | (1 << 1);
- else
- Touch[I->ID] = 1 << 1;
-
- if (Cache[I].Keep() == true)
+ if (Cache[I].Keep() == true)
continue;
if (FileNames[I->ID].empty() == false || Cache[I].Delete() == true)
continue;
@@ -85,10 +84,7 @@ bool pkgPackageManager::FixMissing()
}
// Now downgrade everything that is broken
-// Cache.ResolveConflicts(Touch);
- delete [] Touch;
-
- return Cache.BrokenCount() == 0;
+ return Resolve.ResolveByKeep() == true && Cache.BrokenCount() == 0;
}
/*}}}*/
@@ -450,10 +446,16 @@ bool pkgPackageManager::OrderInstall()
if ((I->Flags & pkgCache::Flag::ImmediateConf) == pkgCache::Flag::ImmediateConf)
List->Flag(I,pkgOrderList::Immediate);
}
+
+ if (Debug == true)
+ clog << "Begining to order" << endl;
if (List->OrderUnpack() == false)
return _error->Error("Internal ordering error");
+ if (Debug == true)
+ clog << "Done ordering" << endl;
+
for (pkgOrderList::iterator I = List->begin(); I != List->end(); I++)
{
PkgIterator Pkg(Cache,*I);
diff --git a/apt-pkg/packagemanager.h b/apt-pkg/packagemanager.h
index c6ab82de..e0e9dc10 100644
--- a/apt-pkg/packagemanager.h
+++ b/apt-pkg/packagemanager.h
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: packagemanager.h,v 1.5 1998/11/13 04:23:31 jgg Exp $
+// $Id: packagemanager.h,v 1.6 1998/11/22 03:20:34 jgg Exp $
/* ######################################################################
Package Manager - Abstacts the package manager
@@ -42,6 +42,7 @@ class pkgPackageManager
string *FileNames;
pkgDepCache &Cache;
pkgOrderList *List;
+ bool Debug;
// Bring some usefull types into the local scope
typedef pkgCache::PkgIterator PkgIterator;
diff --git a/cmdline/apt-get.cc b/cmdline/apt-get.cc
index 215a431f..e00cf53c 100644
--- a/cmdline/apt-get.cc
+++ b/cmdline/apt-get.cc
@@ -1,6 +1,6 @@
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
-// $Id: apt-get.cc,v 1.14 1998/11/14 08:11:55 jgg Exp $
+// $Id: apt-get.cc,v 1.15 1998/11/22 03:20:36 jgg Exp $
/* ######################################################################
apt-get - Cover for dpkg
@@ -110,8 +110,7 @@ void ShowList(ostream &out,string Title,string List)
description. */
void ShowBroken(ostream &out,pkgDepCache &Cache)
{
- out << "Sorry, but the following packages are broken - this means they have unmet" << endl;
- out << "dependencies:" << endl;
+ out << "Sorry, but the following packages have unmet dependencies:" << endl;
pkgCache::PkgIterator I = Cache.PkgBegin();
for (;I.end() != true; I++)
{
@@ -128,10 +127,15 @@ void ShowBroken(ostream &out,pkgDepCache &Cache)
continue;
}
- for (pkgCache::DepIterator D = Cache[I].InstVerIter(Cache).DependsList(); D.end() == false; D++)
+ for (pkgCache::DepIterator D = Cache[I].InstVerIter(Cache).DependsList(); D.end() == false;)
{
- if (Cache.IsImportantDep(D) == false || (Cache[D] &
- pkgDepCache::DepInstall) != 0)
+ // Compute a single dependency element (glob or)
+ pkgCache::DepIterator Start;
+ pkgCache::DepIterator End;
+ D.GlobOr(Start,End);
+
+ if (Cache.IsImportantDep(End) == false ||
+ (Cache[End] & pkgDepCache::DepGInstall) == pkgDepCache::DepGInstall)
continue;
if (First == false)
@@ -139,17 +143,17 @@ void ShowBroken(ostream &out,pkgDepCache &Cache)
out << ' ';
First = false;
- cout << ' ' << D.DepType() << ": ";
+ cout << ' ' << End.DepType() << ": " << End.TargetPkg().Name();
// Show a quick summary of the version requirements
- if (D.TargetVer() != 0)
- out << " (" << D.CompType() << " " << D.TargetVer() <<
+ if (End.TargetVer() != 0)
+ out << " (" << End.CompType() << " " << End.TargetVer() <<
")";
/* Show a summary of the target package if possible. In the case
of virtual packages we show nothing */
- pkgCache::PkgIterator Targ = D.TargetPkg();
+ pkgCache::PkgIterator Targ = End.TargetPkg();
if (Targ->ProvidesList == 0)
{
out << " but ";
@@ -494,7 +498,7 @@ bool InstallPackages(pkgDepCache &Cache,bool ShwKept,bool Ask = true)
return _error->Error("The list of sources could not be read.");
// Create the package manager and prepare to download
- pkgPackageManager PM(Cache);
+ pkgDPkgPM PM(Cache);
if (PM.GetArchives(&Fetcher,&List,&Recs) == false)
return false;
@@ -531,8 +535,31 @@ bool InstallPackages(pkgDepCache &Cache,bool ShwKept,bool Ask = true)
// Run it
if (Fetcher.Run() == false)
return false;
+
+ // Print out errors
+ bool Failed = false;
+ for (pkgAcquire::Item **I = Fetcher.ItemsBegin(); I != Fetcher.ItemsEnd(); I++)
+ {
+ if ((*I)->Status == pkgAcquire::Item::StatDone &&
+ (*I)->Complete == true)
+ continue;
+
+ cerr << "Failed to fetch " << (*I)->Describe() << endl;
+ cerr << " " << (*I)->ErrorText << endl;
+ Failed = true;
+ }
- return true;
+ if (Failed == true && _config->FindB("APT::Fix-Missing",false) == false)
+ return _error->Error("Unable to fetch some archives, maybe try with --fix-missing?");
+
+ // Try to deal with missing package files
+/* if (PM.FixMissing() == false)
+ {
+ cerr << "Unable to correct missing packages." << endl;
+ return _error->Error("Aborting Install.");
+ }*/
+
+ return PM.DoInstall();
}
/*}}}*/
@@ -941,7 +968,8 @@ int main(int argc,const char *argv[])
{'y',"assume-yes","APT::Get::Assume-Yes",0},
{'f',"fix-broken","APT::Get::Fix-Broken",0},
{'u',"show-upgraded","APT::Get::Show-Upgraded",0},
- {'m',"ignore-missing","APT::Get::Fix-Broken",0},
+ {'m',"ignore-missing","APT::Get::Fix-Missing",0},
+ {0,"fix-missing","APT::Get::Fix-Missing",0},
{0,"ignore-hold","APT::Ingore-Hold",0},
{0,"no-upgrade","APT::Get::no-upgrade",0},
{'c',"config-file",0,CommandLine::ConfigFile},
diff --git a/doc/Bugs b/doc/Bugs
index 1c7aac89..52202629 100644
--- a/doc/Bugs
+++ b/doc/Bugs
@@ -34,10 +34,6 @@
Summary: The man pages have references to several non-existent items,
ftp.conf is only one of them.
Status: Fix the man pages. This certainly will be done in 0.3.0
-#28391: apt-get install without upgrading
- Summary: Make install leave the package in the keep state if it is already
- installed
- Status: Will be implemented in 0.3.0
-- Fixed but unclosed things
#25026: apt: Why do you list the packages you're _not_ doing anything to instead of the ones you are?
@@ -96,6 +92,11 @@
though it failed. I'm paying very close attention to this in
0.3.x. Not to mention that the clean behavior will be
configurable..
+#28391: apt-get install without upgrading
+ Summary: Make install leave the package in the keep state if it is already
+ installed
+ Status: Will be implemented in 0.3.0
+ Try the --no-upgrade options
-- Silly things
#26592: apt: Problems with ftpd in SunOS 5.6
diff --git a/doc/examples/apt.conf b/doc/examples/apt.conf
index 2519fa2a..ddd7d512 100644
--- a/doc/examples/apt.conf
+++ b/doc/examples/apt.conf
@@ -1,4 +1,4 @@
-// $Id: apt.conf,v 1.11 1998/11/11 06:54:18 jgg Exp $
+// $Id: apt.conf,v 1.12 1998/11/22 03:20:38 jgg Exp $
/* This file is an index of all APT configuration directives. It should
NOT actually be used as a real config file, though it is a completely
valid file.
@@ -25,6 +25,7 @@ APT {
Simulate "false";
Assume-Yes "false";
Fix-Broken "false";
+ Fix-Missing "false";
Show-Upgraded "false";
};
@@ -73,6 +74,7 @@ Dir
Bin {
methods "/home/jgg/work/apt/build/bin/methods/";
gzip "/bin/gzip";
+ dpkg "/usr/bin/dpkg";
};
};
@@ -86,6 +88,7 @@ Debug {
pkgProblemResolver "false";
pkgAcquire "false";
pkgAcquire::Worker "false";
+ pkgDPkgPM "false";
pkgInitialize "false"; // This one will dump the configuration space
}