|
|
@@ -0,0 +1,126 @@
|
|
|
+
|
|
|
+// Include Files /*{{{*/
|
|
|
+#include <config.h>
|
|
|
+
|
|
|
+#include <apt-pkg/algorithms.h>
|
|
|
+#include <apt-pkg/update.h>
|
|
|
+#include <apt-pkg/error.h>
|
|
|
+#include <apt-pkg/configuration.h>
|
|
|
+#include <apt-pkg/version.h>
|
|
|
+#include <apt-pkg/sptr.h>
|
|
|
+#include <apt-pkg/acquire-item.h>
|
|
|
+#include <apt-pkg/edsp.h>
|
|
|
+#include <apt-pkg/sourcelist.h>
|
|
|
+#include <apt-pkg/fileutl.h>
|
|
|
+#include <apt-pkg/progress.h>
|
|
|
+
|
|
|
+#include <sys/types.h>
|
|
|
+#include <cstdlib>
|
|
|
+#include <algorithm>
|
|
|
+#include <iostream>
|
|
|
+#include <stdio.h>
|
|
|
+
|
|
|
+#include <apti18n.h>
|
|
|
+ /*}}}*/
|
|
|
+
|
|
|
+using namespace std;
|
|
|
+
|
|
|
+// ListUpdate - construct Fetcher and update the cache files /*{{{*/
|
|
|
+// ---------------------------------------------------------------------
|
|
|
+/* This is a simple wrapper to update the cache. it will fetch stuff
|
|
|
+ * from the network (or any other sources defined in sources.list)
|
|
|
+ */
|
|
|
+bool ListUpdate(pkgAcquireStatus &Stat,
|
|
|
+ pkgSourceList &List,
|
|
|
+ int PulseInterval)
|
|
|
+{
|
|
|
+ pkgAcquire Fetcher;
|
|
|
+ if (Fetcher.Setup(&Stat, _config->FindDir("Dir::State::Lists")) == false)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ // Populate it with the source selection
|
|
|
+ if (List.GetIndexes(&Fetcher) == false)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ return AcquireUpdate(Fetcher, PulseInterval, true);
|
|
|
+}
|
|
|
+ /*}}}*/
|
|
|
+// AcquireUpdate - take Fetcher and update the cache files /*{{{*/
|
|
|
+// ---------------------------------------------------------------------
|
|
|
+/* This is a simple wrapper to update the cache with a provided acquire
|
|
|
+ * If you only need control over Status and the used SourcesList use
|
|
|
+ * ListUpdate method instead.
|
|
|
+ */
|
|
|
+bool AcquireUpdate(pkgAcquire &Fetcher, int const PulseInterval,
|
|
|
+ bool const RunUpdateScripts, bool const ListCleanup)
|
|
|
+{
|
|
|
+ // Run scripts
|
|
|
+ if (RunUpdateScripts == true)
|
|
|
+ RunScripts("APT::Update::Pre-Invoke");
|
|
|
+
|
|
|
+ pkgAcquire::RunResult res;
|
|
|
+ if(PulseInterval > 0)
|
|
|
+ res = Fetcher.Run(PulseInterval);
|
|
|
+ else
|
|
|
+ res = Fetcher.Run();
|
|
|
+
|
|
|
+ if (res == pkgAcquire::Failed)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ bool Failed = false;
|
|
|
+ bool TransientNetworkFailure = false;
|
|
|
+ for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin();
|
|
|
+ I != Fetcher.ItemsEnd(); ++I)
|
|
|
+ {
|
|
|
+ if ((*I)->Status == pkgAcquire::Item::StatDone)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ (*I)->Finished();
|
|
|
+
|
|
|
+ ::URI uri((*I)->DescURI());
|
|
|
+ uri.User.clear();
|
|
|
+ uri.Password.clear();
|
|
|
+ string descUri = string(uri);
|
|
|
+ _error->Warning(_("Failed to fetch %s %s\n"), descUri.c_str(),
|
|
|
+ (*I)->ErrorText.c_str());
|
|
|
+
|
|
|
+ if ((*I)->Status == pkgAcquire::Item::StatTransientNetworkError)
|
|
|
+ {
|
|
|
+ TransientNetworkFailure = true;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ Failed = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Clean out any old list files
|
|
|
+ // Keep "APT::Get::List-Cleanup" name for compatibility, but
|
|
|
+ // this is really a global option for the APT library now
|
|
|
+ if (!TransientNetworkFailure && !Failed && ListCleanup == true &&
|
|
|
+ (_config->FindB("APT::Get::List-Cleanup",true) == true &&
|
|
|
+ _config->FindB("APT::List-Cleanup",true) == true))
|
|
|
+ {
|
|
|
+ if (Fetcher.Clean(_config->FindDir("Dir::State::lists")) == false ||
|
|
|
+ Fetcher.Clean(_config->FindDir("Dir::State::lists") + "partial/") == false)
|
|
|
+ // something went wrong with the clean
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (TransientNetworkFailure == true)
|
|
|
+ _error->Warning(_("Some index files failed to download. They have been ignored, or old ones used instead."));
|
|
|
+ else if (Failed == true)
|
|
|
+ return _error->Error(_("Some index files failed to download. They have been ignored, or old ones used instead."));
|
|
|
+
|
|
|
+
|
|
|
+ // Run the success scripts if all was fine
|
|
|
+ if (RunUpdateScripts == true)
|
|
|
+ {
|
|
|
+ if(!TransientNetworkFailure && !Failed)
|
|
|
+ RunScripts("APT::Update::Post-Invoke-Success");
|
|
|
+
|
|
|
+ // Run the other scripts
|
|
|
+ RunScripts("APT::Update::Post-Invoke");
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+}
|
|
|
+ /*}}}*/
|