"{ Package: 'stx:goodies/metacello' }"
Object subclass:#MetacelloProjectSpecForLoad
instanceVariableNames:'projectSpec useDetermineVersionForLoad overrideProjectSpec'
classVariableNames:''
poolDictionaries:''
category:'Metacello-Core-Scripts'
!
!MetacelloProjectSpecForLoad methodsFor:'accessing'!
overrideProjectSpec
^ overrideProjectSpec
!
overrideProjectSpec: anObject
overrideProjectSpec := anObject
!
projectSpec
^ projectSpec
!
projectSpec: anObject
projectSpec := anObject
!
useDetermineVersionForLoad
useDetermineVersionForLoad ifNil: [ useDetermineVersionForLoad := true ].
^ useDetermineVersionForLoad
!
useDetermineVersionForLoad: anObject
useDetermineVersionForLoad := anObject
! !
!MetacelloProjectSpecForLoad methodsFor:'operations'!
performCurrentVersionTestAgainst: vrsn operator: anOperator targetVersionStatus: targetVersionStatus using: anMCLoader
"answer true if the current state of image is to be left as is"
| currentVersion existing new |
vrsn ifNil: [ ^ false ].
self useDetermineVersionForLoad
ifTrue: [
| prjct cv |
self hasOverride
ifTrue: [ self error: 'unexpected logic combination: useDeterminVersionForLoad & hasOverride' ].
prjct := self projectSpec projectClassProject.
prjct loader: anMCLoader.
(cv := prjct currentVersion) == nil
ifTrue: [ ^ false ].
(targetVersionStatus includes: cv versionStatus)
ifTrue: [ ^ cv perform: anOperator with: vrsn ].
^ false ].
(self hasOverride not or: [ targetVersionStatus ~= #(#'allLoadedToSpec') ])
ifTrue: [ ^ false ].
(self overrideProjectSpec allPackagesLoaded: anMCLoader)
ifFalse: [
"roughly equivalent to versionStatus test above (#'allLoadedToSpec')"
^ false ].
(currentVersion := self overrideProjectSpec versionOrNil) ifNil: [ ^ false ].
currentVersion = vrsn
ifTrue: [ ^ true ].
existing := self overrideProjectSpec asProjectRegistration.
new := self projectSpec asProjectRegistration.
^ currentVersion > vrsn
ifTrue: [
"answer false if downgrade allowed"
(MetacelloAllowProjectDowngrade new
existingProjectRegistration: existing;
newProjectRegistration: new;
signal) == existing ]
ifFalse: [
"answer false if upgrade allowed"
(MetacelloAllowProjectUpgrade new
existingProjectRegistration: existing;
newProjectRegistration: new;
signal) == existing ]
!
performLoad
| displayString spec |
spec := self projectSpec.
displayString := 'Project: ' , spec name.
spec versionString ~~ nil
ifTrue: [ displayString := displayString , ' ' , spec versionString ].
Transcript
cr;
show: displayString.
self hasOverride
ifTrue: [
| override |
override := self overrideProjectSpec copy.
override mergeScriptLoads: spec.
override loadVersion: nil ]
ifFalse: [
spec
loadVersion:
(self useDetermineVersionForLoad
ifTrue: [ spec determineCurrentVersionForLoad ]
ifFalse: [ spec versionOrNil ]) ]
! !
!MetacelloProjectSpecForLoad methodsFor:'testing'!
hasOverride
^ self overrideProjectSpec ~~ nil
! !
!MetacelloProjectSpecForLoad class methodsFor:'documentation'!
version_SVN
^ '$Id:: $'
! !