]> cygwin.com Git - cygwin-apps/setup.git/blame - IniDBBuilderPackage.cc
Add --no-version-check option
[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
6625e635
RC
32using namespace std;
33
67829ce0 34IniDBBuilderPackage::IniDBBuilderPackage (IniParseFeedback const &aFeedback) :
1c159e0a 35currentSpec (0), _feedback (aFeedback){}
67829ce0 36
3a87705e
RC
37IniDBBuilderPackage::~IniDBBuilderPackage()
38{
9651bab7 39 process();
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;
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
68const std::string
69IniDBBuilderPackage::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 84void
1c159e0a 85IniDBBuilderPackage::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
122void
9b0876b3 123IniDBBuilderPackage::buildPackageVersion (const std::string& version)
076654e7 124{
1c159e0a 125 cbpv.version = version;
076654e7
RC
126}
127
128void
9b0876b3 129IniDBBuilderPackage::buildPackageSDesc (const std::string& theDesc)
076654e7 130{
1c159e0a 131 cbpv.sdesc = theDesc;
076654e7
RC
132}
133
134void
9b0876b3 135IniDBBuilderPackage::buildPackageLDesc (const std::string& theDesc)
076654e7 136{
1c159e0a 137 cbpv.ldesc = theDesc;
076654e7
RC
138}
139
140void
9a1a53fc 141IniDBBuilderPackage::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 170void
9b0876b3 171IniDBBuilderPackage::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
219void
1c159e0a 220IniDBBuilderPackage::buildPackageTrust (trusts newtrust)
076654e7 221{
1c159e0a
JT
222 process();
223 cbpv.stability = newtrust;
076654e7
RC
224}
225
226void
9b0876b3 227IniDBBuilderPackage::buildPackageCategory (const std::string& name)
076654e7 228{
1c159e0a 229 categories.insert(name);
076654e7
RC
230}
231
aa1e3b4d
RC
232void
233IniDBBuilderPackage::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
244void
245IniDBBuilderPackage::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
255void
256IniDBBuilderPackage::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
267void
268IniDBBuilderPackage::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
279void
280IniDBBuilderPackage::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 291void
1c159e0a 292IniDBBuilderPackage::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
303void
9b0876b3 304IniDBBuilderPackage::buildSourceNameVersion (const std::string& version)
aa1e3b4d 305{
1c159e0a 306 // XXX: should be stored as sourceevr
aa1e3b4d
RC
307}
308
309void
60b4f6ca 310IniDBBuilderPackage::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
320void
321IniDBBuilderPackage::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 333void
9b0876b3 334IniDBBuilderPackage::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 346void
1c159e0a 347IniDBBuilderPackage::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
353void
354IniDBBuilderPackage::buildPackageReplaceVersionsList (const std::string& version)
355{
356 replace_versions.insert(version);
357}
358
1c159e0a
JT
359/* privates */
360void
361IniDBBuilderPackage::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}
This page took 0.119148 seconds and 5 git commands to generate.