From: Keith M. <kei...@us...> - 2010-03-02 22:33:39
|
Update of /cvsroot/mingw/mingw-get/src In directory sfp-cvsdas-1.v30.ch3.sourceforge.com:/tmp/cvs-serv13433/src Modified Files: pkgexec.cpp pkginet.cpp pkgkeys.c pkgkeys.h pkgname.cpp Log Message: Add preliminary support for virtual packages. Index: pkgkeys.h =================================================================== RCS file: /cvsroot/mingw/mingw-get/src/pkgkeys.h,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** pkgkeys.h 1 Mar 2010 22:34:19 -0000 1.5 --- pkgkeys.h 2 Mar 2010 22:33:24 -0000 1.6 *************** *** 75,80 **** * 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 */ --- 75,85 ---- * of the above XML database keys. */ ! #define yes_value value_yes ! #define no_value value_no ! ! EXTERN_C_DECL const char *value_no; ! EXTERN_C_DECL const char *value_none; ! EXTERN_C_DECL const char *value_virtual; ! EXTERN_C_DECL const char *value_yes; #endif /* PKGKEYS_H: $RCSfile$: end of file */ Index: pkgkeys.c =================================================================== RCS file: /cvsroot/mingw/mingw-get/src/pkgkeys.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** pkgkeys.c 1 Mar 2010 22:34:19 -0000 1.5 --- pkgkeys.c 2 Mar 2010 22:33:24 -0000 1.6 *************** *** 64,69 **** * of the above keys. */ ! const char *yes_value = "yes"; ! const char *no_value = "no"; /* $RCSfile$: end of file */ --- 64,71 ---- * of the above keys. */ ! const char *value_no = "no"; ! const char *value_none = "none"; ! const char *value_virtual = "virtual"; ! const char *value_yes = "yes"; /* $RCSfile$: end of file */ Index: pkgexec.cpp =================================================================== RCS file: /cvsroot/mingw/mingw-get/src/pkgexec.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** pkgexec.cpp 2 Feb 2010 20:19:28 -0000 1.5 --- pkgexec.cpp 2 Mar 2010 22:33:18 -0000 1.6 *************** *** 391,397 **** if( current->Selection( to_remove ) == NULL ) { ! pkgTarArchiveInstaller package( current->Selection() ); ! if( package.IsOk() ) ! package.Process(); } else --- 391,401 ---- if( current->Selection( to_remove ) == NULL ) { ! pkgXmlNode *pkg = current->Selection(); ! if( ! match_if_explicit( pkg->ArchiveName(), value_none ) ) ! { ! pkgTarArchiveInstaller package( pkg ); ! if( package.IsOk() ) ! package.Process(); ! } } else Index: pkgname.cpp =================================================================== RCS file: /cvsroot/mingw/mingw-get/src/pkgname.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** pkgname.cpp 2 Feb 2010 20:19:28 -0000 1.3 --- pkgname.cpp 2 Mar 2010 22:33:24 -0000 1.4 *************** *** 41,45 **** * applicable only to XML "release" elements. */ ! if( ! rel->IsElementOfType( "release" ) ) { dmh_control( DMH_BEGIN_DIGEST ); --- 41,45 ---- * applicable only to XML "release" elements. */ ! if( ! rel->IsElementOfType( release_key ) ) { dmh_control( DMH_BEGIN_DIGEST ); *************** *** 52,56 **** /* Given a package release specification... ! * determine the archive name for the tarball to be processed; this * is retrieved from a child XML element with name specified by "tag"; * by default, if "opt" is non-zero, it is the canonical "tarname" --- 52,81 ---- /* Given a package release specification... ! * First check that it relates to a real package, rather than to ! * a virtual "meta-package"; such meta-packages exist solely as ! * containers for requirements specifications, and have no ! * associated archive. ! */ ! pkgXmlNode *pkg = rel->GetParent(); ! while( (pkg != NULL) && ! pkg->IsElementOfType( package_key ) ) ! pkg = pkg->GetParent(); ! ! /* FIXME: we should probably provide some error handling here, ! * to diagnose release elements without any package association; ! * (these would be identified by pkg == NULL). ! */ ! if( pkg != NULL ) ! { ! /* We found the package association... ! * Check its 'class' attribute, if any, and if classified as ! * 'virtual', return the archive association as "none". ! */ ! const char *package_class = pkg->GetPropVal( class_key, NULL ); ! if( (package_class != NULL) && (strcmp( package_class, value_virtual ) == 0) ) ! return value_none; ! } ! ! /* The given release specification relates to a real package... ! * Determine the archive name for the tarball to be processed; this * is retrieved from a child XML element with name specified by "tag"; * by default, if "opt" is non-zero, it is the canonical "tarname" Index: pkginet.cpp =================================================================== RCS file: /cvsroot/mingw/mingw-get/src/pkginet.cpp,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** pkginet.cpp 2 Feb 2010 20:19:28 -0000 1.6 --- pkginet.cpp 2 Mar 2010 22:33:24 -0000 1.7 *************** *** 282,314 **** */ const char *package_name = current->Selection()->ArchiveName(); - pkgInternetStreamingAgent download( package_name, pkgArchivePath() ); ! /* Check if the required archive is already available locally... */ ! if( (access( download.DestFile(), R_OK ) != 0) && (errno == ENOENT) ) { ! /* ...if not, ask the download agent to fetch it... */ ! const char *url_template = get_host_info( current->Selection(), uri_key ); ! if( url_template != NULL ) { ! /* ...from the URL constructed from the template specified in ! * 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 ); ! if( ! (download.Get( package_url ) > 0) ) dmh_notify( DMH_ERROR, ! "Get package: %s: download failed\n", package_url ); } - else - /* Cannot download; the repository catalogue didn't specify a - * template, from which to construct a download URL... - */ - dmh_notify( DMH_ERROR, - "Get package: %s: no URL specified for download\n", package_name - ); } } --- 282,324 ---- */ const char *package_name = current->Selection()->ArchiveName(); ! /* An explicit package name of "none" is a special case, indicating ! * a "virtual" meta-package; it requires nothing to be downloaded... */ ! if( ! match_if_explicit( package_name, value_none ) ) { ! /* ...but we expect any other package to provide real content, ! * for which we may need to download the package archive... */ ! pkgInternetStreamingAgent download( package_name, pkgArchivePath() ); ! ! /* Check if the required archive is already available locally... ! */ ! if( (access( download.DestFile(), R_OK ) != 0) && (errno == ENOENT) ) { ! /* ...if not, ask the download agent to fetch it... */ ! const char *url_template = get_host_info( current->Selection(), uri_key ); ! if( url_template != NULL ) ! { ! /* ...from the URL constructed from the template specified in ! * 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 ); ! if( ! (download.Get( package_url ) > 0) ) ! dmh_notify( DMH_ERROR, ! "Get package: %s: download failed\n", package_url ! ); ! } ! else ! /* Cannot download; the repository catalogue didn't specify a ! * template, from which to construct a download URL... ! */ dmh_notify( DMH_ERROR, ! "Get package: %s: no URL specified for download\n", package_name ); } } } |