Author: mlandres
Date: Mon Jul 9 17:56:58 2007
New Revision: 5937
URL: http://svn.opensuse.org/viewcvs/zypp?rev=5937&view=rev
Log:
fixed location path and handling of shared tag
Modified:
branches/REFACTORING-10_3/libzypp/zypp/data/ResolvableData.h
branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/FileReaderBaseImpl.h
branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/PackagesFileReader.cc
branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/RepoParser.cc
Modified: branches/REFACTORING-10_3/libzypp/zypp/data/ResolvableData.h
URL: http://svn.opensuse.org/viewcvs/zypp/branches/REFACTORING-10_3/libzypp/zypp/data/ResolvableData.h?rev=5937&r1=5936&r2=5937&view=diff
==============================================================================
--- branches/REFACTORING-10_3/libzypp/zypp/data/ResolvableData.h (original)
+++ branches/REFACTORING-10_3/libzypp/zypp/data/ResolvableData.h Mon Jul 9 17:56:58 2007
@@ -45,7 +45,7 @@
/** List of files contained in a package (info for UI) */
typedef std::liststd::string Filenames;
-
+
///////////////////////////////////////////////////////////////////
DEFINE_PTR_TYPE(Resolvable);
@@ -78,6 +78,8 @@
ResObject()
{}
+ /** Raw data to determine \ref shareDataWith */
+ std::string sharedDataTag;
/** Share some data with another resolvable.*/
RecordId shareDataWith;
@@ -179,7 +181,7 @@
Date timestamp;
/** Patch category (recommended, security,...) */
std::string category;
-
+
// Flags:
/** Does the system need to reboot to finish the update process? */
DefaultIntegral rebootNeeded;
@@ -306,7 +308,7 @@
/** operating system **/
std::string operatingSystem;
-
+
/** Pre install script. */
std::string prein;
/** Post install script. */
@@ -315,7 +317,7 @@
std::string preun;
/** Post uninstall script. */
std::string postun;
-
+
OnMediaLocation repositoryLocation;
};
@@ -390,13 +392,13 @@
std::string sequenceInfo;
};
- DeltaBaseVersion baseVersion;
+ DeltaBaseVersion baseVersion;
};
DEFINE_PTR_TYPE(PackageAtom);
/**
* Data Object for YUM package atom.
- *
+ *
* \see zypp/parser/yum/schema/patch.rng
*/
struct PackageAtom : public Package
Modified: branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/FileReaderBaseImpl.h
URL: http://svn.opensuse.org/viewcvs/zypp/branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/FileReaderBaseImpl.h?rev=5937&r1=5936&r2=5937&view=diff
==============================================================================
--- branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/FileReaderBaseImpl.h (original)
+++ branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/FileReaderBaseImpl.h Mon Jul 9 17:56:58 2007
@@ -33,6 +33,21 @@
namespace susetags
{ /////////////////////////////////////////////////////////////////
+ inline std::string makeSharedIdent( ResolvableTraits::KindType kind_r,
+ const std::string & name_r,
+ const Edition & edition_r,
+ const Arch & arch_r )
+ {
+ std::string ret( kind_r.asString() );
+ ret += ":";
+ ret += name_r;
+ ret += "-";
+ ret += edition_r.asString();
+ ret += ".";
+ ret += arch_r.asString();
+ return ret;
+ }
+
///////////////////////////////////////////////////////////////////
//
// CLASS NAME : FileReaderBase::BaseImpl
@@ -48,7 +63,10 @@
{}
public:
-
+ /** Parsing Capabilities from string is quite expensive. So we
+ * maintain a little chache to check whether we already parsed some
+ * raw string. If so, we can reuse the result.
+ */
struct CapImplCache
{
template<class _Res>
Modified: branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/PackagesFileReader.cc
URL: http://svn.opensuse.org/viewcvs/zypp/branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/PackagesFileReader.cc?rev=5937&r1=5936&r2=5937&view=diff
==============================================================================
--- branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/PackagesFileReader.cc (original)
+++ branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/PackagesFileReader.cc Mon Jul 9 17:56:58 2007
@@ -157,13 +157,13 @@
switch ( str::split( tag_r->value, std::back_inserter(words) ) )
{
case 2: // [medianr filename]
- _data->repositoryLocation.setMedianr( str::strtonum<unsigned>(words[0]) );
- _data->repositoryLocation.setFilename(_data->arch.asString() + words[1] );
+ _data->repositoryLocation.setMedianr( str::strtonum<unsigned>(words[0]) );
+ _data->repositoryLocation.setFilename( Pathname(_data->arch.asString()) / words[1] );
break;
case 3: // [medianr filename dir]
_data->repositoryLocation.setMedianr( str::strtonum<unsigned>(words[0]) );
- _data->repositoryLocation.setFilename(words[2] + words[1] );
+ _data->repositoryLocation.setFilename( Pathname(words[2]) / words[1] );
break;
default:
@@ -184,10 +184,32 @@
_data->installedSize = str::strtonumByteCount::SizeType( words[1] );
}
- /** Consume =Shr:. */
+ /** Consume =Shr:.
+ * Raw data to identify the object is the string
+ * <tt>kind:name-version-realease.arch</tt>.
+ */
void consumeShr( const SingleTagPtr & tag_r )
{
-#warning TBD
+ std::vectorstd::string words;
+ if ( str::split( tag_r->value, std::back_inserter(words) ) != 4 )
+ {
+ ZYPP_THROW( error( tag_r, "Expected [name version release arch]") );
+ }
+
+ if ( words[3] == "src" || words[3] == "nosrc")
+ {
+ _data->sharedDataTag = makeSharedIdent( ResTraits<SrcPackage>::kind,
+ words[0],
+ Edition( words[1], words[2] ),
+ Arch() );
+ }
+ else
+ {
+ _data->sharedDataTag = makeSharedIdent( ResTraits<Package>::kind,
+ words[0],
+ Edition( words[1], words[2] ),
+ Arch( words[3] ) );
+ }
}
public: // multi tags
Modified: branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/RepoParser.cc
URL: http://svn.opensuse.org/viewcvs/zypp/branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/RepoParser.cc?rev=5937&r1=5936&r2=5937&view=diff
==============================================================================
--- branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/RepoParser.cc (original)
+++ branches/REFACTORING-10_3/libzypp/zypp/parser/susetags/RepoParser.cc Mon Jul 9 17:56:58 2007
@@ -14,6 +14,7 @@
#include "zypp/base/Iterator.h"
#include "zypp/base/String.h"
+#include "zypp/parser/susetags/FileReaderBaseImpl.h"
#include "zypp/parser/susetags/RepoParser.h"
#include "zypp/parser/susetags/ContentFileReader.h"
#include "zypp/parser/susetags/PackagesFileReader.h"
@@ -77,15 +78,50 @@
void consumePkg( const data::Package_Ptr & data_r )
{
//SEC << "[Package]" << data_r << endl;
+
+ // prepend location with 'datadir'
+ Pathname tofix( data_r->repositoryLocation.filename() );
+ data_r->repositoryLocation.setFilename( _datadir / tofix );
+
+ // resolve shared data tag
+ if ( ! data_r->sharedDataTag.empty() )
+ {
+ data_r->shareDataWith = idMapGet( data_r->sharedDataTag );
+ }
+
++_stats.pack;
- _consumer.consumePackage( _repositoryId, data_r );
+ data::RecordId newid = _consumer.consumePackage( _repositoryId, data_r );
+
+ // remember for later reference
+ idMapAdd( makeSharedIdent( ResTraits<Package>::kind,
+ data_r->name,
+ data_r->edition,
+ data_r->arch ),
+ newid );
}
void consumeSrcPkg( const data::SrcPackage_Ptr & data_r )
{
//SEC << "[SrcPackage]" << data_r << endl;
+
+ // prepend location with 'datadir'
+ Pathname tofix( data_r->repositoryLocation.filename() );
+ data_r->repositoryLocation.setFilename( _datadir / tofix );
+
+ // resolve shared data tag
+ if ( ! data_r->sharedDataTag.empty() )
+ {
+ data_r->shareDataWith = idMapGet( data_r->sharedDataTag );
+ }
++_stats.srcp;
- _consumer.consumeSourcePackage( _repositoryId, data_r );
+ data::RecordId newid = _consumer.consumeSourcePackage( _repositoryId, data_r );
+
+ // remember for later reference
+ idMapAdd( makeSharedIdent( ResTraits<SrcPackage>::kind,
+ data_r->name,
+ data_r->edition,
+ data_r->arch ),
+ newid );
}
void consumePat( const data::Pattern_Ptr & data_r )
@@ -158,6 +194,27 @@
}
private:
+ void idMapAdd( const std::string & key_r, data::RecordId value_r )
+ {
+ if ( _idMap[key_r] != data::noRecordId )
+ {
+ WAR << "Multiple record ids for " << key_r
+ << " (first " << _idMap[key_r] << ", now " << value_r << ")" << endl;
+ }
+ _idMap[key_r] = value_r;
+ }
+
+ data::RecordId idMapGet( const std::string & key_r )
+ {
+ data::RecordId ret = _idMap[key_r];
+ if ( ret == data::noRecordId )
+ {
+ WAR << "No record id for " << key_r << endl;
+ }
+ return ret;
+ }
+
+ private:
data::RecordId _repositoryId;
data::ResolvableDataConsumer & _consumer;
ProgressData _ticks;
@@ -166,11 +223,14 @@
RepoIndex_Ptr _repoIndex;
data::Product_Ptr _prodData;
Pathname _descrdir; // full path
- Pathname _datadir; // full path
+ Pathname _datadir; // path below reporoot
/** Translations processed by \ref parseLocaleIf so far.*/
std::set<Locale> _parsedLocales;
+ /** Remember the record ids of created packages and soucepackages. */
+ std::mapstd::string,data::RecordId _idMap;
+
struct Stats {
DefaultIntegral prod;
DefaultIntegral patt;
@@ -207,8 +267,8 @@
DBG << _repoIndex << endl;
// Prepare parsing
- _descrdir = reporoot_r / _repoIndex->descrdir;
- _datadir = reporoot_r / _repoIndex->datadir;
+ _descrdir = reporoot_r / _repoIndex->descrdir; // full path
+ _datadir = _repoIndex->datadir; // path below reporoot
_ticks.name( "Parsing susetags repo at " + reporoot_r.asString() );
_ticks.range( _repoIndex->metaFileChecksums.size() );
--
To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org
For additional commands, e-mail: zypp-commit+help@opensuse.org