]> git.saurik.com Git - apt.git/blob - apt-pkg/update.cc
provide public interface to hold/unhold packages
[apt.git] / apt-pkg / update.cc
1 // Include Files /*{{{*/
2 #include <config.h>
3
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>
12
13 #include <string>
14
15 #include <apti18n.h>
16 /*}}}*/
17
18 using namespace std;
19
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)
24 */
25 bool ListUpdate(pkgAcquireStatus &Stat,
26 pkgSourceList &List,
27 int PulseInterval)
28 {
29 pkgAcquire Fetcher(&Stat);
30 if (Fetcher.GetLock(_config->FindDir("Dir::State::Lists")) == false)
31 return false;
32
33 // Populate it with the source selection
34 if (List.GetIndexes(&Fetcher) == false)
35 return false;
36
37 return AcquireUpdate(Fetcher, PulseInterval, true);
38 }
39 /*}}}*/
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.
45 */
46 bool AcquireUpdate(pkgAcquire &Fetcher, int const PulseInterval,
47 bool const RunUpdateScripts, bool const ListCleanup)
48 {
49 // Run scripts
50 if (RunUpdateScripts == true)
51 RunScripts("APT::Update::Pre-Invoke");
52
53 pkgAcquire::RunResult res;
54 if(PulseInterval > 0)
55 res = Fetcher.Run(PulseInterval);
56 else
57 res = Fetcher.Run();
58
59 if (res == pkgAcquire::Failed)
60 return false;
61
62 bool Failed = false;
63 bool TransientNetworkFailure = false;
64 for (pkgAcquire::ItemIterator I = Fetcher.ItemsBegin();
65 I != Fetcher.ItemsEnd(); ++I)
66 {
67 if ((*I)->Status == pkgAcquire::Item::StatDone)
68 continue;
69
70 (*I)->Finished();
71
72 ::URI uri((*I)->DescURI());
73 uri.User.clear();
74 uri.Password.clear();
75 string descUri = string(uri);
76 _error->Warning(_("Failed to fetch %s %s"), descUri.c_str(),
77 (*I)->ErrorText.c_str());
78
79 if ((*I)->Status == pkgAcquire::Item::StatTransientNetworkError)
80 {
81 TransientNetworkFailure = true;
82 continue;
83 }
84
85 Failed = true;
86 }
87
88 // Clean out any old list files
89 // Keep "APT::Get::List-Cleanup" name for compatibility, but
90 // this is really a global option for the APT library now
91 if (!TransientNetworkFailure && !Failed && ListCleanup == true &&
92 (_config->FindB("APT::Get::List-Cleanup",true) == true &&
93 _config->FindB("APT::List-Cleanup",true) == true))
94 {
95 if (Fetcher.Clean(_config->FindDir("Dir::State::lists")) == false ||
96 Fetcher.Clean(_config->FindDir("Dir::State::lists") + "partial/") == false)
97 // something went wrong with the clean
98 return false;
99 }
100
101 if (TransientNetworkFailure == true)
102 _error->Warning(_("Some index files failed to download. They have been ignored, or old ones used instead."));
103 else if (Failed == true)
104 return _error->Error(_("Some index files failed to download. They have been ignored, or old ones used instead."));
105
106
107 // Run the success scripts if all was fine
108 if (RunUpdateScripts == true)
109 {
110 if(!TransientNetworkFailure && !Failed)
111 RunScripts("APT::Update::Post-Invoke-Success");
112
113 // Run the other scripts
114 RunScripts("APT::Update::Post-Invoke");
115 }
116 return true;
117 }
118 /*}}}*/