MetacelloProjectSpecForLoad.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 03 Sep 2012 13:10:51 +0000
changeset 3 504152ada1fc
parent 1 9e312de5f694
permissions -rw-r--r--
fixed stc-compilability

"{ 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::                                                                                                                        $'
! !