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