18
18
#include <apt-pkg/configuration.h>
19
19
#include <apt-pkg/strutl.h>
21
23
#include <fstream.h>
26
// Global list of Item supported
27
static pkgSourceList::Type *ItmList[10];
28
pkgSourceList::Type **pkgSourceList::Type::GlobalList = ItmList;
29
unsigned long pkgSourceList::Type::GlobalListLen = 0;
31
// Type::Type - Constructor /*{{{*/
32
// ---------------------------------------------------------------------
33
/* Link this to the global list of items*/
34
pkgSourceList::Type::Type()
36
ItmList[GlobalListLen] = this;
40
// Type::GetType - Get a specific meta for a given type /*{{{*/
41
// ---------------------------------------------------------------------
43
pkgSourceList::Type *pkgSourceList::Type::GetType(const char *Type)
45
for (unsigned I = 0; I != GlobalListLen; I++)
46
if (strcmp(GlobalList[I]->Name,Type) == 0)
51
// Type::FixupURI - Normalize the URI and check it.. /*{{{*/
52
// ---------------------------------------------------------------------
54
bool pkgSourceList::Type::FixupURI(string &URI) const
56
if (URI.empty() == true)
59
if (URI.find(':') == string::npos)
62
URI = SubstVar(URI,"$(ARCH)",_config->Find("APT::Architecture"));
64
// Make sure that the URN is / postfixed
65
if (URI[URI.size() - 1] != '/')
71
// Type::ParseLine - Parse a single line /*{{{*/
72
// ---------------------------------------------------------------------
73
/* This is a generic one that is the 'usual' format for sources.list
74
Weird types may override this. */
75
bool pkgSourceList::Type::ParseLine(vector<pkgIndexFile *> &List,
77
unsigned long CurLine,
84
if (ParseQuoteWord(Buffer,URI) == false)
85
return _error->Error(_("Malformed line %lu in source list %s (URI)"),CurLine,File.c_str());
86
if (ParseQuoteWord(Buffer,Dist) == false)
87
return _error->Error(_("Malformed line %lu in source list %s (dist)"),CurLine,File.c_str());
89
if (FixupURI(URI) == false)
90
return _error->Error(_("Malformed line %lu in source list %s (URI parse)"),CurLine,File.c_str());
92
// Check for an absolute dists specification.
93
if (Dist.empty() == false && Dist[Dist.size() - 1] == '/')
95
if (ParseQuoteWord(Buffer,Section) == true)
96
return _error->Error(_("Malformed line %lu in source list %s (Absolute dist)"),CurLine,File.c_str());
97
Dist = SubstVar(Dist,"$(ARCH)",_config->Find("APT::Architecture"));
98
return CreateItem(List,URI,Dist,Section);
101
// Grab the rest of the dists
102
if (ParseQuoteWord(Buffer,Section) == false)
103
return _error->Error(_("Malformed line %lu in source list %s (dist parse)"),CurLine,File.c_str());
107
if (CreateItem(List,URI,Dist,Section) == false)
110
while (ParseQuoteWord(Buffer,Section) == true);
27
116
// SourceList::pkgSourceList - Constructors /*{{{*/
63
152
F.getline(Buffer,sizeof(Buffer));
65
154
_strtabexpand(Buffer,sizeof(Buffer));
158
for (I = Buffer; *I != 0 && *I != '#'; I++);
161
const char *C = _strstrip(Buffer);
68
163
// Comment or blank
69
if (Buffer[0] == '#' || Buffer[0] == 0)
164
if (C[0] == '#' || C[0] == 0)
76
const char *C = Buffer;
77
if (ParseQuoteWord(C,Type) == false)
78
return _error->Error("Malformed line %u in source list %s (type)",CurLine,File.c_str());
79
if (ParseQuoteWord(C,URI) == false)
80
return _error->Error("Malformed line %u in source list %s (URI)",CurLine,File.c_str());
81
if (ParseQuoteWord(C,Itm.Dist) == false)
82
return _error->Error("Malformed line %u in source list %s (dist)",CurLine,File.c_str());
83
if (Itm.SetType(Type) == false)
84
return _error->Error("Malformed line %u in source list %s (type parse)",CurLine,File.c_str());
85
if (Itm.SetURI(URI) == false)
86
return _error->Error("Malformed line %u in source list %s (URI parse)",CurLine,File.c_str());
88
// Check for an absolute dists specification.
89
if (Itm.Dist.empty() == false && Itm.Dist[Itm.Dist.size() - 1] == '/')
91
if (ParseQuoteWord(C,Itm.Section) == true)
92
return _error->Error("Malformed line %u in source list %s (Absolute dist)",CurLine,File.c_str());
93
Itm.Dist = SubstVar(Itm.Dist,"$(ARCH)",_config->Find("APT::Architecture"));
98
// Grab the rest of the dists
99
if (ParseQuoteWord(C,Itm.Section) == false)
100
return _error->Error("Malformed line %u in source list %s (dist parse)",CurLine,File.c_str());
169
if (ParseQuoteWord(C,LineType) == false)
170
return _error->Error(_("Malformed line %u in source list %s (type)"),CurLine,File.c_str());
172
Type *Parse = Type::GetType(LineType.c_str());
174
return _error->Error(_("Type '%s' is not known in on line %u in source list %s"),LineType.c_str(),CurLine,File.c_str());
106
while (ParseQuoteWord(C,Itm.Section) == true);
176
if (Parse->ParseLine(List,C,CurLine,File) == false)
111
// SourceList::Item << - Writes the item to a stream /*{{{*/
112
// ---------------------------------------------------------------------
113
/* This is not suitable for rebuilding the sourcelist file but it good for
115
ostream &operator <<(ostream &O,pkgSourceList::Item &Itm)
117
O << (int)Itm.Type << ' ' << Itm.URI << ' ' << Itm.Dist << ' ' << Itm.Section;
121
// SourceList::Item::SetType - Sets the distribution type /*{{{*/
182
// SourceList::FindIndex - Get the index associated with a file /*{{{*/
122
183
// ---------------------------------------------------------------------
124
bool pkgSourceList::Item::SetType(string S)
185
bool pkgSourceList::FindIndex(pkgCache::PkgFileIterator File,
186
pkgIndexFile *&Found) const
188
for (const_iterator I = List.begin(); I != List.end(); I++)
190
if ((*I)->FindInCache(*File.Cache()) == File)
141
// SourceList::Item::SetURI - Set the URI /*{{{*/
200
// SourceList::GetIndexes - Load the index files into the downloader /*{{{*/
142
201
// ---------------------------------------------------------------------
143
/* For simplicity we strip the scheme off the uri */
144
bool pkgSourceList::Item::SetURI(string S)
203
bool pkgSourceList::GetIndexes(pkgAcquire *Owner) const
146
if (S.empty() == true)
149
if (S.find(':') == string::npos)
152
S = SubstVar(S,"$(ARCH)",_config->Find("APT::Architecture"));
154
// Make sure that the URN is / postfixed
156
if (URI[URI.size() - 1] != '/')
205
for (const_iterator I = List.begin(); I != List.end(); I++)
206
if ((*I)->GetIndexes(Owner) == false)
162
// SourceList::Item::PackagesURI - Returns a URI to the packages file /*{{{*/
163
// ---------------------------------------------------------------------
165
string pkgSourceList::Item::PackagesURI() const
171
if (Dist[Dist.size() - 1] == '/')
179
Res = URI + "dists/" + Dist + '/' + Section +
180
"/binary-" + _config->Find("APT::Architecture") + '/';
186
if (Dist[Dist.size() - 1] == '/')
189
Res = URI + "dists/" + Dist + '/' + Section +
198
// SourceList::Item::PackagesInfo - Shorter version of the URI /*{{{*/
199
// ---------------------------------------------------------------------
200
/* This is a shorter version that is designed to be < 60 chars or so */
201
string pkgSourceList::Item::PackagesInfo() const
207
Res += SiteOnly(URI) + ' ';
208
if (Dist[Dist.size() - 1] == '/')
214
Res += Dist + '/' + Section;
220
Res += SiteOnly(URI) + ' ';
221
if (Dist[Dist.size() - 1] == '/')
224
Res += Dist + '/' + Section;
232
// SourceList::Item::ReleaseURI - Returns a URI to the release file /*{{{*/
233
// ---------------------------------------------------------------------
235
string pkgSourceList::Item::ReleaseURI() const
241
if (Dist[Dist.size() - 1] == '/')
249
Res = URI + "dists/" + Dist + '/' + Section +
250
"/binary-" + _config->Find("APT::Architecture") + '/';
256
if (Dist[Dist.size() - 1] == '/')
259
Res = URI + "dists/" + Dist + '/' + Section +
268
// SourceList::Item::ReleaseInfo - Shorter version of the URI /*{{{*/
269
// ---------------------------------------------------------------------
270
/* This is a shorter version that is designed to be < 60 chars or so */
271
string pkgSourceList::Item::ReleaseInfo() const
278
Res += SiteOnly(URI) + ' ';
279
if (Dist[Dist.size() - 1] == '/')
285
Res += Dist + '/' + Section;
293
// SourceList::Item::ArchiveInfo - Shorter version of the archive spec /*{{{*/
294
// ---------------------------------------------------------------------
295
/* This is a shorter version that is designed to be < 60 chars or so */
296
string pkgSourceList::Item::ArchiveInfo(pkgCache::VerIterator Ver) const
303
Res += SiteOnly(URI) + ' ';
304
if (Dist[Dist.size() - 1] == '/')
310
Res += Dist + '/' + Section;
313
Res += Ver.ParentPkg().Name();
322
// SourceList::Item::ArchiveURI - Returns a URI to the given archive /*{{{*/
323
// ---------------------------------------------------------------------
325
string pkgSourceList::Item::ArchiveURI(string File) const
338
// SourceList::Item::SourceInfo - Returns an info line for a source /*{{{*/
339
// ---------------------------------------------------------------------
341
string pkgSourceList::Item::SourceInfo(string Pkg,string Ver,string Comp) const
348
Res += SiteOnly(URI) + ' ';
349
if (Dist[Dist.size() - 1] == '/')
355
Res += Dist + '/' + Section;
361
if (Comp.empty() == false)
362
Res += " (" + Comp + ")";
368
// SourceList::Item::SiteOnly - Strip off the path part of a URI /*{{{*/
369
// ---------------------------------------------------------------------
371
string pkgSourceList::Item::SiteOnly(string URI) const
375
U.Password = string();