]> cygwin.com Git - cygwin-apps/setup.git/blob - IniDBBuilderPackage.cc
2002-05-26 Ralf Habacker <ralf.habacker@freenet.de>
[cygwin-apps/setup.git] / IniDBBuilderPackage.cc
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"
17 #include "IniParseFeedback.h"
18 #include "package_db.h"
19 #include "package_meta.h"
20 #include "package_version.h"
21 #include "cygpackage.h"
22 #include "filemanip.h"
23 #include "version.h"
24 // for strtoul
25 #include <string.h>
26
27 IniDBBuilderPackage::IniDBBuilderPackage (IniParseFeedback const &aFeedback) :
28 cp (0), cpv (0), trust (0), _feedback (aFeedback){}
29
30 void
31 IniDBBuilderPackage::buildTimestamp (String const &time)
32 {
33 timestamp = strtoul (time.cstr_oneuse(), 0, 0);
34 }
35
36 void
37 IniDBBuilderPackage::buildVersion (String const &aVersion)
38 {
39 version = aVersion;
40 if (version.size())
41 {
42 String ini_version = canonicalize_version (version);
43 String our_version = canonicalize_version (::version);
44 // XXX useversion < operator
45 if (our_version.compare (ini_version) < 0)
46 _feedback.warning("The current ini file is from a newer version of setup.exe. If you have any trouble installing, please download a fresh version from http://www.cygwin.com/setup.exe");
47 }
48 }
49
50 void
51 IniDBBuilderPackage::buildPackage (String const &name)
52 {
53 packagedb db;
54 cp = &db.packages.registerbykey(name);
55 cpv = new cygpackage (name);
56 trust = TRUST_CURR;
57 }
58
59 void
60 IniDBBuilderPackage::buildPackageVersion (String const &version)
61 {
62 cpv->set_canonical_version (version);
63 add_correct_version();
64 }
65
66 void
67 IniDBBuilderPackage::buildPackageSDesc (String const &theDesc)
68 {
69 cpv->set_sdesc(theDesc);
70 }
71
72 void
73 IniDBBuilderPackage::buildPackageLDesc (String const &theDesc)
74 {
75 cpv->set_ldesc(theDesc);
76 }
77
78 void
79 IniDBBuilderPackage::buildPackageInstall (String const &path,
80 String const &size, unsigned char const * md5)
81 {
82 process_src (cpv->bin, path, size, md5);
83 }
84 void
85 IniDBBuilderPackage::buildPackageSource (String const &path,
86 String const &size, unsigned char const * md5)
87 {
88 process_src (cpv->src, path, size, md5);
89 }
90
91 void
92 IniDBBuilderPackage::buildPackageTrust (int newtrust)
93 {
94 trust = newtrust;
95 if (newtrust != TRUST_UNKNOWN)
96 cpv = new cygpackage (cp->name);
97 }
98
99 void
100 IniDBBuilderPackage::buildPackageRequirement (String const &name)
101 {
102 cpv->new_requirement(name);
103 }
104
105 void
106 IniDBBuilderPackage::buildPackageCategory (String const &name)
107 {
108 packagedb db;
109 cp->add_category (db.categories.registerbykey (name));
110 }
111
112 void
113 IniDBBuilderPackage::add_correct_version()
114 {
115 int merged = 0;
116 for (size_t n = 1; !merged && n <= cp->versions.number (); n++)
117 if (!cp->versions[n]->Canonical_version().casecompare(cpv->Canonical_version()))
118 {
119 /* ASSUMPTIONS:
120 categories and requires are consistent for the same version across
121 all mirrors
122 */
123 /* Copy the binary mirror across if this site claims to have an install */
124 if (cpv->bin.sites.number ())
125 cp->versions[n]->bin.sites.registerbykey (cpv->bin.sites[1]->key);
126 /* Ditto for src */
127 if (cpv->src.sites.number ())
128 cp->versions[n]->src.sites.registerbykey (cpv->src.sites[1]->key);
129 /* Copy the descriptions across */
130 if (cpv->SDesc ().size() && !cp->versions[n]->SDesc ().size())
131 cp->versions[n]->set_sdesc (cpv->SDesc ());
132 if (cpv->LDesc ().size() && !cp->versions[n]->LDesc ().size())
133 cp->versions[n]->set_ldesc (cpv->LDesc ());
134 cpv = (cygpackage *)cp->versions[n];
135 merged = 1;
136 }
137 if (!merged)
138 cp->add_version (*cpv);
139 /* trust setting */
140 switch (trust)
141 {
142 case TRUST_CURR:
143 if (cp->currtimestamp < timestamp)
144 {
145 cp->currtimestamp = timestamp;
146 cp->curr = cpv;
147 }
148 break;
149 case TRUST_PREV:
150 if (cp->prevtimestamp < timestamp)
151 {
152 cp->prevtimestamp = timestamp;
153 cp->prev = cpv;
154 }
155 break;
156 case TRUST_TEST:
157 if (cp->exptimestamp < timestamp)
158 {
159 cp->exptimestamp = timestamp;
160 cp->exp = cpv;
161 }
162 break;
163 }
164 }
165
166 void
167 IniDBBuilderPackage::process_src (packagesource &src,
168 String const &path, String const &size, unsigned char const* md5)
169 {
170 if (!cpv->Canonical_version ().size())
171 {
172 fileparse f;
173 if (parse_filename (path, f))
174 {
175 cpv->set_canonical_version (f.ver);
176 add_correct_version ();
177 }
178 }
179
180 if (!src.size)
181 {
182 src.size = atoi(size.cstr_oneuse());
183 src.set_canonical (path.cstr_oneuse());
184 }
185 if (md5 && !src.md5.isSet())
186 src.md5.set(md5);
187 src.sites.registerbykey (parse_mirror);
188 }
This page took 0.041385 seconds and 5 git commands to generate.