MetacelloGenericProjectSpec.st
changeset 1 9e312de5f694
--- /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::                                                                                                                        $'
+! !