]>
git.saurik.com Git - apt.git/blob - apt-pkg/sourcelist.cc
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: sourcelist.cc,v 1.4 1998/07/19 04:22:04 jgg Exp $
4 /* ######################################################################
8 ##################################################################### */
10 // Include Files /*{{{*/
12 #pragma implementation "apt-pkg/sourcelist.h"
15 #include <apt-pkg/sourcelist.h>
16 #include <apt-pkg/error.h>
17 #include <apt-pkg/fileutl.h>
18 #include <apt-pkg/configuration.h>
27 // SourceList::pkgSourceList - Constructors /*{{{*/
28 // ---------------------------------------------------------------------
30 pkgSourceList::pkgSourceList()
34 pkgSourceList::pkgSourceList(string File
)
39 // SourceList::ReadMainList - Read the main source list from etc /*{{{*/
40 // ---------------------------------------------------------------------
42 bool pkgSourceList::ReadMainList()
44 return Read(_config
->Find("APT::Etc:sourcelist"));
47 // SourceList::Read - Parse the sourcelist file /*{{{*/
48 // ---------------------------------------------------------------------
50 bool pkgSourceList::Read(string File
)
52 // Open the stream for reading
53 ifstream
F(File
.c_str(),ios::in
| ios::nocreate
);
55 return _error
->Errno("ifstream::ifstream","Opening %s",File
.c_str());
57 List
.erase(List
.begin(),List
.end());
61 while (F
.eof() == false)
63 F
.getline(Buffer
,sizeof(Buffer
));
65 _strtabexpand(Buffer
,sizeof(Buffer
));
69 if (Buffer
[0] == '#' || Buffer
[0] == 0)
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());
106 while (ParseQuoteWord(C
,Itm
.Section
) == true);
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
<< Itm
.Type
<< ' ' << Itm
.URI
<< ' ' << Itm
.Dist
<< ' ' << Itm
.Section
;
121 // SourceList::Item::SetType - Sets the distribution type /*{{{*/
122 // ---------------------------------------------------------------------
124 bool pkgSourceList::Item::SetType(string S
)
135 // SourceList::Item::SetURI - Set the URI /*{{{*/
136 // ---------------------------------------------------------------------
137 /* For simplicity we strip the scheme off the uri */
138 bool pkgSourceList::Item::SetURI(string S
)
140 if (S
.empty() == true)
143 if (S
.find(':') == string::npos
)
146 S
= SubstVar(S
,"$(ARCH)",_config
->Find("APT::Architecture"));
148 // Make sure that the URN is / postfixed
150 if (URI
[URI
.size() - 1] != '/')
156 // SourceList::Item::PackagesURI - Returns a URI to the packages file /*{{{*/
157 // ---------------------------------------------------------------------
159 string
pkgSourceList::Item::PackagesURI() const
165 if (Dist
[Dist
.size() - 1] == '/')
168 Res
= URI
+ "dists/" + Dist
+ '/' + Section
+
169 "/binary-" + _config
->Find("APT::Architecture") + '/';
177 // SourceList::Item::PackagesInfo - Shorter version of the URI /*{{{*/
178 // ---------------------------------------------------------------------
179 /* This is a shorter version that is designed to be < 60 chars or so */
180 string
pkgSourceList::Item::PackagesInfo() const
186 Res
+= SiteOnly(URI
) + ' ';
187 if (Dist
[Dist
.size() - 1] == '/')
190 Res
+= Dist
+ '/' + Section
;
198 // SourceList::Item::ArchiveInfo - Shorter version of the archive spec /*{{{*/
199 // ---------------------------------------------------------------------
200 /* This is a shorter version that is designed to be < 60 chars or so */
201 string
pkgSourceList::Item::ArchiveInfo(pkgCache::VerIterator Ver
) const
207 Res
+= SiteOnly(URI
) + ' ';
208 if (Dist
[Dist
.size() - 1] == '/')
211 Res
+= Dist
+ '/' + Section
;
214 Res
+= Ver
.ParentPkg().Name();
220 // SourceList::Item::ArchiveURI - Returns a URI to the given archive /*{{{*/
221 // ---------------------------------------------------------------------
223 string
pkgSourceList::Item::ArchiveURI(string File
) const
235 // SourceList::Item::SiteOnly - Strip off the path part of a URI /*{{{*/
236 // ---------------------------------------------------------------------
238 string
pkgSourceList::Item::SiteOnly(string URI
) const
240 unsigned int Pos
= URI
.find(':');
241 if (Pos
== string::npos
|| Pos
+ 3 > URI
.length())
243 if (URI
[Pos
+ 1] != '/' || URI
[Pos
+ 2] != '/')
246 Pos
= URI
.find('/',Pos
+ 3);
247 if (Pos
== string::npos
)
249 return string(URI
,0,Pos
);