From: Keith M. <kei...@us...> - 2010-01-26 21:07:28
|
Update of /cvsroot/mingw/mingw-get/src In directory sfp-cvsdas-1.v30.ch3.sourceforge.com:/tmp/cvs-serv24122/src Modified Files: climain.cpp pkgbase.h pkgexec.cpp pkginet.cpp pkgkeys.c pkgkeys.h vercmp.cpp Log Message: Implement rudimentary dependency resolver. Index: pkgkeys.h =================================================================== RCS file: /cvsroot/mingw/mingw-get/src/pkgkeys.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** pkgkeys.h 16 Jan 2010 20:49:57 -0000 1.1 --- pkgkeys.h 26 Jan 2010 21:07:18 -0000 1.2 *************** *** 66,68 **** --- 66,74 ---- EXTERN_C_DECL const char *uri_key; + /* Some standard values, which may be associated with certain + * of the above XML database keys. + */ + EXTERN_C_DECL const char *yes_value; + EXTERN_C_DECL const char *no_value; + #endif /* PKGKEYS_H: $RCSfile$: end of file */ Index: vercmp.cpp =================================================================== RCS file: /cvsroot/mingw/mingw-get/src/vercmp.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** vercmp.cpp 16 Nov 2009 21:54:30 -0000 1.1 --- vercmp.cpp 26 Jan 2010 21:07:18 -0000 1.2 *************** *** 6,10 **** * * Written by Keith Marshall <kei...@us...> ! * Copyright (C) 2009, MinGW Project * * --- 6,10 ---- * * Written by Keith Marshall <kei...@us...> ! * Copyright (C) 2009, 2010, MinGW Project * * *************** *** 156,160 **** long cmp; for( int index = VERSION_MAJOR; index < VERSION_ELEMENT_COUNT; index++ ) ! if( (cmp = Compare( rhs, index )) != 0L ) return (cmp > 0L); /* If we get to here, lhs and rhs versions are identically equal, --- 156,160 ---- long cmp; for( int index = VERSION_MAJOR; index < VERSION_ELEMENT_COUNT; index++ ) ! if( (cmp = Compare( rhs, index )) != 0L ) return (cmp < 0L); /* If we get to here, lhs and rhs versions are identically equal, Index: climain.cpp =================================================================== RCS file: /cvsroot/mingw/mingw-get/src/climain.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** climain.cpp 22 Jan 2010 17:11:48 -0000 1.4 --- climain.cpp 26 Jan 2010 21:07:17 -0000 1.5 *************** *** 91,95 **** dbase.LoadSystemMap(); - #if 0 /* ...schedule the specified action for each additional command line * argument, (each of which is assumed to represent a package name)... --- 91,94 ---- *************** *** 101,105 **** */ dbase.ExecuteActions(); - #endif } --- 100,103 ---- Index: pkgkeys.c =================================================================== RCS file: /cvsroot/mingw/mingw-get/src/pkgkeys.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** pkgkeys.c 16 Jan 2010 20:49:57 -0000 1.1 --- pkgkeys.c 26 Jan 2010 21:07:18 -0000 1.2 *************** *** 55,57 **** --- 55,63 ---- const char *uri_key = "uri"; + /* Some standard values, which may be associated with certain + * of the above keys. + */ + const char *yes_value = "yes"; + const char *no_value = "no"; + /* $RCSfile$: end of file */ Index: pkgexec.cpp =================================================================== RCS file: /cvsroot/mingw/mingw-get/src/pkgexec.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** pkgexec.cpp 16 Jan 2010 20:49:57 -0000 1.3 --- pkgexec.cpp 26 Jan 2010 21:07:18 -0000 1.4 *************** *** 93,97 **** max_wanted = NULL; /* nor any maximum version */ ! selection = NULL; /* no package selection yet, for this item */ /* Insert this item at a specified location in the actions list. --- 93,98 ---- max_wanted = NULL; /* nor any maximum version */ ! /* Initialise package selection to NONE, for this action... */ ! selection[to_remove] = selection[to_install] = NULL; /* Insert this item at a specified location in the actions list. *************** *** 206,210 **** */ pkgXmlNode* pkg; ! if( (pkg = item.selection->GetParent()) != NULL ) { /* We have a pointer to the XML database entry which identifies --- 207,211 ---- */ pkgXmlNode* pkg; ! if( (pkg = item.Selection()->GetParent()) != NULL ) { /* We have a pointer to the XML database entry which identifies *************** *** 218,222 **** * (i.e. to the same package), we return it... */ ! if( item->selection->GetParent() == pkg ) return item; } --- 219,223 ---- * (i.e. to the same package), we return it... */ ! if( item->Selection()->GetParent() == pkg ) return item; } *************** *** 297,306 **** && match_if_explicit( test.GetComponentVersion(), fit.GetComponentVersion() ) && ((max_wanted == NULL) || ((flags & STRICTLY_LT) ? (test < max_fit) : (test <= max_fit))) ! && ((flags & STRICTLY_GT) ? (test > min_fit) : (test >= min_fit)) ) { /* We have the correct package component, and it fits within * the allowed range of release versions... */ ! pkgSpecs last( selection ); if( test > last ) /* --- 298,307 ---- && match_if_explicit( test.GetComponentVersion(), fit.GetComponentVersion() ) && ((max_wanted == NULL) || ((flags & STRICTLY_LT) ? (test < max_fit) : (test <= max_fit))) ! && ((min_wanted == NULL) || ((flags & STRICTLY_GT) ? (test > min_fit) : (test >= min_fit))) ) { /* We have the correct package component, and it fits within * the allowed range of release versions... */ ! pkgSpecs last( Selection() ); if( test > last ) /* *************** *** 308,317 **** * so we now replace that... */ ! selection = package; } /* Whatever choice we make, we return the resultant selection... */ ! return selection; } --- 309,318 ---- * so we now replace that... */ ! selection[to_install] = package; } /* Whatever choice we make, we return the resultant selection... */ ! return Selection(); } *************** *** 325,332 **** pkgActionItem *ref = rank ? rank : actions; - /* Record the requested action code... - */ - request = action; - /* Don't reschedule, if we already have a prior matching item... */ --- 326,329 ---- *************** *** 344,347 **** --- 341,345 ---- */ return rank->Insert( ref ); + else /* ...otherwise, at the end of the list. *************** *** 356,358 **** --- 354,399 ---- } + void pkgActionItem::Execute() + { + if( this != NULL ) + { + pkgActionItem *current = this; + while( current->prev != NULL ) current = current->prev; + DownloadArchiveFiles( current ); + while( current != NULL ) + { + dmh_printf( "%s: %s\n", action_name(current->flags & ACTION_MASK), + current->Selection()->GetPropVal( tarname_key, "<unknown>" )); + + if( (current->flags & ACTION_REMOVE) == ACTION_REMOVE ) + { + /* The selected package has been marked for removal, either explicitly, + * or as an implicit prerequisite for upgrade; search to installed system + * manifest, to identify the specific version (if any) to be removed. + * + * FIXME: This implementation is a stub, to be rewritten when the system + * manifest structure has been specified and implemented. + */ + if( current->Selection( to_remove ) != NULL ) + dmh_printf( " removing %s\n", current->Selection( to_remove )->GetPropVal( tarname_key, "<unknown>" )); + } + + if( (current->flags & ACTION_INSTALL) == ACTION_INSTALL ) + { + /* The selected package has been marked for installation, either explicitly, + * or implicitly to complete a package upgrade. + * + * FIXME: Once more, this is a stub, to be extended to provide the working + * installer implementation. + */ + dmh_printf( " installing %s\n", current->Selection()->GetPropVal( tarname_key, "<unknown>" )); + } + + /* Proceed to next package with scheduled actions. + */ + current = current->next; + } + } + } + /* $RCSfile$: end of file */ Index: pkginet.cpp =================================================================== RCS file: /cvsroot/mingw/mingw-get/src/pkginet.cpp,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** pkginet.cpp 23 Jan 2010 17:01:53 -0000 1.4 --- pkginet.cpp 26 Jan 2010 21:07:18 -0000 1.5 *************** *** 289,293 **** * the required archive from a suitable internet mirror host. */ ! const char *package_name = current->selection->ArchiveName(); pkgInternetStreamingAgent download( package_name, current->ArchivePath() ); --- 289,293 ---- * the required archive from a suitable internet mirror host. */ ! const char *package_name = current->Selection()->ArchiveName(); pkgInternetStreamingAgent download( package_name, current->ArchivePath() ); *************** *** 298,302 **** /* ...if not, ask the download agent to fetch it... */ ! const char *url_template = get_host_info( current->selection, uri_key ); if( url_template != NULL ) { --- 298,302 ---- /* ...if not, ask the download agent to fetch it... */ ! const char *url_template = get_host_info( current->Selection(), uri_key ); if( url_template != NULL ) { *************** *** 304,308 **** * the package repository catalogue (configuration database)... */ ! const char *mirror = get_host_info( current->selection, mirror_key ); char package_url[mkpath( NULL, url_template, package_name, mirror )]; mkpath( package_url, url_template, package_name, mirror ); --- 304,308 ---- * the package repository catalogue (configuration database)... */ ! const char *mirror = get_host_info( current->Selection(), mirror_key ); char package_url[mkpath( NULL, url_template, package_name, mirror )]; mkpath( package_url, url_template, package_name, mirror ); Index: pkgbase.h =================================================================== RCS file: /cvsroot/mingw/mingw-get/src/pkgbase.h,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** pkgbase.h 22 Jan 2010 17:11:48 -0000 1.3 --- pkgbase.h 26 Jan 2010 21:07:18 -0000 1.4 *************** *** 127,134 **** } ! /* Method for retrieving the system root management records * for a specified installed subsystem. */ pkgXmlNode *GetSysRoot( const char *subsystem ); /* The following pair of methods provide an iterator --- 127,135 ---- } ! /* Methods for retrieving the system root management records * for a specified installed subsystem. */ pkgXmlNode *GetSysRoot( const char *subsystem ); + pkgXmlNode *GetInstallationRecord( const char* ); /* The following pair of methods provide an iterator *************** *** 148,151 **** --- 149,153 ---- }; + enum { to_remove = 0, to_install, selection_types }; class pkgActionItem { *************** *** 172,179 **** const char* max_wanted; ! /* Pointer to the XML database entry for the package selected * for processing by this action. */ ! pkgXmlNode* selection; /* Method for retrieving packages from a distribution server. --- 174,181 ---- const char* max_wanted; ! /* Pointers to the XML database entries for the package selected * for processing by this action. */ ! pkgXmlNode* selection[ selection_types ]; /* Method for retrieving packages from a distribution server. *************** *** 201,204 **** --- 203,218 ---- const char* SetRequirements( pkgXmlNode* ); pkgXmlNode* SelectIfMostRecentFit( pkgXmlNode* ); + inline void SelectPackage( pkgXmlNode *pkg, int opt = to_install ) + { + /* Mark a package as the selection for a specified action. + */ + selection[ opt ] = pkg; + } + inline pkgXmlNode* Selection( int mode = to_install ) + { + /* Retrieve the package selection for a specified action. + */ + return selection[ mode ]; + } /* Method specifying where downloaded packages are stored. |