MetacelloVersionConstructor.st
author jv
Mon, 03 Sep 2012 11:13:41 +0000
changeset 1 9e312de5f694
permissions -rw-r--r--
- Initial commit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     1
"{ Package: 'stx:goodies/metacello' }"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     2
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     3
MetacelloAbstractVersionConstructor subclass:#MetacelloVersionConstructor
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     4
	instanceVariableNames:'errorMap'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     5
	classVariableNames:''
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     6
	poolDictionaries:''
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     7
	category:'Metacello-Core-Constructors'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     8
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     9
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    10
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    11
!MetacelloVersionConstructor class methodsFor:'instance creation'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    12
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    13
on: aConfig
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    14
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    15
	^(self new)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    16
		on: aConfig;
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    17
		yourself
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    18
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    19
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    20
on: aConfig project: aProject
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    21
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    22
	^(self new)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    23
		on: aConfig project: aProject;
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    24
		yourself
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    25
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    26
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    27
!MetacelloVersionConstructor class methodsFor:'deprecated'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    28
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    29
spawnPackageMethodIn: aConfig category: methodCategory named: newSelector sourceVersion: sourceVersionString targetVersion: targetVersionString blessing: blessing
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    30
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    31
	self deprecated: 'see MetacelloToolBox class>>createDevelopment:for:importFromBaseline:description: for a similar example'.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    32
	^self new
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    33
		spawnPackageMethodIn: aConfig 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    34
		category: methodCategory 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    35
		named: newSelector
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    36
		sourceVersion: sourceVersionString 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    37
		targetVersion: targetVersionString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    38
		blessing: blessing
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    39
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    40
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    41
spawnPackageMethodIn: aConfig named: newSelector sourceVersion: sourceVersionString targetVersion: targetVersionString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    42
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    43
	self deprecated: 'see MetacelloToolBox class>>createDevelopment:for:importFromBaseline:description: for a similar example'.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    44
	^self 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    45
		spawnPackageMethodIn: aConfig 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    46
		category: 'versions'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    47
		named: newSelector 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    48
		sourceVersion: sourceVersionString 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    49
		targetVersion: targetVersionString 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    50
		blessing: #development
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    51
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    52
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    53
spawnPackageMethodIn: aConfig named: newSelector sourceVersion: sourceVersionString targetVersion: targetVersionString blessing: blessing
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    54
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    55
	self deprecated: 'see MetacelloToolBox class>>createDevelopment:for:importFromBaseline:description: for a similar example'.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    56
	^self new
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    57
		spawnPackageMethodIn: aConfig 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    58
		category: 'versions'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    59
		named: newSelector 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    60
		sourceVersion: sourceVersionString 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    61
		targetVersion: targetVersionString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    62
		blessing: blessing
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    63
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    64
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    65
updatePackageMethodIn: aConfig sourceVersion: sourceVersionString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    66
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    67
	self deprecated: 'see MetacelloToolBox class>>updateDevelopment:for:updateProjects:description: for a similar example'.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    68
	^self new
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    69
		updatePackageMethodIn: aConfig 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    70
		sourceVersion: sourceVersionString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    71
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    72
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    73
!MetacelloVersionConstructor methodsFor:'accessing'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    74
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    75
errorMap
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    76
    errorMap ifNil: [ errorMap := Dictionary new ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    77
    ^ errorMap
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    78
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    79
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    80
!MetacelloVersionConstructor methodsFor:'deprecated'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    81
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    82
prepareForMethodUpdate: aConfig sourceVersion: sourceVersionString forceUpdate: forceUpdate generating: generateBlock
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    83
	| pragmaDict versionSpecs pragmaMap updatedPackageSpecs updatedPackageSpecsMap reversed pragmaColl seenUpdatedPackageSpecs |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    84
	self deprecated: 'see MetacelloToolBox for replacement methods'.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    85
	self configuration: aConfig.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    86
	versionSpecs := Dictionary new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    87
	pragmaMap := Dictionary new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    88
	pragmaDict := self extractAllVersionPragmas.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    89
	pragmaColl := pragmaDict at: sourceVersionString ifAbsent: [ ^ self ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    90
	pragmaColl
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    91
		do: [ :pragma | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    92
			| specs versionSpec |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    93
			specs := Dictionary new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    94
			self evaluatePragma: pragma.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    95
			self attributeMap
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    96
				keysAndValuesDo: [ :attribute :blockList | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    97
					versionSpec := self project versionSpec.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    98
					versionSpec versionString: sourceVersionString.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    99
					specs at: attribute put: versionSpec.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   100
					blockList do: [ :block | self with: versionSpec during: block ] ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   101
			versionSpecs
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   102
				at: pragma selector
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   103
				put:
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   104
					{specs.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   105
					(self attributeOrder).
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   106
					nil}.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   107
			pragmaMap at: pragma selector put: pragma.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   108
			self reset ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   109
	versionSpecs
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   110
		keysAndValuesDo: [ :selector :ar | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   111
			updatedPackageSpecsMap := Dictionary new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   112
			seenUpdatedPackageSpecs := Dictionary new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   113
			ar at: 3 put: updatedPackageSpecsMap.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   114
			reversed := aConfig project attributes reverse.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   115
			reversed
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   116
				do: [ :attribute | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   117
					| vs |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   118
					(vs := (ar at: 1) at: attribute ifAbsent: [  ]) ~~ nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   119
						ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   120
							updatedPackageSpecs := forceUpdate
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   121
								ifTrue: [ vs forceUpdatedPackageSpecs ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   122
								ifFalse: [ vs updatedPackageSpecs ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   123
							updatedPackageSpecs associations
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   124
								do: [ :assoc | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   125
									| filename |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   126
									(filename := seenUpdatedPackageSpecs at: assoc key ifAbsent: [  ]) == nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   127
										ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   128
											assoc value == #uptodate
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   129
												ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   130
													"#uptodate means that the spec is up-to-date and we mark it as
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   131
										 seen so that the spec is not update for a 'later' spec"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   132
													seenUpdatedPackageSpecs at: assoc key put: #uptodate ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   133
												ifFalse: [ seenUpdatedPackageSpecs at: assoc key put: assoc value file ] ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   134
										ifFalse: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   135
											"if the spec was already seen as up-to-date or the file is the same as 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   136
								 the one already seen don't propogate the file"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   137
											(filename == #uptodate or: [ assoc value == #uptodate or: [ filename = assoc value file ] ])
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   138
												ifTrue: [ updatedPackageSpecs removeKey: assoc key ] ] ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   139
							updatedPackageSpecsMap at: attribute put: updatedPackageSpecs ] ].	"clear out #uptodate markers"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   140
			updatedPackageSpecsMap
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   141
				valuesDo: [ :d | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   142
					d associations
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   143
						do: [ :assoc | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   144
							assoc value == #uptodate
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   145
								ifTrue: [ d removeKey: assoc key ] ] ].	"remove shadowed packages"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   146
			1 to: reversed size do: [ :index | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   147
				| attribute d |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   148
				attribute := reversed at: index.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   149
				((d := updatedPackageSpecsMap at: attribute ifAbsent: [  ]) ~~ nil and: [ d keys size > 0 ])
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   150
					ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   151
						index + 1 to: reversed size do: [ :shadowIndex | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   152
							d
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   153
								keysDo: [ :key | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   154
									| dict |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   155
									(dict := updatedPackageSpecsMap at: (reversed at: shadowIndex) ifAbsent: [  ]) ~~ nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   156
										ifTrue: [ dict removeKey: key ifAbsent: [  ] ] ] ] ] ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   157
			updatedPackageSpecsMap keys
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   158
				do: [ :key | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   159
					| d |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   160
					d := updatedPackageSpecsMap at: key.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   161
					d isEmpty
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   162
						ifTrue: [ updatedPackageSpecsMap removeKey: key ] ].	"ready to generate source for method"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   163
			generateBlock
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   164
				value: selector
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   165
				value: pragmaMap
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   166
				value: ar
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   167
				value: updatedPackageSpecsMap ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   168
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   169
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   170
spawnPackageMethodIn: aConfig category: methodCategory named: newSelector sourceVersion: sourceVersionString targetVersion: targetVersionString blessing: blessing
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   171
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   172
	self deprecated: 'see MetacelloToolBox class>>createBaseline:for:from:description: for replacement method'.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   173
	self 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   174
		prepareForMethodUpdate: aConfig 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   175
		sourceVersion: sourceVersionString 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   176
		forceUpdate: blessing ~~ #baseline
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   177
		generating: [:selector :pragmaMap :ar :updatedPackageSpecsMap | | strm |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   178
			strm := WriteStream on: String new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   179
			strm 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   180
				nextPutAll: newSelector asString, ' spec'; cr;
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   181
				tab; nextPutAll: 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   182
						'<version: ', 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   183
						targetVersionString printString, 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   184
						' imports: #(', sourceVersionString printString, 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   185
						')>';cr.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   186
			(ar at: 2) do: [:attribute | | vs d |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   187
				vs := (ar at: 1) at: attribute.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   188
				(d := updatedPackageSpecsMap at: attribute ifAbsent: []) ~~ nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   189
					ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   190
						vs packagesSpec list do: [:member | | x |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   191
							x := d at: member spec name ifAbsent: [].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   192
						 	member spec updateForSpawnMethod: x ]]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   193
					ifFalse: [
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   194
						vs packagesSpec list do: [:member |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   195
							member spec updateForSpawnMethod: member spec copy ]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   196
				strm cr; tab; nextPutAll: 'spec for: ', attribute printString, ' do: ['; cr.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   197
				attribute == #common
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   198
					ifTrue: [
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   199
						vs 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   200
							author: MetacelloPlatform current authorName;
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   201
							timestamp: MetacelloPlatform current timestamp.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   202
						blessing ~~ nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   203
							ifTrue: [ vs blessing: blessing ]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   204
				vs configSpawnMethodOn: strm indent: 2.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   205
				strm nextPutAll: '].'].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   206
				(aConfig class	
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   207
					compile: strm contents
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   208
					classified: methodCategory) == nil 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   209
						ifTrue: [ self error: 'Error compiling the method' ]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   210
	^true
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   211
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   212
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   213
updatePackageMethodIn: aConfig sourceVersion: sourceVersionString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   214
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   215
	self deprecated: 'see MetacelloToolBox class>>updateDevelopment:for:updateProjects:description: for replacement method'.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   216
	self 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   217
		prepareForMethodUpdate: aConfig 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   218
		sourceVersion: sourceVersionString 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   219
		forceUpdate: false
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   220
		generating: [:selector :pragmaMap :ar :updatedPackageSpecsMap | | strm pragma |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   221
			updatedPackageSpecsMap isEmpty ifTrue: [ ^false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   222
			strm := WriteStream on: String new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   223
			strm 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   224
				nextPutAll: selector asString, ' spec'; cr;
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   225
				tab; nextPutAll: '<version: ', sourceVersionString printString.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   226
			pragma := pragmaMap at: selector.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   227
			pragma numArgs = 2
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   228
				ifTrue: [
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   229
					strm nextPutAll: ' imports: #('.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   230
					(pragma argumentAt: 2) do: [:versionString |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   231
						strm nextPutAll: versionString printString; space ]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   232
			strm nextPutAll: ')>';cr.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   233
			(ar at: 2) do: [:attribute | | vs d |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   234
				vs := (ar at: 1) at: attribute.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   235
				(d := updatedPackageSpecsMap at: attribute ifAbsent: []) ~~ nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   236
					ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   237
						vs packagesSpec list do: [:member | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   238
							member spec file ~~ nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   239
								ifTrue: [ | x |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   240
									(((x := d at: member spec name ifAbsent: []) ~~ nil) and: [ x ~~ #uptodate ])
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   241
						 				ifTrue: [ member spec file: x file ]]]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   242
				strm cr; tab; nextPutAll: 'spec for: ', attribute printString, ' do: ['; cr.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   243
				attribute == #common
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   244
					ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   245
						vs 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   246
							author: MetacelloPlatform current authorName;
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   247
							timestamp: MetacelloPlatform current timestamp ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   248
				vs configMethodOn: strm indent: 2.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   249
				strm nextPutAll: '].'].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   250
			(aConfig class	
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   251
					compile: strm contents
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   252
					classified: (aConfig class whichCategoryIncludesSelector: pragma selector)) == nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   253
						ifTrue: [ self error: 'Error compiling the method' ]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   254
	^true
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   255
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   256
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   257
!MetacelloVersionConstructor methodsFor:'initialization'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   258
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   259
calculate: aConfig project: aProject
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   260
    | versionMap symbolicVersionMap executionBlock pragmaDict |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   261
    self setProject: aProject.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   262
    self configuration: aConfig.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   263
    versionMap := Dictionary new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   264
    symbolicVersionMap := Dictionary new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   265
    executionBlock := self specResolverBlock.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   266
    self collectAllVersionsFromVersionPragmasInto: versionMap using: executionBlock.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   267
    pragmaDict := self extractVersionImportPragmas.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   268
    self verifyVersionImportPragmas: pragmaDict definedIn: versionMap.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   269
    self collectAllVersionsFromVersionImportPragmasInto: versionMap using: executionBlock satisfiedPragmas: pragmaDict.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   270
    self collectAllSymbolicVersionsFromVersionPragmasInto: symbolicVersionMap using: self symbolicVersionResolverBlock.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   271
    self project map: versionMap.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   272
    self project errorMap: self errorMap.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   273
    self project symbolicVersionMap: symbolicVersionMap.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   274
    self project configuration: aConfig.	"now that we have a nearly complete project, we can collect the defaultSymbolicVersions, which expect the project to be fully constructed"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   275
    self
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   276
        collectDefaultSymbolicVersionsFromVersionPragmasFrom: self extractDefaultSymbolicVersionPragmas
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   277
        into: symbolicVersionMap
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   278
        using: self defaultSymbolicVersionResolverBlock.	"Pick up defaults from MetacelloBaseConfiguration"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   279
    self
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   280
        collectDefaultSymbolicVersionsFromVersionPragmasFrom: self extractCommonDefaultSymbolicVersionPragmas
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   281
        into: symbolicVersionMap
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   282
        using: self commonDefaultSymbolicVersionResolverBlock.	"now resolive symbolicVersions defined as symbolicVersions"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   283
    symbolicVersionMap copy
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   284
        keysAndValuesDo: [ :symbolic :original | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   285
            | versionString visited |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   286
            versionString := original.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   287
            visited := Set new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   288
            [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   289
            visited add: versionString.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   290
            versionString isSymbol and: [ versionString ~~ #'notDefined' ] ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   291
                whileTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   292
                    versionString := symbolicVersionMap
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   293
                        at: versionString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   294
                        ifAbsent: [ self error: 'Cannot resolve symbolic version ' , original printString ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   295
                    (visited includes: versionString)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   296
                        ifTrue: [ self error: 'Loop detected resolving symbolic version ' , original printString ] ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   297
            symbolicVersionMap at: symbolic put: versionString ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   298
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   299
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   300
on: aConfig
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   301
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   302
	| cacheKey |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   303
	cacheKey := aConfig class.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   304
	project := MetacelloPlatform current
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   305
		stackCacheFor: #versionConstructor
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   306
		at: cacheKey
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   307
		doing: [ :cache | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   308
			self calculate: aConfig project: nil.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   309
			cache at: cacheKey put:  self project ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   310
	self setProject: project.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   311
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   312
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   313
on: aConfig project: aProject
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   314
    | cacheKey cachedProject |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   315
    cacheKey := aConfig class.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   316
    cachedProject := MetacelloPlatform current
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   317
        stackCacheFor: #'versionConstructor'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   318
        at: cacheKey
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   319
        doing: [ :cache | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   320
            self calculate: aConfig project: aProject.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   321
            cache at: cacheKey put: self project.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   322
            ^ self ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   323
    aProject map: cachedProject map.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   324
    aProject errorMap: cachedProject errorMap.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   325
    aProject symbolicVersionMap: cachedProject symbolicVersionMap.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   326
    aProject configuration: aConfig.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   327
    self setProject: aProject
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   328
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   329
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   330
!MetacelloVersionConstructor methodsFor:'private'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   331
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   332
collectAllSymbolicVersionsFromVersionPragmasInto: symbolicVersionMap using: executionBlock
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   333
	| defined versionPragmaDict versionString |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   334
	versionPragmaDict := self extractSymbolicVersionPragmas.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   335
	versionPragmaDict
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   336
		keysAndValuesDo: [ :versionSymbol :pragmaColl | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   337
			defined := false.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   338
			pragmaColl
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   339
				do: [ :pragma | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   340
					defined := true.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   341
					versionString := executionBlock value: versionSymbol value: pragma ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   342
			defined
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   343
				ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   344
					versionString == nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   345
						ifFalse: [ symbolicVersionMap at: versionSymbol put: versionString ]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   346
			self reset ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   347
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   348
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   349
collectAllVersionsFromVersionImportPragmasInto: versionMap using: executionBlock satisfiedPragmas: pragmaDict
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   350
    | defined done completed |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   351
    done := false.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   352
    completed := IdentitySet new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   353
    [ done ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   354
        whileFalse: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   355
            done := true.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   356
            pragmaDict
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   357
                keysAndValuesDo: [ :versionString :pragmaColl | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   358
                    | versionSpec |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   359
                    versionSpec := nil.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   360
                    defined := false.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   361
                    [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   362
                    pragmaColl
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   363
                        do: [ :pragma | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   364
                            (completed includes: pragma)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   365
                                ifFalse: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   366
                                    done := false.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   367
                                    (pragma argumentAt: 2)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   368
                                        do: [ :importedVersion | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   369
                                            | version |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   370
                                            (version := versionMap at: importedVersion ifAbsent: [  ]) ~~ nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   371
                                                ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   372
                                                    defined := true.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   373
                                                    completed add: pragma.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   374
                                                    versionSpec == nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   375
                                                        ifTrue: [ versionSpec := version spec copy ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   376
                                                        ifFalse: [ versionSpec := versionSpec mergeSpec: version spec copy ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   377
                                                    versionSpec versionString: versionString.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   378
                                                    executionBlock value: versionSpec value: pragma ] ] ] ] ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   379
                        on: Error
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   380
                        do: [ :ex | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   381
                            (MetacelloErrorInProjectConstructionNotification versionString: versionSpec versionString exception: ex)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   382
                                ifTrue: [ ^ ex pass ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   383
                                ifFalse: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   384
                                    self errorMap at: versionSpec versionString put: ex.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   385
                                    done := true.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   386
                                    defined := false ] ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   387
                    defined
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   388
                        ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   389
                            | version importedVersions |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   390
                            importedVersions := OrderedCollection new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   391
                            version := versionSpec createVersion.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   392
                            pragmaColl do: [ :pragma | importedVersions addAll: (pragma argumentAt: 2) ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   393
                            version importedVersions: importedVersions.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   394
                            self validateVersionString: versionString againstSpec: versionSpec.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   395
                            versionMap at: versionSpec versionString put: version ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   396
                    self reset ] ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   397
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   398
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   399
collectAllVersionsFromVersionPragmasInto: versionMap using: executionBlock
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   400
    | defined versionPragmaDict |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   401
    versionPragmaDict := self extractVersionPragmas.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   402
    versionPragmaDict
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   403
        keysAndValuesDo: [ :versionString :pragmaColl | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   404
            | versionSpec |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   405
            versionSpec := self project versionSpec.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   406
            versionSpec versionString: versionString.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   407
            defined := false.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   408
            [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   409
            pragmaColl
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   410
                do: [ :pragma | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   411
                    executionBlock value: versionSpec value: pragma.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   412
                    defined := true ] ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   413
                on: Error
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   414
                do: [ :ex | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   415
                    (MetacelloErrorInProjectConstructionNotification versionString: versionSpec versionString exception: ex)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   416
                        ifTrue: [ ^ ex pass ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   417
                        ifFalse: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   418
                            self errorMap at: versionSpec versionString put: ex.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   419
                            defined := false ] ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   420
            defined
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   421
                ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   422
                    self validateVersionString: versionString againstSpec: versionSpec.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   423
                    versionMap at: versionSpec versionString put: versionSpec createVersion ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   424
            self reset ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   425
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   426
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   427
collectDefaultSymbolicVersionsFromVersionPragmasFrom: versionPragmaDict into: symbolicVersionMap using: executionBlock
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   428
	| defined versionString |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   429
	versionPragmaDict
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   430
		keysAndValuesDo: [ :versionSymbol :pragmaColl | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   431
			defined := false.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   432
			symbolicVersionMap
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   433
				at: versionSymbol
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   434
				ifAbsent: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   435
					"process the defaultSymbolicVersion only if the symbolicVersion is not defined yet"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   436
					pragmaColl
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   437
						do: [ :pragma | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   438
							defined := true.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   439
							versionString := executionBlock value: versionSymbol value: pragma ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   440
					defined
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   441
						ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   442
							versionString == nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   443
								ifFalse: [ symbolicVersionMap at: versionSymbol put: versionString ] ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   444
					self reset ] ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   445
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   446
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   447
commonDefaultSymbolicVersionResolverBlock
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   448
	^ self defaultSymbolicVersionResolverBlock: (ConfigurationOf new project: self project)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   449
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   450
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   451
defaultSymbolicVersionResolverBlock
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   452
	^ self defaultSymbolicVersionResolverBlock: self configuration
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   453
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   454
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   455
defaultSymbolicVersionResolverBlock: receiver
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   456
	^ [ :symbolicVrsn :pragma | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   457
	| result |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   458
	result := nil.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   459
	(pragma argumentAt: 1) = symbolicVrsn
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   460
		ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   461
			self symbolicVersion: symbolicVrsn.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   462
			result := [ receiver perform: pragma selector ] on: MetacelloVersionDoesNotExistError do: [ :ex | ex return: nil ] ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   463
	result ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   464
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   465
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   466
specResolverBlock
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   467
	^ [ :versionSpec :pragma | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   468
	(pragma argumentAt: 1) = versionSpec versionString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   469
		ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   470
			self evaluatePragma: pragma.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   471
			self project attributes
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   472
				do: [ :attribute | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   473
					| blockList |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   474
					(blockList := self attributeMap at: attribute ifAbsent: [  ]) ~~ nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   475
						ifTrue: [ blockList do: [ :block | self with: versionSpec during: block ] ] ] ] ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   476
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   477
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   478
symbolicVersionResolverBlock
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   479
	^ [ :symbolicVrsn :pragma | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   480
	| result |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   481
	result := nil.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   482
	(pragma argumentAt: 1) = symbolicVrsn
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   483
		ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   484
			self symbolicVersion: symbolicVrsn.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   485
			self evaluatePragma: pragma.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   486
			self project attributes
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   487
				do: [ :attribute | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   488
					| versionString |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   489
					versionString := self attributeMap at: attribute ifAbsent: [  ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   490
					versionString ~~ nil
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   491
						ifTrue: [ result := versionString ] ] ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   492
	result ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   493
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   494
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   495
verifyVersionImportPragmas: pragmaDict definedIn: versionMap
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   496
    pragmaDict copy
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   497
        keysAndValuesDo: [ :versionString :pragmaColl | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   498
            [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   499
            pragmaColl
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   500
                do: [ :pragma | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   501
                    (pragma argumentAt: 2)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   502
                        do: [ :importedVersion | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   503
                            versionMap
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   504
                                at: importedVersion
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   505
                                ifAbsent: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   506
                                    pragmaDict
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   507
                                        at: importedVersion
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   508
                                        ifAbsent: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   509
                                            ^ self
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   510
                                                error:
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   511
                                                    'The imported version:' , importedVersion printString , ' for version: ' , versionString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   512
                                                        , ' referenced from the method: ' , pragma selector printString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   513
                                                        , ' in configuration ' , configuration class printString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   514
                                                        , ' has not been defined.' ] ] ] ] ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   515
                on: Error
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   516
                do: [ :ex | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   517
                    (MetacelloErrorInProjectConstructionNotification versionString: versionString exception: ex)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   518
                        ifTrue: [ ^ ex pass ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   519
                        ifFalse: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   520
                            pragmaDict removeKey: versionString.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   521
                            self errorMap at: versionString put: ex ] ] ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   522
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   523
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   524
!MetacelloVersionConstructor methodsFor:'validation'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   525
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   526
validateVersionString: versionString againstSpec: versionSpec
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   527
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   528
	versionString = versionSpec versionString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   529
		ifFalse: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   530
			MetacelloValidationNotification
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   531
				signal:
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   532
					(MetacelloValidationError
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   533
						configurationClass: self configurationClass
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   534
						reasonCode: #incorrectVersionString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   535
						callSite: #validateVersionString:againstSpec
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   536
						explanation:
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   537
							'The version declared in the pragma ', versionString printString , ' does not match the version in the spec '
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   538
								, versionSpec versionString printString) ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   539
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   540
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   541
!MetacelloVersionConstructor class methodsFor:'documentation'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   542
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   543
version_SVN
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   544
    ^ '$Id::                                                                                                                        $'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   545
! !