]> git.saurik.com Git - apt.git/blame - apt-pkg/srcrecords.cc
cherry pick 39a07ec8f2c612a5af234c7713571362f7ca90b4
[apt.git] / apt-pkg / srcrecords.cc
CommitLineData
11e7af84
AL
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
b3d44315 3// $Id: srcrecords.cc,v 1.7.2.2 2003/12/26 16:27:34 mdz Exp $
11e7af84
AL
4/* ######################################################################
5
6 Source Package Records - Allows access to source package records
7
8 Parses and allows access to the list of source records and searching by
9 source name on that list.
10
11 ##################################################################### */
12 /*}}}*/
13// Include Files /*{{{*/
ea542140
DK
14#include<config.h>
15
11e7af84
AL
16#include <apt-pkg/srcrecords.h>
17#include <apt-pkg/error.h>
b2e465d6 18#include <apt-pkg/sourcelist.h>
11e7af84 19#include <apt-pkg/strutl.h>
472ff00e 20#include <apt-pkg/metaindex.h>
ea542140
DK
21
22#include <apti18n.h>
11e7af84
AL
23 /*}}}*/
24
25// SrcRecords::pkgSrcRecords - Constructor /*{{{*/
26// ---------------------------------------------------------------------
27/* Open all the source index files */
dcaa1185 28pkgSrcRecords::pkgSrcRecords(pkgSourceList &List) : d(NULL), Files(0), Current(0)
11e7af84 29{
f7f0d6c7 30 for (pkgSourceList::const_iterator I = List.begin(); I != List.end(); ++I)
b2e465d6 31 {
73688d27
DK
32 std::vector<pkgIndexFile *> *Indexes = (*I)->GetIndexFiles();
33 for (std::vector<pkgIndexFile *>::const_iterator J = Indexes->begin();
f7f0d6c7 34 J != Indexes->end(); ++J)
b3d44315
MV
35 {
36 Parser* P = (*J)->CreateSrcParser();
37 if (_error->PendingError() == true)
38 return;
39 if (P != 0)
40 Files.push_back(P);
41 }
b2e465d6 42 }
b2e465d6 43
0e72dd52 44 // Doesn't work without any source index files
69c2ecbd 45 if (Files.empty() == true)
11e7af84 46 {
677cbcbc 47 _error->Error(_("You must put some 'source' URIs"
b2e465d6 48 " in your sources.list"));
11e7af84
AL
49 return;
50 }
51
11e7af84
AL
52 Restart();
53}
54 /*}}}*/
55// SrcRecords::~pkgSrcRecords - Destructor /*{{{*/
56// ---------------------------------------------------------------------
57/* */
58pkgSrcRecords::~pkgSrcRecords()
59{
11e7af84 60 // Blow away all the parser objects
73688d27 61 for(std::vector<Parser*>::iterator I = Files.begin(); I != Files.end(); ++I)
b3d44315 62 delete *I;
11e7af84
AL
63}
64 /*}}}*/
65// SrcRecords::Restart - Restart the search /*{{{*/
66// ---------------------------------------------------------------------
67/* Return all of the parsers to their starting position */
68bool pkgSrcRecords::Restart()
69{
b3d44315 70 Current = Files.begin();
73688d27 71 for (std::vector<Parser*>::iterator I = Files.begin();
f7f0d6c7 72 I != Files.end(); ++I)
aaee8293
AL
73 (*I)->Restart();
74
11e7af84
AL
75 return true;
76}
77 /*}}}*/
78// SrcRecords::Find - Find the first source package with the given name /*{{{*/
79// ---------------------------------------------------------------------
80/* This searches on both source package names and output binary names and
81 returns the first found. A 'cursor' like system is used to allow this
82 function to be called multiple times to get successive entries */
41c81fd8 83pkgSrcRecords::Parser *pkgSrcRecords::Find(const char *Package,bool const &SrcOnly)
11e7af84 84{
b3d44315 85 if (Current == Files.end())
11e7af84
AL
86 return 0;
87
88 while (true)
89 {
90 // Step to the next record, possibly switching files
91 while ((*Current)->Step() == false)
92 {
93 if (_error->PendingError() == true)
94 return 0;
f7f0d6c7 95 ++Current;
b3d44315 96 if (Current == Files.end())
11e7af84
AL
97 return 0;
98 }
99
100 // IO error somehow
101 if (_error->PendingError() == true)
102 return 0;
103
104 // Source name hit
105 if ((*Current)->Package() == Package)
106 return *Current;
107
108 if (SrcOnly == true)
109 continue;
110
111 // Check for a binary hit
112 const char **I = (*Current)->Binaries();
f7f0d6c7 113 for (; I != 0 && *I != 0; ++I)
11e7af84
AL
114 if (strcmp(Package,*I) == 0)
115 return *Current;
116 }
117}
118 /*}}}*/
b2e465d6
AL
119// Parser::BuildDepType - Convert a build dep to a string /*{{{*/
120// ---------------------------------------------------------------------
121/* */
41c81fd8 122const char *pkgSrcRecords::Parser::BuildDepType(unsigned char const &Type)
b2e465d6 123{
69c2ecbd
DK
124 const char *fields[] = {"Build-Depends",
125 "Build-Depends-Indep",
b2e465d6
AL
126 "Build-Conflicts",
127 "Build-Conflicts-Indep"};
69c2ecbd 128 if (unlikely(Type >= sizeof(fields)/sizeof(fields[0])))
b2e465d6 129 return "";
69c2ecbd 130 return fields[Type];
b2e465d6
AL
131}
132 /*}}}*/
133
11e7af84 134