1 // Include Files /*{{{*/
4 #include <apt-pkg/acquire-item.h>
5 #include <apt-pkg/configuration.h>
6 #include <apt-pkg/error.h>
7 #include <apt-pkg/fileutl.h>
8 #include <apt-pkg/sourcelist.h>
9 #include <apt-pkg/acquire.h>
10 #include <apt-pkg/strutl.h>
11 #include <apt-pkg/update.h>
20 // ListUpdate - construct Fetcher and update the cache files /*{{{*/
21 // ---------------------------------------------------------------------
22 /* This is a simple wrapper to update the cache. it will fetch stuff
23 * from the network (or any other sources defined in sources.list)
25 bool ListUpdate(pkgAcquireStatus
&Stat
,
29 pkgAcquire
Fetcher(&Stat
);
30 if (Fetcher
.GetLock(_config
->FindDir("Dir::State::Lists")) == false)
33 // Populate it with the source selection
34 if (List
.GetIndexes(&Fetcher
) == false)
37 return AcquireUpdate(Fetcher
, PulseInterval
, true);
40 // AcquireUpdate - take Fetcher and update the cache files /*{{{*/
41 // ---------------------------------------------------------------------
42 /* This is a simple wrapper to update the cache with a provided acquire
43 * If you only need control over Status and the used SourcesList use
44 * ListUpdate method instead.
46 bool AcquireUpdate(pkgAcquire
&Fetcher
, int const PulseInterval
,
47 bool const RunUpdateScripts
, bool const ListCleanup
)
50 if (RunUpdateScripts
== true)
51 RunScripts("APT::Update::Pre-Invoke");
53 pkgAcquire::RunResult res
;
55 res
= Fetcher
.Run(PulseInterval
);
59 bool const errorsWereReported
= (res
== pkgAcquire::Failed
);
60 bool Failed
= errorsWereReported
;
61 bool TransientNetworkFailure
= false;
62 bool AllFailed
= true;
63 for (pkgAcquire::ItemIterator I
= Fetcher
.ItemsBegin();
64 I
!= Fetcher
.ItemsEnd(); ++I
)
68 case pkgAcquire::Item::StatDone
:
71 case pkgAcquire::Item::StatTransientNetworkError
:
72 TransientNetworkFailure
= true;
74 case pkgAcquire::Item::StatIdle
:
75 case pkgAcquire::Item::StatFetching
:
76 case pkgAcquire::Item::StatError
:
77 case pkgAcquire::Item::StatAuthError
:
84 if (errorsWereReported
)
87 ::URI
uri((*I
)->DescURI());
90 std::string
const descUri
= std::string(uri
);
91 // Show an error for non-transient failures, otherwise only warn
92 if ((*I
)->Status
== pkgAcquire::Item::StatTransientNetworkError
)
93 _error
->Warning(_("Failed to fetch %s %s"), descUri
.c_str(),
94 (*I
)->ErrorText
.c_str());
96 _error
->Error(_("Failed to fetch %s %s"), descUri
.c_str(),
97 (*I
)->ErrorText
.c_str());
100 // Clean out any old list files
101 // Keep "APT::Get::List-Cleanup" name for compatibility, but
102 // this is really a global option for the APT library now
103 if (!TransientNetworkFailure
&& !Failed
&& ListCleanup
== true &&
104 (_config
->FindB("APT::Get::List-Cleanup",true) == true &&
105 _config
->FindB("APT::List-Cleanup",true) == true))
107 if (Fetcher
.Clean(_config
->FindDir("Dir::State::lists")) == false ||
108 Fetcher
.Clean(_config
->FindDir("Dir::State::lists") + "partial/") == false)
109 // something went wrong with the clean
115 if (errorsWereReported
== true)
117 else if (TransientNetworkFailure
== true)
118 Res
= _error
->Warning(_("Some index files failed to download. They have been ignored, or old ones used instead."));
119 else if (Failed
== true)
120 Res
= _error
->Error(_("Some index files failed to download. They have been ignored, or old ones used instead."));
122 // Run the success scripts if all was fine
123 if (RunUpdateScripts
== true)
125 if(AllFailed
== false)
126 RunScripts("APT::Update::Post-Invoke-Success");
128 // Run the other scripts
129 RunScripts("APT::Update::Post-Invoke");