]>
cygwin.com Git - cygwin-apps/setup.git/blob - IniDBBuilderPackage.cc
2 * Copyright (c) 2002, Robert Collins.
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.
9 * A copy of the GNU General Public License can be found at
12 * Written by Robert Collins <rbtcollins@hotmail.com>
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"
26 #include "LogSingleton.h"
27 #include "PackageSpecification.h"
30 IniDBBuilderPackage :: IniDBBuilderPackage ( IniParseFeedback
const & aFeedback
) :
31 cp ( 0 ), cbpv (), cspv (), currentSpec ( 0 ), currentOrList ( 0 ), currentAndList ( 0 ), trust ( 0 ), _feedback ( aFeedback
){}
34 IniDBBuilderPackage :: buildTimestamp ( String
const & time
)
36 timestamp
= strtoul ( time
. cstr_oneuse (), 0 , 0 );
40 IniDBBuilderPackage :: buildVersion ( String
const & aVersion
)
45 String ini_version
= canonicalize_version ( version
);
46 String our_version
= canonicalize_version (:: version
);
47 // XXX useversion < operator
48 if ( our_version
. compare ( ini_version
) < 0 )
49 _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" );
53 void dumpAndList ( vector
< vector
< PackageSpecification
*> *> * currentAndList
);
56 IniDBBuilderPackage :: buildPackage ( String
const & name
)
61 log ( LOG_BABBLE
) << "Finished with package " << cp
-> name
<< endLog
;
64 log ( LOG_BABBLE
) << "Version " << cbpv
. Canonical_version () << endLog
;
65 log ( LOG_BABBLE
) << "Depends:" << endLog
;
66 dumpAndList ( cbpv
. depends ());
71 cp
= & db
. packages
. registerbykey ( name
);
72 cbpv
= cygpackage :: createInstance ( name
);
73 cspv
= packageversion ();
76 currentAndList
= NULL
;
79 log ( LOG_BABBLE
) << "Created package " << name
<< endLog
;
84 IniDBBuilderPackage :: buildPackageVersion ( String
const & version
)
86 cbpv
. setCanonicalVersion ( version
);
87 add_correct_version ();
91 IniDBBuilderPackage :: buildPackageSDesc ( String
const & theDesc
)
93 cbpv
. set_sdesc ( theDesc
);
97 IniDBBuilderPackage :: buildPackageLDesc ( String
const & theDesc
)
99 cbpv
. set_ldesc ( theDesc
);
101 _feedback
. warning ( theDesc
. cstr_oneuse ());
106 IniDBBuilderPackage :: buildPackageInstall ( String
const & path
)
108 process_src (* cbpv
. source (), path
);
112 IniDBBuilderPackage :: buildPackageSource ( String
const & path
, String
const & size
)
115 /* get an appropriate metadata */
116 csp
= db
. findSource ( PackageSpecification ( cbpv
. Name ()));
119 /* Copy the existing meta data to a new source package */
120 csp
= new packagemeta (* cp
);
121 /* delete versions information */
122 csp
-> versions
. clear ();
123 csp
-> desired
= packageversion ();
124 csp
-> installed
= packageversion ();
125 csp
-> prev
= packageversion ();
126 csp
-> curr
= packageversion ();
127 csp
-> exp
= packageversion ();
128 db
. sourcePackages
. push_back ( csp
);
130 /* create a source packageversion */
131 cspv
= cygpackage :: createInstance ( cbpv
. Name ());
132 cspv
. setCanonicalVersion ( cbpv
. Canonical_version ());
133 set
< packageversion
>:: iterator i
= find ( csp
-> versions
. begin (),
134 csp
-> versions
. end (), cspv
);
135 if ( i
== csp
-> versions
. end ())
137 csp
-> add_version ( cspv
);
142 if (! cspv
. source ()-> Canonical ())
143 cspv
. source ()-> set_canonical ( path
. cstr_oneuse ());
144 cspv
. source ()-> sites
. push_back ( site ( parse_mirror
));
146 cbpv
. setSourcePackageSpecification ( PackageSpecification ( cspv
. Name ()));
148 // process_src (*cspv.source(), path);
149 setSourceSize (* cspv
. source (), size
);
153 IniDBBuilderPackage :: buildPackageTrust ( int newtrust
)
156 if ( newtrust
!= TRUST_UNKNOWN
)
158 cbpv
= cygpackage :: createInstance ( cp
-> name
);
159 cspv
= packageversion ();
164 IniDBBuilderPackage :: buildPackageCategory ( String
const & name
)
166 cp
-> add_category ( name
);
169 void dumpAndList ( vector
< vector
< PackageSpecification
*> *> * currentAndList
)
173 log ( LOG_BABBLE
) << "AND list is:" << endLog
;
174 for ( vector
< vector
< PackageSpecification
*> *>:: const_iterator iAnd
=
175 currentAndList
-> begin (); iAnd
!= currentAndList
-> end (); ++ iAnd
)
177 for ( vector
< PackageSpecification
*>:: const_iterator i
=
179 i
!= (* iAnd
)-> end (); ++ i
)
180 log ( LOG_BABBLE
) << ** i
<< " |" << endLog
;
181 log ( LOG_BABBLE
) << "end of OR list," << endLog
;
187 IniDBBuilderPackage :: buildBeginDepends ()
190 log ( LOG_BABBLE
) << "Beginning of a depends statement for " << cp
-> name
192 dumpAndList ( currentAndList
);
195 currentOrList
= NULL
; /* set by the build AndListNode */
196 currentAndList
= cbpv
. depends ();
200 IniDBBuilderPackage :: buildBeginPreDepends ()
203 log ( LOG_BABBLE
) << "Beginning of a predepends statement" << endLog
;
204 dumpAndList ( currentAndList
);
207 currentOrList
= NULL
; /* set by the build AndListNode */
208 currentAndList
= cbpv
. predepends ();
212 IniDBBuilderPackage :: buildPriority ( String
const & priority
)
214 cp
-> priority
= priority
;
216 log ( LOG_BABBLE
) << "Package " << cp
-> name
<< " is " << priority
<< endLog
;
221 IniDBBuilderPackage :: buildInstalledSize ( String
const & size
)
223 cbpv
. source ()-> setInstalledSize ( atoi ( size
. cstr_oneuse ()));
225 log ( LOG_BABBLE
) << "Installed size for " << cp
-> name
<< " is " << cpv
-> bin
. installedSize () << endLog
;
230 IniDBBuilderPackage :: buildMaintainer ( String
const &){}
233 IniDBBuilderPackage :: buildArchitecture ( String
const & arch
)
235 cp
-> architecture
= arch
;
237 log ( LOG_BABBLE
) << "Package " << cp
-> name
<< " is for " << arch
<< " architectures." << endLog
;
242 IniDBBuilderPackage :: buildInstallSize ( String
const & size
)
244 setSourceSize (* cbpv
. source (), size
);
248 IniDBBuilderPackage :: buildInstallMD5 ( unsigned char const * md5
)
250 if ( md5
&& ! cbpv
. source ()-> md5
. isSet ())
251 cbpv
. source ()-> md5
. set ( md5
);
255 IniDBBuilderPackage :: buildSourceMD5 ( unsigned char const * md5
)
257 if ( md5
&& ! cspv
. source ()-> md5
. isSet ())
258 cspv
. source ()-> md5
. set ( md5
);
262 IniDBBuilderPackage :: buildBeginRecommends ()
265 log ( LOG_BABBLE
) << "Beginning of a recommends statement" << endLog
;
266 dumpAndList ( currentAndList
);
269 currentOrList
= NULL
; /* set by the build AndListNode */
270 currentAndList
= cbpv
. recommends ();
274 IniDBBuilderPackage :: buildBeginSuggests ()
277 log ( LOG_BABBLE
) << "Beginning of a suggests statement" << endLog
;
278 dumpAndList ( currentAndList
);
281 currentOrList
= NULL
; /* set by the build AndListNode */
282 currentAndList
= cbpv
. suggests ();
286 IniDBBuilderPackage :: buildBeginReplaces ()
289 log ( LOG_BABBLE
) << "Beginning of a replaces statement" << endLog
;
290 dumpAndList ( currentAndList
);
293 currentOrList
= NULL
; /* set by the build AndListNode */
294 currentAndList
= cbpv
. replaces ();
298 IniDBBuilderPackage :: buildBeginConflicts ()
301 log ( LOG_BABBLE
) << "Beginning of a conflicts statement" << endLog
;
302 dumpAndList ( currentAndList
);
305 currentOrList
= NULL
; /* set by the build AndListNode */
306 currentAndList
= cbpv
. conflicts ();
310 IniDBBuilderPackage :: buildBeginProvides ()
313 log ( LOG_BABBLE
) << "Beginning of a provides statement" << endLog
;
314 dumpAndList ( currentAndList
);
317 currentOrList
= NULL
; /* set by the build AndListNode */
318 currentAndList
= cbpv
. provides ();
322 IniDBBuilderPackage :: buildDescription ( String
const & descline
)
326 cbpv
. set_ldesc ( cbpv
. LDesc () + descline
+ " \n " );
328 log ( LOG_BABBLE
) << "Description for " << cp
-> name
<< ": \" " <<
329 descline
<< " \" ." << endLog
;
333 _feedback
. warning (( String ( "Attempt to set description for package" )
335 + "before creation of a version." ). cstr_oneuse ());
339 IniDBBuilderPackage :: buildSourceName ( String
const & name
)
343 cbpv
. setSourcePackageSpecification ( PackageSpecification ( name
));
345 log ( LOG_BABBLE
) << " \" " << cpv
-> sourcePackageSpecification () <<
346 " \" is the source package for " << cp
-> name
<< "." << endLog
;
350 _feedback
. warning (( String ( "Attempt to set source for package" )
352 + "before creation of a version." ). cstr_oneuse ());
356 IniDBBuilderPackage :: buildSourceNameVersion ( String
const & version
)
360 cbpv
. sourcePackageSpecification (). setOperator ( PackageSpecification :: Equals
);
361 cbpv
. sourcePackageSpecification (). setVersion ( version
);
363 log ( LOG_BABBLE
) << "The source version needed for " << cp
-> name
<<
364 " is " << version
<< "." << endLog
;
368 _feedback
. warning (( String ( "Attempt to set source version for package" )
370 + "before creation of a version." ). cstr_oneuse ());
374 IniDBBuilderPackage :: buildPackageListAndNode ()
379 log ( LOG_BABBLE
) << "New AND node for a package list" << endLog
;
382 ostream
& os
= log ( LOG_BABBLE
);
383 os
<< "Current OR list is :" ;
384 for ( vector
< PackageSpecification
*>:: const_iterator i
= currentOrList
-> begin ();
385 i
!= currentOrList
-> end (); ++ i
)
391 currentOrList
= new vector
< PackageSpecification
*>;
392 currentAndList
-> push_back ( currentOrList
);
395 _feedback
. warning (( String ( "Attempt to add And node when no AndList"
396 " present for package " )
397 + cp
-> name
). cstr_oneuse ());
401 IniDBBuilderPackage :: buildPackageListOrNode ( String
const & packageName
)
405 currentSpec
= new PackageSpecification ( packageName
);
406 currentOrList
-> push_back ( currentSpec
);
408 log ( LOG_BABBLE
) << "New OR node in a package list refers to \" " <<
409 * currentSpec
<< " \" ." << endLog
;
413 _feedback
. warning (( String ( "Attempt to set specification for package " )
415 + " before creation of a version." ). cstr_oneuse ());
419 IniDBBuilderPackage :: buildPackageListOperator ( PackageSpecification :: _operators
const & _operator
)
423 currentSpec
-> setOperator ( _operator
);
425 log ( LOG_BABBLE
) << "Current specification is " << * currentSpec
<< "." <<
430 _feedback
. warning (( String ( "Attempt to set an operator for package " )
432 + " with no current specification." ). cstr_oneuse ());
437 IniDBBuilderPackage :: buildPackageListOperatorVersion ( String
const & aVersion
)
441 currentSpec
-> setVersion ( aVersion
);
443 log ( LOG_BABBLE
) << "Current specification is " << * currentSpec
<< "." <<
448 _feedback
. warning (( String ( "Attempt to set an operator version for package " )
450 + " with no current specification." ). cstr_oneuse ());
456 IniDBBuilderPackage :: add_correct_version ()
459 for ( set
< packageversion
>:: iterator n
= cp
-> versions
. begin ();
460 ! merged
&& n
!= cp
-> versions
. end (); ++ n
)
463 packageversion ver
= * n
;
465 categories and requires are consistent for the same version across
468 /* Copy the binary mirror across if this site claims to have an install */
469 if ( cbpv
. source ()-> sites
. size () )
470 ver
. source ()-> sites
. push_back ( site ( cbpv
. source ()-> sites
. begin ()-> key
));
471 /* Copy the descriptions across */
472 if ( cbpv
. SDesc (). size () && ! n
-> SDesc (). size ())
473 ver
. set_sdesc ( cbpv
. SDesc ());
474 if ( cbpv
. LDesc (). size () && ! n
-> LDesc (). size ())
475 ver
. set_ldesc ( cbpv
. LDesc ());
476 if ( cbpv
. depends ()-> size () && ! ver
. depends ()-> size ())
477 * ver
. depends () = * cbpv
. depends ();
478 /* TODO: other package lists */
479 /* Prevent dangling references */
480 currentOrList
= NULL
;
481 currentAndList
= NULL
;
487 cp
-> add_version ( cbpv
);
492 if ( cp
-> currtimestamp
< timestamp
)
494 cp
-> currtimestamp
= timestamp
;
499 if ( cp
-> prevtimestamp
< timestamp
)
501 cp
-> prevtimestamp
= timestamp
;
506 if ( cp
-> exptimestamp
< timestamp
)
508 cp
-> exptimestamp
= timestamp
;
516 IniDBBuilderPackage :: process_src ( packagesource
& src
, String
const & path
)
518 if (! src
. Canonical ())
519 src
. set_canonical ( path
. cstr_oneuse ());
520 src
. sites
. push_back ( site ( parse_mirror
));
522 if (! cbpv
. Canonical_version (). size ())
525 if ( parse_filename ( path
, f
))
527 cbpv
. setCanonicalVersion ( f
. ver
);
528 add_correct_version ();
534 IniDBBuilderPackage :: setSourceSize ( packagesource
& src
, String
const & size
)
537 src
. size
= atoi ( size
. cstr_oneuse ());
This page took 0.055795 seconds and 5 git commands to generate.