base/Metacello.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 18 Sep 2012 13:10:10 +0000
changeset 14 f01fe37493e9
parent 11 d354ac2af7ec
permissions -rw-r--r--
- MetacelloProjectSpecForLoad added: #version_SVN - MetacelloRemoveMemberSpec added: #version_SVN - MetacelloValueHolderSpec added: #version_SVN - MetacelloProjectSpecGenerator added: #version_SVN - MetacelloPackagesSpec added: #version_SVN - MetacelloSemanticVersionNumber added: #version_SVN - MetacelloProjectSpecLoadError added: #version_SVN - MetacelloAddMemberSpec added: #version_SVN - MetacelloCannotUpdateReleasedVersionError added: #version_SVN - MetacelloMergeMemberSpec added: #version_SVN - MetacelloValidationFailure added: #version_SVN - MetacelloAllowProjectDowngrade added: #version_SVN - MetacelloVersion added: #version_SVN - MetacelloScriptApiExecutor added: #version_SVN - MetacelloScriptProjectSpecNotification added: #version_SVN - MetacelloAllowConflictingProjectUpgrade added: #version_SVN - MetacelloBaseConfiguration added: #version_SVN - MetacelloConflictingProjectError added: #version_SVN - MetacelloProjectRegistration added: #version_SVN - MetacelloValidationIssue added: #version_SVN - MetacelloSymbolicVersionDoesNotExistError added: #version_SVN - MetacelloClearStackCacheNotification added: #version_SVN - MetacelloVersionMethodSpec added: #version_SVN - MetacelloLookupProjectSpecForLoad added: #version_SVN - MetacelloSymbolicVersionNotDefinedError added: #version_SVN - MetacelloPackageSpecResolutionError added: #version_SVN - stx_goodies_metacello_core changed: #classNamesAndAttributes #extensionMethodNames #preRequisites - MetacelloValidationCriticalWarning added: #version_SVN - MetacelloStackCacheNotification added: #version_SVN - MetacelloVersionMethodSection added: #version_SVN - MetacelloProject added: #version_SVN - MetacelloErrorInProjectConstructionNotification added: #version_SVN - MetacelloGroupSpec added: #version_SVN - MetacelloAbstractConstructor added: #version_SVN - MetacelloConfigurationSpecGenerator added: #version_SVN - MetacelloVersionValidator added: #version_SVN - MetacelloSymbolicVersionMethodSpec added: #version_SVN - MetacelloScriptImageExecutor added: #version_SVN - MetacelloLockedProjectError added: #version_SVN - MetacelloProjectReferenceSpec added: #version_SVN - MetacelloLookupBaselineSpecForEnsureLoad added: #version_SVN - MetacelloToolBoxConstructor added: #version_SVN - MetacelloValidationError added: #version_SVN - MetacelloValidationWarning added: #version_SVN - MetacelloScriptGitHubDownloadNotification added: #version_SVN - MetacelloProjectSpecLoadedNotification added: #version_SVN - MetacelloScriptNotification added: #version_SVN - MetacelloScriptingError added: #version_SVN - MetacelloCopyMemberSpec added: #version_SVN - MetacelloScriptRegistryExecutor added: #version_SVN - MetacelloCleanNotification added: #version_SVN - MetacelloSpecLoader added: #version_SVN - MetacelloAllowProjectUpgrade added: #version_SVN - MetacelloValidationNotification added: #version_SVN - MetacelloScriptEnsureProjectLoadedForDevelopment added: #version_SVN - MetacelloScriptExecutor added: #version_SVN - MetacelloSpec added: #version_SVN - MetacelloCleanLoadAndTestsNotification added: #version_SVN - MetacelloMemberSpec added: #version_SVN - MetacelloProjectSpecLoadConflict added: #version_SVN - MetacelloResolveProjectUpgrade added: #version_SVN - MetacelloGenericProjectSpec added: #version_SVN - MetacelloMethodSpec added: #version_SVN - MetacelloVersionConstructor added: #version_SVN - MetacelloVersionDefinitionError added: #version_SVN - MetacelloBaselineConstructor added: #version_SVN - MetacelloScriptEngine added: #version_SVN - MetacelloUseUpgradeError added: #version_SVN - MetacelloSymbolicVersionSpec added: #version_SVN - MetacelloProjectSpec added: #version_SVN - MetacelloVersionDoesNotExistError added: #version_SVN - MetacelloMethodSectionPath added: #version_SVN - MetacelloCleanLoadNotification added: #version_SVN - MetacelloSkipDirtyPackageLoad added: #version_SVN - MetacelloPlatform added: #version_SVN changed: #createRepository: - MetacelloLookupProjectSpec added: #version_SVN - MetacelloMethodSection added: #version_SVN - MetacelloProjectRegistry added: #version_SVN - MetacelloMemberListSpec added: #version_SVN - MetacelloVersionSpec added: #version_SVN - MetacelloAbstractVersionConstructor added: #version_SVN - MetacelloVersionNumber added: #version_SVN - MetacelloAbstractPackageSpec added: #version_SVN - MetacelloBaselineSpecGenerator added: #version_SVN - extensions ...

"{ Package: 'stx:goodies/metacello/base' }"

Object subclass:#Metacello
	instanceVariableNames:'executorSpec statements'
	classVariableNames:''
	poolDictionaries:''
	category:'Metacello-Base'
!


!Metacello class methodsFor:'instance creation'!

classic
    "set the options such that the load performed will be identical to the classic ConfigurationOf load:
	(ConfigurationOfExample project version: '1.0') load
	
	#classic forces Metacello to look at image state to determine which version of a project is loaded instead of using
		the registry to tell us explicitly which version of a project is loaded .. image state is not PRECISE"

    "useCurrentVersion is a 'private' option for enforcing classic rules, so it's not part of scripting api"

    ^ self new
        onUpgrade: [ :ex | ex allow ];
        onConflict: [ :ex | ex allow ];
        addStatement: #'useCurrentVersion:' args: {true};
        yourself
!

image
    ^ self new
        executorSpec: #'MetacelloScriptImageExecutor' -> 'batch';
        yourself
!

registry
    ^ self new
        executorSpec: #'MetacelloScriptRegistryExecutor' -> 'batch';
        yourself
! !

!Metacello class methodsFor:'private'!

scriptExecutorClass
    ^ self scriptExecutorClass: {(#'MetacelloScriptApiExecutor' -> 'batch')}
!

scriptExecutorClass: anExecutorSpec
    Smalltalk at: anExecutorSpec key ifAbsent: [ ConfigurationOf ensureMetacello: anExecutorSpec value ].
    ^ Smalltalk at: anExecutorSpec key
! !

!Metacello methodsFor:'accessing'!

executorSpec
    executorSpec ifNil: [ executorSpec := #'MetacelloScriptApiExecutor' -> 'batch' ].
    ^ executorSpec
!

executorSpec: anAssoc
    executorSpec := anAssoc
!

scriptExecutor
    ^ (self class scriptExecutorClass: self executorSpec) new
!

statements
    statements ifNil: [ statements := OrderedCollection new ].
    ^ statements
!

statements: anObject
	statements := anObject
! !

!Metacello methodsFor:'api actions'!

fetch
    self addStatement: #'fetch:' args: #(#()).
    ^ self execute
!

fetch: required
    self addStatement: #'fetch:' args: {required}.
    ^ self execute
!

get
    "resolve project name in given repository and return an instance of MetacelloProject resolved from a ConfigurationOf or BaselineOf"

    self addStatement: #'get' args: #().
    ^ self execute
!

list
    "list projects in registry"

    self addStatement: #'list' args: #().
    ^ self execute
!

load
    self addStatement: #'load:' args: #(#()).
    ^ self execute
!

load: required
    self addStatement: #'load:' args: {required}.
    ^ self execute
!

lock
    "lock projects in registry"

    self addStatement: #'lock' args: #().
    ^ self execute
!

record
    self addStatement: #'record:' args: #(#()).
    ^ self execute
!

record: required
    self addStatement: #'record:' args: {required}.
    ^ self execute
!

unlock
    "unlock projects in registry"

    self addStatement: #'unlock' args: #().
    ^ self execute
! !

!Metacello methodsFor:'api options'!

cacheRepository: aRepositoryDescription
    self addStatement: #'cacheRepository:' args: {aRepositoryDescription}
!

ignoreImage
    "ignore image state"

    self addStatement: #'ignoreImage:' args: {true}
!

onConflict: aBlock
    self addStatement: #'onConflict:' args: {aBlock}
!

onDowngrade: aBlock
    self addStatement: #'onDowngrade:' args: {aBlock}
!

onUpgrade: aBlock
    self addStatement: #'onUpgrade:' args: {aBlock}
!

repositoryOverrides: aRepositoryDescriptionCollection
    self addStatement: #'repositoryOverrides:' args: {aRepositoryDescriptionCollection}
!

silently
    "no progress bars"

    self addStatement: #'silently:' args: {true}
! !

!Metacello methodsFor:'api projectSpec'!

baseline: projectName
    self addStatement: #'baselineArg:' args: {projectName}
!

className: className
    self addStatement: #'classNameArg:' args: {className}
!

configuration: projectName
    self addStatement: #'configurationArg:' args: {projectName}
!

project: projectName
    self addStatement: #'projectArg:' args: {projectName}
!

repository: repositoryDescription
    self addStatement: #'repositoryArg:' args: {repositoryDescription}
!

version: versionString
    self addStatement: #'versionArg:' args: {versionString}
! !

!Metacello methodsFor:'api repository shortcuts'!

blueplane: projectName
    self repository: 'http://squeaksource.blueplane.jp/' , projectName
!

croquet: projectName
    self repository: 'http://hedgehog.software.umn.edu:8888/' , projectName
!

gemsource: projectName
    self repository: 'http://seaside.gemstone.com/ss/' , projectName
!

impara: projectName
    self repository: 'http://source.impara.de/' , projectName
!

renggli: projectName
    self repository: 'http://source.lukas-renggli.ch/' , projectName
!

saltypickle: projectName
    self repository: 'http://squeak.saltypickle.com/' , projectName
!

squeakfoundation: projectName
    self repository: 'http://source.squeakfoundation.org/' , projectName
!

squeaksource3: projectName
    self repository: 'http://ss3.gemstone.com/ss/' , projectName
!

squeaksource: projectName
    self repository: 'http://www.squeaksource.com/' , projectName
!

ss3: projectName
    self squeaksource3: projectName
!

wiresong: projectName
    self repository: 'http://source.wiresong.ca/' , projectName
! !

!Metacello methodsFor:'private'!

addStatement: selector args: args
    self statements add: selector -> args
!

execute
    | script |
    script := self statements.
    self statements: nil.
    ^ self scriptExecutor execute: script
! !

!Metacello class methodsFor:'documentation'!

version_SVN
    ^ '$Id::                                                                                                                        $'
! !