]>
Commit | Line | Data |
---|---|---|
076654e7 RC |
1 | /* |
2 | * Copyright (c) 2002, Robert Collins. | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or modify | |
5 | * it under the terms of the GNU General Public License as published by | |
6 | * the Free Software Foundation; either version 2 of the License, or | |
7 | * (at your option) any later version. | |
8 | * | |
9 | * A copy of the GNU General Public License can be found at | |
10 | * http://www.gnu.org/ | |
11 | * | |
12 | * Written by Robert Collins <rbtcollins@hotmail.com> | |
13 | * | |
14 | */ | |
15 | ||
16 | #include "IniDBBuilderPackage.h" | |
2b734ec7 MB |
17 | |
18 | #include "csu_util/version_compare.h" | |
19 | ||
20 | #include "setup_version.h" | |
21 | ||
67829ce0 | 22 | #include "IniParseFeedback.h" |
076654e7 RC |
23 | #include "package_db.h" |
24 | #include "package_meta.h" | |
42c65340 | 25 | #include "ini.h" |
076654e7 RC |
26 | // for strtoul |
27 | #include <string.h> | |
aa1e3b4d RC |
28 | #include "LogSingleton.h" |
29 | #include "PackageSpecification.h" | |
3c196821 | 30 | #include <algorithm> |
076654e7 | 31 | |
6625e635 RC |
32 | using namespace std; |
33 | ||
67829ce0 | 34 | IniDBBuilderPackage::IniDBBuilderPackage (IniParseFeedback const &aFeedback) : |
1c159e0a | 35 | currentSpec (0), _feedback (aFeedback){} |
67829ce0 | 36 | |
3a87705e RC |
37 | IniDBBuilderPackage::~IniDBBuilderPackage() |
38 | { | |
9651bab7 | 39 | process(); |
3a87705e RC |
40 | } |
41 | ||
076654e7 | 42 | void |
9b0876b3 | 43 | IniDBBuilderPackage::buildTimestamp (const std::string& time) |
076654e7 | 44 | { |
d2a3615c | 45 | timestamp = strtoul (time.c_str(), 0, 0); |
076654e7 RC |
46 | } |
47 | ||
48 | void | |
9b0876b3 | 49 | IniDBBuilderPackage::buildVersion (const std::string& aVersion) |
076654e7 RC |
50 | { |
51 | version = aVersion; | |
67829ce0 RC |
52 | if (version.size()) |
53 | { | |
2b734ec7 | 54 | if (version_compare(setup_version, version) < 0) |
42c65340 CV |
55 | { |
56 | char old_vers[256]; | |
57 | snprintf (old_vers, sizeof old_vers, | |
58 | "The current ini file is from a newer version of setup-%s.exe. " | |
59 | "If you have any trouble installing, please download a fresh " | |
2a6835da | 60 | "version from https://cygwin.com/setup-%s.exe", |
42c65340 CV |
61 | is_64bit ? "x86_64" : "x86", |
62 | is_64bit ? "x86_64" : "x86"); | |
63 | _feedback.warning(old_vers); | |
64 | } | |
67829ce0 | 65 | } |
076654e7 RC |
66 | } |
67 | ||
ec599284 JT |
68 | const std::string |
69 | IniDBBuilderPackage::buildMinimumVersion (const std::string& minimum) | |
70 | { | |
71 | if (version_compare(setup_version, minimum) < 0) | |
72 | { | |
73 | char min_vers[256]; | |
74 | snprintf (min_vers, sizeof(min_vers), | |
75 | "The current ini file requires at least version %s of setup.\n" | |
2a6835da | 76 | "Please download a newer version from https://cygwin.com/setup-%s.exe", |
ec599284 JT |
77 | minimum.c_str(), |
78 | is_64bit ? "x86_64" : "x86"); | |
79 | return min_vers; | |
80 | } | |
81 | return ""; | |
82 | } | |
83 | ||
076654e7 | 84 | void |
1c159e0a | 85 | IniDBBuilderPackage::buildPackage (const std::string& _name) |
076654e7 | 86 | { |
1c159e0a JT |
87 | process(); |
88 | ||
89 | /* Reset for next package */ | |
90 | name = _name; | |
91 | message_id = ""; | |
92 | message_string = ""; | |
93 | categories.clear(); | |
d2e0c29e | 94 | replace_versions.clear(); |
1c159e0a JT |
95 | |
96 | cbpv.reponame = release; | |
97 | cbpv.version = ""; | |
98 | cbpv.vendor = release; | |
99 | cbpv.sdesc = ""; | |
100 | cbpv.ldesc = ""; | |
101 | cbpv.stability = TRUST_CURR; | |
102 | cbpv.type = package_binary; | |
103 | cbpv.spkg = PackageSpecification(); | |
104 | cbpv.spkg_id = packageversion(); | |
105 | cbpv.requires = NULL; | |
20b98f20 | 106 | cbpv.obsoletes = NULL; |
9c3e3256 | 107 | cbpv.provides = NULL; |
e6433da6 | 108 | cbpv.conflicts = NULL; |
1c159e0a JT |
109 | cbpv.archive = packagesource(); |
110 | ||
aa1e3b4d | 111 | currentSpec = NULL; |
20b98f20 JT |
112 | currentNodeList = NULL; |
113 | dependsNodeList = PackageDepends(); | |
114 | obsoletesNodeList = PackageDepends(); | |
9c3e3256 | 115 | providesNodeList = PackageDepends(); |
e6433da6 | 116 | conflictsNodeList = PackageDepends(); |
3c196821 | 117 | #if DEBUG |
157dc2b8 | 118 | Log (LOG_BABBLE) << "Created package " << name << endLog; |
3c196821 | 119 | #endif |
076654e7 RC |
120 | } |
121 | ||
122 | void | |
9b0876b3 | 123 | IniDBBuilderPackage::buildPackageVersion (const std::string& version) |
076654e7 | 124 | { |
1c159e0a | 125 | cbpv.version = version; |
076654e7 RC |
126 | } |
127 | ||
128 | void | |
9b0876b3 | 129 | IniDBBuilderPackage::buildPackageSDesc (const std::string& theDesc) |
076654e7 | 130 | { |
1c159e0a | 131 | cbpv.sdesc = theDesc; |
076654e7 RC |
132 | } |
133 | ||
134 | void | |
9b0876b3 | 135 | IniDBBuilderPackage::buildPackageLDesc (const std::string& theDesc) |
076654e7 | 136 | { |
1c159e0a | 137 | cbpv.ldesc = theDesc; |
076654e7 RC |
138 | } |
139 | ||
140 | void | |
9a1a53fc | 141 | IniDBBuilderPackage::buildPackageInstall (const std::string& path, |
419e12a1 JT |
142 | const std::string& size, |
143 | char *hash, | |
144 | hashType type) | |
076654e7 | 145 | { |
1c159e0a JT |
146 | // set archive path, size, mirror, hash |
147 | cbpv.archive.set_canonical(path.c_str()); | |
148 | cbpv.archive.size = atoi(size.c_str()); | |
149 | cbpv.archive.sites.push_back(site(parse_mirror)); | |
419e12a1 JT |
150 | |
151 | switch (type) { | |
152 | case hashType::sha512: | |
1c159e0a | 153 | if (hash && !cbpv.archive.sha512_isSet) |
419e12a1 | 154 | { |
1c159e0a JT |
155 | memcpy (cbpv.archive.sha512sum, hash, sizeof(cbpv.archive.sha512sum)); |
156 | cbpv.archive.sha512_isSet = true; | |
419e12a1 JT |
157 | } |
158 | break; | |
159 | ||
160 | case hashType::md5: | |
1c159e0a JT |
161 | if (hash && !cbpv.archive.md5.isSet()) |
162 | cbpv.archive.md5.set((unsigned char *)hash); | |
419e12a1 JT |
163 | break; |
164 | ||
165 | case hashType::none: | |
166 | break; | |
167 | } | |
076654e7 | 168 | } |
3c196821 | 169 | |
076654e7 | 170 | void |
9b0876b3 | 171 | IniDBBuilderPackage::buildPackageSource (const std::string& path, |
419e12a1 JT |
172 | const std::string& size, |
173 | char *hash, | |
174 | hashType type) | |
076654e7 | 175 | { |
1c159e0a JT |
176 | /* When there is a source: line, we invent a package to contain the source, |
177 | and make it the source package for this package. */ | |
3c196821 | 178 | |
1c159e0a JT |
179 | /* create a source package version */ |
180 | SolverPool::addPackageData cspv = cbpv; | |
181 | cspv.type = package_source; | |
182 | cspv.requires = NULL; | |
20b98f20 | 183 | cspv.obsoletes = NULL; |
9c3e3256 | 184 | cspv.provides = NULL; |
e6433da6 | 185 | cspv.conflicts = NULL; |
3c196821 | 186 | |
1c159e0a JT |
187 | /* set archive path, size, mirror, hash */ |
188 | cspv.archive = packagesource(); | |
189 | cspv.archive.set_canonical(path.c_str()); | |
190 | cspv.archive.size = atoi(size.c_str()); | |
191 | cspv.archive.sites.push_back(site(parse_mirror)); | |
419e12a1 JT |
192 | |
193 | switch (type) { | |
194 | case hashType::sha512: | |
1c159e0a | 195 | if (hash && !cspv.archive.sha512_isSet) |
419e12a1 | 196 | { |
1c159e0a JT |
197 | memcpy (cspv.archive.sha512sum, hash, sizeof(cspv.archive.sha512sum)); |
198 | cspv.archive.sha512_isSet = true; | |
419e12a1 JT |
199 | } |
200 | break; | |
201 | ||
202 | case hashType::md5: | |
1c159e0a JT |
203 | if (hash && !cspv.archive.md5.isSet()) |
204 | cspv.archive.md5.set((unsigned char *)hash); | |
419e12a1 JT |
205 | break; |
206 | ||
207 | case hashType::none: | |
208 | break; | |
209 | } | |
1c159e0a JT |
210 | |
211 | packagedb db; | |
212 | packageversion spkg_id = db.addSource (name + "-src", cspv); | |
213 | ||
214 | /* create relationship between binary and source packageversions */ | |
215 | cbpv.spkg = PackageSpecification(name + "-src"); | |
216 | cbpv.spkg_id = spkg_id; | |
076654e7 RC |
217 | } |
218 | ||
219 | void | |
1c159e0a | 220 | IniDBBuilderPackage::buildPackageTrust (trusts newtrust) |
076654e7 | 221 | { |
1c159e0a JT |
222 | process(); |
223 | cbpv.stability = newtrust; | |
076654e7 RC |
224 | } |
225 | ||
226 | void | |
9b0876b3 | 227 | IniDBBuilderPackage::buildPackageCategory (const std::string& name) |
076654e7 | 228 | { |
1c159e0a | 229 | categories.insert(name); |
076654e7 RC |
230 | } |
231 | ||
aa1e3b4d RC |
232 | void |
233 | IniDBBuilderPackage::buildBeginDepends () | |
234 | { | |
235 | #if DEBUG | |
f717b243 | 236 | Log (LOG_BABBLE) << "Beginning of a depends statement " << endLog; |
aa1e3b4d RC |
237 | #endif |
238 | currentSpec = NULL; | |
20b98f20 JT |
239 | dependsNodeList = PackageDepends(); |
240 | currentNodeList = &dependsNodeList; | |
241 | cbpv.requires = &dependsNodeList; | |
aa1e3b4d RC |
242 | } |
243 | ||
b1ff53ed RC |
244 | void |
245 | IniDBBuilderPackage::buildBeginBuildDepends () | |
246 | { | |
247 | #if DEBUG | |
157dc2b8 | 248 | Log (LOG_BABBLE) << "Beginning of a Build-Depends statement" << endLog; |
b1ff53ed RC |
249 | #endif |
250 | currentSpec = NULL; | |
20b98f20 | 251 | currentNodeList = NULL; |
1c159e0a | 252 | /* there is currently nowhere to store Build-Depends information */ |
b1ff53ed RC |
253 | } |
254 | ||
20b98f20 JT |
255 | void |
256 | IniDBBuilderPackage::buildBeginObsoletes () | |
257 | { | |
258 | #if DEBUG | |
259 | Log (LOG_BABBLE) << "Beginning of an obsoletes statement" << endLog; | |
260 | #endif | |
261 | currentSpec = NULL; | |
262 | obsoletesNodeList = PackageDepends(); | |
263 | currentNodeList = &obsoletesNodeList; | |
264 | cbpv.obsoletes = &obsoletesNodeList; | |
265 | } | |
266 | ||
9c3e3256 JT |
267 | void |
268 | IniDBBuilderPackage::buildBeginProvides () | |
269 | { | |
270 | #if DEBUG | |
271 | Log (LOG_BABBLE) << "Beginning of a provides statement" << endLog; | |
272 | #endif | |
273 | currentSpec = NULL; | |
274 | providesNodeList = PackageDepends(); | |
275 | currentNodeList = &providesNodeList; | |
276 | cbpv.provides = &providesNodeList; | |
277 | } | |
278 | ||
e6433da6 JT |
279 | void |
280 | IniDBBuilderPackage::buildBeginConflicts () | |
281 | { | |
282 | #if DEBUG | |
283 | Log (LOG_BABBLE) << "Beginning of a conflicts statement" << endLog; | |
284 | #endif | |
285 | currentSpec = NULL; | |
286 | conflictsNodeList = PackageDepends(); | |
287 | currentNodeList = &conflictsNodeList; | |
288 | cbpv.conflicts = &conflictsNodeList; | |
289 | } | |
290 | ||
157dc2b8 | 291 | void |
1c159e0a | 292 | IniDBBuilderPackage::buildSourceName (const std::string& _name) |
aa1e3b4d | 293 | { |
1c159e0a | 294 | // When there is a Source: line, that names a real source package |
c59b92e8 JT |
295 | packagedb db; |
296 | cbpv.spkg = PackageSpecification(_name); | |
297 | cbpv.spkg_id = db.findSourceVersion (PackageSpecification(_name, cbpv.version)); | |
aa1e3b4d | 298 | #if DEBUG |
1c159e0a | 299 | Log (LOG_BABBLE) << "\"" << _name << "\" is the source package for " << name << "." << endLog; |
aa1e3b4d | 300 | #endif |
aa1e3b4d RC |
301 | } |
302 | ||
303 | void | |
9b0876b3 | 304 | IniDBBuilderPackage::buildSourceNameVersion (const std::string& version) |
aa1e3b4d | 305 | { |
1c159e0a | 306 | // XXX: should be stored as sourceevr |
aa1e3b4d RC |
307 | } |
308 | ||
309 | void | |
60b4f6ca | 310 | IniDBBuilderPackage::buildPackageListNode (const std::string & name) |
aa1e3b4d | 311 | { |
aa1e3b4d | 312 | #if DEBUG |
f717b243 | 313 | Log (LOG_BABBLE) << "New node '" << name << "' for package list" << endLog; |
aa1e3b4d | 314 | #endif |
f717b243 | 315 | currentSpec = new PackageSpecification (name); |
20b98f20 JT |
316 | if (currentNodeList) |
317 | currentNodeList->push_back (currentSpec); | |
aa1e3b4d RC |
318 | } |
319 | ||
320 | void | |
321 | IniDBBuilderPackage::buildPackageListOperator (PackageSpecification::_operators const &_operator) | |
322 | { | |
323 | if (currentSpec) | |
324 | { | |
325 | currentSpec->setOperator (_operator); | |
326 | #if DEBUG | |
157dc2b8 | 327 | Log (LOG_BABBLE) << "Current specification is " << *currentSpec << "." << |
aa1e3b4d RC |
328 | endLog; |
329 | #endif | |
330 | } | |
aa1e3b4d RC |
331 | } |
332 | ||
aa1e3b4d | 333 | void |
9b0876b3 | 334 | IniDBBuilderPackage::buildPackageListOperatorVersion (const std::string& aVersion) |
aa1e3b4d RC |
335 | { |
336 | if (currentSpec) | |
337 | { | |
338 | currentSpec->setVersion (aVersion); | |
339 | #if DEBUG | |
157dc2b8 | 340 | Log (LOG_BABBLE) << "Current specification is " << *currentSpec << "." << |
aa1e3b4d RC |
341 | endLog; |
342 | #endif | |
343 | } | |
aa1e3b4d RC |
344 | } |
345 | ||
076654e7 | 346 | void |
1c159e0a | 347 | IniDBBuilderPackage::buildMessage (const std::string& _message_id, const std::string& _message_string) |
076654e7 | 348 | { |
1c159e0a JT |
349 | message_id = _message_id; |
350 | message_string = _message_string; | |
351 | } | |
78e4c7d7 | 352 | |
d2e0c29e JT |
353 | void |
354 | IniDBBuilderPackage::buildPackageReplaceVersionsList (const std::string& version) | |
355 | { | |
356 | replace_versions.insert(version); | |
357 | } | |
358 | ||
1c159e0a JT |
359 | /* privates */ |
360 | void | |
361 | IniDBBuilderPackage::process () | |
362 | { | |
363 | if (!name.size()) | |
364 | return; | |
e15fb0ab | 365 | |
0ffb7794 JT |
366 | if (cbpv.version.empty()) |
367 | return; | |
368 | ||
e15fb0ab | 369 | #if DEBUG |
1c159e0a JT |
370 | Log (LOG_BABBLE) << "Finished with package " << name << endLog; |
371 | Log (LOG_BABBLE) << "Version " << cbpv.version << endLog; | |
e15fb0ab | 372 | #endif |
e15fb0ab | 373 | |
1c159e0a JT |
374 | /* Transfer the accumulated package information to packagedb */ |
375 | packagedb db; | |
376 | packagemeta *pkg = db.addBinary (name, cbpv); | |
e15fb0ab | 377 | |
1c159e0a JT |
378 | // For no good historical reason, some data lives in packagemeta rather than |
379 | // the packageversion | |
380 | for (auto i = categories.begin(); i != categories.end(); i++) | |
e15fb0ab | 381 | { |
1c159e0a | 382 | pkg->add_category(*i); |
e15fb0ab | 383 | } |
1c159e0a | 384 | pkg->set_message(message_id, message_string); |
d2e0c29e | 385 | pkg->set_version_blacklist(replace_versions); |
aa1e3b4d | 386 | |
1c159e0a | 387 | // Reset for next version |
7f6e9fae KB |
388 | cbpv.version = ""; |
389 | cbpv.type = package_binary; | |
1c159e0a JT |
390 | cbpv.spkg = PackageSpecification(); |
391 | cbpv.spkg_id = packageversion(); | |
7f6e9fae | 392 | cbpv.archive = packagesource(); |
9c3e3256 JT |
393 | obsoletesNodeList = PackageDepends(); |
394 | providesNodeList = PackageDepends(); | |
e6433da6 | 395 | conflictsNodeList = PackageDepends(); |
f38044ff | 396 | } |