A new version of Monticello was added to project The Inbox: http://source.squeak.org/inbox/Monticello-topa.490.mcz
==================== Summary ====================
Name: Monticello-topa.490 Author: topa Time: 2 December 2011, 10:49:46.616 am UUID: 460bc9a0-d113-4619-b46f-539ec5a25521 Ancestors: Monticello-cmm.489
Support for pluggable loaders and serializers for MCZ/MCD files. This can be handy when extending The Monticello fromat without breaking too much.
=============== Diff against Monticello-cmm.489 ===============
Item was added: + ----- Method: MCMcdReader class>>initialize (in category 'as yet unclassified') ----- + initialize + "MCMcdReader initialize" + "use super to populate loaders" + super initialize!
Item was added: + ----- Method: MCMcdReader class>>loaderDiff (in category 'as yet unclassified') ----- + loaderDiff + + ^ 9999 -> [:reader | reader loadDiff]!
Item was added: + ----- Method: MCMcdReader class>>loaderDiffBinary (in category 'as yet unclassified') ----- + loaderDiffBinary + + ^ 100 -> [:reader | reader loaderDiffBinary]!
Item was added: + ----- Method: MCMcdReader>>loadDiff (in category 'as yet unclassified') ----- + loadDiff + | old new | + + definitions := OrderedCollection new. + (self zip membersMatching: 'old/*') + do: [:m | self extractDefinitionsFrom: m]. + old := definitions asArray. + definitions := OrderedCollection new. + (self zip membersMatching: 'new/*') + do: [:m | self extractDefinitionsFrom: m]. + new := definitions asArray. + + ^ patch := self buildPatchFrom: old to: new.!
Item was added: + ----- Method: MCMcdReader>>loadDiffBinary (in category 'as yet unclassified') ----- + loadDiffBinary + + (self zip memberNamed: 'patch.bin') ifNotNil: + [:m | [^ patch := (DataStream on: m contentStream) next ] + on: Error do: [:fallThrough | ^ nil ]].!
Item was changed: ----- Method: MCMcdReader>>loadPatch (in category 'as yet unclassified') ----- loadPatch + + ^ self loadByLoaderBlock! - | old new | - (self zip memberNamed: 'patch.bin') ifNotNil: - [:m | [^ patch := (DataStream on: m contentStream) next ] - on: Error do: [:fallThrough ]]. - definitions := OrderedCollection new. - (self zip membersMatching: 'old/*') - do: [:m | self extractDefinitionsFrom: m]. - old := definitions asArray. - definitions := OrderedCollection new. - (self zip membersMatching: 'new/*') - do: [:m | self extractDefinitionsFrom: m]. - new := definitions asArray. - ^ patch := self buildPatchFrom: old to: new. - !
Item was added: + ----- Method: MCMcdWriter class>>initialize (in category 'as yet unclassified') ----- + initialize + "MCMcdWriter initialize" + "use super to populate serializers" + super initialize!
Item was added: + ----- Method: MCMcdWriter class>>serializerBinary (in category 'as yet unclassified') ----- + serializerBinary + + ^ [:writer :patch | writer writePatchAsBinary: patch]!
Item was added: + ----- Method: MCMcdWriter class>>serializerDefinition (in category 'as yet unclassified') ----- + serializerDefinition + + ^ [:writer :patch | writer writePatchAsDefinition: patch]!
Item was changed: ----- Method: MCMcdWriter>>writePatch: (in category 'as yet unclassified') ----- writePatch: aPatch + self writeWithAllSerializers: aPatch! - | old new | - old := OrderedCollection new. - new := OrderedCollection new. - aPatch operations do: - [:ea | - ea isRemoval ifTrue: [old add: ea definition]. - ea isAddition ifTrue: [new add: ea definition]. - ea isModification ifTrue: [old add: ea baseDefinition. new add: ea definition]]. - self writeOldDefinitions: old. - self writeNewDefinitions: new. - self addString: (self serializeInBinary: aPatch) at: 'patch.bin'.!
Item was added: + ----- Method: MCMcdWriter>>writePatchAsBinary: (in category 'as yet unclassified') ----- + writePatchAsBinary: aPatch + self addString: (self serializeInBinary: aPatch) at: 'patch.bin'.!
Item was added: + ----- Method: MCMcdWriter>>writePatchAsDefinition: (in category 'as yet unclassified') ----- + writePatchAsDefinition: aPatch + + | old new | + old := OrderedCollection new. + new := OrderedCollection new. + aPatch operations do: + [:ea | + ea isRemoval ifTrue: [old add: ea definition]. + ea isAddition ifTrue: [new add: ea definition]. + ea isModification ifTrue: [old add: ea baseDefinition. new add: ea definition]]. + self writeOldDefinitions: old. + self writeNewDefinitions: new!
Item was changed: MCVersionReader subclass: #MCMczReader instanceVariableNames: 'zip infoCache' classVariableNames: '' poolDictionaries: '' category: 'Monticello-Storing'! + MCMczReader class + instanceVariableNames: 'loaders'! + MCMczReader class + instanceVariableNames: 'loaders'!
Item was added: + ----- Method: MCMczReader class>>allLoaderSelectors (in category 'as yet unclassified') ----- + allLoaderSelectors + + ^ self class selectors select: [ :each | + each ~= 'loaders' + and: [(each beginsWith: 'loader') + and: [each numArgs = 0]]]!
Item was added: + ----- Method: MCMczReader class>>initialize (in category 'as yet unclassified') ----- + initialize + "MCMczReader initialize" + + self populateLoaders.!
Item was added: + ----- Method: MCMczReader class>>loaderBinary (in category 'as yet unclassified') ----- + loaderBinary + + ^ 100 -> [:reader | reader loadBinary]. + !
Item was added: + ----- Method: MCMczReader class>>loaderSnapshot (in category 'as yet unclassified') ----- + loaderSnapshot + + ^ 9999 -> [:reader | reader loadSnapshot]!
Item was added: + ----- Method: MCMczReader class>>loaders (in category 'as yet unclassified') ----- + loaders + + ^ loaders!
Item was added: + ----- Method: MCMczReader class>>populateLoaders (in category 'as yet unclassified') ----- + populateLoaders + " loaders will hold a Collection of associations of + priority -> [:OneArg | LoaderBlock] + and the arg will be the reader." + + loaders := self allLoaderSelectors + inject: (SortedCollection sortBlock: [:loader1 :loader2 | loader1 key <= loader2 key]) + into: [:collection :selector | + collection add: (self perform: selector); yourself].!
Item was added: + ----- Method: MCMczReader>>definitions: (in category 'as yet unclassified') ----- + definitions: anObject + + definitions := anObject.!
Item was added: + ----- Method: MCMczReader>>loadBinary (in category 'as yet unclassified') ----- + loadBinary + + (self zip memberNamed: 'snapshot.bin') ifNotNil: [:m | + [^ definitions := (DataStream on: m contentStream) next definitions] + on: Error do: [:fallThrough | ^ nil]]!
Item was added: + ----- Method: MCMczReader>>loadByLoaderBlock (in category 'as yet unclassified') ----- + loadByLoaderBlock + + | loaderSorted defs| + loaderSorted := self class loaders collect: [:loader | loader value]. + loaderSorted detect: [:loaderBlock | (defs := loaderBlock value: self) notNil]. + ^ defs + !
Item was changed: ----- Method: MCMczReader>>loadDefinitions (in category 'as yet unclassified') ----- loadDefinitions + + ^ self loadByLoaderBlock - definitions := OrderedCollection new. - (self zip memberNamed: 'snapshot.bin') ifNotNil: - [:m | [^ definitions := (DataStream on: m contentStream) next definitions] - on: Error do: [:fallThrough ]]. - "otherwise" - (self zip membersMatching: 'snapshot/*') - do: [:m | self extractDefinitionsFrom: m]. !
Item was added: + ----- Method: MCMczReader>>loadSnapshot (in category 'as yet unclassified') ----- + loadSnapshot + + definitions :=OrderedCollection new. + (self zip membersMatching: 'snapshot/*') + do: [:m | self extractDefinitionsFrom: m]. + ^ definitions + !
Item was changed: MCWriter subclass: #MCMczWriter instanceVariableNames: 'zip infoWriter' classVariableNames: '' poolDictionaries: '' category: 'Monticello-Storing'! + MCMczWriter class + instanceVariableNames: 'serializers'! + MCMczWriter class + instanceVariableNames: 'serializers'!
Item was added: + ----- Method: MCMczWriter class>>allSerializerSelectors (in category 'as yet unclassified') ----- + allSerializerSelectors + + ^ self class selectors select: [ :each | + each ~= 'serializers' + and: [(each beginsWith: 'serializer') + and: [each numArgs = 0]]]!
Item was added: + ----- Method: MCMczWriter class>>initialize (in category 'as yet unclassified') ----- + initialize + "MCMczWriter initialize" + + self populateSerializers.!
Item was added: + ----- Method: MCMczWriter class>>populateSerializers (in category 'as yet unclassified') ----- + populateSerializers + " serializers will hold a Collection of + [:OneArg :TwoArg | WriterBlock] + and + the first argument will be the writer + and + the second argument will be the snapshot." + + serializers := self allSerializerSelectors collect: [:selector | self perform: selector].!
Item was added: + ----- Method: MCMczWriter class>>serializerBinary (in category 'as yet unclassified') ----- + serializerBinary + + ^ [:writer :snapshot | writer writeSnapshotAsBinary: snapshot]!
Item was added: + ----- Method: MCMczWriter class>>serializerDefinition (in category 'as yet unclassified') ----- + serializerDefinition + + ^ [:writer :snapshot | writer writeSnapshotAsDefinition: snapshot]!
Item was added: + ----- Method: MCMczWriter class>>serializers (in category 'as yet unclassified') ----- + serializers + + ^ serializers!
Item was added: + ----- Method: MCMczWriter>>serializeInFuel: (in category 'serializing') ----- + serializeInFuel: aSnapshot + + (self class environment classNamed: #FLSerializer) ifNotNil: [:serializerClass | + ^ serializerClass serializeToByteArray: aSnapshot]!
Item was changed: ----- Method: MCMczWriter>>writeSnapshot: (in category 'visiting') ----- writeSnapshot: aSnapshot + self writeWithAllSerializers: aSnapshot.! - self addString: (self serializeDefinitions: aSnapshot definitions) at: 'snapshot/source.', self snapshotWriterClass extension. - self addString: (self serializeInBinary: aSnapshot) at: 'snapshot.bin'!
Item was added: + ----- Method: MCMczWriter>>writeSnapshotAsBinary: (in category 'visiting') ----- + writeSnapshotAsBinary: aSnapshot + self addString: (self serializeInBinary: aSnapshot) at: 'snapshot.bin'!
Item was added: + ----- Method: MCMczWriter>>writeSnapshotAsDefinition: (in category 'visiting') ----- + writeSnapshotAsDefinition: aSnapshot + self addString: (self serializeDefinitions: aSnapshot definitions) at: 'snapshot/source.', self snapshotWriterClass extension.!
Item was added: + ----- Method: MCMczWriter>>writeWithAllSerializers: (in category 'visiting') ----- + writeWithAllSerializers: snapshot + + self class serializers do: [:serializerBlock | + serializerBlock value: self value: snapshot]. + !
squeak-dev@lists.squeakfoundation.org