]> cygwin.com Git - cygwin-apps/setup.git/blame - IniDBBuilderPackage.cc
Further fix symlinks to absolute paths made for ' --symlink-type native'
[cygwin-apps/setup.git] / IniDBBuilderPackage.cc
CommitLineData
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 32IniDBBuilderPackage::IniDBBuilderPackage (IniParseFeedback const &aFeedback) :
51351b41 33 currentSpec (0), _feedback (aFeedback), minimum_version_checked(FALSE) {}
67829ce0 34
3a87705e
RC
35IniDBBuilderPackage::~IniDBBuilderPackage()
36{
9651bab7 37 process();
dc2d74cc
KB
38 packagedb db;
39 db.solver.internalize();
3a87705e
RC
40}
41
076654e7 42void
9b0876b3 43IniDBBuilderPackage::buildTimestamp (const std::string& time)
076654e7 44{
d2a3615c 45 timestamp = strtoul (time.c_str(), 0, 0);
076654e7
RC
46}
47
48void
9b0876b3 49IniDBBuilderPackage::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
77const std::string
78IniDBBuilderPackage::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 94void
1c159e0a 95IniDBBuilderPackage::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
132void
9b0876b3 133IniDBBuilderPackage::buildPackageVersion (const std::string& version)
076654e7 134{
1c159e0a 135 cbpv.version = version;
076654e7
RC
136}
137
138void
9b0876b3 139IniDBBuilderPackage::buildPackageSDesc (const std::string& theDesc)
076654e7 140{
1c159e0a 141 cbpv.sdesc = theDesc;
076654e7
RC
142}
143
144void
9b0876b3 145IniDBBuilderPackage::buildPackageLDesc (const std::string& theDesc)
076654e7 146{
1c159e0a 147 cbpv.ldesc = theDesc;
076654e7
RC
148}
149
150void
9a1a53fc 151IniDBBuilderPackage::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 180void
9b0876b3 181IniDBBuilderPackage::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
229void
1c159e0a 230IniDBBuilderPackage::buildPackageTrust (trusts newtrust)
076654e7 231{
1c159e0a
JT
232 process();
233 cbpv.stability = newtrust;
076654e7
RC
234}
235
236void
9b0876b3 237IniDBBuilderPackage::buildPackageCategory (const std::string& name)
076654e7 238{
1c159e0a 239 categories.insert(name);
076654e7
RC
240}
241
aa1e3b4d
RC
242void
243IniDBBuilderPackage::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
254void
255IniDBBuilderPackage::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
265void
266IniDBBuilderPackage::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
277void
278IniDBBuilderPackage::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
289void
290IniDBBuilderPackage::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 301void
1c159e0a 302IniDBBuilderPackage::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
313void
9b0876b3 314IniDBBuilderPackage::buildSourceNameVersion (const std::string& version)
aa1e3b4d 315{
1c159e0a 316 // XXX: should be stored as sourceevr
aa1e3b4d
RC
317}
318
319void
60b4f6ca 320IniDBBuilderPackage::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
330void
331IniDBBuilderPackage::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 343void
9b0876b3 344IniDBBuilderPackage::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 356void
1c159e0a 357IniDBBuilderPackage::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
363void
364IniDBBuilderPackage::buildPackageReplaceVersionsList (const std::string& version)
365{
366 replace_versions.insert(version);
367}
368
1c159e0a
JT
369/* privates */
370void
371IniDBBuilderPackage::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}
This page took 0.246142 seconds and 5 git commands to generate.