]>
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"
18 #include "csu_util/version_compare.h"
20 #include "setup_version.h"
22 #include "IniParseFeedback.h"
23 #include "package_db.h"
24 #include "package_meta.h"
25 #include "package_version.h"
26 #include "cygpackage.h"
27 #include "filemanip.h"
30 #include "LogSingleton.h"
31 #include "PackageSpecification.h"
36 IniDBBuilderPackage :: IniDBBuilderPackage ( IniParseFeedback
const & aFeedback
) :
37 cp ( 0 ), cbpv (), cspv (), currentSpec ( 0 ), currentOrList ( 0 ), currentAndList ( 0 ), trust ( 0 ), _feedback ( aFeedback
){}
39 inline bool lt_packagemeta ( packagemeta
* p1
, packagemeta
* p2
)
40 { return casecompare ( p1
-> name
, p2
-> name
) < 0 ; }
42 IniDBBuilderPackage ::~ IniDBBuilderPackage ()
45 sort ( db
. packages
. begin (), db
. packages
. end (), lt_packagemeta
);
49 IniDBBuilderPackage :: buildTimestamp ( const std :: string
& time
)
51 timestamp
= strtoul ( time
. c_str (), 0 , 0 );
55 IniDBBuilderPackage :: buildVersion ( const std :: string
& aVersion
)
60 if ( version_compare ( setup_version
, version
) < 0 )
61 _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" );
66 IniDBBuilderPackage :: buildPackage ( const std :: string
& name
)
71 log ( LOG_BABBLE
) << "Finished with package " << cp
-> name
<< endLog
;
74 log ( LOG_BABBLE
) << "Version " << cbpv
. Canonical_version () << endLog
;
75 log ( LOG_BABBLE
) << "Depends:" << endLog
;
76 dumpAndList ( cbpv
. depends (), log ( LOG_BABBLE
));
81 cp
= db
. findBinary ( PackageSpecification ( name
));
84 cp
= new packagemeta ( name
);
85 db
. packages
. push_back ( cp
);
87 cbpv
= cygpackage :: createInstance ( name
, package_binary
);
88 cspv
= packageversion ();
91 currentAndList
= NULL
;
94 log ( LOG_BABBLE
) << "Created package " << name
<< endLog
;
99 IniDBBuilderPackage :: buildPackageVersion ( const std :: string
& version
)
101 cbpv
. setCanonicalVersion ( version
);
102 add_correct_version ();
106 IniDBBuilderPackage :: buildPackageSDesc ( const std :: string
& theDesc
)
108 cbpv
. set_sdesc ( theDesc
);
112 IniDBBuilderPackage :: buildPackageLDesc ( const std :: string
& theDesc
)
114 cbpv
. set_ldesc ( theDesc
);
116 _feedback
. warning ( theDesc
. c_str ());
121 IniDBBuilderPackage :: buildPackageInstall ( const std :: string
& path
)
123 process_src (* cbpv
. source (), path
);
127 IniDBBuilderPackage :: buildPackageSource ( const std :: string
& path
,
128 const std :: string
& size
)
131 /* get an appropriate metadata */
132 csp
= db
. findSource ( PackageSpecification ( cbpv
. Name ()));
135 /* Copy the existing meta data to a new source package */
136 csp
= new packagemeta (* cp
);
137 /* delete versions information */
138 csp
-> versions
. clear ();
139 csp
-> desired
= packageversion ();
140 csp
-> installed
= packageversion ();
141 csp
-> prev
= packageversion ();
142 csp
-> curr
= packageversion ();
143 csp
-> exp
= packageversion ();
144 db
. sourcePackages
. push_back ( csp
);
146 /* create a source packageversion */
147 cspv
= cygpackage :: createInstance ( cbpv
. Name (), package_source
);
148 cspv
. setCanonicalVersion ( cbpv
. Canonical_version ());
149 set
< packageversion
>:: iterator i
= find ( csp
-> versions
. begin (),
150 csp
-> versions
. end (), cspv
);
151 if ( i
== csp
-> versions
. end ())
153 csp
-> add_version ( cspv
);
158 if (! cspv
. source ()-> Canonical ())
159 cspv
. source ()-> set_canonical ( path
. c_str ());
160 cspv
. source ()-> sites
. push_back ( site ( parse_mirror
));
162 /* creates the relationship between binary and source packageversions */
163 cbpv
. setSourcePackageSpecification ( PackageSpecification ( cspv
. Name ()));
164 PackageSpecification
& spec
= cbpv
. sourcePackageSpecification ();
165 spec
. setOperator ( PackageSpecification :: Equals
);
166 spec
. setVersion ( cbpv
. Canonical_version ());
168 // process_src (*cspv.source(), path);
169 setSourceSize (* cspv
. source (), size
);
173 IniDBBuilderPackage :: buildSourceFile ( unsigned char const * md5
,
174 const std :: string
& size
,
175 const std :: string
& path
)
180 IniDBBuilderPackage :: buildPackageTrust ( int newtrust
)
183 if ( newtrust
!= TRUST_UNKNOWN
)
185 cbpv
= cygpackage :: createInstance ( cp
-> name
, package_binary
);
186 cspv
= packageversion ();
191 IniDBBuilderPackage :: buildPackageCategory ( const std :: string
& name
)
193 cp
-> add_category ( name
);
197 IniDBBuilderPackage :: buildBeginDepends ()
200 log ( LOG_BABBLE
) << "Beginning of a depends statement for " << cp
-> name
202 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
205 currentOrList
= NULL
; /* set by the build AndListNode */
206 currentAndList
= cbpv
. depends ();
210 IniDBBuilderPackage :: buildBeginPreDepends ()
213 log ( LOG_BABBLE
) << "Beginning of a predepends statement" << endLog
;
214 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
217 currentOrList
= NULL
; /* set by the build AndListNode */
218 currentAndList
= cbpv
. predepends ();
222 IniDBBuilderPackage :: buildPriority ( const std :: string
& priority
)
224 cp
-> priority
= priority
;
226 log ( LOG_BABBLE
) << "Package " << cp
-> name
<< " is " << priority
<< endLog
;
231 IniDBBuilderPackage :: buildInstalledSize ( const std :: string
& size
)
233 cbpv
. source ()-> setInstalledSize ( atoi ( size
. c_str ()));
235 log ( LOG_BABBLE
) << "Installed size for " << cp
-> name
<< " is " << cbpv
. source ()-> installedSize () << endLog
;
240 IniDBBuilderPackage :: buildMaintainer ( const std :: string
& ){}
242 /* TODO: we can multiple arch's for a given package,
243 and it may befor either source or binary, so we need to either set both
244 or track a third current package that points to whether we altering source
245 or binary at the moment
248 IniDBBuilderPackage :: buildArchitecture ( const std :: string
& arch
)
250 cp
-> architecture
= arch
;
252 log ( LOG_BABBLE
) << "Package " << cp
-> name
<< " is for " << arch
<< " architectures." << endLog
;
257 IniDBBuilderPackage :: buildInstallSize ( const std :: string
& size
)
259 setSourceSize (* cbpv
. source (), size
);
263 IniDBBuilderPackage :: buildInstallMD5 ( unsigned char const * md5
)
265 if ( md5
&& ! cbpv
. source ()-> md5
. isSet ())
266 cbpv
. source ()-> md5
. set ( md5
);
270 IniDBBuilderPackage :: buildSourceMD5 ( unsigned char const * md5
)
272 if ( md5
&& ! cspv
. source ()-> md5
. isSet ())
273 cspv
. source ()-> md5
. set ( md5
);
277 IniDBBuilderPackage :: buildBeginRecommends ()
280 log ( LOG_BABBLE
) << "Beginning of a recommends statement" << endLog
;
281 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
284 currentOrList
= NULL
; /* set by the build AndListNode */
285 currentAndList
= cbpv
. recommends ();
289 IniDBBuilderPackage :: buildBeginSuggests ()
292 log ( LOG_BABBLE
) << "Beginning of a suggests statement" << endLog
;
293 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
296 currentOrList
= NULL
; /* set by the build AndListNode */
297 currentAndList
= cbpv
. suggests ();
301 IniDBBuilderPackage :: buildBeginReplaces ()
304 log ( LOG_BABBLE
) << "Beginning of a replaces statement" << endLog
;
305 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
308 currentOrList
= NULL
; /* set by the build AndListNode */
309 currentAndList
= cbpv
. replaces ();
313 IniDBBuilderPackage :: buildBeginConflicts ()
316 log ( LOG_BABBLE
) << "Beginning of a conflicts statement" << endLog
;
317 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
320 currentOrList
= NULL
; /* set by the build AndListNode */
321 currentAndList
= cbpv
. conflicts ();
325 IniDBBuilderPackage :: buildBeginProvides ()
328 log ( LOG_BABBLE
) << "Beginning of a provides statement" << endLog
;
329 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
332 currentOrList
= NULL
; /* set by the build AndListNode */
333 currentAndList
= cbpv
. provides ();
337 IniDBBuilderPackage :: buildBeginBuildDepends ()
340 log ( LOG_BABBLE
) << "Beginning of a Build-Depends statement" << endLog
;
341 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
344 currentOrList
= NULL
; /* set by the build AndListNode */
345 currentAndList
= cspv
. depends ();
350 IniDBBuilderPackage :: buildBeginBinary ()
353 log ( LOG_BABBLE
) << "Beginning of a Binary statement" << endLog
;
354 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
357 currentOrList
= NULL
; /* set by the build AndListNode */
358 currentAndList
= cspv
. binaries ();
362 IniDBBuilderPackage :: buildDescription ( const std :: string
& descline
)
366 cbpv
. set_ldesc ( cbpv
. LDesc () + descline
+ " \n " );
368 log ( LOG_BABBLE
) << "Description for " << cp
-> name
<< ": \" " <<
369 descline
<< " \" ." << endLog
;
373 _feedback
. warning (( std :: string ( "Attempt to set description for package" )
374 + std :: string ( cp
-> name
)
375 + "before creation of a version." ). c_str ());
379 IniDBBuilderPackage :: buildSourceName ( const std :: string
& name
)
383 cbpv
. setSourcePackageSpecification ( PackageSpecification ( name
));
385 log ( LOG_BABBLE
) << " \" " << cbpv
. sourcePackageSpecification () <<
386 " \" is the source package for " << cp
-> name
<< "." << endLog
;
390 _feedback
. warning (( std :: string ( "Attempt to set source for package" )
391 + std :: string ( cp
-> name
)
392 + "before creation of a version." ). c_str ());
396 IniDBBuilderPackage :: buildSourceNameVersion ( const std :: string
& version
)
400 cbpv
. sourcePackageSpecification (). setOperator ( PackageSpecification :: Equals
);
401 cbpv
. sourcePackageSpecification (). setVersion ( version
);
403 log ( LOG_BABBLE
) << "The source version needed for " << cp
-> name
<<
404 " is " << version
<< "." << endLog
;
408 _feedback
. warning (( std :: string ( "Attempt to set source version for package" )
409 + std :: string ( cp
-> name
)
410 + "before creation of a version." ). c_str ());
414 IniDBBuilderPackage :: buildPackageListAndNode ()
419 log ( LOG_BABBLE
) << "New AND node for a package list" << endLog
;
422 ostream
& os
= log ( LOG_BABBLE
);
423 os
<< "Current OR list is :" ;
424 for ( vector
< PackageSpecification
*>:: const_iterator i
= currentOrList
-> begin ();
425 i
!= currentOrList
-> end (); ++ i
)
431 currentOrList
= new vector
< PackageSpecification
*>;
432 currentAndList
-> push_back ( currentOrList
);
435 _feedback
. warning (( std :: string ( "Attempt to add And node when no AndList"
436 " present for package " )
437 + std :: string ( cp
-> name
)). c_str ());
441 IniDBBuilderPackage :: buildPackageListOrNode ( const std :: string
& packageName
)
445 currentSpec
= new PackageSpecification ( packageName
);
446 currentOrList
-> push_back ( currentSpec
);
448 log ( LOG_BABBLE
) << "New OR node in a package list refers to \" " <<
449 * currentSpec
<< " \" ." << endLog
;
453 _feedback
. warning (( std :: string ( "Attempt to set specification for package " )
454 + std :: string ( cp
-> name
)
455 + " before creation of a version." ). c_str ());
459 IniDBBuilderPackage :: buildPackageListOperator ( PackageSpecification :: _operators
const & _operator
)
463 currentSpec
-> setOperator ( _operator
);
465 log ( LOG_BABBLE
) << "Current specification is " << * currentSpec
<< "." <<
470 _feedback
. warning (( std :: string ( "Attempt to set an operator for package " )
471 + std :: string ( cp
-> name
)
472 + " with no current specification." ). c_str ());
477 IniDBBuilderPackage :: buildPackageListOperatorVersion ( const std :: string
& aVersion
)
481 currentSpec
-> setVersion ( aVersion
);
483 log ( LOG_BABBLE
) << "Current specification is " << * currentSpec
<< "." <<
488 _feedback
. warning (( std :: string ( "Attempt to set an operator version for package " )
489 + std :: string ( cp
-> name
)
490 + " with no current specification." ). c_str ());
496 IniDBBuilderPackage :: add_correct_version ()
499 for ( set
< packageversion
>:: iterator n
= cp
-> versions
. begin ();
500 ! merged
&& n
!= cp
-> versions
. end (); ++ n
)
503 packageversion ver
= * n
;
505 categories and requires are consistent for the same version across
508 /* Copy the binary mirror across if this site claims to have an install */
509 if ( cbpv
. source ()-> sites
. size () )
510 ver
. source ()-> sites
. push_back ( site ( cbpv
. source ()-> sites
. begin ()-> key
));
511 /* Copy the descriptions across */
512 if ( cbpv
. SDesc (). size () && ! n
-> SDesc (). size ())
513 ver
. set_sdesc ( cbpv
. SDesc ());
514 if ( cbpv
. LDesc (). size () && ! n
-> LDesc (). size ())
515 ver
. set_ldesc ( cbpv
. LDesc ());
516 if ( cbpv
. depends ()-> size () && ! ver
. depends ()-> size ())
517 * ver
. depends () = * cbpv
. depends ();
518 /* TODO: other package lists */
519 /* Prevent dangling references */
520 currentOrList
= NULL
;
521 currentAndList
= NULL
;
527 cp
-> add_version ( cbpv
);
532 if ( cp
-> currtimestamp
< timestamp
)
534 cp
-> currtimestamp
= timestamp
;
539 if ( cp
-> prevtimestamp
< timestamp
)
541 cp
-> prevtimestamp
= timestamp
;
546 if ( cp
-> exptimestamp
< timestamp
)
548 cp
-> exptimestamp
= timestamp
;
556 IniDBBuilderPackage :: process_src ( packagesource
& src
, const std :: string
& path
)
558 if (! src
. Canonical ())
559 src
. set_canonical ( path
. c_str ());
560 src
. sites
. push_back ( site ( parse_mirror
));
562 if (! cbpv
. Canonical_version (). size ())
565 if ( parse_filename ( path
, f
))
567 cbpv
. setCanonicalVersion ( f
. ver
);
568 add_correct_version ();
574 IniDBBuilderPackage :: setSourceSize ( packagesource
& src
, const std :: string
& size
)
577 src
. size
= atoi ( size
. c_str ());
This page took 0.063193 seconds and 5 git commands to generate.