--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/MetacelloGenericProjectSpec.st Mon Sep 03 11:13:41 2012 +0000
@@ -0,0 +1,171 @@
+"{ Package: 'stx:goodies/metacello' }"
+
+MetacelloProjectSpec subclass:#MetacelloGenericProjectSpec
+ instanceVariableNames:'projectPackage repositories'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloGenericProjectSpec methodsFor:'accessing'!
+
+getRepositories
+ "raw access to iv"
+
+ ^ repositories
+!
+
+name: aString
+ super name: aString.
+ self projectPackage: nil
+!
+
+projectPackage
+ self subclassResponsibility
+!
+
+projectPackage: aProjectPackage
+ self shouldBeMutable.
+ projectPackage := aProjectPackage
+!
+
+repositories
+ repositories ifNil: [ repositories := self project repositoriesSpec ].
+ ^ repositories
+!
+
+repositories: anObject
+ self shouldBeMutable.
+ repositories := anObject.
+ self projectPackage: nil
+!
+
+repository: aStringOrMetacelloRepositorySpec
+ self repositories repository: aStringOrMetacelloRepositorySpec.
+ self projectPackage: nil
+!
+
+repository: aString username: username password: password
+ self repositories repository: aString username: username password: password.
+ self projectPackage: nil
+! !
+
+!MetacelloGenericProjectSpec methodsFor:'construction'!
+
+projectPackage: aBlock constructor: aVersionConstructor
+ aVersionConstructor projectPackageForProject: aBlock
+!
+
+repositories: aBlock constructor: aVersionConstructor
+ aVersionConstructor repositoriesForProject: aBlock
+!
+
+repository: anObject constructor: aVersionConstructor
+ aVersionConstructor repositoryForProject: anObject
+!
+
+repository: aString username: username password: password constructor: aVersionConstructor
+ aVersionConstructor repositoryForProject: aString username: username password: password
+! !
+
+!MetacelloGenericProjectSpec methodsFor:'copying'!
+
+postCopy
+ super postCopy.
+ repositories := repositories copy.
+ projectPackage := nil
+! !
+
+!MetacelloGenericProjectSpec methodsFor:'loading'!
+
+determineCurrentVersionForLoad
+ self subclassResponsibility
+!
+
+load
+ (MetacelloLookupProjectSpecForLoad new
+ projectSpec: self;
+ yourself) signal performLoad
+!
+
+loadVersion: aVersionOrNil
+ self subclassResponsibility
+! !
+
+!MetacelloGenericProjectSpec methodsFor:'merging'!
+
+mergeMap
+ | map |
+ map := super mergeMap.
+ map at: #'repositories' put: repositories.
+ ^ map
+!
+
+mergeSpec: anotherSpec
+ | newSpec map anotherRepositories |
+ newSpec := super mergeSpec: anotherSpec.
+ map := anotherSpec mergeMap.
+ (anotherRepositories := map at: #'repositories') ~~ nil
+ ifTrue: [
+ newSpec
+ repositories:
+ (self getRepositories == nil
+ ifTrue: [ anotherRepositories ]
+ ifFalse: [ self repositories mergeSpec: anotherRepositories ]) ].
+ ^ newSpec
+!
+
+nonOverridable
+ ^ super nonOverridable , #(#'projectPackage' #'repositories')
+! !
+
+!MetacelloGenericProjectSpec methodsFor:'querying'!
+
+repository
+ | specs |
+ self deprecated: 'Use repositories or repositorySpecs'.
+ (specs := self repositorySpecs) isEmpty
+ ifTrue: [ ^ nil ].
+ ^ specs first
+!
+
+repositoryDescriptions
+ ^ self repositorySpecs collect: [ :repoSpec | repoSpec description ]
+!
+
+repositorySpecs
+ repositories ifNil: [ ^ #() ].
+ ^ self repositories map values
+! !
+
+!MetacelloGenericProjectSpec methodsFor:'scripting'!
+
+compareEqual: aMetacelloProjectSpec
+ "'projectPackage repositories'"
+
+ ^ (super compareEqual: aMetacelloProjectSpec)
+ and: [ self repositories compareEqual: aMetacelloProjectSpec repositories ]
+!
+
+mergeScriptRepository: anotherSpec
+ self repositories: anotherSpec repositories
+!
+
+metacelloRegistrationHash
+ "projectPackage (ignored) repositories"
+
+ ^ super metacelloRegistrationHash bitXor: self repositories metacelloRegistrationHash
+! !
+
+!MetacelloGenericProjectSpec methodsFor:'testing'!
+
+hasRepository
+ ^ self repositorySpecs notEmpty
+! !
+
+!MetacelloGenericProjectSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !