]>
git.saurik.com Git - apt.git/blob - apt-pkg/deb/debsrcrecords.cc
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: debsrcrecords.cc,v 1.6 2004/03/17 05:58:54 mdz Exp $
4 /* ######################################################################
6 Debian Source Package Records - Parser implementation for Debian style
9 ##################################################################### */
11 // Include Files /*{{{*/
14 #include <apt-pkg/deblistparser.h>
15 #include <apt-pkg/debsrcrecords.h>
16 #include <apt-pkg/error.h>
17 #include <apt-pkg/strutl.h>
18 #include <apt-pkg/aptconfiguration.h>
19 #include <apt-pkg/srcrecords.h>
20 #include <apt-pkg/tagfile.h>
21 #include <apt-pkg/hashes.h>
22 #include <apt-pkg/gpgv.h>
35 // SrcRecordParser::Binaries - Return the binaries field /*{{{*/
36 // ---------------------------------------------------------------------
37 /* This member parses the binaries field into a pair of class arrays and
38 returns a list of strings representing all of the components of the
39 binaries field. The returned array need not be freed and will be
40 reused by the next Binaries function call. This function is commonly
41 used during scanning to find the right package */
42 const char **debSrcRecordParser::Binaries()
44 const char *Start
, *End
;
45 if (Sect
.Find("Binary", Start
, End
) == false)
47 for (; isspace(*Start
) != 0; ++Start
);
51 StaticBinList
.clear();
53 Buffer
= strndup(Start
, End
- Start
);
57 char* binStartNext
= strchrnul(bin
, ',');
58 char* binEnd
= binStartNext
- 1;
59 for (; isspace(*binEnd
) != 0; --binEnd
)
61 StaticBinList
.push_back(bin
);
62 if (*binStartNext
!= ',')
65 for (bin
= binStartNext
+ 1; isspace(*bin
) != 0; ++bin
)
67 } while (*bin
!= '\0');
68 StaticBinList
.push_back(NULL
);
70 return &StaticBinList
[0];
73 // SrcRecordParser::BuildDepends - Return the Build-Depends information /*{{{*/
74 // ---------------------------------------------------------------------
75 /* This member parses the build-depends information and returns a list of
76 package/version records representing the build dependency. The returned
77 array need not be freed and will be reused by the next call to this
79 bool debSrcRecordParser::BuildDepends(std::vector
<pkgSrcRecords::Parser::BuildDepRec
> &BuildDeps
,
80 bool const &ArchOnly
, bool const &StripMultiArch
)
83 const char *Start
, *Stop
;
85 const char *fields
[] = {"Build-Depends",
86 "Build-Depends-Indep",
88 "Build-Conflicts-Indep"};
92 for (I
= 0; I
< 4; I
++)
94 if (ArchOnly
&& (I
== 1 || I
== 3))
97 if (Sect
.Find(fields
[I
], Start
, Stop
) == false)
102 Start
= debListParser::ParseDepends(Start
, Stop
,
103 rec
.Package
,rec
.Version
,rec
.Op
,true,StripMultiArch
,true);
106 return _error
->Error("Problem parsing dependency: %s", fields
[I
]);
109 if (rec
.Package
!= "")
110 BuildDeps
.push_back(rec
);
120 // SrcRecordParser::Files - Return a list of files for this source /*{{{*/
121 // ---------------------------------------------------------------------
122 /* This parses the list of files and returns it, each file is required to have
123 a complete source package */
124 bool debSrcRecordParser::Files(std::vector
<pkgSrcRecords::File
> &List
)
126 List
.erase(List
.begin(),List
.end());
128 // Stash the / terminated directory prefix
129 string Base
= Sect
.FindS("Directory");
130 if (Base
.empty() == false && Base
[Base
.length()-1] != '/')
133 std::vector
<std::string
> const compExts
= APT::Configuration::getCompressorExtensions();
135 for (char const * const * type
= HashString::SupportedHashes(); *type
!= NULL
; ++type
)
137 // derive field from checksum type
138 std::string
checksumField("Checksums-");
139 if (strcmp(*type
, "MD5Sum") == 0)
140 checksumField
= "Files"; // historic name for MD5 checksums
142 checksumField
.append(*type
);
144 string
const Files
= Sect
.FindS(checksumField
.c_str());
145 if (Files
.empty() == true)
148 // Iterate over the entire list grabbing each triplet
149 const char *C
= Files
.c_str();
152 string hash
, size
, path
;
154 // Parse each of the elements
155 if (ParseQuoteWord(C
, hash
) == false ||
156 ParseQuoteWord(C
, size
) == false ||
157 ParseQuoteWord(C
, path
) == false)
158 return _error
->Error("Error parsing file record in %s of source package %s", checksumField
.c_str(), Package().c_str());
160 HashString
const hashString(*type
, hash
);
161 if (Base
.empty() == false)
164 // look if we have a record for this file already
165 std::vector
<pkgSrcRecords::File
>::iterator file
= List
.begin();
166 for (; file
!= List
.end(); ++file
)
167 if (file
->Path
== path
)
170 // we have it already, store the new hash and be done
171 if (file
!= List
.end())
174 // set for compatibility only, so warn users not us
175 #pragma GCC diagnostic push
176 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
178 if (checksumField
== "Files")
179 file
->MD5Hash
= hash
;
181 #pragma GCC diagnostic pop
183 // an error here indicates that we have two different hashes for the same file
184 if (file
->Hashes
.push_back(hashString
) == false)
185 return _error
->Error("Error parsing checksum in %s of source package %s", checksumField
.c_str(), Package().c_str());
189 // we haven't seen this file yet
190 pkgSrcRecords::File F
;
192 F
.Size
= strtoull(size
.c_str(), NULL
, 10);
193 F
.Hashes
.push_back(hashString
);
196 // set for compatibility only, so warn users not us
197 #pragma GCC diagnostic push
198 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
200 if (checksumField
== "Files")
203 #pragma GCC diagnostic pop
206 // Try to guess what sort of file it is we are getting.
207 string::size_type Pos
= F
.Path
.length()-1;
210 string::size_type Tmp
= F
.Path
.rfind('.',Pos
);
211 if (Tmp
== string::npos
)
213 if (F
.Type
== "tar") {
214 // source v3 has extension 'debian.tar.*' instead of 'diff.*'
215 if (string(F
.Path
, Tmp
+1, Pos
-Tmp
) == "debian")
219 F
.Type
= string(F
.Path
,Tmp
+1,Pos
-Tmp
);
221 if (std::find(compExts
.begin(), compExts
.end(), std::string(".").append(F
.Type
)) != compExts
.end() ||
237 // SrcRecordParser::~SrcRecordParser - Destructor /*{{{*/
238 // ---------------------------------------------------------------------
240 debSrcRecordParser::~debSrcRecordParser()
242 // was allocated via strndup()
248 debDscRecordParser::debDscRecordParser(std::string
const &DscFile
, pkgIndexFile
const *Index
)
249 : debSrcRecordParser(DscFile
, Index
)
251 // support clear signed files
252 if (OpenMaybeClearSignedFile(DscFile
, Fd
) == false)
254 _error
->Error("Failed to open %s", DscFile
.c_str());
258 // re-init to ensure the updated Fd is used
260 // read the first (and only) record