]> git.saurik.com Git - apt.git/blame_incremental - apt-pkg/sourcelist.cc
BSD testing fixes
[apt.git] / apt-pkg / sourcelist.cc
... / ...
CommitLineData
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
3// $Id: sourcelist.cc,v 1.18 2001/02/20 07:03:17 jgg Exp $
4/* ######################################################################
5
6 List of Sources
7
8 ##################################################################### */
9 /*}}}*/
10// Include Files /*{{{*/
11#ifdef __GNUG__
12#pragma implementation "apt-pkg/sourcelist.h"
13#endif
14
15#include <apt-pkg/sourcelist.h>
16#include <apt-pkg/error.h>
17#include <apt-pkg/fileutl.h>
18#include <apt-pkg/configuration.h>
19#include <apt-pkg/strutl.h>
20
21#include <apti18n.h>
22
23#include <fstream.h>
24 /*}}}*/
25
26// Global list of Item supported
27static pkgSourceList::Type *ItmList[10];
28pkgSourceList::Type **pkgSourceList::Type::GlobalList = ItmList;
29unsigned long pkgSourceList::Type::GlobalListLen = 0;
30
31// Type::Type - Constructor /*{{{*/
32// ---------------------------------------------------------------------
33/* Link this to the global list of items*/
34pkgSourceList::Type::Type()
35{
36 ItmList[GlobalListLen] = this;
37 GlobalListLen++;
38}
39 /*}}}*/
40// Type::GetType - Get a specific meta for a given type /*{{{*/
41// ---------------------------------------------------------------------
42/* */
43pkgSourceList::Type *pkgSourceList::Type::GetType(const char *Type)
44{
45 for (unsigned I = 0; I != GlobalListLen; I++)
46 if (strcmp(GlobalList[I]->Name,Type) == 0)
47 return GlobalList[I];
48 return 0;
49}
50 /*}}}*/
51// Type::FixupURI - Normalize the URI and check it.. /*{{{*/
52// ---------------------------------------------------------------------
53/* */
54bool pkgSourceList::Type::FixupURI(string &URI) const
55{
56 if (URI.empty() == true)
57 return false;
58
59 if (URI.find(':') == string::npos)
60 return false;
61
62 URI = SubstVar(URI,"$(ARCH)",_config->Find("APT::Architecture"));
63
64 // Make sure that the URN is / postfixed
65 if (URI[URI.size() - 1] != '/')
66 URI += '/';
67
68 return true;
69}
70 /*}}}*/
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. */
75bool pkgSourceList::Type::ParseLine(vector<pkgIndexFile *> &List,
76 const char *Buffer,
77 unsigned long CurLine,
78 string File) const
79{
80 string URI;
81 string Dist;
82 string Section;
83
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());
88
89 if (FixupURI(URI) == false)
90 return _error->Error(_("Malformed line %lu in source list %s (URI parse)"),CurLine,File.c_str());
91
92 // Check for an absolute dists specification.
93 if (Dist.empty() == false && Dist[Dist.size() - 1] == '/')
94 {
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);
99 }
100
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());
104
105 do
106 {
107 if (CreateItem(List,URI,Dist,Section) == false)
108 return false;
109 }
110 while (ParseQuoteWord(Buffer,Section) == true);
111
112 return true;
113}
114 /*}}}*/
115
116// SourceList::pkgSourceList - Constructors /*{{{*/
117// ---------------------------------------------------------------------
118/* */
119pkgSourceList::pkgSourceList()
120{
121}
122
123pkgSourceList::pkgSourceList(string File)
124{
125 Read(File);
126}
127 /*}}}*/
128// SourceList::ReadMainList - Read the main source list from etc /*{{{*/
129// ---------------------------------------------------------------------
130/* */
131bool pkgSourceList::ReadMainList()
132{
133 return Read(_config->FindFile("Dir::Etc::sourcelist"));
134}
135 /*}}}*/
136// SourceList::Read - Parse the sourcelist file /*{{{*/
137// ---------------------------------------------------------------------
138/* */
139bool pkgSourceList::Read(string File)
140{
141 // Open the stream for reading
142 ifstream F(File.c_str(),ios::in | ios::nocreate);
143 if (!F != 0)
144 return _error->Errno("ifstream::ifstream",_("Opening %s"),File.c_str());
145
146 List.erase(List.begin(),List.end());
147 char Buffer[300];
148
149 int CurLine = 0;
150 while (F.eof() == false)
151 {
152 F.getline(Buffer,sizeof(Buffer));
153 CurLine++;
154 _strtabexpand(Buffer,sizeof(Buffer));
155
156
157 char *I;
158 for (I = Buffer; *I != 0 && *I != '#'; I++);
159 *I = 0;
160
161 const char *C = _strstrip(Buffer);
162
163 // Comment or blank
164 if (C[0] == '#' || C[0] == 0)
165 continue;
166
167 // Grok it
168 string LineType;
169 if (ParseQuoteWord(C,LineType) == false)
170 return _error->Error(_("Malformed line %u in source list %s (type)"),CurLine,File.c_str());
171
172 Type *Parse = Type::GetType(LineType.c_str());
173 if (Parse == 0)
174 return _error->Error(_("Type '%s' is not known in on line %u in source list %s"),LineType.c_str(),CurLine,File.c_str());
175
176 if (Parse->ParseLine(List,C,CurLine,File) == false)
177 return false;
178 }
179 return true;
180}
181 /*}}}*/
182// SourceList::FindIndex - Get the index associated with a file /*{{{*/
183// ---------------------------------------------------------------------
184/* */
185bool pkgSourceList::FindIndex(pkgCache::PkgFileIterator File,
186 pkgIndexFile *&Found) const
187{
188 for (const_iterator I = List.begin(); I != List.end(); I++)
189 {
190 if ((*I)->FindInCache(*File.Cache()) == File)
191 {
192 Found = *I;
193 return true;
194 }
195 }
196
197 return false;
198}
199 /*}}}*/
200// SourceList::GetIndexes - Load the index files into the downloader /*{{{*/
201// ---------------------------------------------------------------------
202/* */
203bool pkgSourceList::GetIndexes(pkgAcquire *Owner) const
204{
205 for (const_iterator I = List.begin(); I != List.end(); I++)
206 if ((*I)->GetIndexes(Owner) == false)
207 return false;
208 return true;
209}
210 /*}}}*/