]>
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 p1
-> name
. casecompare ( p2
-> name
) < 0 ; }
42 IniDBBuilderPackage ::~ IniDBBuilderPackage ()
45 sort ( db
. packages
. begin (), db
. packages
. end (), lt_packagemeta
);
49 IniDBBuilderPackage :: buildTimestamp ( String
const & time
)
51 timestamp
= strtoul ( time
. cstr_oneuse (), 0 , 0 );
55 IniDBBuilderPackage :: buildVersion ( String
const & 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 ( String
const & 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
);
88 cspv
= packageversion ();
91 currentAndList
= NULL
;
94 log ( LOG_BABBLE
) << "Created package " << name
<< endLog
;
99 IniDBBuilderPackage :: buildPackageVersion ( String
const & version
)
101 cbpv
. setCanonicalVersion ( version
);
102 add_correct_version ();
106 IniDBBuilderPackage :: buildPackageSDesc ( String
const & theDesc
)
108 cbpv
. set_sdesc ( theDesc
);
112 IniDBBuilderPackage :: buildPackageLDesc ( String
const & theDesc
)
114 cbpv
. set_ldesc ( theDesc
);
116 _feedback
. warning ( theDesc
. cstr_oneuse ());
121 IniDBBuilderPackage :: buildPackageInstall ( String
const & path
)
123 process_src (* cbpv
. source (), path
);
127 IniDBBuilderPackage :: buildPackageSource ( String
const & path
, String
const & size
)
130 /* get an appropriate metadata */
131 csp
= db
. findSource ( PackageSpecification ( cbpv
. Name ()));
134 /* Copy the existing meta data to a new source package */
135 csp
= new packagemeta (* cp
);
136 /* delete versions information */
137 csp
-> versions
. clear ();
138 csp
-> desired
= packageversion ();
139 csp
-> installed
= packageversion ();
140 csp
-> prev
= packageversion ();
141 csp
-> curr
= packageversion ();
142 csp
-> exp
= packageversion ();
143 db
. sourcePackages
. push_back ( csp
);
145 /* create a source packageversion */
146 cspv
= cygpackage :: createInstance ( cbpv
. Name ());
147 cspv
. setCanonicalVersion ( cbpv
. Canonical_version ());
148 set
< packageversion
>:: iterator i
= find ( csp
-> versions
. begin (),
149 csp
-> versions
. end (), cspv
);
150 if ( i
== csp
-> versions
. end ())
152 csp
-> add_version ( cspv
);
157 if (! cspv
. source ()-> Canonical ())
158 cspv
. source ()-> set_canonical ( path
. cstr_oneuse ());
159 cspv
. source ()-> sites
. push_back ( site ( parse_mirror
));
161 cbpv
. setSourcePackageSpecification ( PackageSpecification ( cspv
. Name ()));
163 // process_src (*cspv.source(), path);
164 setSourceSize (* cspv
. source (), size
);
168 IniDBBuilderPackage :: buildSourceFile ( unsigned char const * md5
, String
const & size
, String
const & path
)
173 IniDBBuilderPackage :: buildPackageTrust ( int newtrust
)
176 if ( newtrust
!= TRUST_UNKNOWN
)
178 cbpv
= cygpackage :: createInstance ( cp
-> name
);
179 cspv
= packageversion ();
184 IniDBBuilderPackage :: buildPackageCategory ( String
const & name
)
186 cp
-> add_category ( name
);
190 IniDBBuilderPackage :: buildBeginDepends ()
193 log ( LOG_BABBLE
) << "Beginning of a depends statement for " << cp
-> name
195 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
198 currentOrList
= NULL
; /* set by the build AndListNode */
199 currentAndList
= cbpv
. depends ();
203 IniDBBuilderPackage :: buildBeginPreDepends ()
206 log ( LOG_BABBLE
) << "Beginning of a predepends statement" << endLog
;
207 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
210 currentOrList
= NULL
; /* set by the build AndListNode */
211 currentAndList
= cbpv
. predepends ();
215 IniDBBuilderPackage :: buildPriority ( String
const & priority
)
217 cp
-> priority
= priority
;
219 log ( LOG_BABBLE
) << "Package " << cp
-> name
<< " is " << priority
<< endLog
;
224 IniDBBuilderPackage :: buildInstalledSize ( String
const & size
)
226 cbpv
. source ()-> setInstalledSize ( atoi ( size
. cstr_oneuse ()));
228 log ( LOG_BABBLE
) << "Installed size for " << cp
-> name
<< " is " << cbpv
. source ()-> installedSize () << endLog
;
233 IniDBBuilderPackage :: buildMaintainer ( String
const &){}
235 /* TODO: we can multiple arch's for a given package,
236 and it may befor either source or binary, so we need to either set both
237 or track a third current package that points to whether we altering source
238 or binary at the moment
241 IniDBBuilderPackage :: buildArchitecture ( String
const & arch
)
243 cp
-> architecture
= arch
;
245 log ( LOG_BABBLE
) << "Package " << cp
-> name
<< " is for " << arch
<< " architectures." << endLog
;
250 IniDBBuilderPackage :: buildInstallSize ( String
const & size
)
252 setSourceSize (* cbpv
. source (), size
);
256 IniDBBuilderPackage :: buildInstallMD5 ( unsigned char const * md5
)
258 if ( md5
&& ! cbpv
. source ()-> md5
. isSet ())
259 cbpv
. source ()-> md5
. set ( md5
);
263 IniDBBuilderPackage :: buildSourceMD5 ( unsigned char const * md5
)
265 if ( md5
&& ! cspv
. source ()-> md5
. isSet ())
266 cspv
. source ()-> md5
. set ( md5
);
270 IniDBBuilderPackage :: buildBeginRecommends ()
273 log ( LOG_BABBLE
) << "Beginning of a recommends statement" << endLog
;
274 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
277 currentOrList
= NULL
; /* set by the build AndListNode */
278 currentAndList
= cbpv
. recommends ();
282 IniDBBuilderPackage :: buildBeginSuggests ()
285 log ( LOG_BABBLE
) << "Beginning of a suggests statement" << endLog
;
286 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
289 currentOrList
= NULL
; /* set by the build AndListNode */
290 currentAndList
= cbpv
. suggests ();
294 IniDBBuilderPackage :: buildBeginReplaces ()
297 log ( LOG_BABBLE
) << "Beginning of a replaces statement" << endLog
;
298 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
301 currentOrList
= NULL
; /* set by the build AndListNode */
302 currentAndList
= cbpv
. replaces ();
306 IniDBBuilderPackage :: buildBeginConflicts ()
309 log ( LOG_BABBLE
) << "Beginning of a conflicts statement" << endLog
;
310 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
313 currentOrList
= NULL
; /* set by the build AndListNode */
314 currentAndList
= cbpv
. conflicts ();
318 IniDBBuilderPackage :: buildBeginProvides ()
321 log ( LOG_BABBLE
) << "Beginning of a provides statement" << endLog
;
322 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
325 currentOrList
= NULL
; /* set by the build AndListNode */
326 currentAndList
= cbpv
. provides ();
330 IniDBBuilderPackage :: buildBeginBuildDepends ()
333 log ( LOG_BABBLE
) << "Beginning of a Build-Depends statement" << endLog
;
334 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
337 currentOrList
= NULL
; /* set by the build AndListNode */
338 currentAndList
= cspv
. depends ();
343 IniDBBuilderPackage :: buildBeginBinary ()
346 log ( LOG_BABBLE
) << "Beginning of a Binary statement" << endLog
;
347 dumpAndList ( currentAndList
, log ( LOG_BABBLE
));
350 currentOrList
= NULL
; /* set by the build AndListNode */
351 currentAndList
= cspv
. binaries ();
355 IniDBBuilderPackage :: buildDescription ( String
const & descline
)
359 cbpv
. set_ldesc ( cbpv
. LDesc () + descline
+ " \n " );
361 log ( LOG_BABBLE
) << "Description for " << cp
-> name
<< ": \" " <<
362 descline
<< " \" ." << endLog
;
366 _feedback
. warning (( String ( "Attempt to set description for package" )
368 + "before creation of a version." ). cstr_oneuse ());
372 IniDBBuilderPackage :: buildSourceName ( String
const & name
)
376 cbpv
. setSourcePackageSpecification ( PackageSpecification ( name
));
378 log ( LOG_BABBLE
) << " \" " << cbpv
. sourcePackageSpecification () <<
379 " \" is the source package for " << cp
-> name
<< "." << endLog
;
383 _feedback
. warning (( String ( "Attempt to set source for package" )
385 + "before creation of a version." ). cstr_oneuse ());
389 IniDBBuilderPackage :: buildSourceNameVersion ( String
const & version
)
393 cbpv
. sourcePackageSpecification (). setOperator ( PackageSpecification :: Equals
);
394 cbpv
. sourcePackageSpecification (). setVersion ( version
);
396 log ( LOG_BABBLE
) << "The source version needed for " << cp
-> name
<<
397 " is " << version
<< "." << endLog
;
401 _feedback
. warning (( String ( "Attempt to set source version for package" )
403 + "before creation of a version." ). cstr_oneuse ());
407 IniDBBuilderPackage :: buildPackageListAndNode ()
412 log ( LOG_BABBLE
) << "New AND node for a package list" << endLog
;
415 ostream
& os
= log ( LOG_BABBLE
);
416 os
<< "Current OR list is :" ;
417 for ( vector
< PackageSpecification
*>:: const_iterator i
= currentOrList
-> begin ();
418 i
!= currentOrList
-> end (); ++ i
)
424 currentOrList
= new vector
< PackageSpecification
*>;
425 currentAndList
-> push_back ( currentOrList
);
428 _feedback
. warning (( String ( "Attempt to add And node when no AndList"
429 " present for package " )
430 + cp
-> name
). cstr_oneuse ());
434 IniDBBuilderPackage :: buildPackageListOrNode ( String
const & packageName
)
438 currentSpec
= new PackageSpecification ( packageName
);
439 currentOrList
-> push_back ( currentSpec
);
441 log ( LOG_BABBLE
) << "New OR node in a package list refers to \" " <<
442 * currentSpec
<< " \" ." << endLog
;
446 _feedback
. warning (( String ( "Attempt to set specification for package " )
448 + " before creation of a version." ). cstr_oneuse ());
452 IniDBBuilderPackage :: buildPackageListOperator ( PackageSpecification :: _operators
const & _operator
)
456 currentSpec
-> setOperator ( _operator
);
458 log ( LOG_BABBLE
) << "Current specification is " << * currentSpec
<< "." <<
463 _feedback
. warning (( String ( "Attempt to set an operator for package " )
465 + " with no current specification." ). cstr_oneuse ());
470 IniDBBuilderPackage :: buildPackageListOperatorVersion ( String
const & aVersion
)
474 currentSpec
-> setVersion ( aVersion
);
476 log ( LOG_BABBLE
) << "Current specification is " << * currentSpec
<< "." <<
481 _feedback
. warning (( String ( "Attempt to set an operator version for package " )
483 + " with no current specification." ). cstr_oneuse ());
489 IniDBBuilderPackage :: add_correct_version ()
492 for ( set
< packageversion
>:: iterator n
= cp
-> versions
. begin ();
493 ! merged
&& n
!= cp
-> versions
. end (); ++ n
)
496 packageversion ver
= * n
;
498 categories and requires are consistent for the same version across
501 /* Copy the binary mirror across if this site claims to have an install */
502 if ( cbpv
. source ()-> sites
. size () )
503 ver
. source ()-> sites
. push_back ( site ( cbpv
. source ()-> sites
. begin ()-> key
));
504 /* Copy the descriptions across */
505 if ( cbpv
. SDesc (). size () && ! n
-> SDesc (). size ())
506 ver
. set_sdesc ( cbpv
. SDesc ());
507 if ( cbpv
. LDesc (). size () && ! n
-> LDesc (). size ())
508 ver
. set_ldesc ( cbpv
. LDesc ());
509 if ( cbpv
. depends ()-> size () && ! ver
. depends ()-> size ())
510 * ver
. depends () = * cbpv
. depends ();
511 /* TODO: other package lists */
512 /* Prevent dangling references */
513 currentOrList
= NULL
;
514 currentAndList
= NULL
;
520 cp
-> add_version ( cbpv
);
525 if ( cp
-> currtimestamp
< timestamp
)
527 cp
-> currtimestamp
= timestamp
;
532 if ( cp
-> prevtimestamp
< timestamp
)
534 cp
-> prevtimestamp
= timestamp
;
539 if ( cp
-> exptimestamp
< timestamp
)
541 cp
-> exptimestamp
= timestamp
;
549 IniDBBuilderPackage :: process_src ( packagesource
& src
, String
const & path
)
551 if (! src
. Canonical ())
552 src
. set_canonical ( path
. cstr_oneuse ());
553 src
. sites
. push_back ( site ( parse_mirror
));
555 if (! cbpv
. Canonical_version (). size ())
558 if ( parse_filename ( path
, f
))
560 cbpv
. setCanonicalVersion ( f
. ver
);
561 add_correct_version ();
567 IniDBBuilderPackage :: setSourceSize ( packagesource
& src
, String
const & size
)
570 src
. size
= atoi ( size
. cstr_oneuse ());
This page took 0.062465 seconds and 5 git commands to generate.