--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/Make.proto Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,152 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# The Makefile as generated by this Make.proto supports the following targets:
+# make - compile all st-files to a classLib
+# make clean - clean all temp files
+# make clobber - clean all
+#
+# This file contains definitions for Unix based platforms.
+# It shares common definitions with the win32-make in Make.spec.
+
+#
+# position (of this package) in directory hierarchy:
+# (must point to ST/X top directory, for tools and includes)
+TOP=../..
+INCLUDE_TOP=$(TOP)/..
+
+# subdirectories where targets are to be made:
+SUBDIRS=
+
+
+# subdirectories where Makefiles are to be made:
+# (only define if different from SUBDIRS)
+# ALLSUBDIRS=
+
+REQUIRED_SUPPORT_DIRS=
+
+# if your embedded C code requires any system includes,
+# add the path(es) here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALINCLUDES=-Ifoo -Ibar
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/libbasic
+
+
+# if you need any additional defines for embedded C code,
+# add them here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALDEFINES=-Dfoo -Dbar -DDEBUG
+LOCALDEFINES=
+
+LIBNAME=libstx_goodies_metacello
+STCLOCALOPT='-package=$(PACKAGE)' -I. $(LOCALINCLUDES) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -headerDir=. -varPrefix=$(LIBNAME)
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C-libraries that should be pre-linked with the class-objects
+LD_OBJ_LIBS=
+LOCAL_SHARED_LIBS=
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C targets or libraries should be added below
+LOCAL_EXTRA_TARGETS=
+
+OBJS= $(COMMON_OBJS) $(UNIX_OBJS)
+
+
+
+all:: preMake classLibRule postMake
+
+pre_objs::
+
+
+
+
+# Update SVN revision in package definition class
+ifneq (,$(findstring .svn,$(wildcard .svn)))
+.svnversion: *.st
+ if [ -d .svn ]; then \
+ rev=$(shell svnversion -n); \
+ echo -n $$rev > .svnversion; \
+ else \
+ echo -n exported > .svnversion; \
+ fi
+
+stx_goodies_metacello.o: stx_goodies_metacello.st .svnversion
+ @if [ -d .svn ]; then \
+ rev2="$(shell printf "%-16s" $$(cat .svnversion))"; \
+ echo " [SV] Expanding svnRevisionNo in $1.st"; \
+ sed -e "s/\"\$$SVN\-Revision:\".*\"\$$\"/\"\$$SVN-Revision:\"\'$$rev2\'\"\$$\"/g" $< > .stx_goodies_metacello.svn.st; \
+ fi
+ $(MAKE) CC="$(CLASSLIB_CC)" OPT="$(OPT)" SEPINITCODE="$(SEPINITCODE)" STC="$(STC)" STFILE=.stx_goodies_metacello.svn $(C_RULE);
+ sed -i -e "s/\".stx_goodies_metacello.svn.st\");/\"\stx_goodies_metacello.st\");/g" .stx_goodies_metacello.svn.c
+ $(MAKE) .stx_goodies_metacello.svn.$(O)
+ @mv .stx_goodies_metacello.svn.$(O) stx_goodies_metacello.$(O)
+endif
+
+
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+ifneq (**NOHG**, $(shell hg root 2> /dev/null || echo -n '**NOHG**'))
+stx_goodies_metacello.$(O): $(shell hg root)/.hg/dirstate
+endif
+
+
+
+
+# run default testsuite for this package
+test: $(TOP)/goodies/builder/reports
+ $(MAKE) -C $(TOP)/goodies/builder/reports -f Makefile.init
+ $(TOP)/goodies/builder/reports/report-runner.sh -D . -r Builder::TestReport -p $(PACKAGE)
+
+
+
+# add more install actions here
+install::
+
+# add more install actions for aux-files (resources) here
+installAux::
+
+# add more preMake actions here
+preMake::
+
+# add more postMake actions here
+postMake:: cleanjunk
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+ cd ../../libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+ cd base && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+ cd core && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+ cd stx && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+
+
+
+# build all packages containing referenced classes for this package
+# they are nor needed to compile the package
+references:
+
+
+cleanjunk::
+ -rm -f *.s *.s2
+
+clean::
+ -rm -f *.o *.H
+
+clobber:: clean
+ -rm -f *.so *.dll
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)stx_goodies_metacello.$(O) stx_goodies_metacello.$(H): stx_goodies_metacello.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/Make.spec Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,62 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# This file contains specifications which are common to all platforms.
+#
+
+# Do NOT CHANGE THESE DEFINITIONS
+# (otherwise, ST/X will have a hard time to find out the packages location from its packageID,
+# to find the source code of a class and to find the library for a package)
+MODULE=stx
+MODULE_DIR=goodies/metacello
+PACKAGE=$(MODULE):$(MODULE_DIR)
+
+
+# Argument(s) to the stc compiler (stc --usage).
+# -headerDir=. : create header files locally
+# (if removed, they will be created as common
+# -Pxxx : defines the package
+# -Zxxx : a prefix for variables within the classLib
+# -Dxxx : defines passed to to CC for inline C-code
+# -Ixxx : include path passed to CC for inline C-code
+# +optspace : optimized for space
+# +optspace2 : optimized more for space
+# +optspace3 : optimized even more for space
+# +optinline : generate inline code for some ST constructs
+# +inlineNew : additionally inline new
+# +inlineMath : additionally inline some floatPnt math stuff
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCLOCALOPTIMIZATIONS=+optinline +inlineNew
+# STCLOCALOPTIMIZATIONS=+optspace3
+STCLOCALOPTIMIZATIONS=+optspace3
+
+
+# Argument(s) to the stc compiler (stc --usage).
+# -warn : no warnings
+# -warnNonStandard : no warnings about ST/X extensions
+# -warnEOLComments : no warnings about EOL comment extension
+# -warnPrivacy : no warnings about privateClass extension
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCWARNINGS=-warn
+# STCWARNINGS=-warnNonStandard
+# STCWARNINGS=-warnEOLComments
+STCWARNINGS=-warnNonStandard
+
+COMMON_CLASSES= \
+ stx_goodies_metacello \
+
+
+
+
+COMMON_OBJS= \
+ $(OUTDIR_SLASH)stx_goodies_metacello.$(O) \
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/Makefile.init Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,27 @@
+#
+# DO NOT EDIT
+#
+# make uses this file (Makefile) only, if there is no
+# file named "makefile" (lower-case m) in the same directory.
+# My only task is to generate the real makefile and call make again.
+# Thereafter, I am no longer used and needed.
+#
+# MACOSX caveat:
+# as filenames are not case sensitive (in a default setup),
+# we cannot use the above trick. Therefore, this file is now named
+# "Makefile.init", and you have to execute "make -f Makefile.init" to
+# get the initial makefile. This is now also done by the toplevel CONFIG
+# script.
+
+.PHONY: run
+
+run: makefile
+ $(MAKE) -f makefile
+
+#only needed for the definition of $(TOP)
+include Make.proto
+
+makefile: mf
+
+mf:
+ $(TOP)/rules/stmkmf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/abbrev.stc Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,4 @@
+# automagically generated by the project definition
+# this file is needed for stc to be able to compile modules independently.
+# it provides information about a classes filename, category and especially namespace.
+stx_goodies_metacello stx_goodies_metacello stx:goodies/metacello '* Projects & Packages *' 3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/BaselineOf.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,31 @@
+"{ Package: 'stx:goodies/metacello/base' }"
+
+ConfigurationOf subclass:#BaselineOf
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Base'
+!
+
+
+!BaselineOf methodsFor:'accessing'!
+
+projectClass
+ ^ MetacelloMCBaselineProject
+!
+
+versionNumberClass
+ ^ MetacelloVersionNumber
+! !
+
+!BaselineOf class methodsFor:'documentation'!
+
+version_HG
+
+ ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/ConfigurationOf.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,254 @@
+"{ Package: 'stx:goodies/metacello/base' }"
+
+Object subclass:#ConfigurationOf
+ instanceVariableNames:'project'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Base'
+!
+
+
+!ConfigurationOf class methodsFor:'accessing'!
+
+project
+
+ ^self new project
+!
+
+validate
+ "Check the configuration for Errors, Critical Warnings, and Warnings (see class comment for MetacelloMCVersionValidator for more information).
+ Errors identify specification issues that will result in unexpected behaviour when you load the configuration.
+ Critical Warnings identify specification issues that may result in unexpected behavior when you load the configuration.
+ Warnings identify specification issues that are technically correct, but are worth take a look at."
+
+ "self validate"
+
+ <apiDocumentation>
+ self ensureMetacello.
+ ^ ((Smalltalk at: #MetacelloToolBox) validateConfiguration: self debug: #() recurse: false) explore
+! !
+
+!ConfigurationOf class methodsFor:'private'!
+
+bootstrapMetacelloFrom: repositoryUrl
+ "Corresponds to version 1.0-beta.32.2"
+
+ "KEEP MetacelloConfigTemplate class>>ensureMetacelloBaseConfiguration in synch!!"
+
+ | platformPkg |
+ self ensureGoferVersion: 'Gofer-Core-lr.115' repositoryUrl: repositoryUrl.
+ #('Metacello-Base-dkh.96' 'Metacello-Core-dkh.664' 'Metacello-MC-dkh.656')
+ do: [ :pkg | self bootstrapPackage: pkg from: repositoryUrl ].
+ platformPkg := Smalltalk
+ at: #'SystemVersion'
+ ifPresent: [ :cl |
+ | versionString |
+ versionString := cl current version.
+ (versionString beginsWith: 'Squeak')
+ ifTrue: [
+ (versionString beginsWith: 'Squeak3')
+ ifTrue: [ 'Metacello-Platform.squeak-dkh.5' ]
+ ifFalse: [ 'Metacello-Platform.squeak-dkh.13' ] ]
+ ifFalse: [
+ (versionString beginsWith: 'Pharo')
+ ifTrue: [ 'Metacello-Platform.pharo-dkh.27' ] ] ].
+ self bootstrapPackage: platformPkg from: repositoryUrl
+!
+
+bootstrapPackage: aString from: aPath
+ | repository version |
+ repository := (MCCacheRepository default includesVersionNamed: aString)
+ ifTrue: [MCCacheRepository default]
+ ifFalse: [MCHttpRepository
+ location: aPath
+ user: ''
+ password: ''].
+ repository
+ versionReaderForFileNamed: aString , '.mcz'
+ do: [:reader |
+ version := reader version.
+ version load.
+ version workingCopy repositoryGroup addRepository: repository]
+!
+
+ensureGoferVersion: goferVersion repositoryUrl: repositoryUrl
+ "load the p=file goferVersion if Gofer isn't loaded or an earlier version of Gofer is currently loaded"
+
+ | goferVersionNumber wc pName |
+ (Smalltalk at: #'Gofer' ifAbsent: [ ]) == nil
+ ifTrue: [ ^ self bootstrapPackage: goferVersion from: repositoryUrl ].
+ goferVersionNumber := (goferVersion copyAfterLast: $.) asNumber.
+ wc := [ ((Smalltalk at: #'GoferPackageReference') name: 'Gofer') workingCopy ]
+ on: Error
+ do: [ :ex | ex return: ((Smalltalk at: #'GoferPackageReference') name: 'Gofer-Core') workingCopy ].
+ pName := wc ancestry ancestors first name.
+ (pName copyAfterLast: $.) asNumber <= goferVersionNumber
+ ifTrue: [ self bootstrapPackage: goferVersion from: repositoryUrl ]
+!
+
+ensureMetacello
+ "Bootstrap Metacello and load the 'botstrap' group"
+
+ self ensureMetacello: #('batch')
+!
+
+ensureMetacello: loadList
+ "Bootstrap Metacello, retry using alternate repository, if primary repository is not accessible"
+
+ Smalltalk
+ at: #'MetacelloProject'
+ ifAbsent: [
+ | retry version error gofer |
+ retry := false.
+ (Array with: 'http://seaside.gemstone.com/ss/metacello' with: 'http://www.squeaksource.com/metacello')
+ do: [ :repositoryUrl |
+ [
+ "bootstrap Metacello"
+ self bootstrapMetacelloFrom: repositoryUrl.
+ Smalltalk
+ at: #'ConfigurationOfMetacello'
+ ifAbsent: [
+ gofer := (Smalltalk at: #'Gofer') new.
+ gofer
+ perform: #'url:' with: repositoryUrl;
+ perform: #'package:' with: 'ConfigurationOfMetacello';
+ perform: #'load' ].
+ version := (Smalltalk at: #'ConfigurationOfMetacello') project version: '1.0-beta.32'. "bootstrap with 1.0-beta.32"
+ retry
+ ifTrue: [
+ "on retry, use #repositoryOverrides:"
+ version
+ repositoryOverrides:
+ (Array with: (MCHttpRepository location: repositoryUrl user: '' password: '')) ].
+ version load: loadList.
+ gofer := (Smalltalk at: #'Gofer') new.
+ Smalltalk
+ at: #'ConfigurationOfMetacelloPreview'
+ ifAbsent: [
+ gofer
+ perform: #'url:' with: repositoryUrl;
+ perform: #'package:' with: 'ConfigurationOfMetacelloPreview';
+ perform: #'load' ].
+ version := (Smalltalk at: #'ConfigurationOfMetacelloPreview') project version: '1.0.0-beta.32.2'. "load latest from GitHub"
+ version load: loadList.
+ ^ self ]
+ on: Error
+ do: [ :ex |
+ error := ex.
+ Transcript
+ cr;
+ show: 'failed ensureMetacello: ';
+ show: ex description printString;
+ show: '...retrying'. "try again"
+ retry := true.
+ ex return: nil ] ]. "shouldn't get here unless the load failed ... throw an error"
+ self error: 'retry with alternate repository failed: ' , error description printString ]
+! !
+
+!ConfigurationOf class methodsFor:'unloading Metacello'!
+
+unloadMetacello
+ "Unload the classes that implement Metacello. Metacello is not needed once a project has been loaded, so it can safely be unloaded."
+
+ "self unloadMetacello"
+
+ <apiDocumentation>
+ | gofer |
+ gofer := (Smalltalk at: #Gofer) new.
+ MCWorkingCopy allManagers do: [:wc |
+ ((wc packageName beginsWith: 'Metacello') or: [ wc packageName beginsWith: 'OB-Metacello' ])
+ ifTrue: [ gofer package: wc packageName ]].
+ gofer unload.
+! !
+
+!ConfigurationOf methodsFor:'accessing'!
+
+customProjectAttributes
+ "Edit to return a collection of any custom attributes e.g. for conditional loading: Array with: #'Condition1' with: #'Condition2.
+ For more information see: http://code.google.com/p/metacello/wiki/CustomProjectAttrributes "
+
+ ^ #()
+!
+
+project
+ ^ project
+ ifNil: [
+ "Bootstrap Metacello if it is not already loaded"
+ self class ensureMetacello.
+ project := self projectClass new projectAttributes: self customProjectAttributes. "Create the Metacello project"
+ project versionNumberClass: self versionNumberClass.
+ project class versionConstructorClass on: self project: project. "Construct the project"
+ project loadType: #'linear'. "change to #atomic if desired"
+ project ]
+!
+
+project: aProject
+
+ project ifNil: [ self class ensureMetacello ].
+ project := aProject
+!
+
+projectClass
+
+ | cls |
+
+ "Hmm...hmm...what to return here. In master, MetacelloMCProject is
+ returned, which seem to be incorrect as it implies dependency on
+ Metacello-MC. On the other hand, MetacelloProject is just an abstract
+ class. Let's try following for now:"
+
+ cls := Smalltalk at:#MetacelloStXProject.
+ cls notNil ifTrue:[ ^ cls ].
+ cls := Smalltalk at:#MetacelloMCProject.
+ cls notNil ifTrue:[ ^ cls ].
+ "/ last resort...
+ ^ MetacelloStXProject
+
+ "Modified: / 10-09-2012 / 22:11:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+versionNumberClass
+
+ "Use Smalltalk>>at: to trick the dependency collector. However,
+ this looks like unwanted dependency anyway..."
+ ^Smalltalk at:#MetacelloSemanticVersionNumber ifAbsent:[
+ self error:'MetacelloSemanticVersionNumber class not present'.
+ ].
+
+ "Modified: / 10-09-2012 / 22:07:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!ConfigurationOf methodsFor:'defaults'!
+
+bleedingEdge
+ "override if different behavior desired.
+ Use:
+ self versionDoesNotExistError: #bleedingEdge
+ if #bleedingEdge version is disallowed."
+
+ <defaultSymbolicVersion: #bleedingEdge>
+
+ ^self defaultBleedingEdgeVersion
+!
+
+defaultBleedingEdgeVersion
+ | bleedingEdgeVersion |
+ bleedingEdgeVersion := (self project map values select: [ :version | version blessing == #baseline ])
+ detectMax: [ :version | version ].
+ bleedingEdgeVersion ifNil: [ ^#'notDefined' ].
+ ^ bleedingEdgeVersion versionString
+! !
+
+!ConfigurationOf methodsFor:'private'!
+
+versionDoesNotExistError: versionStringOrSymbol
+
+ ((Smalltalk at: #MetacelloSymbolicVersionDoesNotExistError) project: self project versionString: versionStringOrSymbol) signal
+! !
+
+!ConfigurationOf class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/Make.proto Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,152 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_base.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# The Makefile as generated by this Make.proto supports the following targets:
+# make - compile all st-files to a classLib
+# make clean - clean all temp files
+# make clobber - clean all
+#
+# This file contains definitions for Unix based platforms.
+# It shares common definitions with the win32-make in Make.spec.
+
+#
+# position (of this package) in directory hierarchy:
+# (must point to ST/X top directory, for tools and includes)
+TOP=../../..
+INCLUDE_TOP=$(TOP)/..
+
+# subdirectories where targets are to be made:
+SUBDIRS=
+
+
+# subdirectories where Makefiles are to be made:
+# (only define if different from SUBDIRS)
+# ALLSUBDIRS=
+
+REQUIRED_SUPPORT_DIRS=
+
+# if your embedded C code requires any system includes,
+# add the path(es) here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALINCLUDES=-Ifoo -Ibar
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/libbasic
+
+
+# if you need any additional defines for embedded C code,
+# add them here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALDEFINES=-Dfoo -Dbar -DDEBUG
+LOCALDEFINES=
+
+LIBNAME=libstx_goodies_metacello_base
+STCLOCALOPT='-package=$(PACKAGE)' -I. $(LOCALINCLUDES) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -headerDir=. -varPrefix=$(LIBNAME)
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C-libraries that should be pre-linked with the class-objects
+LD_OBJ_LIBS=
+LOCAL_SHARED_LIBS=
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C targets or libraries should be added below
+LOCAL_EXTRA_TARGETS=
+
+OBJS= $(COMMON_OBJS) $(UNIX_OBJS)
+
+
+
+all:: preMake classLibRule postMake
+
+pre_objs::
+
+
+
+
+# Update SVN revision in package definition class
+ifneq (,$(findstring .svn,$(wildcard .svn)))
+.svnversion: *.st
+ if [ -d .svn ]; then \
+ rev=$(shell svnversion -n); \
+ echo -n $$rev > .svnversion; \
+ else \
+ echo -n exported > .svnversion; \
+ fi
+
+stx_goodies_metacello_base.o: stx_goodies_metacello_base.st .svnversion
+ @if [ -d .svn ]; then \
+ rev2="$(shell printf "%-16s" $$(cat .svnversion))"; \
+ echo " [SV] Expanding svnRevisionNo in $1.st"; \
+ sed -e "s/\"\$$SVN\-Revision:\".*\"\$$\"/\"\$$SVN-Revision:\"\'$$rev2\'\"\$$\"/g" $< > .stx_goodies_metacello_base.svn.st; \
+ fi
+ $(MAKE) CC="$(CLASSLIB_CC)" OPT="$(OPT)" SEPINITCODE="$(SEPINITCODE)" STC="$(STC)" STFILE=.stx_goodies_metacello_base.svn $(C_RULE);
+ sed -i -e "s/\".stx_goodies_metacello_base.svn.st\");/\"\stx_goodies_metacello_base.st\");/g" .stx_goodies_metacello_base.svn.c
+ $(MAKE) .stx_goodies_metacello_base.svn.$(O)
+ @mv .stx_goodies_metacello_base.svn.$(O) stx_goodies_metacello_base.$(O)
+endif
+
+
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+ifneq (**NOHG**, $(shell hg root 2> /dev/null || echo -n '**NOHG**'))
+stx_goodies_metacello_base.$(O): $(shell hg root)/.hg/dirstate
+endif
+
+
+
+
+# run default testsuite for this package
+test: $(TOP)/goodies/builder/reports
+ $(MAKE) -C $(TOP)/goodies/builder/reports -f Makefile.init
+ $(TOP)/goodies/builder/reports/report-runner.sh -D . -r Builder::TestReport -p $(PACKAGE)
+
+
+
+# add more install actions here
+install::
+
+# add more install actions for aux-files (resources) here
+installAux::
+
+# add more preMake actions here
+preMake::
+
+# add more postMake actions here
+postMake:: cleanjunk
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+ cd ../../../libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+
+
+
+# build all packages containing referenced classes for this package
+# they are nor needed to compile the package
+references:
+
+
+cleanjunk::
+ -rm -f *.s *.s2
+
+clean::
+ -rm -f *.o *.H
+
+clobber:: clean
+ -rm -f *.so *.dll
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)ConfigurationOf.$(O) ConfigurationOf.$(H): ConfigurationOf.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)Metacello.$(O) Metacello.$(H): Metacello.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)stx_goodies_metacello_base.$(O) stx_goodies_metacello_base.$(H): stx_goodies_metacello_base.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)BaselineOf.$(O) BaselineOf.$(H): BaselineOf.st $(INCLUDE_TOP)/stx/goodies/metacello/base/ConfigurationOf.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/Make.spec Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,68 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_base.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# This file contains specifications which are common to all platforms.
+#
+
+# Do NOT CHANGE THESE DEFINITIONS
+# (otherwise, ST/X will have a hard time to find out the packages location from its packageID,
+# to find the source code of a class and to find the library for a package)
+MODULE=stx
+MODULE_DIR=goodies/metacello/base
+PACKAGE=$(MODULE):$(MODULE_DIR)
+
+
+# Argument(s) to the stc compiler (stc --usage).
+# -headerDir=. : create header files locally
+# (if removed, they will be created as common
+# -Pxxx : defines the package
+# -Zxxx : a prefix for variables within the classLib
+# -Dxxx : defines passed to to CC for inline C-code
+# -Ixxx : include path passed to CC for inline C-code
+# +optspace : optimized for space
+# +optspace2 : optimized more for space
+# +optspace3 : optimized even more for space
+# +optinline : generate inline code for some ST constructs
+# +inlineNew : additionally inline new
+# +inlineMath : additionally inline some floatPnt math stuff
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCLOCALOPTIMIZATIONS=+optinline +inlineNew
+# STCLOCALOPTIMIZATIONS=+optspace3
+STCLOCALOPTIMIZATIONS=+optspace3
+
+
+# Argument(s) to the stc compiler (stc --usage).
+# -warn : no warnings
+# -warnNonStandard : no warnings about ST/X extensions
+# -warnEOLComments : no warnings about EOL comment extension
+# -warnPrivacy : no warnings about privateClass extension
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCWARNINGS=-warn
+# STCWARNINGS=-warnNonStandard
+# STCWARNINGS=-warnEOLComments
+STCWARNINGS=-warnNonStandard
+
+COMMON_CLASSES= \
+ ConfigurationOf \
+ Metacello \
+ stx_goodies_metacello_base \
+ BaselineOf \
+
+
+
+
+COMMON_OBJS= \
+ $(OUTDIR_SLASH)ConfigurationOf.$(O) \
+ $(OUTDIR_SLASH)Metacello.$(O) \
+ $(OUTDIR_SLASH)stx_goodies_metacello_base.$(O) \
+ $(OUTDIR_SLASH)BaselineOf.$(O) \
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/Makefile.init Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,27 @@
+#
+# DO NOT EDIT
+#
+# make uses this file (Makefile) only, if there is no
+# file named "makefile" (lower-case m) in the same directory.
+# My only task is to generate the real makefile and call make again.
+# Thereafter, I am no longer used and needed.
+#
+# MACOSX caveat:
+# as filenames are not case sensitive (in a default setup),
+# we cannot use the above trick. Therefore, this file is now named
+# "Makefile.init", and you have to execute "make -f Makefile.init" to
+# get the initial makefile. This is now also done by the toplevel CONFIG
+# script.
+
+.PHONY: run
+
+run: makefile
+ $(MAKE) -f makefile
+
+#only needed for the definition of $(TOP)
+include Make.proto
+
+makefile: mf
+
+mf:
+ $(TOP)/rules/stmkmf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/Metacello.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,260 @@
+"{ 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:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/abbrev.stc Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,7 @@
+# automagically generated by the project definition
+# this file is needed for stc to be able to compile modules independently.
+# it provides information about a classes filename, category and especially namespace.
+ConfigurationOf ConfigurationOf stx:goodies/metacello/base 'Metacello-Base' 0
+Metacello Metacello stx:goodies/metacello/base 'Metacello-Base' 0
+stx_goodies_metacello_base stx_goodies_metacello_base stx:goodies/metacello/base '* Projects & Packages *' 3
+BaselineOf BaselineOf stx:goodies/metacello/base 'Metacello-Base' 0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/base.rc Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,37 @@
+//
+// DO NOT EDIT
+// automagically generated from the projectDefinition: stx_goodies_metacello_base.
+//
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 6,2,32767,32767
+ PRODUCTVERSION 6,2,4,0
+#if (__BORLANDC__)
+ FILEFLAGSMASK VS_FF_DEBUG | VS_FF_PRERELEASE
+ FILEFLAGS VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
+ FILEOS VOS_NT_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE VS_USER_DEFINED
+#endif
+
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+ VALUE "CompanyName", "Dale Henrichs & Jan Vrany\0"
+ VALUE "FileDescription", "Metacello -- a Smalltalk project configuration management tool (LIB)\0"
+ VALUE "FileVersion", "6.2.32767.32767\0"
+ VALUE "InternalName", "stx:goodies/metacello/base\0"
+ VALUE "LegalCopyright", "Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)\0"
+ VALUE "ProductName", "Metacello\0"
+ VALUE "ProductVersion", "6.2.4.0\0"
+ VALUE "ProductDate", "Thu, 21 Aug 2014 08:17:41 GMT\0"
+ END
+
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN // Language | Translation
+ VALUE "Translation", 0x409, 0x4E4 // U.S. English, Windows Multilingual
+ END
+END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/bc.mak Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,84 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_base.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# Notice, that the name bc.mak is historical (from times, when only borland c was supported).
+# This file contains make rules for the win32 platform using either borland-bcc or visual-c.
+# It shares common definitions with the unix-make in Make.spec.
+# The bc.mak supports the following targets:
+# bmake - compile all st-files to a classLib (dll)
+# bmake clean - clean all temp files
+# bmake clobber - clean all
+#
+# Historic Note:
+# this used to contain only rules to make with borland
+# (called via bmake, by "make.exe -f bc.mak")
+# this has changed; it is now also possible to build using microsoft visual c
+# (called via vcmake, by "make.exe -f bc.mak -DUSEVC")
+#
+TOP=..\..\..
+INCLUDE_TOP=$(TOP)\..
+
+
+
+!INCLUDE $(TOP)\rules\stdHeader_bc
+
+!INCLUDE Make.spec
+
+LIBNAME=libstx_goodies_metacello_base
+RESFILES=base.$(RES)
+
+
+
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\libbasic
+LOCALDEFINES=
+
+STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -varPrefix=$(LIBNAME)
+LOCALLIBS=
+
+OBJS= $(COMMON_OBJS) $(WIN32_OBJS)
+
+ALL:: classLibRule
+
+classLibRule: $(OUTDIR) $(OUTDIR)$(LIBNAME).dll
+
+!INCLUDE $(TOP)\rules\stdRules_bc
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+ pushd ..\..\..\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+
+
+
+
+
+
+
+test: $(TOP)\goodies\builder\reports\NUL
+ pushd $(TOP)\goodies\builder\reports & $(MAKE_BAT)
+ $(TOP)\goodies\builder\reports\report-runner.bat -D . -r Builder::TestReport -p $(PACKAGE)
+
+clean::
+ del *.$(CSUFFIX)
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)ConfigurationOf.$(O) ConfigurationOf.$(H): ConfigurationOf.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)Metacello.$(O) Metacello.$(H): Metacello.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)stx_goodies_metacello_base.$(O) stx_goodies_metacello_base.$(H): stx_goodies_metacello_base.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)BaselineOf.$(O) BaselineOf.$(H): BaselineOf.st $(INCLUDE_TOP)\stx\goodies\metacello\base\ConfigurationOf.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
+# **Must be at end**
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+!IFDEF HGROOT
+$(OUTDIR)stx_goodies_metacello_base.$(O): $(HGROOT)\.hg\dirstate
+!ENDIF
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/bmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,12 @@
+@REM -------
+@REM make using Borland bcc32
+@REM type bmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak %DEFINES% %*
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/lccmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,8 @@
+@REM -------
+@REM make using lcc compiler
+@REM type lccmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+make.exe -N -f bc.mak -DUSELCC=1 %*
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/libInit.cc Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,37 @@
+/*
+ * $Header$
+ *
+ * DO NOT EDIT
+ * automagically generated from the projectDefinition: stx_goodies_metacello_base.
+ */
+#define __INDIRECTVMINITCALLS__
+#include <stc.h>
+
+#ifdef WIN32
+# pragma codeseg INITCODE "INITCODE"
+#endif
+
+#if defined(INIT_TEXT_SECTION) || defined(DLL_EXPORT)
+DLL_EXPORT void _libstx_goodies_metacello_base_Init() INIT_TEXT_SECTION;
+DLL_EXPORT void _libstx_goodies_metacello_base_InitDefinition() INIT_TEXT_SECTION;
+#endif
+
+void _libstx_goodies_metacello_base_InitDefinition(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello_base__DFN", _libstx_goodies_metacello_base_InitDefinition, "stx:goodies/metacello/base");
+_stx_137goodies_137metacello_137base_Init(pass,__pRT__,snd);
+
+__END_PACKAGE__();
+}
+
+void _libstx_goodies_metacello_base_Init(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello_base", _libstx_goodies_metacello_base_Init, "stx:goodies/metacello/base");
+_ConfigurationOf_Init(pass,__pRT__,snd);
+_Metacello_Init(pass,__pRT__,snd);
+_stx_137goodies_137metacello_137base_Init(pass,__pRT__,snd);
+_BaselineOf_Init(pass,__pRT__,snd);
+
+
+__END_PACKAGE__();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/mingwmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+@REM -------
+@REM make using mingw gnu compiler
+@REM type mingwmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+
+@pushd ..\..\..\rules
+@call find_mingw.bat
+@popd
+make.exe -N -f bc.mak %DEFINES% %USEMINGW_ARG% %*
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/stx_goodies_metacello_base.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,142 @@
+"{ Package: 'stx:goodies/metacello/base' }"
+
+LibraryDefinition subclass:#stx_goodies_metacello_base
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'* Projects & Packages *'
+!
+
+
+!stx_goodies_metacello_base class methodsFor:'description'!
+
+excludedFromPreRequisites
+ "list all packages which should be ignored in the automatic
+ preRequisites scan. See #preRequisites for more."
+
+ ^ #(
+ "Argh...Metacello-Base is so dependent on Monticello, but in St/X we don't want to have
+ this dependency. We don't use Monticello at all. "
+ #'stx:goodies/monticello' "MCCacheRepository - referenced by ConfigurationOf class>>bootstrapPackage:from: "
+ )
+
+ "Modified: / 10-09-2012 / 22:24:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+preRequisites
+ "list all required packages.
+ This list can be maintained manually or (better) generated and
+ updated by scanning the superclass hierarchies and looking for
+ global variable accesses. (the browser has a menu function for that)
+ Howevery, often too much is found, and you may want to explicitely
+ exclude individual packages in the #excludedFromPrerequisites method."
+
+ ^ #(
+ #'stx:libbasic' "LibraryDefinition - superclass of stx_goodies_metacello_base "
+ )
+
+ "Modified: / 10-09-2012 / 22:23:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_metacello_base class methodsFor:'description - contents'!
+
+classNamesAndAttributes
+ "lists the classes which are to be included in the project.
+ Each entry in the list may be: a single class-name (symbol),
+ or an array-literal consisting of class name and attributes.
+ Attributes are: #autoload or #<os> where os is one of win32, unix,..."
+
+ ^ #(
+ "<className> or (<className> attributes...) in load order"
+ ConfigurationOf
+ Metacello
+ #'stx_goodies_metacello_base'
+ BaselineOf
+ )
+!
+
+extensionMethodNames
+ "lists the extension methods which are to be included in the project.
+ Entries are 2-element array literals, consisting of class-name and selector."
+
+ ^ #(
+ )
+! !
+
+!stx_goodies_metacello_base class methodsFor:'description - project information'!
+
+applicationIconFileName
+ "Return the name (without suffix) of an icon-file (the app's icon); will be included in the rc-resource file"
+
+ ^ nil
+ "/ ^ self applicationName
+!
+
+companyName
+ "Return a companyname which will appear in <lib>.rc"
+
+ ^ 'Dale Henrichs & Jan Vrany'
+
+ "Modified: / 10-09-2012 / 22:14:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+description
+ "Return a description string which will appear in vc.def / bc.def"
+
+ ^ 'Metacello -- a Smalltalk project configuration management tool'
+
+ "Modified: / 10-09-2012 / 22:15:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+legalCopyright
+ "Return a copyright string which will appear in <lib>.rc"
+
+ ^ 'Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)'
+
+ "Modified: / 10-09-2012 / 22:16:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+productInstallDirBaseName
+ "Returns a default installDir which will appear in <app>.nsi.
+ This is usually not the one you want to keep"
+
+ ^ (self package asCollectionOfSubstringsSeparatedByAny:':/') last
+!
+
+productName
+ "Return a product name which will appear in <lib>.rc"
+
+ ^ 'Metacello'
+
+ "Modified: / 10-09-2012 / 22:16:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_metacello_base class methodsFor:'description - svn'!
+
+svnRepositoryUrlString
+ "Return a SVN repository URL of myself.
+ (Generated since 2011-04-08)
+ Do not make the string shorter!!!!!! We have to use fixed-length keyword!!!!!!
+ "
+
+ ^ '$URL:: $'
+!
+
+svnRevisionNr
+ "Return a SVN revision number of myself.
+ This number is updated after a commit"
+
+ ^ "$SVN-Revision:"'nil '"$"
+! !
+
+!stx_goodies_metacello_base class methodsFor:'documentation'!
+
+version_HG
+
+ ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/base/vcmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,20 @@
+@REM -------
+@REM make using Microsoft Visual C compiler
+@REM type vcmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+
+@if not defined VSINSTALLDIR (
+ pushd ..\..\..\rules
+ call vcsetup.bat
+ popd
+)
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak -DUSEVC=1 %DEFINES% %*
+
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/bc.mak Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,84 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# Notice, that the name bc.mak is historical (from times, when only borland c was supported).
+# This file contains make rules for the win32 platform using either borland-bcc or visual-c.
+# It shares common definitions with the unix-make in Make.spec.
+# The bc.mak supports the following targets:
+# bmake - compile all st-files to a classLib (dll)
+# bmake clean - clean all temp files
+# bmake clobber - clean all
+#
+# Historic Note:
+# this used to contain only rules to make with borland
+# (called via bmake, by "make.exe -f bc.mak")
+# this has changed; it is now also possible to build using microsoft visual c
+# (called via vcmake, by "make.exe -f bc.mak -DUSEVC")
+#
+TOP=..\..
+INCLUDE_TOP=$(TOP)\..
+
+
+
+!INCLUDE $(TOP)\rules\stdHeader_bc
+
+!INCLUDE Make.spec
+
+LIBNAME=libstx_goodies_metacello
+RESFILES=metacello.$(RES)
+
+
+
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\libbasic
+LOCALDEFINES=
+
+STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -varPrefix=$(LIBNAME)
+LOCALLIBS=
+
+OBJS= $(COMMON_OBJS) $(WIN32_OBJS)
+
+ALL:: classLibRule
+
+classLibRule: $(OUTDIR) $(OUTDIR)$(LIBNAME).dll
+
+!INCLUDE $(TOP)\rules\stdRules_bc
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+ pushd ..\..\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+ pushd base & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+ pushd core & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+ pushd stx & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+
+
+
+
+
+
+
+test: $(TOP)\goodies\builder\reports\NUL
+ pushd $(TOP)\goodies\builder\reports & $(MAKE_BAT)
+ $(TOP)\goodies\builder\reports\report-runner.bat -D . -r Builder::TestReport -p $(PACKAGE)
+
+clean::
+ del *.$(CSUFFIX)
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)stx_goodies_metacello.$(O) stx_goodies_metacello.$(H): stx_goodies_metacello.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
+# **Must be at end**
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+!IFDEF HGROOT
+$(OUTDIR)stx_goodies_metacello.$(O): $(HGROOT)\.hg\dirstate
+!ENDIF
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/bmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,12 @@
+@REM -------
+@REM make using Borland bcc32
+@REM type bmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak %DEFINES% %*
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/Make.proto Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,234 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_core.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# The Makefile as generated by this Make.proto supports the following targets:
+# make - compile all st-files to a classLib
+# make clean - clean all temp files
+# make clobber - clean all
+#
+# This file contains definitions for Unix based platforms.
+# It shares common definitions with the win32-make in Make.spec.
+
+#
+# position (of this package) in directory hierarchy:
+# (must point to ST/X top directory, for tools and includes)
+TOP=../../..
+INCLUDE_TOP=$(TOP)/..
+
+# subdirectories where targets are to be made:
+SUBDIRS=
+
+
+# subdirectories where Makefiles are to be made:
+# (only define if different from SUBDIRS)
+# ALLSUBDIRS=
+
+REQUIRED_SUPPORT_DIRS=
+
+# if your embedded C code requires any system includes,
+# add the path(es) here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALINCLUDES=-Ifoo -Ibar
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/metacello/base -I$(INCLUDE_TOP)/stx/libbasic
+
+
+# if you need any additional defines for embedded C code,
+# add them here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALDEFINES=-Dfoo -Dbar -DDEBUG
+LOCALDEFINES=
+
+LIBNAME=libstx_goodies_metacello_core
+STCLOCALOPT='-package=$(PACKAGE)' -I. $(LOCALINCLUDES) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -headerDir=. -varPrefix=$(LIBNAME)
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C-libraries that should be pre-linked with the class-objects
+LD_OBJ_LIBS=
+LOCAL_SHARED_LIBS=
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C targets or libraries should be added below
+LOCAL_EXTRA_TARGETS=
+
+OBJS= $(COMMON_OBJS) $(UNIX_OBJS)
+
+
+
+all:: preMake classLibRule postMake
+
+pre_objs::
+
+
+
+
+# Update SVN revision in package definition class
+ifneq (,$(findstring .svn,$(wildcard .svn)))
+.svnversion: *.st
+ if [ -d .svn ]; then \
+ rev=$(shell svnversion -n); \
+ echo -n $$rev > .svnversion; \
+ else \
+ echo -n exported > .svnversion; \
+ fi
+
+stx_goodies_metacello_core.o: stx_goodies_metacello_core.st .svnversion
+ @if [ -d .svn ]; then \
+ rev2="$(shell printf "%-16s" $$(cat .svnversion))"; \
+ echo " [SV] Expanding svnRevisionNo in $1.st"; \
+ sed -e "s/\"\$$SVN\-Revision:\".*\"\$$\"/\"\$$SVN-Revision:\"\'$$rev2\'\"\$$\"/g" $< > .stx_goodies_metacello_core.svn.st; \
+ fi
+ $(MAKE) CC="$(CLASSLIB_CC)" OPT="$(OPT)" SEPINITCODE="$(SEPINITCODE)" STC="$(STC)" STFILE=.stx_goodies_metacello_core.svn $(C_RULE);
+ sed -i -e "s/\".stx_goodies_metacello_core.svn.st\");/\"\stx_goodies_metacello_core.st\");/g" .stx_goodies_metacello_core.svn.c
+ $(MAKE) .stx_goodies_metacello_core.svn.$(O)
+ @mv .stx_goodies_metacello_core.svn.$(O) stx_goodies_metacello_core.$(O)
+endif
+
+
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+ifneq (**NOHG**, $(shell hg root 2> /dev/null || echo -n '**NOHG**'))
+stx_goodies_metacello_core.$(O): $(shell hg root)/.hg/dirstate
+endif
+
+
+
+
+# run default testsuite for this package
+test: $(TOP)/goodies/builder/reports
+ $(MAKE) -C $(TOP)/goodies/builder/reports -f Makefile.init
+ $(TOP)/goodies/builder/reports/report-runner.sh -D . -r Builder::TestReport -p $(PACKAGE)
+
+
+
+# add more install actions here
+install::
+
+# add more install actions for aux-files (resources) here
+installAux::
+
+# add more preMake actions here
+preMake::
+
+# add more postMake actions here
+postMake:: cleanjunk
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+ cd ../../../libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+ cd ../base && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+
+
+
+# build all packages containing referenced classes for this package
+# they are nor needed to compile the package
+references:
+
+
+cleanjunk::
+ -rm -f *.s *.s2
+
+clean::
+ -rm -f *.o *.H
+
+clobber:: clean
+ -rm -f *.so *.dll
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)MetacelloAbstractConstructor.$(O) MetacelloAbstractConstructor.$(H): MetacelloAbstractConstructor.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloBaseConfiguration.$(O) MetacelloBaseConfiguration.$(H): MetacelloBaseConfiguration.st $(INCLUDE_TOP)/stx/goodies/metacello/base/ConfigurationOf.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCannotUpdateReleasedVersionError.$(O) MetacelloCannotUpdateReleasedVersionError.$(H): MetacelloCannotUpdateReleasedVersionError.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCleanNotification.$(O) MetacelloCleanNotification.$(H): MetacelloCleanNotification.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloClearStackCacheNotification.$(O) MetacelloClearStackCacheNotification.$(H): MetacelloClearStackCacheNotification.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloErrorInProjectConstructionNotification.$(O) MetacelloErrorInProjectConstructionNotification.$(H): MetacelloErrorInProjectConstructionNotification.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMethodSection.$(O) MetacelloMethodSection.$(H): MetacelloMethodSection.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMethodSectionPath.$(O) MetacelloMethodSectionPath.$(H): MetacelloMethodSectionPath.st $(INCLUDE_TOP)/stx/libbasic/Array.$(H) $(INCLUDE_TOP)/stx/libbasic/ArrayedCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/SequenceableCollection.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMethodSpec.$(O) MetacelloMethodSpec.$(H): MetacelloMethodSpec.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloPackageSpecResolutionError.$(O) MetacelloPackageSpecResolutionError.$(H): MetacelloPackageSpecResolutionError.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloPlatform.$(O) MetacelloPlatform.$(H): MetacelloPlatform.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProject.$(O) MetacelloProject.$(H): MetacelloProject.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectRegistration.$(O) MetacelloProjectRegistration.$(H): MetacelloProjectRegistration.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectRegistry.$(O) MetacelloProjectRegistry.$(H): MetacelloProjectRegistry.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecForLoad.$(O) MetacelloProjectSpecForLoad.$(H): MetacelloProjectSpecForLoad.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecGenerator.$(O) MetacelloProjectSpecGenerator.$(H): MetacelloProjectSpecGenerator.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecLoadError.$(O) MetacelloProjectSpecLoadError.$(H): MetacelloProjectSpecLoadError.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptEngine.$(O) MetacelloScriptEngine.$(H): MetacelloScriptEngine.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptExecutor.$(O) MetacelloScriptExecutor.$(H): MetacelloScriptExecutor.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptGitHubDownloadNotification.$(O) MetacelloScriptGitHubDownloadNotification.$(H): MetacelloScriptGitHubDownloadNotification.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptNotification.$(O) MetacelloScriptNotification.$(H): MetacelloScriptNotification.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptingError.$(O) MetacelloScriptingError.$(H): MetacelloScriptingError.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSemanticVersionNumber.$(O) MetacelloSemanticVersionNumber.$(H): MetacelloSemanticVersionNumber.st $(INCLUDE_TOP)/stx/libbasic/Magnitude.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSkipDirtyPackageLoad.$(O) MetacelloSkipDirtyPackageLoad.$(H): MetacelloSkipDirtyPackageLoad.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSpec.$(O) MetacelloSpec.$(H): MetacelloSpec.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSpecLoader.$(O) MetacelloSpecLoader.$(H): MetacelloSpecLoader.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStackCacheNotification.$(O) MetacelloStackCacheNotification.$(H): MetacelloStackCacheNotification.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationFailure.$(O) MetacelloValidationFailure.$(H): MetacelloValidationFailure.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationIssue.$(O) MetacelloValidationIssue.$(H): MetacelloValidationIssue.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationNotification.$(O) MetacelloValidationNotification.$(H): MetacelloValidationNotification.st $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersion.$(O) MetacelloVersion.$(H): MetacelloVersion.st $(INCLUDE_TOP)/stx/libbasic/Magnitude.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionDoesNotExistError.$(O) MetacelloVersionDoesNotExistError.$(H): MetacelloVersionDoesNotExistError.st $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionNumber.$(O) MetacelloVersionNumber.$(H): MetacelloVersionNumber.st $(INCLUDE_TOP)/stx/libbasic/Magnitude.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)stx_goodies_metacello_core.$(O) stx_goodies_metacello_core.$(H): stx_goodies_metacello_core.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAbstractPackageSpec.$(O) MetacelloAbstractPackageSpec.$(H): MetacelloAbstractPackageSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAbstractVersionConstructor.$(O) MetacelloAbstractVersionConstructor.$(H): MetacelloAbstractVersionConstructor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloBaselineSpecGenerator.$(O) MetacelloBaselineSpecGenerator.$(H): MetacelloBaselineSpecGenerator.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloProjectSpecGenerator.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCleanLoadAndTestsNotification.$(O) MetacelloCleanLoadAndTestsNotification.$(H): MetacelloCleanLoadAndTestsNotification.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloCleanNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCleanLoadNotification.$(O) MetacelloCleanLoadNotification.$(H): MetacelloCleanLoadNotification.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloCleanNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloConfigurationSpecGenerator.$(O) MetacelloConfigurationSpecGenerator.$(H): MetacelloConfigurationSpecGenerator.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloProjectSpecGenerator.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloConflictingProjectError.$(O) MetacelloConflictingProjectError.$(H): MetacelloConflictingProjectError.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptingError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLockedProjectError.$(O) MetacelloLockedProjectError.$(H): MetacelloLockedProjectError.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptingError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMemberListSpec.$(O) MetacelloMemberListSpec.$(H): MetacelloMemberListSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMemberSpec.$(O) MetacelloMemberSpec.$(H): MetacelloMemberSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpec.$(O) MetacelloProjectSpec.$(H): MetacelloProjectSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecLoadConflict.$(O) MetacelloProjectSpecLoadConflict.$(H): MetacelloProjectSpecLoadConflict.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloProjectSpecLoadError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloResolveProjectUpgrade.$(O) MetacelloResolveProjectUpgrade.$(H): MetacelloResolveProjectUpgrade.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptApiExecutor.$(O) MetacelloScriptApiExecutor.$(H): MetacelloScriptApiExecutor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptExecutor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptEnsureProjectLoadedForDevelopment.$(O) MetacelloScriptEnsureProjectLoadedForDevelopment.$(H): MetacelloScriptEnsureProjectLoadedForDevelopment.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptImageExecutor.$(O) MetacelloScriptImageExecutor.$(H): MetacelloScriptImageExecutor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptExecutor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptProjectSpecNotification.$(O) MetacelloScriptProjectSpecNotification.$(H): MetacelloScriptProjectSpecNotification.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptRegistryExecutor.$(O) MetacelloScriptRegistryExecutor.$(H): MetacelloScriptRegistryExecutor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptExecutor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionDoesNotExistError.$(O) MetacelloSymbolicVersionDoesNotExistError.$(H): MetacelloSymbolicVersionDoesNotExistError.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloVersionDoesNotExistError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionMethodSpec.$(O) MetacelloSymbolicVersionMethodSpec.$(H): MetacelloSymbolicVersionMethodSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMethodSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionSpec.$(O) MetacelloSymbolicVersionSpec.$(H): MetacelloSymbolicVersionSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMethodSection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloUseUpgradeError.$(O) MetacelloUseUpgradeError.$(H): MetacelloUseUpgradeError.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptingError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationCriticalWarning.$(O) MetacelloValidationCriticalWarning.$(H): MetacelloValidationCriticalWarning.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloValidationIssue.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationError.$(O) MetacelloValidationError.$(H): MetacelloValidationError.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloValidationIssue.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationWarning.$(O) MetacelloValidationWarning.$(H): MetacelloValidationWarning.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloValidationIssue.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValueHolderSpec.$(O) MetacelloValueHolderSpec.$(H): MetacelloValueHolderSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionDefinitionError.$(O) MetacelloVersionDefinitionError.$(H): MetacelloVersionDefinitionError.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloVersionDoesNotExistError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionMethodSection.$(O) MetacelloVersionMethodSection.$(H): MetacelloVersionMethodSection.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMethodSection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionMethodSpec.$(O) MetacelloVersionMethodSpec.$(H): MetacelloVersionMethodSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMethodSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionSpec.$(O) MetacelloVersionSpec.$(H): MetacelloVersionSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionValidator.$(O) MetacelloVersionValidator.$(H): MetacelloVersionValidator.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAddMemberSpec.$(O) MetacelloAddMemberSpec.$(H): MetacelloAddMemberSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMemberSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAllowConflictingProjectUpgrade.$(O) MetacelloAllowConflictingProjectUpgrade.$(H): MetacelloAllowConflictingProjectUpgrade.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloResolveProjectUpgrade.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAllowProjectDowngrade.$(O) MetacelloAllowProjectDowngrade.$(H): MetacelloAllowProjectDowngrade.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloResolveProjectUpgrade.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAllowProjectUpgrade.$(O) MetacelloAllowProjectUpgrade.$(H): MetacelloAllowProjectUpgrade.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloResolveProjectUpgrade.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloBaselineConstructor.$(O) MetacelloBaselineConstructor.$(H): MetacelloBaselineConstructor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCopyMemberSpec.$(O) MetacelloCopyMemberSpec.$(H): MetacelloCopyMemberSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMemberSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloGenericProjectSpec.$(O) MetacelloGenericProjectSpec.$(H): MetacelloGenericProjectSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloProjectSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloGroupSpec.$(O) MetacelloGroupSpec.$(H): MetacelloGroupSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractPackageSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLookupBaselineSpecForEnsureLoad.$(O) MetacelloLookupBaselineSpecForEnsureLoad.$(H): MetacelloLookupBaselineSpecForEnsureLoad.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLookupProjectSpec.$(O) MetacelloLookupProjectSpec.$(H): MetacelloLookupProjectSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLookupProjectSpecForLoad.$(O) MetacelloLookupProjectSpecForLoad.$(H): MetacelloLookupProjectSpecForLoad.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMergeMemberSpec.$(O) MetacelloMergeMemberSpec.$(H): MetacelloMergeMemberSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMemberSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloPackagesSpec.$(O) MetacelloPackagesSpec.$(H): MetacelloPackagesSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMemberListSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectReferenceSpec.$(O) MetacelloProjectReferenceSpec.$(H): MetacelloProjectReferenceSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractPackageSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecLoadedNotification.$(O) MetacelloProjectSpecLoadedNotification.$(H): MetacelloProjectSpecLoadedNotification.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptNotification.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Notification.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloRemoveMemberSpec.$(O) MetacelloRemoveMemberSpec.$(H): MetacelloRemoveMemberSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMemberSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionNotDefinedError.$(O) MetacelloSymbolicVersionNotDefinedError.$(H): MetacelloSymbolicVersionNotDefinedError.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSymbolicVersionDoesNotExistError.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloVersionDoesNotExistError.$(H) $(INCLUDE_TOP)/stx/libbasic/Error.$(H) $(INCLUDE_TOP)/stx/libbasic/Exception.$(H) $(INCLUDE_TOP)/stx/libbasic/GenericException.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloToolBoxConstructor.$(O) MetacelloToolBoxConstructor.$(H): MetacelloToolBoxConstructor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionConstructor.$(O) MetacelloVersionConstructor.$(H): MetacelloVersionConstructor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)/stx/libbasic/AbstractTime.$(H) $(INCLUDE_TOP)/stx/libbasic/ArithmeticValue.$(H) $(INCLUDE_TOP)/stx/libbasic/ArrayedCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/Block.$(H) $(INCLUDE_TOP)/stx/libbasic/CharacterArray.$(H) $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/CompiledCode.$(H) $(INCLUDE_TOP)/stx/libbasic/ExecutableFunction.$(H) $(INCLUDE_TOP)/stx/libbasic/Integer.$(H) $(INCLUDE_TOP)/stx/libbasic/Magnitude.$(H) $(INCLUDE_TOP)/stx/libbasic/Number.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/SequenceableCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/String.$(H) $(INCLUDE_TOP)/stx/libbasic/Symbol.$(H) $(INCLUDE_TOP)/stx/libbasic/Timestamp.$(H) $(INCLUDE_TOP)/stx/libbasic/UndefinedObject.$(H) $(INCLUDE_TOP)/stx/libbasic/UninterpretedBytes.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/Make.spec Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,229 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_core.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# This file contains specifications which are common to all platforms.
+#
+
+# Do NOT CHANGE THESE DEFINITIONS
+# (otherwise, ST/X will have a hard time to find out the packages location from its packageID,
+# to find the source code of a class and to find the library for a package)
+MODULE=stx
+MODULE_DIR=goodies/metacello/core
+PACKAGE=$(MODULE):$(MODULE_DIR)
+
+
+# Argument(s) to the stc compiler (stc --usage).
+# -headerDir=. : create header files locally
+# (if removed, they will be created as common
+# -Pxxx : defines the package
+# -Zxxx : a prefix for variables within the classLib
+# -Dxxx : defines passed to to CC for inline C-code
+# -Ixxx : include path passed to CC for inline C-code
+# +optspace : optimized for space
+# +optspace2 : optimized more for space
+# +optspace3 : optimized even more for space
+# +optinline : generate inline code for some ST constructs
+# +inlineNew : additionally inline new
+# +inlineMath : additionally inline some floatPnt math stuff
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCLOCALOPTIMIZATIONS=+optinline +inlineNew
+# STCLOCALOPTIMIZATIONS=+optspace3
+STCLOCALOPTIMIZATIONS=+optspace3
+
+
+# Argument(s) to the stc compiler (stc --usage).
+# -warn : no warnings
+# -warnNonStandard : no warnings about ST/X extensions
+# -warnEOLComments : no warnings about EOL comment extension
+# -warnPrivacy : no warnings about privateClass extension
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCWARNINGS=-warn
+# STCWARNINGS=-warnNonStandard
+# STCWARNINGS=-warnEOLComments
+STCWARNINGS=-warnNonStandard
+
+COMMON_CLASSES= \
+ MetacelloAbstractConstructor \
+ MetacelloBaseConfiguration \
+ MetacelloCannotUpdateReleasedVersionError \
+ MetacelloCleanNotification \
+ MetacelloClearStackCacheNotification \
+ MetacelloErrorInProjectConstructionNotification \
+ MetacelloMethodSection \
+ MetacelloMethodSectionPath \
+ MetacelloMethodSpec \
+ MetacelloPackageSpecResolutionError \
+ MetacelloPlatform \
+ MetacelloProject \
+ MetacelloProjectRegistration \
+ MetacelloProjectRegistry \
+ MetacelloProjectSpecForLoad \
+ MetacelloProjectSpecGenerator \
+ MetacelloProjectSpecLoadError \
+ MetacelloScriptEngine \
+ MetacelloScriptExecutor \
+ MetacelloScriptGitHubDownloadNotification \
+ MetacelloScriptNotification \
+ MetacelloScriptingError \
+ MetacelloSemanticVersionNumber \
+ MetacelloSkipDirtyPackageLoad \
+ MetacelloSpec \
+ MetacelloSpecLoader \
+ MetacelloStackCacheNotification \
+ MetacelloValidationFailure \
+ MetacelloValidationIssue \
+ MetacelloValidationNotification \
+ MetacelloVersion \
+ MetacelloVersionDoesNotExistError \
+ MetacelloVersionNumber \
+ stx_goodies_metacello_core \
+ MetacelloAbstractPackageSpec \
+ MetacelloAbstractVersionConstructor \
+ MetacelloBaselineSpecGenerator \
+ MetacelloCleanLoadAndTestsNotification \
+ MetacelloCleanLoadNotification \
+ MetacelloConfigurationSpecGenerator \
+ MetacelloConflictingProjectError \
+ MetacelloLockedProjectError \
+ MetacelloMemberListSpec \
+ MetacelloMemberSpec \
+ MetacelloProjectSpec \
+ MetacelloProjectSpecLoadConflict \
+ MetacelloResolveProjectUpgrade \
+ MetacelloScriptApiExecutor \
+ MetacelloScriptEnsureProjectLoadedForDevelopment \
+ MetacelloScriptImageExecutor \
+ MetacelloScriptProjectSpecNotification \
+ MetacelloScriptRegistryExecutor \
+ MetacelloSymbolicVersionDoesNotExistError \
+ MetacelloSymbolicVersionMethodSpec \
+ MetacelloSymbolicVersionSpec \
+ MetacelloUseUpgradeError \
+ MetacelloValidationCriticalWarning \
+ MetacelloValidationError \
+ MetacelloValidationWarning \
+ MetacelloValueHolderSpec \
+ MetacelloVersionDefinitionError \
+ MetacelloVersionMethodSection \
+ MetacelloVersionMethodSpec \
+ MetacelloVersionSpec \
+ MetacelloVersionValidator \
+ MetacelloAddMemberSpec \
+ MetacelloAllowConflictingProjectUpgrade \
+ MetacelloAllowProjectDowngrade \
+ MetacelloAllowProjectUpgrade \
+ MetacelloBaselineConstructor \
+ MetacelloCopyMemberSpec \
+ MetacelloGenericProjectSpec \
+ MetacelloGroupSpec \
+ MetacelloLookupBaselineSpecForEnsureLoad \
+ MetacelloLookupProjectSpec \
+ MetacelloLookupProjectSpecForLoad \
+ MetacelloMergeMemberSpec \
+ MetacelloPackagesSpec \
+ MetacelloProjectReferenceSpec \
+ MetacelloProjectSpecLoadedNotification \
+ MetacelloRemoveMemberSpec \
+ MetacelloSymbolicVersionNotDefinedError \
+ MetacelloToolBoxConstructor \
+ MetacelloVersionConstructor \
+
+
+
+
+COMMON_OBJS= \
+ $(OUTDIR_SLASH)MetacelloAbstractConstructor.$(O) \
+ $(OUTDIR_SLASH)MetacelloBaseConfiguration.$(O) \
+ $(OUTDIR_SLASH)MetacelloCannotUpdateReleasedVersionError.$(O) \
+ $(OUTDIR_SLASH)MetacelloCleanNotification.$(O) \
+ $(OUTDIR_SLASH)MetacelloClearStackCacheNotification.$(O) \
+ $(OUTDIR_SLASH)MetacelloErrorInProjectConstructionNotification.$(O) \
+ $(OUTDIR_SLASH)MetacelloMethodSection.$(O) \
+ $(OUTDIR_SLASH)MetacelloMethodSectionPath.$(O) \
+ $(OUTDIR_SLASH)MetacelloMethodSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloPackageSpecResolutionError.$(O) \
+ $(OUTDIR_SLASH)MetacelloPlatform.$(O) \
+ $(OUTDIR_SLASH)MetacelloProject.$(O) \
+ $(OUTDIR_SLASH)MetacelloProjectRegistration.$(O) \
+ $(OUTDIR_SLASH)MetacelloProjectRegistry.$(O) \
+ $(OUTDIR_SLASH)MetacelloProjectSpecForLoad.$(O) \
+ $(OUTDIR_SLASH)MetacelloProjectSpecGenerator.$(O) \
+ $(OUTDIR_SLASH)MetacelloProjectSpecLoadError.$(O) \
+ $(OUTDIR_SLASH)MetacelloScriptEngine.$(O) \
+ $(OUTDIR_SLASH)MetacelloScriptExecutor.$(O) \
+ $(OUTDIR_SLASH)MetacelloScriptGitHubDownloadNotification.$(O) \
+ $(OUTDIR_SLASH)MetacelloScriptNotification.$(O) \
+ $(OUTDIR_SLASH)MetacelloScriptingError.$(O) \
+ $(OUTDIR_SLASH)MetacelloSemanticVersionNumber.$(O) \
+ $(OUTDIR_SLASH)MetacelloSkipDirtyPackageLoad.$(O) \
+ $(OUTDIR_SLASH)MetacelloSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloSpecLoader.$(O) \
+ $(OUTDIR_SLASH)MetacelloStackCacheNotification.$(O) \
+ $(OUTDIR_SLASH)MetacelloValidationFailure.$(O) \
+ $(OUTDIR_SLASH)MetacelloValidationIssue.$(O) \
+ $(OUTDIR_SLASH)MetacelloValidationNotification.$(O) \
+ $(OUTDIR_SLASH)MetacelloVersion.$(O) \
+ $(OUTDIR_SLASH)MetacelloVersionDoesNotExistError.$(O) \
+ $(OUTDIR_SLASH)MetacelloVersionNumber.$(O) \
+ $(OUTDIR_SLASH)stx_goodies_metacello_core.$(O) \
+ $(OUTDIR_SLASH)MetacelloAbstractPackageSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloAbstractVersionConstructor.$(O) \
+ $(OUTDIR_SLASH)MetacelloBaselineSpecGenerator.$(O) \
+ $(OUTDIR_SLASH)MetacelloCleanLoadAndTestsNotification.$(O) \
+ $(OUTDIR_SLASH)MetacelloCleanLoadNotification.$(O) \
+ $(OUTDIR_SLASH)MetacelloConfigurationSpecGenerator.$(O) \
+ $(OUTDIR_SLASH)MetacelloConflictingProjectError.$(O) \
+ $(OUTDIR_SLASH)MetacelloLockedProjectError.$(O) \
+ $(OUTDIR_SLASH)MetacelloMemberListSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloMemberSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloProjectSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloProjectSpecLoadConflict.$(O) \
+ $(OUTDIR_SLASH)MetacelloResolveProjectUpgrade.$(O) \
+ $(OUTDIR_SLASH)MetacelloScriptApiExecutor.$(O) \
+ $(OUTDIR_SLASH)MetacelloScriptEnsureProjectLoadedForDevelopment.$(O) \
+ $(OUTDIR_SLASH)MetacelloScriptImageExecutor.$(O) \
+ $(OUTDIR_SLASH)MetacelloScriptProjectSpecNotification.$(O) \
+ $(OUTDIR_SLASH)MetacelloScriptRegistryExecutor.$(O) \
+ $(OUTDIR_SLASH)MetacelloSymbolicVersionDoesNotExistError.$(O) \
+ $(OUTDIR_SLASH)MetacelloSymbolicVersionMethodSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloSymbolicVersionSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloUseUpgradeError.$(O) \
+ $(OUTDIR_SLASH)MetacelloValidationCriticalWarning.$(O) \
+ $(OUTDIR_SLASH)MetacelloValidationError.$(O) \
+ $(OUTDIR_SLASH)MetacelloValidationWarning.$(O) \
+ $(OUTDIR_SLASH)MetacelloValueHolderSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloVersionDefinitionError.$(O) \
+ $(OUTDIR_SLASH)MetacelloVersionMethodSection.$(O) \
+ $(OUTDIR_SLASH)MetacelloVersionMethodSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloVersionSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloVersionValidator.$(O) \
+ $(OUTDIR_SLASH)MetacelloAddMemberSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloAllowConflictingProjectUpgrade.$(O) \
+ $(OUTDIR_SLASH)MetacelloAllowProjectDowngrade.$(O) \
+ $(OUTDIR_SLASH)MetacelloAllowProjectUpgrade.$(O) \
+ $(OUTDIR_SLASH)MetacelloBaselineConstructor.$(O) \
+ $(OUTDIR_SLASH)MetacelloCopyMemberSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloGenericProjectSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloGroupSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloLookupBaselineSpecForEnsureLoad.$(O) \
+ $(OUTDIR_SLASH)MetacelloLookupProjectSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloLookupProjectSpecForLoad.$(O) \
+ $(OUTDIR_SLASH)MetacelloMergeMemberSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloPackagesSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloProjectReferenceSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloProjectSpecLoadedNotification.$(O) \
+ $(OUTDIR_SLASH)MetacelloRemoveMemberSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloSymbolicVersionNotDefinedError.$(O) \
+ $(OUTDIR_SLASH)MetacelloToolBoxConstructor.$(O) \
+ $(OUTDIR_SLASH)MetacelloVersionConstructor.$(O) \
+ $(OUTDIR_SLASH)extensions.$(O) \
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/Makefile.init Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,27 @@
+#
+# DO NOT EDIT
+#
+# make uses this file (Makefile) only, if there is no
+# file named "makefile" (lower-case m) in the same directory.
+# My only task is to generate the real makefile and call make again.
+# Thereafter, I am no longer used and needed.
+#
+# MACOSX caveat:
+# as filenames are not case sensitive (in a default setup),
+# we cannot use the above trick. Therefore, this file is now named
+# "Makefile.init", and you have to execute "make -f Makefile.init" to
+# get the initial makefile. This is now also done by the toplevel CONFIG
+# script.
+
+.PHONY: run
+
+run: makefile
+ $(MAKE) -f makefile
+
+#only needed for the definition of $(TOP)
+include Make.proto
+
+makefile: mf
+
+mf:
+ $(TOP)/rules/stmkmf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloAbstractConstructor.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,97 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloAbstractConstructor
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloAbstractConstructor methodsFor:'accessing'!
+
+configurationClass
+
+ ^self subclassResponsibility
+! !
+
+!MetacelloAbstractConstructor methodsFor:'pragma extraction'!
+
+extractAllVersionPragmas
+
+ | aDict |
+ aDict := Dictionary new.
+ self extractPragmas: #version: into: aDict.
+ self extractPragmas: #version:imports: into: aDict.
+ ^aDict
+!
+
+extractCommonDefaultSymbolicVersionPragmas
+
+ | aDict |
+ aDict := Dictionary new.
+ self extractPragmas: #defaultSymbolicVersion: for: ConfigurationOf into: aDict.
+ ^aDict
+!
+
+extractDefaultSymbolicVersionPragmas
+
+ | aDict |
+ aDict := Dictionary new.
+ self extractPragmas: #defaultSymbolicVersion: into: aDict.
+ ^aDict
+!
+
+extractSymbolicVersionPragmas
+
+ | aDict |
+ aDict := Dictionary new.
+ self extractPragmas: #symbolicVersion: into: aDict.
+ ^aDict
+!
+
+extractVersionImportPragmas
+
+ | aDict |
+ aDict := Dictionary new.
+ self extractPragmas: #version:imports: into: aDict.
+ ^aDict
+!
+
+extractVersionPragmas
+
+ | aDict |
+ aDict := Dictionary new.
+ self extractPragmas: #version: into: aDict.
+ ^aDict
+! !
+
+!MetacelloAbstractConstructor methodsFor:'private'!
+
+extractPragmas: pragmaKeyword for: aClass into: versionDict
+
+ | versionString pragmas |
+ (Pragma
+ allNamed: pragmaKeyword
+ in: aClass) do: [:pragma |
+ versionString := pragma argumentAt: 1.
+ pragmas := versionDict
+ at: versionString
+ ifAbsent: [ | list |
+ list := OrderedCollection new.
+ versionDict at: versionString put: list.
+ list ].
+ pragmas add: pragma ].
+!
+
+extractPragmas: pragmaKeyword into: versionDict
+
+ ^self extractPragmas: pragmaKeyword for: self configurationClass into: versionDict
+! !
+
+!MetacelloAbstractConstructor class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloAbstractPackageSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,248 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloSpec subclass:#MetacelloAbstractPackageSpec
+ instanceVariableNames:'name requires includes answers'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloAbstractPackageSpec methodsFor:'accessing'!
+
+answers: aListOfPairs
+
+ self setAnswers: aListOfPairs
+!
+
+includes: aCollection
+
+ aCollection setIncludesInMetacelloPackage: self
+!
+
+name: aString
+ ((aString at: 1) isSeparator or: [ (aString at: aString size) isSeparator ])
+ ifTrue: [ self error: 'Names are not allowed to have leading or trailing blanks: ' , aString printString ].
+ name := aString
+!
+
+referencedSpec
+
+ ^self
+!
+
+requires: aCollection
+
+ aCollection setRequiresInMetacelloPackage: self
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'adding'!
+
+addToMetacelloPackages: aMetacelloPackagesSpec
+
+ aMetacelloPackagesSpec addMember:
+ (aMetacelloPackagesSpec addMember
+ name: self name;
+ spec: self;
+ yourself)
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'copying'!
+
+postCopy
+
+ super postCopy.
+ requires := requires copy.
+ includes := includes copy.
+ answers := answers copy.
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'merging'!
+
+mergeIntoMetacelloPackages: aMetacelloPackagesSpec
+
+ aMetacelloPackagesSpec addMember:
+ (aMetacelloPackagesSpec mergeMember
+ name: self name;
+ spec: self;
+ yourself)
+!
+
+mergeMap
+
+ | map |
+ map := super mergeMap.
+ map at: #requires put: requires.
+ map at: #includes put: includes.
+ map at: #answers put: answers.
+ ^map
+!
+
+mergeSpec: anotherSpec
+
+ | newSpec map anotherRequires anotherIncludes anotherAnswers |
+ newSpec := super mergeSpec: anotherSpec.
+ map := anotherSpec mergeMap.
+ anotherSpec name ~~ nil
+ ifTrue: [ newSpec name: anotherSpec name ].
+ (anotherRequires := map at: #requires) ~~ nil
+ ifTrue: [ newSpec setRequires: self requires, anotherRequires ].
+ (anotherIncludes := map at: #includes) ~~ nil
+ ifTrue: [ newSpec setIncludes: self includes, anotherIncludes ].
+ (anotherAnswers := map at: #answers) ~~ nil
+ ifTrue: [ newSpec setAnswers: self answers, anotherAnswers ].
+ ^newSpec
+
+!
+
+nonOverridable
+
+ ^#( includes requires answers )
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'printing'!
+
+configMethodBodyOn: aStream hasName: hasName cascading: cascading indent: indent
+
+ | hasCascading hasRequires hasIncludes hasAnswers |
+ hasCascading := cascading.
+ hasRequires := self requires isEmpty not.
+ hasIncludes := self includes isEmpty not.
+ hasAnswers := self answers isEmpty not.
+ hasRequires
+ ifTrue: [
+ hasName | hasIncludes | hasAnswers | hasCascading
+ ifTrue: [ aStream cr; tab: indent ].
+ aStream nextPutAll: 'requires: #('.
+ self requires do: [:str | aStream nextPutAll: str printString, ' ' ].
+ hasIncludes | hasAnswers | hasCascading
+ ifTrue: [ aStream nextPutAll: ');' ]
+ ifFalse: [ aStream nextPut: $) ]].
+ hasIncludes
+ ifTrue: [
+ hasName | hasRequires | hasAnswers | hasCascading
+ ifTrue: [ aStream cr; tab: indent ].
+ aStream nextPutAll: 'includes: #('.
+ self includes do: [:str | aStream nextPutAll: str printString, ' ' ].
+ hasAnswers | hasCascading
+ ifTrue: [ aStream nextPutAll: ');' ]
+ ifFalse: [ aStream nextPut: $) ]].
+ hasAnswers
+ ifTrue: [
+ hasName | hasRequires | hasIncludes | hasCascading
+ ifTrue: [ aStream cr; tab: indent ].
+ aStream nextPutAll: 'supplyingAnswers: #( '.
+ self answers do: [:ar |
+ aStream nextPutAll: '#( '.
+ ar do: [:val |
+ (val isString or: [ val isNumber or: [ val isSymbol or: [ val isCharacter ]]])
+ ifTrue: [ aStream nextPutAll: val printString, ' ' ].
+ val == true
+ ifTrue: [ aStream nextPutAll: 'true ' ].
+ val == false
+ ifTrue: [ aStream nextPutAll: 'false ' ]].
+ aStream nextPutAll: ') ' ].
+ hasCascading
+ ifTrue: [ aStream nextPutAll: ');' ]
+ ifFalse: [ aStream nextPut: $) ]].
+!
+
+configMethodCascadeOn: aStream member: aMember last: lastCascade indent: indent
+
+ self subclassResponsibility
+!
+
+configMethodOn: aStream for: aValue selector: selector cascading: cascading cascade: cascade indent: indent
+
+ | valuePrintString |
+ aValue == nil ifTrue: [ ^self ].
+ cascading ifTrue: [ aStream cr; tab: indent ].
+ valuePrintString := aValue value isSymbol
+ ifTrue: [ '#' , aValue value asString printString ]
+ ifFalse: [ aValue value printString ].
+ aStream nextPutAll: selector, valuePrintString.
+ cascade ifTrue: [ aStream nextPut: $; ]
+!
+
+label
+
+ ^self name
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'private'!
+
+includesForPackageOrdering
+
+ ^#()
+!
+
+setAnswers: aCollection
+
+ answers := aCollection
+!
+
+setIncludes: aCollection
+
+ includes := aCollection
+!
+
+setRequires: aCollection
+
+ requires := aCollection
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'querying'!
+
+answers
+
+ answers == nil ifTrue: [ answers := #() ].
+ ^answers
+!
+
+includes
+
+ includes == nil ifTrue: [ includes := #() ].
+ ^includes
+!
+
+name
+
+ ^name
+!
+
+requires
+
+ requires == nil ifTrue: [ requires := #() ].
+ ^requires
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'removing'!
+
+removeFromMetacelloPackages: aMetacelloPackagesSpec
+
+ aMetacelloPackagesSpec addMember:
+ (aMetacelloPackagesSpec removeMember
+ name: self name;
+ spec: self;
+ yourself)
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'testing'!
+
+hasRepository
+ ^ false
+! !
+
+!MetacelloAbstractPackageSpec methodsFor:'visiting'!
+
+projectDo: projectBlock packageDo: packageBlock groupDo: groupBlock
+
+ self subclassResponsibility
+! !
+
+!MetacelloAbstractPackageSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloAbstractVersionConstructor.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,828 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloAbstractConstructor subclass:#MetacelloAbstractVersionConstructor
+ instanceVariableNames:'root configuration project attributeMap attributeOrder
+ symbolicVersion currentContext'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloAbstractVersionConstructor class methodsFor:'method generation'!
+
+symbolicMethodSelectorAndPragma: selector symbolicVersionSymbol: symbolicVersionSymbol on: strm
+ strm
+ nextPutAll: selector asString , ' spec';
+ cr;
+ tab;
+ nextPutAll: '<symbolicVersion: #' , symbolicVersionSymbol asString printString;
+ nextPutAll: '>';
+ cr
+! !
+
+!MetacelloAbstractVersionConstructor methodsFor:'accessing'!
+
+addAttribute: anAttribute
+
+ self attributeOrder add: anAttribute
+!
+
+attributeMap
+
+ attributeMap == nil ifTrue: [ attributeMap := Dictionary new ].
+ ^attributeMap
+!
+
+attributeOrder
+
+ attributeOrder == nil ifTrue: [ attributeOrder := OrderedCollection new ].
+ ^attributeOrder
+!
+
+configuration
+
+ ^configuration
+!
+
+configuration: aConfig
+
+ configuration := aConfig
+!
+
+configurationClass
+
+ ^self configuration class
+!
+
+project
+ ^project
+
+ "Created: / 18-09-2012 / 19:08:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+root
+
+ ^root
+!
+
+root: aMetacelloSpec
+ root := aMetacelloSpec
+!
+
+setProject: aProject
+
+ project := aProject
+!
+
+symbolicVersion
+
+ ^symbolicVersion
+!
+
+symbolicVersion: aSymbol
+
+ symbolicVersion := aSymbol
+! !
+
+!MetacelloAbstractVersionConstructor methodsFor:'api'!
+
+author: aBlockOrString
+ "Define author field of version spec (MetacelloMCVersionSpec).
+ If <aBlockOrString> is a String, the version spec author is set to the String.
+ If <aBlockOrString> is a Block, the specifications in <aBlockOrString> are applied to the author spec (MetacelloValueHolderSpec). Not Recommended!!
+
+ spec author: 'dkh'.
+
+ spec author: [
+ spec value: 'dkh'. ].
+ "
+
+ self root author: aBlockOrString constructor: self
+!
+
+baseline: aString
+ self root baseline: aString constructor: self
+!
+
+baseline: aString with: aBlockOrString
+ self root baseline: aString with: aBlockOrString constructor: self
+!
+
+blessing: aBlockOrString
+ "Define blessing field of version spec (MetacelloMCVersionSpec).
+ If <aBlockOrString> is a String, the version spec blessing is set to the String. It is recommended to use a Symbol.
+ If <aBlockOrString> is a Block, the specifications in <aBlockOrString> are applied to the blessing spec (MetacelloValueHolderSpec). Not Recommended!!
+
+ spec blessing: #release.
+
+ spec blessing: [
+ spec value: #release. ].
+
+ The blessing should typically be set to one of three values:
+ #baseline - indicating that the version spec is specifying a baseline version
+ #development - indicating that the version spec is not stabilized and will change over time
+ #release - indicating that the version spec has stabilized and will NOT change over time
+ "
+
+ self root blessing: aBlockOrString constructor: self
+!
+
+className: aString
+ "Define className field of a project spec (MetacelloMCProjectSpec).
+
+ spec project: 'CoolBrowser' with: [
+ spec className: 'ConfigurationOfCoolBrowser'. ].
+
+ The className field is OPTIONAL in the project spec. If omitted, the className will be created by prepending 'ConfigurationOf' to the project name.
+ "
+
+ self root className: aString constructor: self
+!
+
+configuration: aString with: aBlockOrString
+ self root configuration: aString with: aBlockOrString constructor: self
+!
+
+description: aBlockOrString
+ "Define description field of version spec (MetacelloMCVersionSpec).
+ If <aBlockOrString> is a String, the version spec blessing is set to the String. It is recommended to use a Symbol.
+ If <aBlockOrString> is a Block, the specifications in <aBlockOrString> are applied to the blessing spec (MetacelloValueHolderSpec). Not Recommended!!
+
+ spec description: 'Descriptive comment'.
+
+ spec description: [
+ spec value: 'Descriptive comment'.
+ "
+
+ self root description: aBlockOrString constructor: self
+!
+
+file: aString
+ "Define file field of a package spec (MetacelloPackageSpec) or project spec (MetacelloMCProjectSpec).
+
+ For a package spec, the file: field is optional in a baseline. In a baseline, the file field may be used to specify a package branch for the package:
+
+ spec package: 'MyPackage' with: [
+ spec file: 'MyPackage.gemstone'. ]'.
+
+ The file: field is required in a version. In a version, the file field defines the explicit version of the package to be loaded:
+
+ spec package: 'MyPackage' with: [
+ spec file: 'MyPackage.gemstone-dkh.1'. ]'.
+
+ The following may be used as a short cut for specifying the file field in a version:
+
+ spec package: 'MyPackage' with: 'MyPackage.gemstone-dkh.1'.
+
+ For a project spec, the file field specifies the name of the Monticello package that contains the configuration. If you are using the convention of
+ naming the class and package usingthe 'ConfigurationOf' prefix, then there is no need to specify the file field:
+
+ spec project: 'MyProject' with: [
+ spec file: 'ConfigurationMyProject'.
+
+ It should only be used when the package name for the configuration is different from the name of the project:
+
+ spec project: 'MyProject' with: [
+ spec file: 'MyProject-Metacello'.
+ "
+
+ self root file: aString constructor: self
+!
+
+for: attribute do: aBlock
+ "conditional version support"
+
+ | blockList |
+ blockList := self attributeMap
+ at: attribute
+ ifAbsent: [ self attributeMap at: attribute put: (blockList := OrderedCollection new) ].
+ blockList add: aBlock.
+ self addAttribute: attribute
+!
+
+for: attribute version: aString
+ "conditional symbolicVersion support"
+
+ self attributeMap at: attribute put: aString.
+ self addAttribute: attribute
+!
+
+group: aString overrides: aStringOrCollection
+ self root group: aString overrides: aStringOrCollection constructor: self
+!
+
+group: aString with: aStringOrCollection
+ self root group: aString with: aStringOrCollection constructor: self
+!
+
+import: aString
+ "import names defined in baseline <aString> to be used when loading the version
+
+ spec baseline: 'Sample' with: [ spec repository: 'github://dalehenrich/sample:master/repository' ].
+ spec import: 'Sample' ]
+ "
+
+ self root import: aString constructor: self
+!
+
+includes: anObject
+ self root includes: anObject constructor: self
+!
+
+loads: anObject
+ self root loads: anObject constructor: self
+!
+
+name: anObject
+ self root name: anObject constructor: self
+!
+
+operator: anObject
+ self root operator: anObject constructor: self
+!
+
+package: aString
+ self root package: aString constructor: self
+!
+
+package: aString overrides: aBlock
+ self root package: aString overrides: aBlock constructor: self
+!
+
+package: packageName with: aBlockOrString
+ "Define specification for package <packageName>.
+ If <aBlockOrString> is a String (or Symbol), the String is expected to be a version (or symbolic version).
+ If <aBlockOrString> is a Block, the specifications in <aBlockOrString> are applied to the project:
+
+ spec package: 'MyPackage' with: '1.0'.
+
+ spec package: 'MyPackage' with: [
+ spec file:'MyPackage-dkh.1'.
+ spec repository: '/opt/gemstone/repository'.
+ "
+
+ self root package: packageName with: aBlockOrString constructor: self
+!
+
+postLoadDoIt: aSymbol
+ self root postLoadDoIt: aSymbol constructor: self
+!
+
+preLoadDoIt: aSymbol
+ self root preLoadDoIt: aSymbol constructor: self
+!
+
+project: aString
+ self root project: aString constructor: self
+!
+
+project: aString copyFrom: oldSpecName with: aBlock
+ self root
+ project: aString
+ copyFrom: oldSpecName
+ with: aBlock
+ constructor: self
+!
+
+project: aString overrides: aBlock
+ self root project: aString overrides: aBlock constructor: self
+!
+
+project: aString with: aBlockOrString
+ self root project: aString with: aBlockOrString constructor: self
+!
+
+projectPackage: aBlock
+ "projectPackage spec data folded into project spec"
+
+ self root projectPackage: aBlock constructor: self
+!
+
+removeGroup: aString
+ self root removeGroup: aString constructor: self
+!
+
+removePackage: aString
+ self root removePackage: aString constructor: self
+!
+
+removeProject: aString
+ self root removeProject: aString constructor: self
+!
+
+repositories: aBlock
+ self root repositories: aBlock constructor: self
+!
+
+repository: anObject
+ self root repository: anObject constructor: self
+!
+
+repository: description username: username password: password
+ self root
+ repository: description
+ username: username
+ password: password
+ constructor: self
+!
+
+requires: anObject
+ self root requires: anObject constructor: self
+!
+
+supplyingAnswers: aCollection
+ self root supplyingAnswers: aCollection constructor: self
+!
+
+timestamp: aBlockOrStringOrDateAndTime
+ "Define timestamp field of version spec (MetacelloMCVersionSpec).
+ If <aBlockOrStringOrDateAndTime> is a String, the version spec timetamp is set to the String.
+ If <aBlockOrStringOrDateAndTime> is a DateAndTime, the version spec timetamp is set to the printString of the DateAndTime.
+ If <aBlockOrStringOrDateAndTime> is a Block, the specifications in <aBlockOrStringOrDateAndTime> are applied to the timestamp spec (MetacelloValueHolderSpec). Not Recommended!!
+
+ spec timestamp: '10/7/2009 14:40'.
+
+ spec timestamp: DateAndTime now'.
+
+ spec timestamp: [
+ spec value: '10/7/2009 14:40'. ].
+ "
+
+ self root timestamp: aBlockOrStringOrDateAndTime constructor: self
+!
+
+value: anObject
+ self root value: anObject constructor: self
+!
+
+version: anObject
+ self root version: anObject constructor: self
+!
+
+versionString: anObject
+ self root versionString: anObject constructor: self
+! !
+
+!MetacelloAbstractVersionConstructor methodsFor:'api callbacks'!
+
+setAuthorWithBlock: aBlock
+
+ | spec |
+ (spec := self root getAuthor) == nil
+ ifTrue: [
+ spec := self project valueHolderSpec.
+ self root setAuthor: spec ].
+ self with: spec during: aBlock
+!
+
+setAuthorWithString: aString
+
+ self root author: aString
+!
+
+setBaseline: aString
+ | spec projectSpec |
+ projectSpec := self project baselineOfProjectSpec
+ name: aString;
+ className: 'BaselineOf' , aString;
+ yourself.
+ spec := self project projectReferenceSpec
+ name: aString;
+ projectReference: projectSpec;
+ yourself.
+ self root packages merge: spec.
+ ^ projectSpec
+!
+
+setBaseline: aString withBlock: aBlock
+ | projectSpec |
+ projectSpec := self setBaseline: aString.
+ self with: projectSpec during: aBlock
+!
+
+setBlessingWithBlock: aBlock
+
+ | spec |
+ (spec := self root getBlessing) == nil
+ ifTrue: [
+ spec := self project valueHolderSpec.
+ self root setBlessing: spec ].
+ self with: spec during: aBlock
+!
+
+setBlessingWithString: aString
+
+ self root blessing: aString
+!
+
+setConfiguration: aString withBlock: aBlock
+ | spec projectSpec |
+ projectSpec := self project configurationOfProjectSpec
+ name: aString;
+ yourself.
+ spec := self project projectReferenceSpec
+ name: aString;
+ projectReference: projectSpec;
+ yourself.
+ self root packages merge: spec.
+ self with: projectSpec during: aBlock
+!
+
+setDescriptionWithBlock: aBlock
+
+ | spec |
+ (spec := self root getDescription) == nil
+ ifTrue: [
+ spec := self project valueHolderSpec.
+ self root setDescription: spec ].
+ self with: spec during: aBlock
+!
+
+setDescriptionWithString: aString
+
+ self root description: aString
+!
+
+setPackage: aString withBlock: aBlock
+
+ | spec |
+ spec :=
+ (self project packageSpec)
+ name: aString;
+ yourself.
+ self root packages merge: spec.
+ self with: spec during: aBlock
+!
+
+setPackage: aString withString: aFile
+
+ | spec |
+ spec :=
+ (self project packageSpec)
+ name: aString;
+ file: aFile;
+ yourself.
+ self root packages merge: spec.
+!
+
+setProject: aString withBlock: aBlock
+ | spec projectSpec |
+ projectSpec := self project projectSpec
+ name: aString;
+ yourself.
+ spec := self project projectReferenceSpec
+ name: aString;
+ projectReference: projectSpec;
+ yourself.
+ self root packages merge: spec.
+ self with: projectSpec during: aBlock
+!
+
+setProject: aString withString: versionString
+
+ | spec projectSpec |
+ projectSpec :=
+ (self project projectSpec)
+ name: aString;
+ versionString: versionString;
+ yourself.
+ spec :=
+ (self project projectReferenceSpec)
+ name: aString;
+ projectReference: projectSpec;
+ yourself.
+ self root packages merge: spec.
+!
+
+setTimestampWithBlock: aBlock
+
+ | spec |
+ (spec := self root getTimestamp) == nil
+ ifTrue: [
+ spec := self project valueHolderSpec.
+ self root setTimestamp: spec ].
+ self with: spec during: aBlock
+!
+
+setTimestampWithString: aString
+
+ self root timestamp: aString
+! !
+
+!MetacelloAbstractVersionConstructor methodsFor:'api spec callbacks'!
+
+authorForVersion: aBlockOrString
+ aBlockOrString setAuthorInMetacelloConfig: self
+!
+
+baselineForVersion: aString
+ self setBaseline: aString
+!
+
+baselineForVersion: aString with: aBlock
+ aBlock setBaseline: aString withInMetacelloConfig: self
+!
+
+blessingForVersion: aBlockOrString
+ aBlockOrString setBlessingInMetacelloConfig: self
+!
+
+classNameForProject: aString
+ self root className: aString
+!
+
+configurationForVersion: aString with: aBlock
+ aBlock setConfiguration: aString withInMetacelloConfig: self
+!
+
+descriptionForVersion: aBlockOrString
+ aBlockOrString setDescriptionInMetacelloConfig: self
+!
+
+fileForPackage: aString
+ self root file: aString
+!
+
+fileForProject: aString
+ self root file: aString
+!
+
+groupForVersion: aString overrides: aStringOrCollection
+ | spec |
+ spec := self project groupSpec
+ name: aString;
+ includes: aStringOrCollection;
+ yourself.
+ self root packages add: spec
+!
+
+groupForVersion: aString with: aStringOrCollection
+ | spec |
+ spec := self project groupSpec
+ name: aString;
+ includes: aStringOrCollection;
+ yourself.
+ self root packages merge: spec
+!
+
+importForVersion: aString
+ self root import: aString
+!
+
+includesForPackage: anObject
+ self root includes: anObject
+!
+
+loadsForProject: anObject
+ self root loads: anObject
+!
+
+nameForProject: aString
+ self root name: aString
+!
+
+operatorForProject: anObject
+ self root operator: anObject
+!
+
+packageForVersion: aString
+ | spec |
+ spec := self project packageSpec
+ name: aString;
+ yourself.
+ self root packages add: spec
+!
+
+packageForVersion: aString overrides: aBlock
+ | spec |
+ spec := self project packageSpec
+ name: aString;
+ yourself.
+ self root packages add: spec.
+ self with: spec during: aBlock
+!
+
+packageForVersion: packageName with: aBlockOrString
+ aBlockOrString setPackage: packageName withInMetacelloConfig: self
+!
+
+postLoadDoItForPackage: aSymbol
+ self postLoadDoItForSpec: aSymbol
+!
+
+postLoadDoItForProject: aSymbol
+ self postLoadDoItForSpec: aSymbol
+!
+
+postLoadDoItForSpec: aSymbol
+ self validateDoItSelector: aSymbol.
+ self root postLoadDoIt: aSymbol
+!
+
+postLoadDoItForVersion: aSymbol
+ self postLoadDoItForSpec: aSymbol
+!
+
+preLoadDoItForPackage: aSymbol
+ self preLoadDoItForSpec: aSymbol
+!
+
+preLoadDoItForProject: aSymbol
+ self preLoadDoItForSpec: aSymbol
+!
+
+preLoadDoItForSpec: aSymbol
+ self validateDoItSelector: aSymbol.
+ self root preLoadDoIt: aSymbol
+!
+
+preLoadDoItForVersion: aSymbol
+ self preLoadDoItForSpec: aSymbol
+!
+
+projectForVersion: aString
+ self project: aString with: ''
+!
+
+projectForVersion: aString copyFrom: oldSpecName with: aBlock
+ | spec projectSpec |
+ projectSpec := self project projectSpec
+ name: aString;
+ yourself.
+ spec := self project projectReferenceSpec
+ name: aString;
+ projectReference: projectSpec;
+ yourself.
+ self root packages copy: oldSpecName to: spec.
+ self with: projectSpec during: aBlock
+!
+
+projectForVersion: aString overrides: aBlock
+ | spec projectSpec |
+ projectSpec := self project projectSpec
+ name: aString;
+ yourself.
+ spec := self project projectReferenceSpec
+ name: aString;
+ projectReference: projectSpec;
+ yourself.
+ self root packages add: spec.
+ self with: projectSpec during: aBlock
+!
+
+projectForVersion: aString with: aBlockOrString
+ aBlockOrString setProject: aString withInMetacelloConfig: self
+!
+
+projectPackageForProject: aBlock
+ self with: self root during: aBlock
+!
+
+removeGroupForVersion: aString
+ | spec |
+ spec := self project groupSpec
+ name: aString;
+ yourself.
+ self root packages remove: spec
+!
+
+removePackageForVersion: aString
+ | spec |
+ spec := self project packageSpec
+ name: aString;
+ yourself.
+ self root packages remove: spec
+!
+
+removeProjectForVersion: aString
+ | spec |
+ spec := self project projectReferenceSpec
+ name: aString;
+ yourself.
+ self root packages remove: spec
+!
+
+repositoriesForPackage: aBlock
+ self repositoriesForSpec: aBlock
+!
+
+repositoriesForProject: aBlock
+ self repositoriesForSpec: aBlock
+!
+
+repositoriesForSpec: aBlock
+ self with: self root repositories during: aBlock
+!
+
+repositoriesForVersion: aBlock
+ self repositoriesForSpec: aBlock
+!
+
+repositoryForPackage: anObject
+ self repositoryForSpec: anObject
+!
+
+repositoryForPackage: aString username: username password: password
+ self repositoryForSpec: aString username: username password: password
+!
+
+repositoryForProject: anObject
+ self repositoryForSpec: anObject
+!
+
+repositoryForProject: aString username: username password: password
+ self repositoryForSpec: aString username: username password: password
+!
+
+repositoryForRepositories: anObject
+ self repositoryForSpec: anObject
+!
+
+repositoryForRepositories: aString username: username password: password
+ self repositoryForVersion: aString username: username password: password
+!
+
+repositoryForSpec: anObject
+ self root repository: anObject
+!
+
+repositoryForSpec: aString username: username password: password
+ self root repository: aString username: username password: password
+!
+
+repositoryForVersion: anObject
+ self repositoryForSpec: anObject
+!
+
+repositoryForVersion: aString username: username password: password
+ self repositoryForSpec: aString username: username password: password
+!
+
+requiresForPackage: anObject
+ self root requires: anObject
+!
+
+supplyingAnswersForPackage: anObject
+ self root answers: anObject
+!
+
+timestampForVersion: aBlockOrStringOrDateAndTime
+ aBlockOrStringOrDateAndTime setTimestampInMetacelloConfig: self
+!
+
+valueForValueHolder: anObject
+ self root value: anObject
+!
+
+versionForProject: anObject
+ self versionStringForProject: anObject
+!
+
+versionForVersion: anObject
+ self versionStringForVersion: anObject
+!
+
+versionStringForProject: anObject
+ self root versionString: anObject
+!
+
+versionStringForVersion: anObject
+ self versionStringForProject: anObject
+! !
+
+!MetacelloAbstractVersionConstructor methodsFor:'initialization'!
+
+reset
+ attributeMap := attributeOrder := nil
+! !
+
+!MetacelloAbstractVersionConstructor methodsFor:'private'!
+
+evaluatePragma: pragma
+ currentContext := pragma.
+ [ self configuration perform: pragma selector with: self ] ensure: [ currentContext := nil ]
+!
+
+with: aMetacelloSpec during: aBlock
+ | previousRoot |
+ previousRoot := self root.
+ self root: aMetacelloSpec.
+ aBlock
+ ensure: [ self root: previousRoot ]
+! !
+
+!MetacelloAbstractVersionConstructor methodsFor:'validation'!
+
+validateDoItSelector: anObject
+
+ anObject == nil ifTrue: [ ^ self ].
+ anObject isSymbol ifFalse: [ self error: 'Invalid message selector for doit: ', anObject printString ].
+! !
+
+!MetacelloAbstractVersionConstructor class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloAddMemberSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,35 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMemberSpec subclass:#MetacelloAddMemberSpec
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Members'
+!
+
+
+!MetacelloAddMemberSpec methodsFor:'accessing'!
+
+methodUpdateSelector
+
+ ^#overrides:
+! !
+
+!MetacelloAddMemberSpec methodsFor:'actions'!
+
+applyAdd: addBlock copy: copyBlock merge: mergeBlock remove: removeBlock
+
+ addBlock value: self
+!
+
+applyToList: aListSpec
+
+ aListSpec add: self
+! !
+
+!MetacelloAddMemberSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloAllowConflictingProjectUpgrade.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,37 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloResolveProjectUpgrade subclass:#MetacelloAllowConflictingProjectUpgrade
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloAllowConflictingProjectUpgrade methodsFor:'accessing'!
+
+operationString
+ ^ 'conflict'
+! !
+
+!MetacelloAllowConflictingProjectUpgrade methodsFor:'exception handling'!
+
+defaultAction
+ ^ MetacelloConflictingProjectError
+ signal:
+ 'Load Conflict between existing ' , self existingProjectRegistration printString , ' and '
+ , self newProjectRegistration printString
+! !
+
+!MetacelloAllowConflictingProjectUpgrade methodsFor:'handlers'!
+
+handleResolutionFor: aScriptEngine
+ ^ aScriptEngine handleConflict: self
+! !
+
+!MetacelloAllowConflictingProjectUpgrade class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloAllowProjectDowngrade.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,32 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloResolveProjectUpgrade subclass:#MetacelloAllowProjectDowngrade
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloAllowProjectDowngrade methodsFor:'accessing'!
+
+operationString
+ ^ 'downgrade'
+! !
+
+!MetacelloAllowProjectDowngrade methodsFor:'handlers'!
+
+handleOnDownGrade: onDownGradeBlock onUpgrade: onUpgradeBlock
+ ^ onDownGradeBlock cull: self cull: self existingProjectRegistration cull: self newProjectRegistration
+!
+
+handleResolutionFor: aScriptEngine
+ ^ aScriptEngine handleDowngrade: self
+! !
+
+!MetacelloAllowProjectDowngrade class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloAllowProjectUpgrade.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,41 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloResolveProjectUpgrade subclass:#MetacelloAllowProjectUpgrade
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloAllowProjectUpgrade methodsFor:'accessing'!
+
+operationString
+ ^ 'upgrade'
+! !
+
+!MetacelloAllowProjectUpgrade methodsFor:'exception handling'!
+
+defaultAction
+ "Default for Upgrade is to allow"
+
+ self checkAllowed.
+ ^ self newProjectRegistration
+! !
+
+!MetacelloAllowProjectUpgrade methodsFor:'handlers'!
+
+handleOnDownGrade: onDownGradeBlock onUpgrade: onUpgradeBlock
+ ^ onUpgradeBlock cull: self cull: self existingProjectRegistration cull: self newProjectRegistration
+!
+
+handleResolutionFor: aScriptEngine
+ ^ aScriptEngine handleUpgrade: self
+! !
+
+!MetacelloAllowProjectUpgrade class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloBaseConfiguration.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+ConfigurationOf subclass:#MetacelloBaseConfiguration
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Deprecated'
+!
+
+
+!MetacelloBaseConfiguration class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloBaselineConstructor.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,84 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloAbstractVersionConstructor subclass:#MetacelloBaselineConstructor
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloBaselineConstructor class methodsFor:'instance creation'!
+
+on: aConfig
+ ^ self new
+ on: aConfig;
+ yourself
+!
+
+on: aConfig project: aProject
+ ^ self new
+ on: aConfig project: aProject;
+ yourself
+! !
+
+!MetacelloBaselineConstructor methodsFor:'accessing'!
+
+projectClass
+ ^ MetacelloMCBaselineProject
+! !
+
+!MetacelloBaselineConstructor methodsFor:'initialization'!
+
+on: aConfig
+ self calculate: aConfig project: nil
+!
+
+on: aConfig project: aProject
+ self calculate: aConfig project: aProject
+! !
+
+!MetacelloBaselineConstructor methodsFor:'pragma extraction'!
+
+extractBaselinePragmaFor: aClass
+ | pragmas |
+ pragmas := Pragma allNamed: #'baseline' in: aClass.
+ pragmas isEmpty
+ ifTrue: [ ^ self error: 'No #baseline pragma found' ].
+ ^ pragmas first
+! !
+
+!MetacelloBaselineConstructor methodsFor:'private'!
+
+calculate: aConfig project: aProject
+ | pragma versionMap versionSpec |
+ self configuration: aConfig.
+ pragma := self extractBaselinePragmaFor: aConfig class.
+ self
+ setProject:
+ (aProject
+ ifNil: [
+ [ aConfig class project ]
+ on: MessageNotUnderstood
+ do: [ :ex | ex return: nil ] ]).
+ versionSpec := self project versionSpec.
+ self root: versionSpec.
+ self evaluatePragma: pragma.
+ versionMap := Dictionary new.
+ self project attributes
+ do: [ :attribute |
+ | blockList |
+ (blockList := self attributeMap at: attribute ifAbsent: [ ]) ~~ nil
+ ifTrue: [ blockList do: [ :block | self with: versionSpec during: block ] ] ].
+ versionSpec versionString: self project singletonVersionName.
+ versionMap at: versionSpec versionString put: versionSpec createVersion.
+ self project map: versionMap.
+ self project configuration: aConfig
+! !
+
+!MetacelloBaselineConstructor class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloBaselineSpecGenerator.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,33 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloProjectSpecGenerator subclass:#MetacelloBaselineSpecGenerator
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloBaselineSpecGenerator methodsFor:'accessing'!
+
+projectSpecCreationBlock
+ ^ [ :projectName | {(MetacelloMCBaselineProject new baselineOfProjectSpec name: projectName)} ]
+!
+
+projectSpecListBlock
+ ^ [ MetacelloProjectRegistration baselineProjectSpecs ]
+!
+
+projectSpecLookupBlock
+ ^ [ :projectName |
+ {(MetacelloProjectRegistration
+ projectSpecForClassNamed: (MetacelloScriptEngine baselineNameFrom: projectName)
+ ifAbsent: [ ])} ]
+! !
+
+!MetacelloBaselineSpecGenerator class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloCannotUpdateReleasedVersionError.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,24 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Error subclass:#MetacelloCannotUpdateReleasedVersionError
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloCannotUpdateReleasedVersionError methodsFor:'private'!
+
+isResumable
+ "Determine whether an exception is resumable."
+
+ ^ true
+! !
+
+!MetacelloCannotUpdateReleasedVersionError class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloCleanLoadAndTestsNotification.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloCleanNotification subclass:#MetacelloCleanLoadAndTestsNotification
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloCleanLoadAndTestsNotification class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloCleanLoadNotification.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloCleanNotification subclass:#MetacelloCleanLoadNotification
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloCleanLoadNotification class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloCleanNotification.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,43 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloCleanNotification
+ instanceVariableNames:'version'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloCleanNotification class methodsFor:'exceptioninstantiator'!
+
+signal: aMetacelloVersion
+
+ ^ self new signal: aMetacelloVersion
+! !
+
+!MetacelloCleanNotification methodsFor:'accessing'!
+
+version
+ ^ version
+!
+
+version: anObject
+ version := anObject
+! !
+
+!MetacelloCleanNotification methodsFor:'signaling'!
+
+signal: aMetacelloVersion
+
+ self version: aMetacelloVersion.
+ ^ self raiseRequest
+
+ "Modified: / 02-10-2012 / 23:31:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloCleanNotification class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloClearStackCacheNotification.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,37 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloClearStackCacheNotification
+ instanceVariableNames:'cacheNames'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloClearStackCacheNotification methodsFor:'accessing'!
+
+cacheNames
+ ^ cacheNames
+!
+
+cacheNames: anArray
+ cacheNames := anArray
+! !
+
+!MetacelloClearStackCacheNotification methodsFor:'signaling'!
+
+signal: anArray
+ "Signal the occurrence of an exceptional condition with a specified cacheName."
+
+ self cacheNames: anArray.
+ ^ self raiseSignal
+
+ "Modified: / 02-10-2012 / 23:34:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloClearStackCacheNotification class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloConfigurationSpecGenerator.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,33 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloProjectSpecGenerator subclass:#MetacelloConfigurationSpecGenerator
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloConfigurationSpecGenerator methodsFor:'accessing'!
+
+projectSpecCreationBlock
+ ^ [ :projectName | {(MetacelloMCProject new configurationOfProjectSpec name: projectName)} ]
+!
+
+projectSpecListBlock
+ ^ [ MetacelloProjectRegistration configurationProjectSpecs ]
+!
+
+projectSpecLookupBlock
+ ^ [ :projectName |
+ {(MetacelloProjectRegistration
+ projectSpecForClassNamed: (MetacelloScriptEngine configurationNameFrom: projectName)
+ ifAbsent: [ ])} ]
+! !
+
+!MetacelloConfigurationSpecGenerator class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloConflictingProjectError.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptingError subclass:#MetacelloConflictingProjectError
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloConflictingProjectError class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloCopyMemberSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,44 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMemberSpec subclass:#MetacelloCopyMemberSpec
+ instanceVariableNames:'sourceName'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Members'
+!
+
+
+!MetacelloCopyMemberSpec methodsFor:'accessing'!
+
+methodUpdateSelector
+
+ ^#copy:
+!
+
+sourceName
+
+ ^sourceName
+!
+
+sourceName: aString
+
+ sourceName := aString
+! !
+
+!MetacelloCopyMemberSpec methodsFor:'actions'!
+
+applyAdd: addBlock copy: copyBlock merge: mergeBlock remove: removeBlock
+ copyBlock value: self
+!
+
+applyToList: aListSpec
+
+ aListSpec copy: self
+! !
+
+!MetacelloCopyMemberSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloErrorInProjectConstructionNotification.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,54 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloErrorInProjectConstructionNotification
+ instanceVariableNames:'versionString exception'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloErrorInProjectConstructionNotification class methodsFor:'instance creation'!
+
+versionString: aString exception: anException
+ ^ self new
+ versionString: aString;
+ exception: anException;
+ raiseSignal
+
+ "Modified: / 02-10-2012 / 23:33:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloErrorInProjectConstructionNotification methodsFor:'accessing'!
+
+exception
+ ^ exception
+!
+
+exception: anObject
+ exception := anObject
+!
+
+versionString
+ ^ versionString
+!
+
+versionString: anObject
+ versionString := anObject
+! !
+
+!MetacelloErrorInProjectConstructionNotification methodsFor:'exception description'!
+
+defaultAction
+ "Answer false if you want the version recorded in the errorMap.
+ Answer true if you want to go ahead and throw the error"
+
+ ^ false
+! !
+
+!MetacelloErrorInProjectConstructionNotification class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloGenericProjectSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,174 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+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) raiseSignal performLoad
+
+ "Modified: / 02-10-2012 / 23:33:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+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:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloGroupSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,64 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloAbstractPackageSpec subclass:#MetacelloGroupSpec
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloGroupSpec methodsFor:'accessing'!
+
+answers: aListOfPairs
+
+ self shouldNotImplement
+!
+
+requires: aCollection
+
+ self shouldNotImplement
+! !
+
+!MetacelloGroupSpec methodsFor:'printing'!
+
+configMethodCascadeOn: aStream member: aMember last: lastCascade indent: indent
+
+ aMember methodUpdateSelector == #remove:
+ ifTrue: [ aStream nextPutAll: 'removeGroup: ', self name printString. ]
+ ifFalse: [
+ aStream
+ nextPutAll: 'group: ', self name printString;
+ space;
+ nextPutAll: aMember methodUpdateSelector asString, ' #('.
+ self includes do: [:str | aStream nextPutAll: str printString, ' ' ].
+ aStream nextPut: $) ].
+ lastCascade
+ ifTrue: [ aStream nextPut: $. ]
+ ifFalse: [ aStream nextPut: $;; cr ].
+!
+
+configMethodOn: aStream indent: indent
+
+ aStream
+ tab: indent;
+ nextPutAll: 'spec '; cr;
+ tab: indent + 1;
+ nextPutAll: 'name: ', self name printString, ';'.
+ self configMethodBodyOn: aStream hasName: true cascading: false indent: indent + 1.
+ aStream nextPut: $.
+! !
+
+!MetacelloGroupSpec methodsFor:'visiting'!
+
+projectDo: projectBlock packageDo: packageBlock groupDo: groupBlock
+
+ groupBlock value: self
+! !
+
+!MetacelloGroupSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloLockedProjectError.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptingError subclass:#MetacelloLockedProjectError
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloLockedProjectError class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloLookupBaselineSpecForEnsureLoad.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,30 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptProjectSpecNotification subclass:#MetacelloLookupBaselineSpecForEnsureLoad
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloLookupBaselineSpecForEnsureLoad methodsFor:'exception description'!
+
+defaultAction
+ "Answer <true> if you want to ensure the load of the baseline ... default is to load the baseline"
+
+ ^ true
+! !
+
+!MetacelloLookupBaselineSpecForEnsureLoad methodsFor:'handlers'!
+
+handleResolutionFor: aScriptEngine
+ ^ aScriptEngine handleLookupBaselineSpecForEnsureLoad: self
+! !
+
+!MetacelloLookupBaselineSpecForEnsureLoad class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloLookupProjectSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,22 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptProjectSpecNotification subclass:#MetacelloLookupProjectSpec
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloLookupProjectSpec methodsFor:'handlers'!
+
+handleResolutionFor: aScriptEngine
+ ^ aScriptEngine handleLookupProjectSpec: self
+! !
+
+!MetacelloLookupProjectSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloLookupProjectSpecForLoad.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,33 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptProjectSpecNotification subclass:#MetacelloLookupProjectSpecForLoad
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloLookupProjectSpecForLoad methodsFor:'exception description'!
+
+defaultAction
+ "Result of signal should be the MetacelloProjectSpecForLoad to be used to perform the load.
+ Create a MetacelloProjectSpecForLoad and use the overrideProjectSpec: if you want to supply a different projectSpec"
+
+ ^ MetacelloProjectSpecForLoad new
+ projectSpec: self projectSpec;
+ yourself
+! !
+
+!MetacelloLookupProjectSpecForLoad methodsFor:'handlers'!
+
+handleResolutionFor: aScriptEngine
+ ^ aScriptEngine handleLookupProjectSpecForLoad: self
+! !
+
+!MetacelloLookupProjectSpecForLoad class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloMemberListSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,220 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloSpec subclass:#MetacelloMemberListSpec
+ instanceVariableNames:'list memberMap'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Members'
+!
+
+
+!MetacelloMemberListSpec methodsFor:'accessing'!
+
+list
+
+ list == nil ifTrue: [ list := OrderedCollection new ].
+ ^list
+!
+
+list: aCollection
+
+ list := aCollection.
+ self clearMemberMap
+!
+
+map
+
+ | map |
+ memberMap notNil ifTrue: [ ^memberMap ].
+ map := Dictionary new.
+ self list do: [:member |
+ member
+ applyAdd: [:memberSpec | self mapAdd: memberSpec into: map ]
+ copy: [:memberSpec | self mapCopy: memberSpec into: map ]
+ merge: [:memberSpec | self mapMerge: memberSpec into: map ]
+ remove: [:memberSpec | self mapRemove: memberSpec into: map ]].
+ memberMap := map.
+ ^memberMap
+
+ "Modified: / 03-10-2012 / 22:15:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloMemberListSpec methodsFor:'actions'!
+
+add: aSpec
+
+ self subclassResponsibility
+!
+
+copy: aMemberSpec
+
+ self addMember: aMemberSpec
+!
+
+copy: specNamed to: aSpec
+
+ self subclassResponsibility
+!
+
+merge: aSpec
+
+ self subclassResponsibility
+!
+
+remove: aSpec
+
+ self subclassResponsibility
+! !
+
+!MetacelloMemberListSpec methodsFor:'adding'!
+
+addMember: aMember
+
+ self list add: aMember.
+ self clearMemberMap
+! !
+
+!MetacelloMemberListSpec methodsFor:'copying'!
+
+postCopy
+
+ super postCopy.
+ list := list copy.
+ self clearMemberMap
+! !
+
+!MetacelloMemberListSpec methodsFor:'enumeration'!
+
+collect: aBlock
+ | newCollection |
+ newCollection :=OrderedCollection new.
+ self do: [:each | newCollection add: (aBlock value: each)].
+ ^ newCollection
+!
+
+detect: aBlock
+ "Evaluate aBlock with each of the receiver's elements as the argument.
+ Answer the first element for which aBlock evaluates to true."
+
+ ^ self detect: aBlock ifNone: [ self error: 'Object is not in the collection.' ]
+!
+
+detect: aBlock ifNone: exceptionBlock
+ "Evaluate aBlock with each of the receiver's elements as the argument.
+ Answer the first element for which aBlock evaluates to true. If none
+ evaluate to true, then evaluate the argument, exceptionBlock."
+
+ self
+ do: [ :each |
+ (aBlock value: each)
+ ifTrue: [ ^ each ] ].
+ ^ exceptionBlock value
+!
+
+do: aBlock
+
+ self map values do: aBlock
+!
+
+select: aBlock
+ | newCollection |
+ newCollection := OrderedCollection new.
+ self do: [:each | (aBlock value: each) ifTrue: [newCollection add: each]].
+ ^newCollection
+!
+
+specListDetect: aBlock
+ "Evaluate aBlock with each of the receiver's elements as the argument.
+ Answer the first element for which aBlock evaluates to true."
+
+ ^ self specListDetect: aBlock ifNone: [ self error: 'Object is not in the collection.' ]
+!
+
+specListDetect: aBlock ifNone: exceptionBlock
+ "Evaluate aBlock with each of the receiver's elements as the argument.
+ Answer the first element for which aBlock evaluates to true. If none
+ evaluate to true, then evaluate the argument, exceptionBlock."
+
+ self
+ specListDo: [ :each |
+ (aBlock value: each)
+ ifTrue: [ ^ each ] ].
+ ^ exceptionBlock value
+!
+
+specListDo: aBlock
+
+ self list do: [:member | aBlock value: member spec ]
+!
+
+specListSelect: aBlock
+ | newCollection |
+ newCollection := OrderedCollection new.
+ self specListDo: [:each | (aBlock value: each) ifTrue: [newCollection add: each]].
+ ^newCollection
+! !
+
+!MetacelloMemberListSpec methodsFor:'merging'!
+
+mergeSpec: anotherSpec
+
+ | newSpec val |
+ newSpec := super mergeSpec: anotherSpec.
+ newSpec list: self list copy.
+ anotherSpec list do: [:groupMember | groupMember applyToList: newSpec ].
+ ^newSpec
+! !
+
+!MetacelloMemberListSpec methodsFor:'private'!
+
+clearMemberMap
+
+ memberMap := nil.
+!
+
+mapAdd: aMemberSpec into: map
+
+ map at: aMemberSpec name put: aMemberSpec spec
+!
+
+mapCopy: aMemberSpec into: map
+ | spec |
+ spec := map at: aMemberSpec sourceName ifAbsent: [ ].
+ spec == nil
+ ifTrue: [ ^ self error: 'Source spec named ' , aMemberSpec sourceName printString , ' not found' ]
+ ifFalse: [
+ spec aboutToCopy.
+ map at: aMemberSpec name put: (spec copy mergeSpec: aMemberSpec spec copy) ]
+!
+
+mapMerge: aMemberSpec into: map
+ | spec |
+ spec := map at: aMemberSpec name ifAbsent: [].
+ spec == nil
+ ifTrue: [ map at: aMemberSpec name put: aMemberSpec spec copy ]
+ ifFalse: [ map at: aMemberSpec name put: (spec mergeSpec: aMemberSpec spec)]
+!
+
+mapRemove: aMemberSpec into: map
+
+ map removeKey: aMemberSpec name ifAbsent: []
+! !
+
+!MetacelloMemberListSpec methodsFor:'testing'!
+
+isEmpty
+
+ ^self list isEmpty
+!
+
+notEmpty
+
+ ^self list notEmpty
+! !
+
+!MetacelloMemberListSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloMemberSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,79 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloSpec subclass:#MetacelloMemberSpec
+ instanceVariableNames:'name spec'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Members'
+!
+
+
+!MetacelloMemberSpec methodsFor:'accessing'!
+
+methodUpdateSelector
+
+ ^self subclassResponsibility
+!
+
+name
+
+ ^name
+!
+
+name: aString
+
+ name := aString
+!
+
+sourceName
+
+ ^self name
+!
+
+spec
+
+ ^spec
+!
+
+spec: aMetacelloSpec
+
+ spec := aMetacelloSpec
+! !
+
+!MetacelloMemberSpec methodsFor:'actions'!
+
+applyAdd: addBlock copy: copyBlock merge: mergeBlock remove: removeBlock
+
+ self subclassResponsibility
+
+!
+
+applyToList: aListSpec
+
+ self subclassResponsibility
+! !
+
+!MetacelloMemberSpec methodsFor:'printing'!
+
+configMethodCascadeOn: aStream last: lastCascade indent: indent
+
+ self spec
+ configMethodCascadeOn: aStream
+ member: self
+ last: lastCascade
+ indent: indent
+!
+
+configMethodOn: aStream indent: indent
+
+ aStream nextPutAll: self class name asString, ' member: ('.
+ self spec configMethodOn: aStream indent: indent.
+ aStream nextPutAll: ')'.
+! !
+
+!MetacelloMemberSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloMergeMemberSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,35 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMemberSpec subclass:#MetacelloMergeMemberSpec
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Members'
+!
+
+
+!MetacelloMergeMemberSpec methodsFor:'accessing'!
+
+methodUpdateSelector
+
+ ^#with:
+! !
+
+!MetacelloMergeMemberSpec methodsFor:'actions'!
+
+applyAdd: addBlock copy: copyBlock merge: mergeBlock remove: removeBlock
+
+ mergeBlock value: self
+!
+
+applyToList: aListSpec
+
+ aListSpec merge: self
+! !
+
+!MetacelloMergeMemberSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloMethodSection.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,26 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloMethodSection
+ instanceVariableNames:'attribute'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloMethodSection methodsFor:'accessing'!
+
+attribute
+ ^ attribute
+!
+
+attribute: anObject
+ attribute := anObject
+! !
+
+!MetacelloMethodSection class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloMethodSectionPath.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,33 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Array variableSubclass:#MetacelloMethodSectionPath
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloMethodSectionPath methodsFor:'conversion'!
+
+asAttributeOrPath
+ self size = 1
+ ifTrue: [
+ | attribute |
+ attribute := self at: 1.
+ ^ attribute size = 1
+ ifTrue: [ attribute at: 1 ]
+ ifFalse: [ attribute ] ].
+ ^ self
+!
+
+asMetacelloAttributePath
+ ^ self
+! !
+
+!MetacelloMethodSectionPath class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloMethodSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,75 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloMethodSpec
+ instanceVariableNames:'project selector category versionString methodSections'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloMethodSpec methodsFor:'accessing'!
+
+category
+ ^ category
+!
+
+category: anObject
+ category := anObject
+!
+
+methodSections
+
+ methodSections == nil ifTrue: [ methodSections := OrderedCollection new ].
+ ^ methodSections
+!
+
+methodSections: anObject
+ methodSections := anObject
+!
+
+project
+ ^ project
+!
+
+project: anObject
+ project := anObject
+!
+
+selector
+ ^ selector
+!
+
+selector: anObject
+ selector := anObject
+!
+
+versionString
+ ^ versionString
+!
+
+versionString: aStringOrSymbol
+ versionString := aStringOrSymbol
+! !
+
+!MetacelloMethodSpec methodsFor:'method generation'!
+
+compileMethod
+
+ (project configuration class
+ compile: self methodSource
+ classified: self category) == nil
+ ifTrue: [ self error: 'Error compiling the method' ]
+!
+
+methodSource
+
+ self subclassResponsibility
+! !
+
+!MetacelloMethodSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloPackageSpecResolutionError.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,63 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Error subclass:#MetacelloPackageSpecResolutionError
+ instanceVariableNames:'packageSpec repositories repositoryError'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloPackageSpecResolutionError methodsFor:'accessing'!
+
+description
+ "Return a textual description of the exception."
+
+ ^ 'Could not resolve: ' , packageSpec name , ' [' , packageSpec file , ']' , ' in' , self repositoryString
+ ,
+ (repositoryError == nil
+ ifTrue: [ '' ]
+ ifFalse: [
+ "report repository error to user here, since failure here is likely to be due to earlier repository error"
+ ' ERROR: ' , repositoryError description printString ])
+!
+
+packageSpec
+ ^ packageSpec
+!
+
+packageSpec: anObject
+ packageSpec := anObject
+!
+
+repositories
+ ^ repositories
+!
+
+repositories: anObject
+ repositories := anObject
+!
+
+repositoryError
+ ^ repositoryError
+!
+
+repositoryError: anObject
+ repositoryError := anObject
+! !
+
+!MetacelloPackageSpecResolutionError methodsFor:'private'!
+
+repositoryString
+ | repositoryString |
+ repositoryString := ''.
+ self repositories do: [ :repo | repositoryString := repositoryString , ' ' , repo description ].
+ ^ repositoryString
+! !
+
+!MetacelloPackageSpecResolutionError class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloPackagesSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,207 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMemberListSpec subclass:#MetacelloPackagesSpec
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloPackagesSpec methodsFor:'accessing'!
+
+applyIncludesTo: orderedSpecs for: pkgSpec firstTime: firstTime
+ | movedSpecs baseIndex includedSpec result |
+ movedSpecs := Set new.
+ baseIndex := orderedSpecs indexOf: pkgSpec.
+ pkgSpec includesForPackageOrdering
+ do: [:includedSpecName |
+ includedSpec := orderedSpecs
+ detect: [:spec | spec name = includedSpecName ]
+ ifNone: [].
+ (self slideIn: orderedSpecs spec: includedSpec baseIndex: baseIndex seen: IdentitySet new firstTime: firstTime)
+ ifTrue: [ movedSpecs add: includedSpec name ]].
+ ^ movedSpecs
+!
+
+packageNamed: aString ifAbsent: aBlock
+
+ ^self map at: aString ifAbsent: aBlock
+!
+
+packageSpecsInLoadOrder
+ | orderedSpecs moved lastMovedSpecs count terminationLimit map specsWithIncludes firstTime |
+ "specification order is the default order"
+ map := self map.
+ orderedSpecs := OrderedCollection new.
+ self list
+ do: [ :member |
+ | spec |
+ spec := map at: member name ifAbsent: [ ].
+ (spec == nil or: [ orderedSpecs includes: spec ])
+ ifFalse: [ orderedSpecs add: spec ] ].
+ orderedSpecs isEmpty
+ ifTrue: [ ^ orderedSpecs ].
+ moved := true.
+ count := 0.
+ terminationLimit := orderedSpecs size * 2.
+ [ moved ]
+ whileTrue: [
+ count := count + 1.
+ count > terminationLimit
+ ifTrue: [
+ "Cheap termination hack - an APPARENT loop"
+ self error: 'Apparent loop in before/after dependency definitions' ].
+ moved := false.
+ orderedSpecs
+ do: [ :packageSpec | moved := moved or: [ self sortPackageSpecs: orderedSpecs for: packageSpec ] ] ].
+ lastMovedSpecs := Set new.
+ moved := true.
+ count := 0.
+ specsWithIncludes := orderedSpecs select: [ :pkgSpec | pkgSpec includesForPackageOrdering isEmpty not ].
+ firstTime := true.
+ [ moved ]
+ whileTrue: [
+ | result |
+ count := count + 1. "count > terminationLimit"
+ count > 14
+ ifTrue: [
+ "Cheap termination hack - an APPARENT loop"
+ self error: 'Apparent loop in before/after dependency definitions' ].
+ moved := false.
+ result := Set new.
+ specsWithIncludes
+ do: [ :packageSpec | result addAll: (self applyIncludesTo: orderedSpecs for: packageSpec firstTime: firstTime) ].
+ result size = lastMovedSpecs size
+ ifTrue: [
+ result
+ do: [ :name |
+ (lastMovedSpecs includes: name)
+ ifFalse: [ moved := true ] ] ]
+ ifFalse: [ moved := true ].
+ lastMovedSpecs := result.
+ firstTime := false ].
+ ^ orderedSpecs
+!
+
+slideIn: orderedSpecs spec: targetSpec baseIndex: baseIndex seen: seen firstTime: firstTime
+ | targetIndex requires targetRequires targetRequiresIndexes minIndex baseSpec required |
+
+ (seen includes: targetSpec) ifTrue: [ ^false ].
+ targetIndex := orderedSpecs indexOf: targetSpec.
+ baseIndex >= targetIndex ifTrue: [ ^false ].
+ required := false.
+ baseSpec := orderedSpecs at: baseIndex.
+ baseIndex + 1 to: targetIndex - 1 do: [:index | | spec |
+ spec := orderedSpecs at: index.
+ (spec requires includes: baseSpec name) ifTrue: [ required := true ]].
+ firstTime ifFalse: [ required ifFalse: [ ^false ]].
+ requires := targetSpec requires.
+ targetRequires := orderedSpecs
+ select: [:spec | requires includes: spec name].
+ targetRequiresIndexes := targetRequires
+ collect: [:spec | orderedSpecs indexOf: spec].
+ targetRequiresIndexes add: baseIndex.
+ minIndex := targetRequiresIndexes
+ detectMax: [:each | each].
+ minIndex + 1 < targetIndex
+ ifTrue: [
+ orderedSpecs remove: targetSpec.
+ orderedSpecs add: targetSpec afterIndex: minIndex.
+ seen add: targetSpec ]
+ ifFalse: [ ^self slideIn: orderedSpecs spec: (orderedSpecs at: minIndex) baseIndex: 1 seen: seen firstTime: firstTime].
+ ^true
+! !
+
+!MetacelloPackagesSpec methodsFor:'actions'!
+
+add: aSpec
+
+ aSpec addToMetacelloPackages: self
+!
+
+copy: specNamed to: spec
+
+ self addMember:
+ (self copyMember
+ name: spec name;
+ sourceName: specNamed;
+ spec: spec;
+ yourself)
+!
+
+merge: aSpec
+
+ aSpec mergeIntoMetacelloPackages: self
+!
+
+remove: aSpec
+
+ aSpec removeFromMetacelloPackages: self
+! !
+
+!MetacelloPackagesSpec methodsFor:'printing'!
+
+configMethodOn: aStream indent: indent
+
+ | packageSpecs |
+ packageSpecs := self map values.
+ packageSpecs size = 0 ifTrue: [ ^aStream nextPutAll: 'spec add: []' ].
+ packageSpecs size = 1
+ ifTrue: [
+ aStream
+ tab: indent;
+ nextPutAll: 'spec add: ['; cr.
+ packageSpecs first configMethodOn: aStream indent: indent + 1.
+ aStream nextPut: $]; cr ]
+ ifFalse: [
+ aStream
+ tab: indent;
+ nextPutAll: 'spec'.
+ 1 to: packageSpecs size do: [:index | | packageSpec |
+ packageSpec := packageSpecs at: index.
+ aStream
+ tab: indent + 1;
+ nextPutAll: 'add: ['; cr.
+ packageSpec configMethodOn: aStream indent: indent + 2.
+ aStream nextPut: $].
+ index < packageSpecs size
+ ifTrue: [ aStream nextPut: $; ].
+ aStream cr ]]
+! !
+
+!MetacelloPackagesSpec methodsFor:'private'!
+
+sortPackageSpecs: orderedSpecs for: packageSpec
+
+ | packageIndex moved movePackage targetPackage targetIndex targetPackages |
+ packageIndex := orderedSpecs indexOf: packageSpec.
+ moved := movePackage := false.
+ targetPackages := packageSpec requires.
+ targetPackages do: [:targetPackageName |
+ targetPackage := orderedSpecs
+ detect: [:each | each name = targetPackageName ]
+ ifNone: [].
+ targetIndex := orderedSpecs indexOf: targetPackage.
+ movePackage := movePackage or: [ packageIndex <= targetIndex ]].
+ movePackage
+ ifTrue: [
+ moved := true.
+ orderedSpecs remove: packageSpec ifAbsent: [ ^self error: 'unexpected error removing package' ].
+ targetIndex := 0.
+ targetPackages do: [:targetPackageName |
+ (targetPackage := orderedSpecs detect: [:each |
+ each name = targetPackageName ] ifNone: []) ~~ nil
+ ifTrue: [ targetIndex := targetIndex max: (orderedSpecs indexOf: targetPackage) ]].
+ targetIndex == 0
+ ifTrue: [ orderedSpecs add: packageSpec beforeIndex: packageIndex ]
+ ifFalse: [ orderedSpecs add: packageSpec afterIndex: targetIndex ]].
+ ^moved
+! !
+
+!MetacelloPackagesSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloPlatform.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,321 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloPlatform
+ instanceVariableNames:'bypassProgressBars bypassGoferLoadUpdateCategories'
+ classVariableNames:'Current'
+ poolDictionaries:''
+ category:'Metacello-Core-Model'
+!
+
+
+!MetacelloPlatform class methodsFor:'accessing'!
+
+current
+ Current
+ ifNil: [Current := MetacelloPlatform new].
+ ^ Current
+! !
+
+!MetacelloPlatform class methodsFor:'initialize-release'!
+
+initialize
+ "MetacelloPlatform initialize"
+ "MetacelloGemStonePlatform initialize"
+ "MetacelloPharoPlatform initialize"
+ "MetacelloSqueakPlatform initialize"
+
+ Current := self new
+! !
+
+!MetacelloPlatform methodsFor:'accessing'!
+
+bypassGoferLoadUpdateCategories
+
+ bypassGoferLoadUpdateCategories == nil ifTrue: [ bypassGoferLoadUpdateCategories := false ].
+ ^ bypassGoferLoadUpdateCategories
+!
+
+bypassGoferLoadUpdateCategories: anObject
+ bypassGoferLoadUpdateCategories := anObject
+!
+
+bypassProgressBars
+
+ bypassProgressBars == nil ifTrue: [ bypassProgressBars := false ].
+ ^ bypassProgressBars
+!
+
+bypassProgressBars: anObject
+ bypassProgressBars := anObject
+! !
+
+!MetacelloPlatform methodsFor:'attributes'!
+
+defaultPlatformAttributes
+ | versionString |
+ Smalltalk at: #SystemVersion ifPresent: [:cl |
+ versionString := cl current version.
+ (versionString beginsWith: 'Pharo')
+ ifTrue: [ ^ #(#squeakCommon #pharo ) ].
+ (versionString beginsWith: 'Squeak')
+ ifTrue: [^ #(#squeakCommon #squeak )].
+ "see http://code.google.com/p/metacello/issues/detail?id=146"
+ (versionString includesSubString: 'Pharo')
+ ifTrue: [ ^ #(#squeakCommon #pharo ) ].
+ (versionString includesSubString: 'Squeak')
+ ifTrue: [^ #(#squeakCommon #squeak )].
+ self error: 'Unrecognized version of Squeak/Pharo: ', versionString ].
+ ^ #(#gemstone )
+! !
+
+!MetacelloPlatform methodsFor:'caching'!
+
+clearCurrentVersionCache
+ MetacelloClearStackCacheNotification signal: #(#currentVersion #currentVersionAgainst: #currentVersionInfo)
+!
+
+primeStackCacheFor: cacheName doing: noArgBlock defaultDictionary: aDictionary
+
+ self deprecated: 'use #primeStackCacheWith:doing:'.
+ self
+ useStackCacheDuring: [:dict | | cache |
+ cache := dict at: cacheName ifAbsent: [].
+ cache == nil
+ ifTrue: [
+ cache := Dictionary new.
+ dict at: cacheName put: cache ].
+ ^noArgBlock value ]
+ defaultDictionary: aDictionary
+!
+
+primeStackCacheWith: aDictionary doing: noArgBlock
+
+ self
+ useStackCacheDuring: [:dict | ^noArgBlock value ]
+ defaultDictionary: aDictionary
+!
+
+stackCacheFor: cacheName at: key doing: aBlock
+
+ ^self stackCacheFor: cacheName cacheClass: Dictionary at: key doing: aBlock
+!
+
+stackCacheFor: cacheName cacheClass: cacheClass at: key doing: aBlock
+
+ self
+ useStackCacheDuring: [:dict | | cache |
+ cache := dict at: cacheName ifAbsent: [].
+ cache ~~ nil
+ ifTrue: [ | value hasEntry |
+ hasEntry := true.
+ value := cache at: key ifAbsent: [ hasEntry := false ].
+ hasEntry ifTrue: [ ^value ]]
+ ifFalse: [
+ cache := cacheClass new.
+ dict at: cacheName put: cache ].
+ ^aBlock value: cache ]
+ defaultDictionary: nil
+!
+
+useStackCacheDuring: aBlock defaultDictionary: defaultDictionary
+ | dict |
+ dict := MetacelloStackCacheNotification raiseSignal.
+ dict == nil
+ ifTrue: [
+ dict := defaultDictionary == nil
+ ifTrue: [ Dictionary new ]
+ ifFalse: [ defaultDictionary ] ].
+ [ ^ aBlock value: dict ]
+ on: MetacelloStackCacheNotification , MetacelloClearStackCacheNotification
+ do: [ :ex |
+ (ex isKindOf: MetacelloStackCacheNotification)
+ ifTrue: [ ex resume: dict ].
+ (ex isKindOf: MetacelloClearStackCacheNotification)
+ ifTrue: [
+ | keys |
+ keys := ex cacheNames.
+ keys ifNil: [ keys := dict keys ].
+ keys
+ do: [ :k |
+ (dict includesKey: k)
+ ifTrue: [
+ | c |
+ c := dict at: k.
+ c keys do: [ :ck | c removeKey: ck ].
+ dict removeKey: k ] ].
+ ex resume ] ]
+
+ "Modified: / 02-10-2012 / 23:33:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloPlatform methodsFor:'github support'!
+
+downloadFile: url to: outputFileName
+ "download from <url> into <outputFileName>"
+
+ self subclassResponsibility
+!
+
+extractRepositoryFrom: zipFile to: directory
+ "unzip <zipFile> into <directory>"
+
+ self subclassResponsibility
+!
+
+fileDirectoryClass
+
+ ^FileDirectory
+! !
+
+!MetacelloPlatform methodsFor:'notification'!
+
+collection: aCollection do: aBlock displaying: aString
+
+ aCollection do: aBlock
+!
+
+do: aBlock displaying: aString
+
+ aBlock value
+! !
+
+!MetacelloPlatform methodsFor:'reflection'!
+
+copyClass: oldClass as: newName inCategory: newCategoryName
+
+ self subclassResponsibility
+!
+
+globalNamed: globalName
+
+ ^Smalltalk at: globalName
+!
+
+globalNamed: globalName ifAbsent: absentBlock
+
+ ^Smalltalk at: globalName ifAbsent: absentBlock
+! !
+
+!MetacelloPlatform methodsFor:'repository creation'!
+
+createRepository: aRepositorySpec
+ | type |
+ type := aRepositorySpec type.
+ type = 'http'
+ ifTrue: [
+ ^ MCHttpRepository
+ location: aRepositorySpec description
+ user: aRepositorySpec username
+ password: aRepositorySpec password ].
+ type = 'directory'
+ ifTrue: [ ^ MCDirectoryRepository new directory: (FileDirectory on: aRepositorySpec description) ].
+ Smalltalk
+ at: #'MCFileTreeRepository'
+ ifPresent: [ :cl |
+ type = 'filetree'
+ ifTrue: [
+ | description headerSize |
+ description := aRepositorySpec description.
+ headerSize := 'filetree://' size.
+ ^ cl new
+ directory:
+ (FileDirectory on: (aRepositorySpec description copyFrom: headerSize + 1 to: description size)) ] ].
+ Smalltalk
+ at: #'MCGitHubRepository'
+ ifPresent: [ :cl |
+ type = 'github'
+ ifTrue: [ ^ cl location: aRepositorySpec description ] ].
+ type = 'dictionary'
+ ifTrue: [
+ | description headerSize globalName |
+ description := aRepositorySpec description.
+ headerSize := 'dictionary://' size.
+ globalName := (description copyFrom: headerSize + 1 to: description size) asSymbol.
+ ^ Smalltalk
+ at: globalName
+ ifAbsent: [
+ Smalltalk
+ at: globalName
+ put:
+ (MCDictionaryRepository new
+ description: description;
+ yourself) ] ].
+ ^ nil
+!
+
+extractTypeFromDescription: description
+ description == nil
+ ifTrue: [ ^ nil ].
+ ((description beginsWith: '/') or: [ description second = $: ])
+ ifTrue: [ ^ 'directory' ].
+ (description beginsWith: 'dictionary://')
+ ifTrue: [ ^ 'dictionary' ].
+ (description beginsWith: 'filetree://')
+ ifTrue: [ ^ 'filetree' ].
+ (description beginsWith: 'github://')
+ ifTrue: [ ^ 'github' ].
+ ^ 'http'
+! !
+
+!MetacelloPlatform methodsFor:'scripting'!
+
+defaultRepositoryDescription
+ ^ 'http://www.squeaksource.com/MetacelloRepository'
+! !
+
+!MetacelloPlatform methodsFor:'tests'!
+
+defaultTimeout
+ "squeak compatability"
+ ^60
+! !
+
+!MetacelloPlatform methodsFor:'transactions'!
+
+transact: aBlock
+ "On GemStone, we want to optionally abort before command execution and commit after
+ common execution. Other plaforms don't need to do anything special.
+ Returning out of block, skips commit."
+
+ aBlock value
+! !
+
+!MetacelloPlatform methodsFor:'user interaction'!
+
+confirm: aString
+
+ ^(Smalltalk hasClassNamed: #UIManager)
+ ifTrue: [ (Smalltalk classNamed: #UIManager) default perform: #confirm: with: aString ]
+ ifFalse: [
+ "throw warning and answer true, if no way to announce"
+ Warning signal: aString.
+ true ]
+! !
+
+!MetacelloPlatform methodsFor:'utilities'!
+
+authorName
+
+ Smalltalk at: #Author ifPresent: [:cl | ^cl perform: #initials ].
+ ^'no developer initials'
+!
+
+authorName: aString
+ "Primarily used for testing"
+
+ self subclassResponsibility
+!
+
+timestamp
+
+ ^DateAndTime now printString
+! !
+
+!MetacelloPlatform class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
+
+MetacelloPlatform initialize!
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProject.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,503 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloProject
+ instanceVariableNames:'versionMap symbolicVersionMap errorMap loader loaderClass
+ loadType configuration projectAttributes versionNumberClass'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Model'
+!
+
+
+!MetacelloProject class methodsFor:'instance creation'!
+
+new
+
+ | inst |
+ inst := self basicNew.
+ ^inst configuration: inst; yourself
+!
+
+on: aConfig
+
+ ^self basicNew configuration: aConfig; yourself
+! !
+
+!MetacelloProject class methodsFor:'accessing'!
+
+versionConstructorClass
+ ^ MetacelloVersionConstructor
+! !
+
+!MetacelloProject methodsFor:'accessing'!
+
+configuration
+ ^ configuration
+!
+
+configuration: anObject
+ configuration := anObject
+!
+
+defaultBlessing
+
+ ^#release
+!
+
+errorMap
+ ^ errorMap
+!
+
+errorMap: anObject
+ errorMap ifNil: [ errorMap := Dictionary new ].
+ errorMap := anObject
+!
+
+label
+
+ ^self configuration class name
+!
+
+loadType
+ "#atomic or #linear"
+
+ loadType == nil ifTrue: [ ^#atomic ].
+ ^loadType
+!
+
+loadType: aSymbol
+ "#atomic or #linear"
+
+ loadType := aSymbol
+!
+
+map
+ versionMap ifNil: [ ^ Dictionary new ].
+ ^ versionMap
+!
+
+map: aDictionary
+
+ versionMap := aDictionary
+!
+
+project
+
+ ^self
+!
+
+symbolicVersionMap
+
+ ^symbolicVersionMap
+
+
+!
+
+symbolicVersionMap: aDictionary
+
+ symbolicVersionMap := aDictionary
+
+
+! !
+
+!MetacelloProject methodsFor:'loading'!
+
+load: aVersionString
+
+ ^(self version: aVersionString) load
+! !
+
+!MetacelloProject methodsFor:'printing'!
+
+printOn: aStream
+ | label |
+ self configuration class printOn: aStream.
+ aStream nextPut: $(.
+ self versions
+ do: [ :vrsn |
+ aStream nextPutAll: vrsn versionString.
+ vrsn spec ~~ nil
+ ifTrue: [
+ (label := vrsn spec projectLabel) isEmpty
+ ifFalse: [ aStream nextPutAll: ' [' , label , ']' ] ].
+ aStream
+ nextPut: $,;
+ space ].
+ aStream nextPut: $)
+! !
+
+!MetacelloProject methodsFor:'private'!
+
+attributes
+
+ ^(OrderedCollection with: #common)
+ addAll: self platformAttributes;
+ yourself
+!
+
+defaultPlatformAttributes
+
+ ^ MetacelloPlatform current defaultPlatformAttributes
+!
+
+excludeFromLatestVersion
+
+ ^#(development broken baseline)
+!
+
+lookupVersion: aVersionString ifAbsent: aBlock
+ "please use version:...this is a private method"
+
+ ^ self map
+ at: aVersionString
+ ifAbsent: [
+ (MetacelloVersionDefinitionError project: self project versionString: aVersionString)
+ exception: (self errorMap at: aVersionString ifAbsent: [ ^ aBlock value ]);
+ raise ]
+
+ "Modified: / 19-09-2012 / 02:14:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+platformAttributes
+
+ ^self projectPlatformAttributes
+!
+
+pragmaKeywords
+
+ ^#(version:attribute: blessing:attribute: description:attribute: required:attribute: groups:attribute: doits:attribute:)
+!
+
+projectAttributes
+
+ projectAttributes ~~ nil ifTrue: [ ^projectAttributes ].
+ ^#()
+!
+
+projectAttributes: aList
+
+ projectAttributes := aList
+!
+
+projectPlatformAttributes
+
+ | list aBlock |
+ list := OrderedCollection new.
+ (aBlock := self projectAttributes) ~~ nil
+ ifTrue: [ list addAll: aBlock value ].
+ ^self defaultPlatformAttributes, list
+!
+
+sortedAndFilteredVersions
+
+ ^(self map values asArray sort: [:a :b | a >= b ]) select: [:vrsn | (#(broken baseline) includes: vrsn blessing) not ].
+! !
+
+!MetacelloProject methodsFor:'scripting'!
+
+projectForScriptEngine: aMetacelloScriptEngine
+ ^ self projectForScriptEngine: aMetacelloScriptEngine unconditionalLoad: false
+!
+
+projectForScriptEngine: aMetacelloScriptEngine unconditionalLoad: aBool
+ ^ self subclassResponsibility
+! !
+
+!MetacelloProject methodsFor:'spec classes'!
+
+baselineOfProjectSpec
+ ^ self baselineOfProjectSpecClass for: self
+!
+
+baselineOfProjectSpecClass
+ ^ self subclassResponsibility
+!
+
+baselineOfVersionSpecClass
+ ^ self subclassResponsibility
+!
+
+configurationOfProjectSpec
+ ^ self configurationOfProjectSpecClass for: self
+!
+
+configurationOfProjectSpecClass
+ ^ self subclassResponsibility
+!
+
+defaultLoaderClass
+
+ ^MetacelloSpecLoader
+!
+
+groupSpec
+
+ ^self groupSpecClass for: self
+!
+
+groupSpecClass
+
+ ^MetacelloGroupSpec
+!
+
+loader
+
+ ^loader
+!
+
+loader: aLoader
+
+ loader := aLoader
+!
+
+loaderClass
+
+ loaderClass == nil ifTrue: [ loaderClass := self defaultLoaderClass ].
+ ^loaderClass
+!
+
+loaderClass: aMetacelloSpecLoader
+
+ loaderClass := aMetacelloSpecLoader
+!
+
+packagesSpec
+
+ ^self packagesSpecClass for: self
+!
+
+packagesSpecClass
+
+ ^MetacelloPackagesSpec
+!
+
+projectReferenceSpec
+
+ ^self projectReferenceSpecClass for: self
+!
+
+projectReferenceSpecClass
+
+ ^MetacelloProjectReferenceSpec
+!
+
+projectSpec
+
+ ^self projectSpecClass for: self
+!
+
+projectSpecClass
+ ^ MetacelloProjectSpec
+!
+
+valueHolderSpec
+
+ ^self valueHolderSpecClass for: self
+!
+
+valueHolderSpecClass
+
+ ^MetacelloValueHolderSpec
+!
+
+versionSpec
+
+ ^self versionSpecClass for: self
+!
+
+versionSpecClass
+
+ ^MetacelloVersionSpec
+! !
+
+!MetacelloProject methodsFor:'versions'!
+
+bleedingEdge
+
+ ^self version: #bleedingEdge
+!
+
+currentVersion
+ | cacheKey cv |
+ cacheKey := self configuration class.
+ ^ MetacelloPlatform current
+ stackCacheFor: #currentVersion
+ at: cacheKey
+ doing: [ :cache |
+ cv := self currentVersionAgainst: nil.
+ ^ cache at: cacheKey put: cv ]
+!
+
+currentVersionAgainst: resolvedPackageAndProjectNames
+ | cacheKey |
+ cacheKey := resolvedPackageAndProjectNames isNil
+ ifTrue: [ Array with: self configuration class with: nil ]
+ ifFalse: [ Array with: self configuration class with: (resolvedPackageAndProjectNames sort: [ :a :b | a <= b ]) ].
+ ^ MetacelloPlatform current
+ stackCacheFor: #currentVersionAgainst:
+ at: cacheKey
+ doing: [ :cache |
+ | cv versions latestSomethingLoaded |
+ cv := nil.
+ versions := self sortedAndFilteredVersions.
+ versions
+ do: [ :version |
+ | status matchBlock |
+ status := resolvedPackageAndProjectNames isNil
+ ifTrue: [ version spec isPartiallyCurrent ]
+ ifFalse: [ version spec isPartiallyCurrentAgainst: resolvedPackageAndProjectNames ].
+ matchBlock := [ :matchStatus |
+ cv := version copy.
+ cv versionStatus: matchStatus.
+ ^ cache at: cacheKey put: cv ].
+ status isAllLoadedToSpec: matchBlock.
+ status isLoadedToSpec: matchBlock.
+ status isLoadedMatchConstraints: matchBlock.
+ status
+ isSomethingLoaded: [ :matchStatus |
+ latestSomethingLoaded isNil
+ ifTrue: [
+ cv := version copy.
+ cv versionStatus: matchStatus.
+ latestSomethingLoaded := cv ] ] ].
+ latestSomethingLoaded ifNotNil: [ ^ cache at: cacheKey put: latestSomethingLoaded ].
+ ^ cache at: cacheKey put: nil ]
+!
+
+development
+
+ ^self version: #development
+!
+
+hasVersion: versionString
+
+ self version: versionString ifAbsent: [ ^false ].
+ ^true
+!
+
+lastVersion
+
+ | coll |
+ coll := (self map values asArray sort: [:a :b | a <= b ]) asOrderedCollection.
+ coll isEmpty ifTrue: [ ^nil ].
+ ^coll last
+!
+
+latestVersion
+
+ | excluded |
+" self deprecated: 'Please use #stableVersion instead.'.
+" self flag: 'deprecate after version 1.0'.
+ excluded := self excludeFromLatestVersion.
+ ^(self map values select: [:version |
+ (excluded includes: version blessing) not ]) detectMax: [:version | version ]
+!
+
+latestVersion: blessing
+
+ ^(self map values select: [:version | blessing = version blessing ]) detectMax: [:version | version ]
+!
+
+latestVersionMatching: versionPatternString
+ "Answer whether the version number of the receiver matches the given pattern string.
+
+ A Metacello version number is made up of version sequences delimited by the characters $. and $-.
+ The $. introduces a numeric version sequence and $- introduces an alphanumeric version sequence.
+
+ A version pattern is made up of version pattern match sequences. also delimited by the characters $.
+ and $-.. Each pattern match sequence is tested against the corresponding version sequence of the
+ receiver, using the 'standard' pattern matching rules. All sequences must answer true for a match.
+
+ The special pattern sequence '?' is a match for the corresponding version sequence and all subsequent
+ version sequences. '?' as the version pattern matches all versions. No more version pattern
+ sequences are permitted once the '?' sequence is used. If used, it is the last version pattern
+ sequence."
+
+ ^self
+ latestVersionMatching: versionPatternString
+ includedBlessings: #()
+ excludedBlessings: self excludeFromLatestVersion
+!
+
+latestVersionMatching: versionPatternString excludedBlessings: excluded
+
+ ^self
+ latestVersionMatching: versionPatternString
+ includedBlessings: #()
+ excludedBlessings: excluded
+!
+
+latestVersionMatching: versionPatternString includedBlessings: included
+
+ ^self
+ latestVersionMatching: versionPatternString
+ includedBlessings: included
+ excludedBlessings: self excludeFromLatestVersion
+!
+
+latestVersionMatching: versionPatternString includedBlessings: included excludedBlessings: excludedBlessings
+
+ | excluded |
+ excluded := excludedBlessings asSet copy.
+ excluded removeAllFoundIn: included.
+ ^(self map values select: [:version |
+ (included isEmpty or: [ included includes: version blessing ])
+ and: [ (excluded includes: version blessing) not
+ and: [ version versionNumber match: versionPatternString ]]])
+ detectMax: [:version | version ]
+!
+
+stableVersion
+
+ ^self version: #stable
+!
+
+symbolicVersionSymbols
+
+ ^self symbolicVersionMap keys asArray sort: [:a :b | a <= b ]
+!
+
+version: aVersionString
+ aVersionString isSymbol
+ ifTrue: [
+ | symbolicVersionString |
+ symbolicVersionString := self symbolicVersionMap
+ at: aVersionString
+ ifAbsent: [ (MetacelloSymbolicVersionDoesNotExistError project: self project versionString: aVersionString) raiseSignal ].
+ symbolicVersionString == #'notDefined'
+ ifTrue: [ (MetacelloSymbolicVersionNotDefinedError project: self project versionString: aVersionString) raiseSignal ].
+ ^ self
+ lookupVersion: symbolicVersionString
+ ifAbsent: [ (MetacelloSymbolicVersionDoesNotExistError project: self project versionString: symbolicVersionString) raiseSignal ] ].
+ ^ self
+ lookupVersion: aVersionString
+ ifAbsent: [ (MetacelloVersionDoesNotExistError project: self project versionString: aVersionString) raiseSignal ]
+
+ "Modified: / 02-10-2012 / 23:33:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+version: aVersionString ifAbsent: aBlock
+
+ ^[ self version: aVersionString ] on: MetacelloVersionDoesNotExistError do: [:ex | aBlock value ].
+!
+
+versionNumberClass
+ versionNumberClass ifNil: [ versionNumberClass := MetacelloVersionNumber ].
+ ^ versionNumberClass
+!
+
+versionNumberClass: aClass
+ versionNumberClass := aClass
+!
+
+versions
+
+ ^self map values asArray sort: [:a :b | a <= b ]
+! !
+
+!MetacelloProject class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectReferenceSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,185 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloAbstractPackageSpec subclass:#MetacelloProjectReferenceSpec
+ instanceVariableNames:'projectReference'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloProjectReferenceSpec methodsFor:'accessing'!
+
+answers: aListOfPairs
+
+ self shouldNotImplement
+!
+
+includes: aCollection
+
+ self shouldNotImplement
+!
+
+projectLabel
+ ^ self projectReference projectLabel
+!
+
+projectName
+ ^self projectReference name
+!
+
+projectReference: anObject
+ projectReference := anObject
+!
+
+referencedSpec
+
+ ^self projectReference
+!
+
+requires: aCollection
+
+ self shouldNotImplement
+!
+
+versionString
+ ^projectReference versionString
+
+ "Created: / 18-09-2012 / 19:14:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'copying'!
+
+postCopy
+
+ super postCopy.
+ projectReference := projectReference copy.
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'importing'!
+
+mergeImportLoads: aLoadList
+ self projectReference mergeImportLoads: aLoadList
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'loading'!
+
+repositorySpecs
+
+ ^self repositories map values
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'merging'!
+
+aboutToCopy
+ self projectReference className
+!
+
+mergeMap
+
+ | map |
+ map := super mergeMap.
+ map at: #projectReference put: projectReference.
+ ^map
+!
+
+mergeSpec: anotherSpec
+
+ | newSpec map anotherProjectReference |
+ newSpec := super mergeSpec: anotherSpec.
+ map := anotherSpec mergeMap.
+ (anotherProjectReference := map at: #projectReference) ~~ nil
+ ifTrue: [
+ newSpec projectReference:
+ (newSpec projectReference == nil
+ ifTrue: [ anotherProjectReference ]
+ ifFalse: [ newSpec projectReference mergeSpec: anotherProjectReference ])].
+ ^newSpec
+!
+
+nonOverridable
+
+ ^super nonOverridable, #( projectReference )
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'printing'!
+
+configMethodCascadeOn: aStream member: aMember last: lastCascade indent: indent
+ aMember methodUpdateSelector == #'remove:'
+ ifTrue: [ aStream nextPutAll: 'removeProject: ' , self name printString ]
+ ifFalse: [
+ self projectReference == nil
+ ifTrue: [ ^ self ].
+ aStream nextPutAll: self projectLabel , ': ' , self projectName printString , ' '.
+ (aMember methodUpdateSelector == #'copy:' and: [ self projectReference hasNonVersionStringField ])
+ ifTrue: [ aStream nextPutAll: 'copyFrom: ' , aMember sourceName printString , ' ' ].
+ self projectReference configShortCutMethodOn: aStream member: aMember indent: indent + 1 ].
+ lastCascade
+ ifTrue: [ aStream nextPut: $. ]
+ ifFalse: [
+ aStream
+ nextPut: $;;
+ cr ]
+!
+
+configMethodOn: aStream indent: indent
+
+ aStream
+ tab: indent; nextPutAll: 'spec '; cr;
+ tab: indent + 1; nextPutAll: 'name: ', self name printString; nextPut: $;; cr;
+ tab: indent + 1; nextPutAll: 'projectReference: '; nextPut: $[; cr.
+ aStream
+ tab: indent + 2; nextPutAll: 'spec'.
+ self projectReference ifNotNil: [ self projectReference configMethodBodyOn: aStream indent: indent + 2].
+ aStream nextPutAll: ' ].'
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'querying'!
+
+projectReference
+ ^ projectReference
+!
+
+relativeCurrentVersion
+
+ ^self projectReference relativeCurrentVersion
+!
+
+repositories
+ ^ self referencedSpec repositories
+!
+
+version
+
+ ^self projectReference version
+!
+
+versionOrNil
+
+ ^self projectReference versionOrNil
+!
+
+versionString: aString
+
+ ^self projectReference versionString: aString
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'testing'!
+
+hasRepository
+ ^ self projectReference hasRepository
+! !
+
+!MetacelloProjectReferenceSpec methodsFor:'visiting'!
+
+projectDo: projectBlock packageDo: packageBlock groupDo: groupBlock
+
+ projectBlock value: self
+! !
+
+!MetacelloProjectReferenceSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectRegistration.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,476 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloProjectRegistration
+ instanceVariableNames:'projectName configurationProjectSpec baselineProjectSpec
+ loadedInImage locked mutable'
+ classVariableNames:'Registry'
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloProjectRegistration class methodsFor:'instance creation'!
+
+fromMCBaselineProjectSpec: aProjectSpec
+ ^ self new
+ projectName: aProjectSpec name;
+ baselineProjectSpec: aProjectSpec;
+ yourself
+!
+
+fromMCConfigurationProjectSpec: aProjectSpec
+ ^ self new
+ projectName: aProjectSpec name;
+ configurationProjectSpec: aProjectSpec;
+ yourself
+! !
+
+!MetacelloProjectRegistration class methodsFor:'accessing'!
+
+baselineClasses
+ "Return a set of the Metacello baseline classes that have been loaded into the image."
+
+ "self baselineClasses"
+
+ ^ BaselineOf allSubclasses
+!
+
+baselineProjectSpecs
+ "MetacelloProjectRegistration baselineProjectSpecs"
+
+ ^ self registry baselineProjectSpecs
+!
+
+configurationClasses
+ "Return a set of the Metacello configuration classes that have been loaded into the image."
+
+ "self configurationClasses"
+
+ | answer |
+ answer := IdentitySet new.
+ ConfigurationOf allSubclasses
+ do: [ :cl |
+ (cl == BaselineOf or: [ cl inheritsFrom: BaselineOf ])
+ ifFalse: [ answer add: cl ] ].
+ Object allSubclasses
+ do: [ :cl |
+ (answer includes: cl)
+ ifFalse: [
+ (([ cl isMetacelloConfig ]
+ on: Error
+ do: [ :ex | ex return: false ]) and: [ cl name asString beginsWith: 'ConfigurationOf' ])
+ ifTrue: [ answer add: cl ] ] ].
+ ^ answer
+!
+
+configurationProjectSpecs
+ "MetacelloProjectRegistration configurationProjectSpecs"
+
+ ^ self registry configurationProjectSpecs
+!
+
+primeRegistryFromImage
+ "MetacelloProjectRegistration primeRegistryFromImage"
+
+ self registry primeRegistryFromImage
+!
+
+projectSpecs
+ "MetacelloProjectRegistration projectSpecs"
+
+ ^ self configurationProjectSpecs , self baselineProjectSpecs
+!
+
+registry
+ Registry ifNil: [ Registry := MetacelloProjectRegistry new ].
+ ^ Registry
+!
+
+registry: aMetacelloProjectRegistry
+ Registry := aMetacelloProjectRegistry
+!
+
+resetRegistry
+ Registry := nil
+! !
+
+!MetacelloProjectRegistration class methodsFor:'mutability'!
+
+copyRegistryRestoreOnErrorWhile: aBlock
+ "install copy of registry for duration of <aBlock> execution."
+
+ "registrations will be copied on write during <aBlock> execution."
+
+ "if <aBlock> does not return control to this context, revert to the original
+ version of the registry. Otherwise leave the new copy installed."
+
+ | oldRegistry newRegistry |
+ oldRegistry := self registry.
+ newRegistry := self registry copy.
+ self registry: newRegistry.
+ aBlock
+ ensure: [
+ "install old version of registry"
+ self registry: oldRegistry ].
+ self registry: newRegistry "if control returned, install newRegistry"
+!
+
+copyRegistryWhile: aBlock
+ "install copy of registry for duration of <aBlock> execution."
+
+ "registrations will be copied on write during <aBlock> execution."
+
+ "Unconditionally revert to the original
+ version of the registry. Otherwise leave the new copy installed."
+
+ | oldRegistry newRegistry |
+ oldRegistry := self registry.
+ newRegistry := self registry copy.
+ self registry: newRegistry.
+ aBlock
+ ensure: [
+ "install old version of registry"
+ self registry: oldRegistry ]
+! !
+
+!MetacelloProjectRegistration class methodsFor:'querying'!
+
+projectSpecForClassNamed: aClassName ifAbsent: absentBlock
+ ^ self registry projectSpecForClassNamed: aClassName ifAbsent: absentBlock
+!
+
+registrationForClassNamed: aClassName ifAbsent: absentBlock
+ ^ self registry registrationForClassNamed: aClassName ifAbsent: absentBlock
+!
+
+registrationForProjectSpec: aProjectSpec ifAbsent: absentBlock ifPresent: presentBlock
+ | newRegistration |
+ newRegistration := aProjectSpec asProjectRegistration.
+ self registry
+ registrationFor: newRegistration
+ ifPresent: [ :existing | ^ presentBlock value: existing value: newRegistration ]
+ ifAbsent: [ ^ absentBlock value: newRegistration ]
+! !
+
+!MetacelloProjectRegistration class methodsFor:'registration'!
+
+registerProjectSpec: aProjectSpec ifPresent: presentBlock
+ | newRegistration |
+ newRegistration := aProjectSpec asProjectRegistration.
+ ^ self registry
+ registrationFor: newRegistration
+ ifPresent: [ :existing | presentBlock value: existing value: newRegistration ]
+ ifAbsent: [ newRegistration registerProject ]
+! !
+
+!MetacelloProjectRegistration methodsFor:'accessing'!
+
+baseName
+ ^ MetacelloScriptEngine baseNameOf: (configurationProjectSpec ifNil: [ baselineProjectSpec ]) className
+!
+
+baselineProjectSpec
+ ^ baselineProjectSpec
+!
+
+baselineProjectSpec: anObject
+ self shouldBeMutable.
+ baselineProjectSpec := anObject
+!
+
+baselineProjectSpecIfAbsent: absentBlock
+ ^ baselineProjectSpec ifNil: absentBlock
+!
+
+baselineProjectSpecIfPresent: presentBlock ifAbsent: absentBlock
+ ^ baselineProjectSpec ifNotNil: [ presentBlock cull: baselineProjectSpec ] ifNil: absentBlock
+!
+
+configurationProjectSpec
+ ^ configurationProjectSpec
+!
+
+configurationProjectSpec: anObject
+ self shouldBeMutable.
+ configurationProjectSpec := anObject
+!
+
+configurationProjectSpecIfAbsent: absentBlock
+ ^ configurationProjectSpec ifNil: absentBlock
+!
+
+configurationProjectSpecIfPresent: presentBlock ifAbsent: absentBlock
+ ^ configurationProjectSpec ifNotNil: [ presentBlock cull: configurationProjectSpec ] ifNil: absentBlock
+!
+
+loadedInImage
+ loadedInImage ifNil: [ loadedInImage := false ].
+ ^ loadedInImage
+!
+
+loadedInImage: anObject
+ self shouldBeMutable.
+ loadedInImage := anObject
+!
+
+locked
+ locked ifNil: [ locked := false ].
+ ^ locked
+!
+
+locked: anObject
+ self shouldBeMutable.
+ locked := anObject
+!
+
+projectName
+ ^ projectName
+!
+
+projectName: anObject
+ self shouldBeMutable.
+ projectName := anObject
+!
+
+repositoryDescriptions
+ ^ (self configurationProjectSpecIfAbsent: [ self baselineProjectSpec ]) repositoryDescriptions
+!
+
+version
+ ^ (self configurationProjectSpecIfAbsent: [ ^ MetacelloMCBaselineProject singletonVersionName ]) versionString
+! !
+
+!MetacelloProjectRegistration methodsFor:'comparision'!
+
+= aRegistration
+ aRegistration class == self class
+ ifFalse: [ ^ false ].
+ ^ (configurationProjectSpec registrationsCompareEqual: aRegistration configurationProjectSpec)
+ and: [ baselineProjectSpec registrationsCompareEqual: aRegistration baselineProjectSpec ]
+!
+
+hash
+ ^ ((String stringHash: projectName initialHash: 0) bitXor: configurationProjectSpec metacelloRegistrationHash)
+ bitXor: baselineProjectSpec metacelloRegistrationHash
+! !
+
+!MetacelloProjectRegistration methodsFor:'copying'!
+
+postCopy
+ super postCopy.
+ mutable := nil
+! !
+
+!MetacelloProjectRegistration methodsFor:'lookup'!
+
+lookupBaselineSpec
+ | spec |
+
+ spec := baselineProjectSpec ifNotNil: [ ^ spec ].
+ ^ configurationProjectSpec
+!
+
+lookupConfigurationSpec
+ | spec |
+
+ spec := configurationProjectSpec ifNotNil: [ ^ spec ].
+ ^ baselineProjectSpec
+!
+
+lookupSpec: aProjectSpec
+ | spec |
+
+ (spec := self configurationProjectSpec)
+ ifNotNil: [
+ spec className = aProjectSpec className
+ ifTrue: [ ^ spec ] ].
+ (spec := self baselineProjectSpec)
+ ifNotNil: [
+ spec className = aProjectSpec className
+ ifTrue: [ ^ spec ] ].
+ ^ nil
+! !
+
+!MetacelloProjectRegistration methodsFor:'merging'!
+
+merge: aProjectRegistration
+ "should only be called from MetacelloProjectRegistration class>>mergeRegistration:with: ... merge is done when a spec has been loaded into the image"
+
+ "nil specs are ignored in the merge, otherwise aProjectRegistration specs win"
+
+ "(self hasMergeConflicts: aProjectRegistration)
+ ifTrue: [ ^ self error: 'Attempt to merge registrations with conflicts' ]."
+
+ self shouldBeMutable.
+ configurationProjectSpec
+ ifNil: [ configurationProjectSpec := aProjectRegistration configurationProjectSpec ]
+ ifNotNil: [
+ aProjectRegistration configurationProjectSpec
+ ifNotNil: [ configurationProjectSpec := aProjectRegistration configurationProjectSpec ] ].
+ baselineProjectSpec
+ ifNil: [ baselineProjectSpec := aProjectRegistration baselineProjectSpec ]
+ ifNotNil: [ aProjectRegistration baselineProjectSpec ifNotNil: [ baselineProjectSpec := aProjectRegistration baselineProjectSpec ] ]
+! !
+
+!MetacelloProjectRegistration methodsFor:'mutability'!
+
+copyOnWrite: aBlock
+ "assume that only registered projects are immutable ... otherwise you'll get an error"
+
+ | copy |
+ self class registry
+ registrationFor: self
+ ifPresent: [ :existing | ]
+ ifAbsent: [
+ aBlock value: self.
+ ^ self ].
+ self unregisterProject.
+ copy := self copy.
+ aBlock value: copy.
+ copy registerProject.
+ ^ copy
+!
+
+immutable
+ mutable := false
+!
+
+isMutable
+ mutable ifNil: [ ^ true ].
+ ^ mutable
+!
+
+mutable
+ mutable := true
+!
+
+shouldBeMutable
+ self isMutable
+ ifTrue: [ ^ self ].
+ self error: 'Not allowed to modify an immutable object'
+! !
+
+!MetacelloProjectRegistration methodsFor:'printing'!
+
+printOn: aStream
+ | label versionString descriptions |
+ self
+ configurationProjectSpecIfPresent: [ :spec |
+ label := spec className.
+ versionString := spec versionString ]
+ ifAbsent: [
+ "baseline"
+ label := self baselineProjectSpec className.
+ versionString := '[baseline]' ].
+ aStream
+ nextPutAll: label;
+ space;
+ nextPutAll: versionString.
+ (descriptions := self repositoryDescriptions) isEmpty
+ ifTrue: [ ^ self ].
+ aStream nextPutAll: ' from '.
+ descriptions size = 1
+ ifTrue: [ aStream nextPutAll: descriptions first ]
+ ifFalse: [
+ aStream nextPut: ${.
+ descriptions do: [ :description | aStream nextPutAll: description ].
+ aStream nextPut: $} ]
+! !
+
+!MetacelloProjectRegistration methodsFor:'querying'!
+
+currentlyLoadedClassesInProject
+ | classes |
+ classes := Set new.
+ self
+ configurationProjectSpecIfPresent: [ :spec | classes addAll: spec currentlyLoadedClassesInVersion ]
+ ifAbsent: [ ].
+ self baselineProjectSpecIfPresent: [ :spec | classes addAll: spec currentlyLoadedClassesInVersion ] ifAbsent: [ ].
+ ^ classes
+! !
+
+!MetacelloProjectRegistration methodsFor:'registration'!
+
+registerProject
+ "unconditionally register <newRegistration> ... use with care"
+
+ self class registry registerProjectRegistration: self
+!
+
+unregisterProject
+ self class registry unregisterProjectRegistration: self
+! !
+
+!MetacelloProjectRegistration methodsFor:'testing'!
+
+canDowngradeTo: aProjectRegistration
+ "true if there are no load conflicts
+ OR
+ if the load conflicts involved two cofigurations ONLY and a downgrade is allowed"
+
+ (self hasLoadConflicts: aProjectRegistration)
+ ifFalse: [ ^ true ].
+ configurationProjectSpec
+ ifNotNil: [
+ aProjectRegistration configurationProjectSpec
+ ifNotNil: [
+ configurationProjectSpec ensureProjectLoaded.
+ ^ configurationProjectSpec canDowngradeTo: aProjectRegistration configurationProjectSpec ] ].
+ ^ false
+!
+
+canUpgradeTo: aProjectRegistration
+ "true if there are no load conflicts
+ OR
+ if the load conflicts involved two cofigurations ONLY and an upgrade is allowed"
+
+ (self hasLoadConflicts: aProjectRegistration)
+ ifFalse: [ ^ true ].
+ configurationProjectSpec
+ ifNotNil: [
+ aProjectRegistration configurationProjectSpec
+ ifNotNil: [
+ configurationProjectSpec copy ensureProjectLoaded.
+ ^ configurationProjectSpec canUpgradeTo: aProjectRegistration configurationProjectSpec ] ].
+ ^ false
+!
+
+hasLoadConflicts: aProjectRegistration
+ "5 combinations of loads with no load conflicts:
+ No configs and baselines =
+ configs = and no baselines
+ configs = and baselines =
+ configs = and no baseline loaded (self) with a baseline to load (aProjectRegistration)
+ config loaded (self), no config to load (aProjectRegistration) and no baseline loaded(self) with a baseline to load (aProjectRegistration) "
+
+ self isValid
+ ifFalse: [ self error: 'Invalid projectRegistration: ' , self printString ].
+ aProjectRegistration isValid
+ ifFalse: [ self error: 'Invalid projectRegistration: ' , aProjectRegistration printString ].
+ configurationProjectSpec
+ ifNil: [
+ aProjectRegistration configurationProjectSpec notNil
+ ifTrue: [ ^ true ] ]
+ ifNotNil: [
+ aProjectRegistration configurationProjectSpec
+ ifNotNil: [
+ (aProjectRegistration configurationProjectSpec registrationsCompareEqual: configurationProjectSpec) not
+ ifTrue: [ ^ true ] ] ].
+ ^ baselineProjectSpec
+ ifNil: [ false ]
+ ifNotNil: [ (baselineProjectSpec registrationsCompareEqual: aProjectRegistration baselineProjectSpec) not ]
+!
+
+isValid
+ " has a name and one or the other of the projectSpecs is non-nil"
+
+ projectName ifNil: [ ^ false ].
+ ^ configurationProjectSpec notNil or: [ baselineProjectSpec notNil ]
+! !
+
+!MetacelloProjectRegistration class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectRegistry.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,189 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloProjectRegistry
+ instanceVariableNames:'baselineRegistry configurationRegistry'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloProjectRegistry methodsFor:'accessing'!
+
+baselineProjectSpecs
+ "MetacelloProjectRegistration baselineProjectSpecs"
+
+ | projectSpecs |
+ projectSpecs := OrderedCollection new.
+ self baselineRegistry
+ keysAndValuesDo: [ :className :registration | projectSpecs add: (self projectSpecForClassNamed: className ifAbsent: [ self error: 'not expected' ]) ].
+ ^ projectSpecs asArray
+!
+
+baselineRegistry
+ baselineRegistry ifNil: [ baselineRegistry := Dictionary new ].
+ ^ baselineRegistry
+!
+
+configurationProjectSpecs
+ "MetacelloProjectRegistration configurationProjectSpecs"
+
+ | projectSpecs |
+ projectSpecs := OrderedCollection new.
+ self configurationRegistry
+ keysAndValuesDo: [ :className :registration | projectSpecs add: (self projectSpecForClassNamed: className ifAbsent: [ self error: 'not expected' ]) ].
+ ^ projectSpecs asArray
+!
+
+configurationRegistry
+ configurationRegistry ifNil: [ configurationRegistry := Dictionary new ].
+ ^ configurationRegistry
+!
+
+projectSpecs
+ "MetacelloProjectRegistration projectSpecs"
+
+ ^ self configurationProjectSpecs , self baselineProjectSpecs
+! !
+
+!MetacelloProjectRegistry methodsFor:'copying'!
+
+postCopy
+ super postCopy.
+ baselineRegistry := self baselineRegistry copy.
+ configurationRegistry := self configurationRegistry copy
+! !
+
+!MetacelloProjectRegistry methodsFor:'initialization'!
+
+primeRegistryFromImage
+ "MetacelloProjectRegistration primeRegistryFromImage"
+
+ MetacelloProjectRegistration configurationClasses
+ do: [ :cl |
+ (self configurationRegistry includesKey: cl name asString)
+ ifFalse: [
+ | version |
+
+ "not registered"
+ (version := cl project currentVersion)
+ ifNotNil: [
+ | projectSpec |
+ projectSpec := (version project projectSpec
+ name: (MetacelloScriptEngine baseNameOf: cl name asString);
+ className: cl name asString;
+ versionString: version versionString;
+ repositories: version project projectPackage repositories copy;
+ yourself) asConfigurationProjectSpec.
+ projectSpec asProjectRegistration
+ loadedInImage: true;
+ registerProject ] ] ].
+ MetacelloProjectRegistration baselineClasses
+ do: [ :cl |
+ (self baselineRegistry includesKey: cl name asString)
+ ifFalse: [
+ | version |
+ "not registered"
+
+ (version := cl project currentVersion)
+ ifNotNil: [
+ | projectSpec |
+ projectSpec := (version project projectSpec
+ name: (MetacelloScriptEngine baseNameOf: cl name asString);
+ repositories: version project projectPackage repositories copy;
+ yourself) asBaselineProjectSpec.
+ projectSpec asProjectRegistration
+ loadedInImage: true;
+ registerProject ] ] ]
+! !
+
+!MetacelloProjectRegistry methodsFor:'querying'!
+
+projectSpecForClassNamed: aClassName ifAbsent: absentBlock
+ ^ (self configurationRegistry
+ at: aClassName
+ ifAbsent: [ ^ (self baselineRegistry at: aClassName ifAbsent: [^absentBlock value]) baselineProjectSpec ])
+ configurationProjectSpec
+!
+
+registrationForClassNamed: aClassName ifAbsent: absentBlock
+ | baseName |
+ baseName := MetacelloScriptEngine baseNameOf: aClassName.
+ self configurationRegistry at: aClassName ifPresent: [ :registration | ^ registration ].
+ self baselineRegistry at: aClassName ifPresent: [ :registration | ^ registration ].
+ self configurationRegistry at: 'ConfigurationOf' , baseName ifPresent: [ :registration | ^ registration ].
+ self baselineRegistry at: 'BaselineOf' , baseName ifPresent: [ :registration | ^ registration ].
+ ^ absentBlock value
+! !
+
+!MetacelloProjectRegistry methodsFor:'registration'!
+
+registerProjectRegistration: aMetacelloProjectRegistration
+ "unconditionally register <newRegistration> ... use with care"
+
+ | spec |
+
+ (spec := aMetacelloProjectRegistration configurationProjectSpec)
+ ifNotNil: [
+ self configurationRegistry
+ at: spec className
+ ifPresent: [ :existing |
+ (existing configurationProjectSpec registrationsCompareEqual: spec)
+ ifFalse: [
+ Transcript
+ cr;
+ show:
+ 'REGISTRATION OF INCOMPATABLE PROJECTS: ' , existing printString , ' REPLACED BY '
+ , aMetacelloProjectRegistration printString ] ].
+ spec immutable.
+ self configurationRegistry at: spec className put: aMetacelloProjectRegistration ].
+ (spec := aMetacelloProjectRegistration baselineProjectSpec)
+ ifNotNil: [
+ self baselineRegistry
+ at: spec className
+ ifPresent: [ :existing |
+ (existing baselineProjectSpec registrationsCompareEqual: spec)
+ ifFalse: [
+ Transcript
+ cr;
+ show:
+ 'REGISTRATION OF INCOMPATABLE PROJECTS: ' , existing printString , ' REPLACED BY '
+ , aMetacelloProjectRegistration printString ] ].
+ spec immutable.
+ self baselineRegistry at: spec className put: aMetacelloProjectRegistration ].
+ aMetacelloProjectRegistration immutable
+!
+
+registrationFor: aMetacelloProjectRegistration ifPresent: presentBlock ifAbsent: absentBlock
+ | baseName spec |
+
+ baseName := aMetacelloProjectRegistration baseName.
+ (spec := aMetacelloProjectRegistration configurationProjectSpec)
+ ifNotNil: [ self configurationRegistry at: spec className ifPresent: [ :existing | ^ presentBlock value: existing ] ].
+ (spec := aMetacelloProjectRegistration baselineProjectSpec)
+ ifNotNil: [ self baselineRegistry at: spec className ifPresent: [ :existing | ^ presentBlock value: existing ] ].
+ self configurationRegistry
+ at: 'ConfigurationOf' , baseName
+ ifPresent: [ :existing | ^ presentBlock value: existing ].
+ self baselineRegistry at: 'BaselineOf' , baseName ifPresent: [ :existing | ^ presentBlock value: existing ].
+ ^ absentBlock value
+!
+
+unregisterProjectRegistration: aMetacelloProjectRegistration
+ | spec |
+
+ (spec := aMetacelloProjectRegistration configurationProjectSpec)
+ ifNotNil: [
+ self configurationRegistry
+ removeKey: spec className
+ ifAbsent: [ self error: 'unexpectedly missing project registration' ] ].
+ (spec := aMetacelloProjectRegistration baselineProjectSpec)
+ ifNotNil: [ self baselineRegistry removeKey: spec className ifAbsent: [ self error: 'unexpectedly missing project registration' ] ]
+! !
+
+!MetacelloProjectRegistry class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,536 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloSpec subclass:#MetacelloProjectSpec
+ instanceVariableNames:'name className versionString operator loads preLoadDoIt
+ postLoadDoIt'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloProjectSpec methodsFor:'accessing'!
+
+className: aString
+ self shouldBeMutable.
+ className := aString
+!
+
+file
+ ^ nil
+!
+
+getClassName
+ "raw access to iv"
+
+ ^ className
+!
+
+getFile
+ "raw access to iv"
+
+ ^ nil
+!
+
+getOperator
+
+ ^operator
+!
+
+getRepositories
+ "raw access to iv"
+
+ ^ nil
+!
+
+loads: aCollection
+
+ aCollection setLoadsInMetacelloProject: self
+!
+
+name: aString
+ ((aString at: 1) isSeparator or: [ (aString at: aString size) isSeparator ])
+ ifTrue: [ self error: 'Names are not allowed to have leading or trailing blanks: ' , aString printString ].
+ self shouldBeMutable.
+ name := aString
+!
+
+operator: anObject
+ " #= #~= #> #< #>= #<= #~> "
+
+ self shouldBeMutable.
+ operator := anObject
+!
+
+postLoadDoIt: anObject
+
+ anObject setPostLoadDoItInMetacelloSpec: self
+!
+
+preLoadDoIt: anObject
+
+ anObject setPreLoadDoItInMetacelloSpec: self
+!
+
+setPostLoadDoIt: aSymbol
+ self shouldBeMutable.
+ postLoadDoIt := aSymbol
+!
+
+setPreLoadDoIt: aSymbol
+ self shouldBeMutable.
+ preLoadDoIt := aSymbol
+!
+
+versionString: anObject
+ self shouldBeMutable.
+ versionString := anObject
+! !
+
+!MetacelloProjectSpec methodsFor:'adding'!
+
+addToMetacelloPackages: aMetacelloPackagesSpec
+
+ | spec |
+ spec := (aMetacelloPackagesSpec project projectReferenceSpec)
+ name: self name;
+ projectReference: self copy;
+ yourself.
+ aMetacelloPackagesSpec addMember:
+ (aMetacelloPackagesSpec addMember
+ name: spec name;
+ spec: spec;
+ yourself)
+
+! !
+
+!MetacelloProjectSpec methodsFor:'construction'!
+
+className: aString constructor: aVersionConstructor
+ aVersionConstructor classNameForProject: aString
+!
+
+loads: anObject constructor: aVersionConstructor
+ aVersionConstructor loadsForProject: anObject
+!
+
+name: aString constructor: aVersionConstructor
+ aVersionConstructor nameForProject: aString
+!
+
+operator: anObject constructor: aVersionConstructor
+ aVersionConstructor operatorForProject: anObject
+!
+
+postLoadDoIt: aSymbol constructor: aVersionConstructor
+ aVersionConstructor postLoadDoItForProject: aSymbol
+!
+
+preLoadDoIt: aSymbol constructor: aVersionConstructor
+ aVersionConstructor preLoadDoItForProject: aSymbol
+!
+
+version: anObject constructor: aVersionConstructor
+ aVersionConstructor versionForProject: anObject
+!
+
+versionString: anObject constructor: aVersionConstructor
+ aVersionConstructor versionStringForProject: anObject
+! !
+
+!MetacelloProjectSpec methodsFor:'loading'!
+
+load
+
+ self subclassResponsibility
+! !
+
+!MetacelloProjectSpec methodsFor:'merging'!
+
+mergeMap
+
+ | map |
+ map := super mergeMap.
+ map at: #name put: name.
+ map at: #className put: className.
+ map at: #versionString put: versionString.
+ map at: #operator put: operator.
+ map at: #loads put: loads.
+ map at: #preLoadDoIt put: preLoadDoIt.
+ map at: #postLoadDoIt put: postLoadDoIt.
+ ^map
+! !
+
+!MetacelloProjectSpec methodsFor:'printing'!
+
+configMethodBodyOn: aStream indent: indent
+ | hasVersionString hasOperator hasProjectPackage hasLoads hasClassName hasPreLoadDoIt hasPostLoadDoIt |
+ hasClassName := self hasClassName.
+ hasVersionString := self versionString ~~ nil.
+ hasOperator := operator ~~ nil.
+ hasProjectPackage := self hasRepository or: [ hasClassName & (self getFile ~~ nil or: [ className ~= self name ]) ].
+ hasLoads := self loads ~~ nil.
+ hasPreLoadDoIt := self getPreLoadDoIt ~~ nil.
+ hasPostLoadDoIt := self getPostLoadDoIt ~~ nil.
+ hasClassName
+ ifTrue: [
+ hasVersionString | hasOperator | hasProjectPackage | hasLoads
+ ifTrue: [
+ aStream
+ cr;
+ tab: indent + 1 ]
+ ifFalse: [ aStream space ].
+ aStream nextPutAll: 'className: ' , self className printString.
+ hasVersionString | hasPreLoadDoIt | hasPostLoadDoIt | hasOperator | hasLoads | hasProjectPackage
+ ifTrue: [ aStream nextPut: $; ] ].
+ hasVersionString
+ ifTrue: [
+ | vs |
+ hasClassName | hasOperator | hasProjectPackage | hasLoads | hasPreLoadDoIt | hasPostLoadDoIt
+ ifTrue: [
+ aStream
+ cr;
+ tab: indent + 1 ]
+ ifFalse: [ aStream space ].
+ vs := self versionString.
+ aStream nextPutAll: 'versionString: '.
+ vs isSymbol
+ ifTrue: [ aStream nextPut: $# ].
+ aStream nextPutAll: vs asString printString.
+ hasPreLoadDoIt | hasPostLoadDoIt | hasOperator | hasProjectPackage | hasLoads
+ ifTrue: [ aStream nextPut: $; ] ].
+ hasPreLoadDoIt
+ ifTrue: [
+ hasClassName | hasOperator | hasProjectPackage | hasLoads | hasPreLoadDoIt
+ ifTrue: [
+ aStream
+ cr;
+ tab: indent + 1 ]
+ ifFalse: [ aStream space ].
+ aStream nextPutAll: 'preLoadDoIt: '.
+ self preLoadDoIt value isSymbol
+ ifTrue: [
+ aStream
+ nextPut: $#;
+ nextPutAll: self preLoadDoIt value asString printString ]
+ ifFalse: [ aStream nextPutAll: self preLoadDoIt value asString ].
+ hasPostLoadDoIt | hasOperator | hasProjectPackage | hasLoads
+ ifTrue: [ aStream nextPut: $; ] ].
+ hasPostLoadDoIt
+ ifTrue: [
+ hasClassName | hasOperator | hasProjectPackage | hasLoads | hasPostLoadDoIt
+ ifTrue: [
+ aStream
+ cr;
+ tab: indent + 1 ]
+ ifFalse: [ aStream space ].
+ aStream nextPutAll: 'postLoadDoIt: '.
+ self postLoadDoIt value isSymbol
+ ifTrue: [
+ aStream
+ nextPut: $#;
+ nextPutAll: self postLoadDoIt value asString printString ]
+ ifFalse: [ aStream nextPutAll: self postLoadDoIt value asString ].
+ hasOperator | hasProjectPackage | hasLoads
+ ifTrue: [ aStream nextPut: $; ] ].
+ hasOperator
+ ifTrue: [
+ hasClassName | hasVersionString | hasProjectPackage | hasLoads | hasPreLoadDoIt | hasPostLoadDoIt
+ ifTrue: [
+ aStream
+ cr;
+ tab: indent + 1 ]
+ ifFalse: [ aStream space ].
+ aStream nextPutAll: 'operator: #' , self operator asString printString.
+ hasProjectPackage | hasLoads
+ ifTrue: [ aStream nextPut: $; ] ].
+ hasLoads
+ ifTrue: [
+ hasClassName | hasVersionString | hasOperator | hasProjectPackage | hasPreLoadDoIt | hasPostLoadDoIt
+ ifTrue: [
+ aStream
+ cr;
+ tab: indent + 1 ]
+ ifFalse: [ aStream space ].
+ aStream nextPutAll: 'loads: #('.
+ self loads do: [ :str | aStream nextPutAll: str printString , ' ' ].
+ aStream nextPut: $).
+ hasProjectPackage
+ ifTrue: [ aStream nextPut: $; ] ].
+ hasProjectPackage
+ ifTrue: [
+ | hasName hasRepo |
+ hasRepo := self hasRepository.
+ hasName := self file ~= self className.
+ hasName
+ ifTrue: [
+ hasClassName | hasVersionString | hasOperator | hasLoads | hasPreLoadDoIt | hasPostLoadDoIt
+ ifTrue: [
+ aStream
+ cr;
+ tab: indent + 1 ]
+ ifFalse: [ aStream space ].
+ aStream nextPutAll: 'file: ' , self file printString.
+ hasRepo
+ ifTrue: [ aStream nextPut: $; ] ].
+ hasRepo
+ ifTrue: [
+ | repos |
+ repos := self repositories map values.
+ repos size = 1
+ ifTrue: [
+ hasClassName | hasVersionString | hasOperator | hasLoads | hasPreLoadDoIt | hasPostLoadDoIt | hasName
+ ifTrue: [
+ aStream
+ cr;
+ tab: indent + 1 ]
+ ifFalse: [ aStream space ].
+ repos first configMethodCascadeOn: aStream lastCascade: true ]
+ ifFalse: [
+ aStream cr.
+ self repositories configMethodCascadeOn: aStream indent: indent ] ] ]
+!
+
+configMethodOn: aStream indent: indent
+
+ aStream
+ tab: indent;
+ nextPutAll: 'spec '; cr;
+ tab: indent + 1;
+ nextPutAll: 'name: ', self name printString, ';'.
+ self configMethodBodyOn: aStream indent: indent.
+ aStream nextPut: $.
+!
+
+configShortCutMethodOn: aStream member: aMember indent: indent
+ | hasVersionString hasOperator hasProjectPackage hasLoads hasClassName hasPreLoadDoIt hasPostLoadDoIt |
+ hasClassName := self hasClassName.
+ hasVersionString := self versionString ~~ nil.
+ hasOperator := operator ~~ nil.
+ hasProjectPackage := self hasRepository or: [ hasClassName & (self getFile ~~ nil or: [ className ~= self name ]) ].
+ hasLoads := self loads ~~ nil.
+ hasPreLoadDoIt := self getPreLoadDoIt ~~ nil.
+ hasPostLoadDoIt := self getPostLoadDoIt ~~ nil.
+ hasClassName | hasOperator | hasProjectPackage | hasLoads | hasPreLoadDoIt | hasPostLoadDoIt
+ ifTrue: [
+ (aMember methodUpdateSelector == #'copy:' or: [ aMember methodUpdateSelector == #'with:' ])
+ ifTrue: [
+ aStream
+ nextPutAll: 'with: [';
+ cr ]
+ ifFalse: [
+ aStream
+ nextPutAll: 'overrides: [';
+ cr ].
+ aStream
+ tab: indent;
+ nextPutAll: 'spec'.
+ self configMethodBodyOn: aStream indent: indent.
+ aStream nextPutAll: ' ]'.
+ ^ self ].
+ hasVersionString
+ ifTrue: [
+ | vs |
+ vs := self versionString.
+ aStream nextPutAll: 'with: '.
+ vs isSymbol
+ ifTrue: [ aStream nextPut: $# ].
+ aStream nextPutAll: vs asString printString ]
+!
+
+hasClassName
+ ^ className ~~ nil
+!
+
+label
+
+ ^self name
+!
+
+projectLabel
+ ^ 'project'
+! !
+
+!MetacelloProjectSpec methodsFor:'private'!
+
+constructClassName
+ ^ nil
+!
+
+loadListForVersion: vrsn
+
+ ^ (self loads == nil
+ or: [self loads isEmpty])
+ ifTrue: [vrsn spec defaultPackageNames]
+ ifFalse: [self loads]
+!
+
+setLoads: aCollection
+ self shouldBeMutable.
+ loads := aCollection
+!
+
+setName: aStringOrNil
+ self shouldBeMutable.
+ name := aStringOrNil
+! !
+
+!MetacelloProjectSpec methodsFor:'querying'!
+
+className
+ className ifNil: [ self name ifNotNil: [ self className: self constructClassName ] ].
+ ^ className
+!
+
+currentlyLoadedClassesInVersion
+ | vrsn |
+
+ (vrsn := self versionOrNil) ifNotNil: [ ^ vrsn currentlyLoadedClassesInVersion ].
+ ^ #()
+!
+
+getPostLoadDoIt
+
+ ^postLoadDoIt
+!
+
+getPreLoadDoIt
+
+ ^preLoadDoIt
+!
+
+loads
+ ^ loads
+!
+
+name
+
+ ^name
+!
+
+operator
+
+ operator == nil ifTrue: [ ^#>= ].
+ ^ operator
+!
+
+postLoadDoIt
+
+ ^postLoadDoIt
+!
+
+preLoadDoIt
+
+ ^preLoadDoIt
+!
+
+projectPackage
+
+ ^nil
+!
+
+version
+ self subclassResponsibility
+!
+
+versionKey
+ "suitable for using as a unique key for the receiver's version in a dictionary"
+
+ ^ self version versionKey
+!
+
+versionOrNil
+
+ ^[ self version ] on: MetacelloVersionDoesNotExistError do: [:ex | ^nil ].
+!
+
+versionString
+ ^ versionString
+! !
+
+!MetacelloProjectSpec methodsFor:'scripting'!
+
+asProjectRegistration
+ ^ MetacelloProjectRegistration fromProjectSpec: self
+!
+
+canDowngradeTo: aMetacelloProjectSpec
+ (self className = aMetacelloProjectSpec className and: [ self operator == aMetacelloProjectSpec operator ])
+ ifFalse: [ ^ false ].
+ ^ (aMetacelloProjectSpec version perform: self operator with: self version) not
+!
+
+canUpgradeTo: aMetacelloProjectSpec
+ (self className = aMetacelloProjectSpec className and: [ self operator == aMetacelloProjectSpec operator ])
+ ifFalse: [ ^ false ].
+ ^ aMetacelloProjectSpec version perform: self operator with: self version
+!
+
+compareEqual: aMetacelloProjectSpec
+ "name className versionString operator loads preLoadDoIt postLoadDoIt"
+
+ ^ self className = aMetacelloProjectSpec className
+ and: [
+ self versionString = aMetacelloProjectSpec versionString
+ and: [
+ self operator == aMetacelloProjectSpec operator
+ and: [
+ self loads = aMetacelloProjectSpec loads
+ and: [ self preLoadDoIt == aMetacelloProjectSpec preLoadDoIt and: [ self postLoadDoIt == aMetacelloProjectSpec postLoadDoIt ] ] ] ] ]
+!
+
+mergeScriptLoads: aSpec
+ | otherLoads |
+
+ self shouldBeMutable.
+ (otherLoads := aSpec loads)
+ ifNotNil: [ self loads ifNil: [ loads := otherLoads ] ifNotNil: [ loads := (loads , otherLoads) asSet asArray ] ].
+ self loader: aSpec loader
+!
+
+metacelloRegistrationHash
+ "name className versionString operator loads preLoadDoIt postLoadDoIt"
+
+ | hash |
+ hash := String stringHash: name initialHash: 0.
+ hash := String stringHash: self className initialHash: hash.
+ hash := String stringHash: self versionString initialHash: hash.
+ hash := String stringHash: self operator asString initialHash: hash.
+ hash := String stringHash: self preLoadDoIt asString initialHash: hash.
+ hash := String stringHash: self postLoadDoIt asString initialHash: hash.
+ ^ hash bitXor: loads hash
+!
+
+registration
+ ^ MetacelloProjectRegistration
+ registrationForProjectSpec: self
+ ifAbsent: [ :ignored | ]
+ ifPresent: [ :existing :new | existing ]
+!
+
+registrationsCompareEqual: aMetacelloProjectSpec
+ "name className versionString operator loads preLoadDoIt postLoadDoIt"
+
+ ^ self className = aMetacelloProjectSpec className
+ and: [ self versionString = aMetacelloProjectSpec versionString and: [ self operator == aMetacelloProjectSpec operator ] ]
+!
+
+unregisterProject
+ ^ MetacelloProjectRegistration
+ registrationForProjectSpec: self
+ ifAbsent: [ ]
+ ifPresent: [ :existing :new | existing unregisterProject ]
+! !
+
+!MetacelloProjectSpec methodsFor:'visiting'!
+
+projectDo: projectBlock packageDo: packageBlock groupDo: groupBlock
+ projectBlock value: self
+! !
+
+!MetacelloProjectSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectSpecForLoad.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,119 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+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;
+ raiseSignal) == existing ]
+ ifFalse: [
+ "answer false if upgrade allowed"
+ (MetacelloAllowProjectUpgrade new
+ existingProjectRegistration: existing;
+ newProjectRegistration: new;
+ raiseSignal) == existing ]
+
+ "Modified: / 02-10-2012 / 23:33:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+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:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectSpecGenerator.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,44 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloProjectSpecGenerator
+ instanceVariableNames:'target'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloProjectSpecGenerator methodsFor:'accessing'!
+
+projectSpecCreationBlock
+ ^ [ :projectName | {(MetacelloMCProject new projectSpec name: projectName)} ]
+!
+
+projectSpecListBlock
+ ^ [ MetacelloProjectRegistration projectSpecs ]
+!
+
+projectSpecLookupBlock
+ ^ [ :projectName |
+ {(MetacelloProjectRegistration
+ projectSpecForClassNamed: (MetacelloScriptEngine baselineNameFrom: projectName)
+ ifAbsent: [ ]).
+ (MetacelloProjectRegistration
+ projectSpecForClassNamed: (MetacelloScriptEngine configurationNameFrom: projectName)
+ ifAbsent: [ ])} ]
+!
+
+target
+ ^ target
+!
+
+target: anObject
+ target := anObject
+! !
+
+!MetacelloProjectSpecGenerator class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectSpecLoadConflict.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,38 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloProjectSpecLoadError subclass:#MetacelloProjectSpecLoadConflict
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloProjectSpecLoadConflict methodsFor:'accessing'!
+
+possibleVersions
+ "not applicable to a Conflict error"
+
+ self shouldNotImplement
+!
+
+versionString
+ "not applicable to a Conflict error"
+
+ self shouldNotImplement
+! !
+
+!MetacelloProjectSpecLoadConflict methodsFor:'private'!
+
+isResumable
+ "Determine whether an exception is resumable."
+
+ ^ true
+! !
+
+!MetacelloProjectSpecLoadConflict class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectSpecLoadError.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,61 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Error subclass:#MetacelloProjectSpecLoadError
+ instanceVariableNames:'projectSpec versionDoesNotExistException'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloProjectSpecLoadError class methodsFor:'instance creation'!
+
+projectSpec: aMetacelloMCProjectSpec
+
+ ^self new
+ projectSpec: aMetacelloMCProjectSpec;
+ yourself
+! !
+
+!MetacelloProjectSpecLoadError methodsFor:'accessing'!
+
+possibleVersions
+ ^ self versionDoesNotExistException possibleVersions
+!
+
+projectSpec
+
+ ^projectSpec
+!
+
+projectSpec: aMetacelloMCProjectSpec
+
+ projectSpec := aMetacelloMCProjectSpec
+!
+
+versionDoesNotExistException
+ ^ versionDoesNotExistException
+!
+
+versionDoesNotExistException: anObject
+ versionDoesNotExistException := anObject
+!
+
+versionString
+ ^ self versionDoesNotExistException versionString
+! !
+
+!MetacelloProjectSpecLoadError methodsFor:'private'!
+
+isResumable
+ "Determine whether an exception is resumable."
+
+ ^ false
+! !
+
+!MetacelloProjectSpecLoadError class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloProjectSpecLoadedNotification.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,28 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptProjectSpecNotification subclass:#MetacelloProjectSpecLoadedNotification
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloProjectSpecLoadedNotification methodsFor:'exception description'!
+
+defaultAction
+ ^ nil
+! !
+
+!MetacelloProjectSpecLoadedNotification methodsFor:'handlers'!
+
+handleResolutionFor: aScriptEngine
+ ^ aScriptEngine handleProjectSpecLoaded: self
+! !
+
+!MetacelloProjectSpecLoadedNotification class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloRemoveMemberSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,35 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMemberSpec subclass:#MetacelloRemoveMemberSpec
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Members'
+!
+
+
+!MetacelloRemoveMemberSpec methodsFor:'accessing'!
+
+methodUpdateSelector
+
+ ^#remove:
+! !
+
+!MetacelloRemoveMemberSpec methodsFor:'actions'!
+
+applyAdd: addBlock copy: copyBlock merge: mergeBlock remove: removeBlock
+
+ removeBlock value: self
+!
+
+applyToList: aListSpec
+
+ aListSpec remove: self
+! !
+
+!MetacelloRemoveMemberSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloResolveProjectUpgrade.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,78 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptNotification subclass:#MetacelloResolveProjectUpgrade
+ instanceVariableNames:'existingProjectRegistration newProjectRegistration'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloResolveProjectUpgrade methodsFor:'accessing'!
+
+existingProjectRegistration
+ ^ existingProjectRegistration
+!
+
+existingProjectRegistration: anObject
+ existingProjectRegistration := anObject
+!
+
+newProjectRegistration
+ ^ newProjectRegistration
+!
+
+newProjectRegistration: anObject
+ newProjectRegistration := anObject
+!
+
+operationString
+ self subclassResponsibility
+! !
+
+!MetacelloResolveProjectUpgrade methodsFor:'exception handling'!
+
+allow
+ self checkAllowed.
+ self resume: self newProjectRegistration
+!
+
+allowEvenIfLocked
+ self resume: self newProjectRegistration
+!
+
+defaultAction
+ "Result of signal should be the projectRegistration to be used to perform the load ... default is to disallow"
+
+ ^ self existingProjectRegistration
+!
+
+disallow
+ "default action"
+
+ self resume: self existingProjectRegistration
+! !
+
+!MetacelloResolveProjectUpgrade methodsFor:'handlers'!
+
+handleOnDownGrade: onDownGradeBlock onUpgrade: onUpgradeBlock
+ self subclassResponsibility
+! !
+
+!MetacelloResolveProjectUpgrade methodsFor:'private'!
+
+checkAllowed
+ self existingProjectRegistration locked
+ ifTrue: [
+ MetacelloLockedProjectError
+ signal:
+ 'Attempt to perform' , self operationString printString , ' a locked project: '
+ , self existingProjectRegistration printString ]
+! !
+
+!MetacelloResolveProjectUpgrade class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptApiExecutor.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,53 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptExecutor subclass:#MetacelloScriptApiExecutor
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptApiExecutor methodsFor:'execution callback'!
+
+executeBlock: selectBlock do: projectSpecBlock
+ (self projectSpecsFromRepositoryArg select: selectBlock)
+ do: [ :projectSpec | projectSpecBlock value: (self applyArgsToProjectSpec: projectSpec copy) ]
+!
+
+executeCollection: aCollection do: projectSpecBlock
+ self projectSpecsFromRepositoryArg
+ do: [ :projectSpec |
+ (aCollection includes: (MetacelloScriptEngine baseNameOf: projectSpec className))
+ ifTrue: [ projectSpecBlock value: (self applyArgsToProjectSpec: projectSpec copy) ] ]
+!
+
+executeString: aString do: projectSpecBlock
+ self singleRoot: true.
+ (projectSpecGenerator projectSpecCreationBlock value: aString)
+ do: [ :projectSpec | projectSpec ifNotNil: [ projectSpecBlock value: (self applyArgsToProjectSpec: projectSpec copy) ] ]
+!
+
+projectSpecsFromRepositoryArg
+ | spec repo projectSpecs |
+ repositoryArg ifNil: [ ^ #() ].
+ spec := (projectSpecGenerator projectSpecCreationBlock value: 'xxx') first.
+ repo := spec project createRepository: (spec project repositorySpec description: repositoryArg).
+ projectSpecs := OrderedCollection new.
+ ((Gofer new disablePackageCache
+ repository: repo;
+ allResolved) collect: [ :resolvedReference | resolvedReference packageName ]) asSet
+ do: [ :packageName |
+ (projectSpecGenerator projectSpecCreationBlock value: (MetacelloScriptEngine baseNameOf: packageName))
+ do: [ :projectSpec |
+ projectSpec className = packageName
+ ifTrue: [ projectSpecs add: (self applyArgsToProjectSpec: projectSpec copy) ] ] ].
+ ^ projectSpecs
+! !
+
+!MetacelloScriptApiExecutor class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptEngine.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,464 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloScriptEngine
+ instanceVariableNames:'root projectSpec options'
+ classVariableNames:'DefaultRepositoryDescription DefaultVersionString'
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptEngine class methodsFor:'defaults'!
+
+defaultRepositoryDescription
+ DefaultRepositoryDescription
+ ifNil: [ DefaultRepositoryDescription := MetacelloPlatform current defaultRepositoryDescription ].
+ ^ DefaultRepositoryDescription
+!
+
+defaultVersionString
+ DefaultVersionString ifNil: [ DefaultVersionString := #'stable' ].
+ ^ DefaultVersionString
+! !
+
+!MetacelloScriptEngine class methodsFor:'utility'!
+
+baseNameOf: className
+ ^ (className indexOfSubCollection: 'BaselineOf') = 0
+ ifTrue: [
+ (className indexOfSubCollection: 'ConfigurationOf') = 0
+ ifTrue: [ className ]
+ ifFalse: [ className copyFrom: 'ConfigurationOf' size + 1 to: className size ] ]
+ ifFalse: [ className copyFrom: 'BaselineOf' size + 1 to: className size ]
+!
+
+baselineNameFrom: baseName
+ "Return the fully-qualified configuration class name."
+
+ ^ (baseName indexOfSubCollection: 'BaselineOf') > 0
+ ifTrue: [ baseName ]
+ ifFalse: [ 'BaselineOf' , baseName ]
+!
+
+baselineProjectNameOf: baselineClassName
+ ^ (baselineClassName indexOfSubCollection: 'BaselineOf') = 0
+ ifTrue: [ baselineClassName ]
+ ifFalse: [ baselineClassName copyFrom: 'BaselineOf' size + 1 to: baselineClassName size ]
+!
+
+configurationNameFrom: baseName
+ "Return the fully-qualified configuration class name."
+
+ ^ (baseName indexOfSubCollection: 'ConfigurationOf') > 0
+ ifTrue: [ baseName ]
+ ifFalse: [ 'ConfigurationOf' , baseName ]
+!
+
+configurationProjectNameOf: configurationClassName
+ ^ (configurationClassName indexOfSubCollection: 'ConfigurationOf') = 0
+ ifTrue: [ configurationClassName ]
+ ifFalse: [ configurationClassName copyFrom: 'ConfigurationOf' size + 1 to: configurationClassName size ]
+! !
+
+!MetacelloScriptEngine methodsFor:'accessing'!
+
+options
+ options ifNil: [ options := Dictionary new ].
+ ^ options
+!
+
+options: aDictionary
+ options := aDictionary
+!
+
+projectName
+ ^ self projectSpec name
+!
+
+projectSpec
+ ^ projectSpec
+!
+
+projectSpec: aProjectSpec
+ projectSpec := aProjectSpec
+!
+
+repositories
+ ^ self projectSpec repositories
+!
+
+root
+ ^ root
+!
+
+root: anObject
+ root := anObject
+! !
+
+!MetacelloScriptEngine methodsFor:'actions api'!
+
+fetch: required
+ self
+ fetchRecord: [ :version |
+ required isEmpty
+ ifTrue: [ version fetch ]
+ ifFalse: [ version fetch: required ] ]
+ required: required
+!
+
+fetchRecord: fetchRecordBlock required: required
+ MetacelloProjectRegistration
+ copyRegistryWhile: [
+ self
+ handleNotificationsForAction: [
+ | version loadedSpec |
+ self validateProjectSpecForScript.
+ [ loadedSpec := self lookupProjectSpecFor: self projectSpec ]
+ on: MetacelloAllowProjectDowngrade , MetacelloAllowProjectUpgrade
+ do: [ :notification |
+ notification
+ handleOnDownGrade: [ :ex :existing :new | ex allowEvenIfLocked ]
+ onUpgrade: [ :ex :existing :new | ex allowEvenIfLocked ] ].
+ version := loadedSpec versionForScriptEngine: self.
+ self root: (fetchRecordBlock value: version) loadDirective ] ]
+!
+
+get
+ " load a fresh copy from repo"
+
+ | spec projectPackage |
+ MetacelloProjectRegistration
+ copyRegistryRestoreOnErrorWhile: [
+ self validateProjectSpecForScript.
+ spec := self projectSpec.
+ projectPackage := spec projectPackage.
+ projectPackage repositorySpecs do: [ :repoSpec | repoSpec createRepository flushForScriptGet ].
+ projectPackage load.
+ self root: (Smalltalk at: spec className asSymbol) project.
+ MetacelloProjectRegistration
+ registrationForProjectSpec: spec
+ ifAbsent: [ :new | new registerProject ]
+ ifPresent: [ :existing :new |
+ existing
+ copyOnWrite: [ :existingCopy |
+ spec
+ copyForRegistration: existingCopy
+ onWrite: [ :specCopy | specCopy ifNil: [ existingCopy merge: new ] ifNotNil: [ specCopy mergeScriptRepository: spec ] ] ] ] ]
+!
+
+list
+ self validateProjectSpecForScript.
+ self root: self projectSpec
+!
+
+load: required
+ self
+ load: required
+ onProjectDownGrade: [ :ex :existing :new | ex allowEvenIfLocked ]
+ onProjectUpgrade: [ :ex :existing :new | ex allowEvenIfLocked ]
+!
+
+load: required onProjectDownGrade: onDownGradeBlock onProjectUpgrade: onUpgradeBlock
+ MetacelloProjectRegistration
+ copyRegistryRestoreOnErrorWhile: [
+ self
+ handleNotificationsForAction: [
+ | version loadedSpec |
+ self validateProjectSpecForScript.
+ [ loadedSpec := self lookupProjectSpecFor: self projectSpec ]
+ on: MetacelloAllowProjectDowngrade , MetacelloAllowProjectUpgrade
+ do: [ :ex | ex handleOnDownGrade: onDownGradeBlock onUpgrade: onUpgradeBlock ].
+ version := loadedSpec versionForScriptEngine: self.
+ self
+ root:
+ (required isEmpty
+ ifTrue: [ version load ]
+ ifFalse: [ version load: required ]) loadDirective.
+ loadedSpec loads: required.
+ MetacelloProjectRegistration
+ registrationForProjectSpec: loadedSpec
+ ifAbsent: [ :new |
+ new
+ loadedInImage: true;
+ registerProject ]
+ ifPresent: [ :existing :new |
+ existing
+ copyOnWrite: [ :existingCopy |
+ existingCopy
+ loadedInImage: true;
+ merge: new ] ] ] ]
+!
+
+lock
+ | spec |
+ MetacelloProjectRegistration
+ copyRegistryRestoreOnErrorWhile: [
+ self validateProjectSpecForScript.
+ spec := self projectSpec.
+ MetacelloProjectRegistration
+ registrationForProjectSpec: spec
+ ifAbsent: [ :new |
+ new
+ locked: true;
+ registerProject ]
+ ifPresent: [ :existing :new |
+ existing
+ copyOnWrite: [ :existingCopy |
+ existingCopy locked: true.
+ spec
+ copyForRegistration: existingCopy
+ onWrite: [ :specCopy |
+ specCopy
+ ifNil: [ existingCopy merge: new ]
+ ifNotNil: [
+ specCopy mergeScriptRepository: spec.
+ spec := specCopy ] ] ] ].
+ self root: spec ]
+!
+
+record: required
+ self
+ fetchRecord: [ :version |
+ required isEmpty
+ ifTrue: [ version record ]
+ ifFalse: [ version record: required ] ]
+ required: required
+!
+
+unlock
+ | spec |
+ MetacelloProjectRegistration
+ copyRegistryRestoreOnErrorWhile: [
+ self validateProjectSpecForScript.
+ spec := self projectSpec.
+ MetacelloProjectRegistration
+ registrationForProjectSpec: spec
+ ifAbsent: [ :ignored | ]
+ ifPresent: [ :existing :new | existing copyOnWrite: [ :existingCopy | existingCopy locked: false ] ].
+ self root: spec ]
+! !
+
+!MetacelloScriptEngine methodsFor:'defaults'!
+
+defaultRepositoryDescription
+ ^ self class defaultRepositoryDescription
+!
+
+defaultVersionString
+ ^ self class defaultVersionString
+! !
+
+!MetacelloScriptEngine methodsFor:'handlers'!
+
+handleConflict: exception
+ ^ (self options at: #'onConflict' ifAbsent: [ ^ exception pass ])
+ cull: exception
+ cull: exception existingProjectRegistration
+ cull: exception newProjectRegistration
+!
+
+handleDowngrade: exception
+ ^ (self options at: #'onDowngrade' ifAbsent: [ ^ exception pass ])
+ cull: exception
+ cull: exception existingProjectRegistration
+ cull: exception newProjectRegistration
+!
+
+handleEnsureProjectLoadedForDevelopment: exception
+ "if useCurrentVersion resume with true, else resume with false"
+
+ ^ exception resume: self useCurrentVersion
+!
+
+handleLookupBaselineSpecForEnsureLoad: exception
+ "if existing and new don't compare equal, then ensure the new baseline is loaded"
+
+ | existing new |
+ new := exception projectSpec.
+ existing := self lookupBaselineSpecForEnsure: exception projectSpec.
+ ^ exception resume: (existing registrationsCompareEqual: new) not
+!
+
+handleLookupProjectSpec: exception
+ ^ exception
+ resume:
+ ((self lookupProjectSpecFor: exception projectSpec) ifNil: [ ^ exception resume: exception projectSpec ])
+!
+
+handleLookupProjectSpecForLoad: exception
+ "if overrideProjectSpec is nil, use currentVersion in image, ignoreImage is false"
+
+ | existing new override |
+ existing := exception projectSpec.
+ override := self useCurrentVersion
+ ifTrue: [
+ "don't do lookup in registry if we expect to use the #currentVersion calculation"
+ nil ]
+ ifFalse: [
+ new := self lookupProjectSpecFor: exception projectSpec.
+ (new compareEqual: existing)
+ ifFalse: [
+ "counts as override, only if they differ in some aspect"
+ override := new ] ].
+ ^ exception
+ resume:
+ (MetacelloProjectSpecForLoad new
+ projectSpec: existing;
+ useDetermineVersionForLoad: self useCurrentVersion;
+ overrideProjectSpec: override;
+ yourself)
+!
+
+handleNotificationsForAction: actionBlock
+ [
+ actionBlock
+ on:
+ MetacelloLookupProjectSpec , MetacelloLookupProjectSpecForLoad , MetacelloProjectSpecLoadedNotification
+ , MetacelloScriptEnsureProjectLoadedForDevelopment , MetacelloLookupBaselineSpecForEnsureLoad
+ do: [ :ex |
+ "lookup and registration handlers need to be innermost set of handlers ...they may throw option notifications"
+ ex handleResolutionFor: self ] ]
+ on: MetacelloAllowProjectDowngrade , MetacelloAllowProjectUpgrade , MetacelloAllowConflictingProjectUpgrade
+ do: [ :ex |
+ "option handlers need to be outermost set of handlers ... last line of defense before users are involved"
+ ex handleResolutionFor: self ]
+!
+
+handleProjectSpecLoaded: exception
+ MetacelloProjectRegistration
+ registrationForProjectSpec: exception projectSpec
+ ifAbsent: [ :new |
+ new
+ loadedInImage: true;
+ registerProject ]
+ ifPresent: [ :existing :new |
+ "unconditionally merge new with existing (updates registration)"
+ existing
+ copyOnWrite: [ :existingCopy |
+ existingCopy
+ loadedInImage: true;
+ merge: new ] ].
+ exception resume
+!
+
+handleUpgrade: exception
+ ^ (self options at: #'onUpgrade' ifAbsent: [ ^ exception pass ])
+ cull: exception
+ cull: exception existingProjectRegistration
+ cull: exception newProjectRegistration
+! !
+
+!MetacelloScriptEngine methodsFor:'options'!
+
+cacheRepository
+ ^ (MetacelloMCProject new repositorySpec description: (self options at: #'cacheRepository' ifAbsent: [ ^ nil ]))
+ createRepository
+!
+
+ignoreImage
+ ^ self options at: #'ignoreImage' ifAbsent: [ false ]
+!
+
+repositoryOverrides
+ ^ (self options at: #'repositoryOverrides' ifAbsent: [ ^ nil ])
+ collect: [ :description | (MetacelloMCProject new repositorySpec description: description) createRepository ]
+!
+
+silently
+ ^ self options at: #'silently' ifAbsent: [ false ]
+!
+
+useCurrentVersion
+ "private option used to implement the classic mode"
+
+ ^ self options at: #'useCurrentVersion' ifAbsent: [ false ]
+! !
+
+!MetacelloScriptEngine methodsFor:'project lookup'!
+
+getBaselineProjectUnconditionalLoad: unconditionalLoad
+ | project |
+ project := (self getBaselineUnconditionalLoad: unconditionalLoad) project.
+ project version spec repositories: self repositories copy.
+ ^ project
+!
+
+getBaselineUnconditionalLoad: unconditionalLoad
+ | spec |
+ spec := self projectSpec.
+ Smalltalk
+ at: spec className asSymbol
+ ifPresent: [ :cl |
+ unconditionalLoad
+ ifFalse: [ ^ cl ] ].
+ (spec := self lookupProjectSpecFor: spec) projectPackage load.
+ ^ Smalltalk at: spec className asSymbol
+!
+
+getConfigurationProjectUnconditionalLoad: unconditionalLoad
+ ^ (self getConfigurationUnconditionalLoad: unconditionalLoad) project
+!
+
+getConfigurationUnconditionalLoad: unconditionalLoad
+ | spec |
+ spec := self projectSpec.
+ Smalltalk
+ at: spec className asSymbol
+ ifPresent: [ :cl |
+ unconditionalLoad
+ ifFalse: [ ^ cl ] ].
+ (spec := self lookupProjectSpecFor: spec) projectPackage load.
+ ^ Smalltalk at: spec className asSymbol
+!
+
+lookupBaselineSpecForEnsure: aProjectSpec
+ | registration loadedSpec |
+ registration := MetacelloProjectRegistration
+ registrationForProjectSpec: aProjectSpec
+ ifAbsent: [ :new | new ]
+ ifPresent: [ :existing :new | existing ].
+ ^ registration lookupSpec: aProjectSpec
+!
+
+lookupProjectSpecFor: aProjectSpec
+ | registration loadedSpec |
+ registration := MetacelloProjectRegistration
+ registrationForProjectSpec: aProjectSpec
+ ifAbsent: [ :new | new ]
+ ifPresent: [ :existing :new |
+ (existing hasLoadConflicts: new)
+ ifTrue: [
+ ((existing canUpgradeTo: new)
+ ifTrue: [ MetacelloAllowProjectUpgrade new ]
+ ifFalse: [
+ (existing canDowngradeTo: new)
+ ifTrue: [ MetacelloAllowProjectDowngrade new ]
+ ifFalse: [ MetacelloAllowConflictingProjectUpgrade new ] ])
+ existingProjectRegistration: existing;
+ newProjectRegistration: new;
+ raiseSignal ]
+ ifFalse: [ new ] ].
+ ^ registration lookupSpec: aProjectSpec
+
+ "Modified: / 02-10-2012 / 23:32:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+validateProjectSpecForScript
+ | issues |
+ issues := self projectSpec
+ validateForScriptLoad: self
+ withDefaultVersionString: self defaultVersionString
+ withDefaultRepositoryDecription: self defaultRepositoryDescription.
+ issues isEmpty
+ ifTrue: [ ^ self ].
+ (MetacelloValidationFailure issues: issues message: 'Project spec validation failure') raiseSignal
+
+ "Modified: / 02-10-2012 / 23:32:45 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloScriptEngine class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptEnsureProjectLoadedForDevelopment.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,30 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptNotification subclass:#MetacelloScriptEnsureProjectLoadedForDevelopment
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptEnsureProjectLoadedForDevelopment methodsFor:'exception handling'!
+
+defaultAction
+ "Go ahead and download a new copy of configuration because blessing is #development"
+
+ ^ true
+! !
+
+!MetacelloScriptEnsureProjectLoadedForDevelopment methodsFor:'handlers'!
+
+handleResolutionFor: aScriptEngine
+ ^ aScriptEngine handleEnsureProjectLoadedForDevelopment: self
+! !
+
+!MetacelloScriptEnsureProjectLoadedForDevelopment class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptExecutor.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,233 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloScriptExecutor
+ instanceVariableNames:'options roots singleRoot projectSpecGenerator actionArg
+ configurationArg baselineArg projectArg classNameArg versionArg
+ repositoryArg'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptExecutor methodsFor:'accessing'!
+
+options
+ options ifNil: [ options := Dictionary new ].
+ ^ options
+!
+
+roots
+ roots ifNil: [ roots := OrderedCollection new ].
+ ^ roots
+!
+
+singleRoot
+ singleRoot ifNil: [ singleRoot := false ].
+ ^ singleRoot
+!
+
+singleRoot: aBool
+ singleRoot := aBool
+! !
+
+!MetacelloScriptExecutor methodsFor:'actions api'!
+
+fetch: required
+ actionArg := #'fetch:' -> {required}
+!
+
+get
+ actionArg := #'get' -> #()
+!
+
+list
+ actionArg := #'list' -> #()
+!
+
+load: required
+ actionArg := #'load:' -> {required}
+!
+
+lock
+ actionArg := #'lock' -> #()
+!
+
+record: required
+ actionArg := #'record:' -> {required}
+!
+
+unlock
+ actionArg := #'unlock' -> #()
+! !
+
+!MetacelloScriptExecutor methodsFor:'args'!
+
+baselineArg
+ ^ baselineArg
+!
+
+baselineArg: anObject
+ baselineArg := anObject
+!
+
+classNameArg
+ ^ classNameArg
+!
+
+classNameArg: anObject
+ classNameArg := anObject
+!
+
+configurationArg
+ ^ configurationArg
+!
+
+configurationArg: anObject
+ configurationArg := anObject
+!
+
+projectArg
+ ^ projectArg
+!
+
+projectArg: anObject
+ projectArg := anObject
+!
+
+repositoryArg
+ ^ repositoryArg
+!
+
+repositoryArg: anObject
+ repositoryArg := anObject
+!
+
+versionArg
+ ^ versionArg
+!
+
+versionArg: anObject
+ versionArg := anObject
+! !
+
+!MetacelloScriptExecutor methodsFor:'execution'!
+
+applyArgsToProjectSpec: aProjectSpec
+ classNameArg ifNotNil: [ aProjectSpec className: classNameArg ].
+ versionArg ifNotNil: [ aProjectSpec versionString: versionArg ].
+ repositoryArg ifNotNil: [ aProjectSpec repository: repositoryArg ].
+ ^ aProjectSpec
+!
+
+execute: statements
+ statements
+ do: [ :assoc | assoc value ifNil: [ self perform: assoc key ] ifNotNil: [ self perform: assoc key withArguments: assoc value ] ].
+ projectSpecGenerator := self projectSpecGenerator.
+ projectSpecGenerator target
+ execute: [ :projectSpec |
+ | engine root |
+
+ engine := MetacelloScriptEngine new
+ options: self options copy;
+ projectSpec: projectSpec;
+ yourself.
+ engine perform: actionArg key withArguments: actionArg value.
+ (root := engine root) ifNotNil: [ self roots add: root ] ]
+ against: self.
+ ^ (self singleRoot and: [ self roots size == 1 ])
+ ifTrue: [ self roots first ]
+ ifFalse: [ self roots ]
+!
+
+projectSpecGenerator
+ baselineArg
+ ifNotNil: [
+ configurationArg ifNotNil: [ self error: ' baseline: and configuration: are both be specified' ].
+ projectArg ifNotNil: [ self error: ' baseline: and project are both be specified' ].
+ ^ MetacelloBaselineSpecGenerator new
+ target: baselineArg;
+ yourself ].
+ configurationArg
+ ifNotNil: [
+ baselineArg ifNotNil: [ self error: ' baseline: and configuration: are both be specified' ].
+ projectArg ifNotNil: [ self error: ' configuration and project are both be specified' ].
+ ^ MetacelloConfigurationSpecGenerator new
+ target: configurationArg;
+ yourself ].
+ projectArg
+ ifNotNil: [
+ configurationArg ifNotNil: [ self error: ' project and configuration: are both be specified' ].
+ baselineArg ifNotNil: [ self error: ' baseline: and project are both be specified' ].
+ ^ MetacelloProjectSpecGenerator new
+ target: projectArg;
+ yourself ].
+ self error: 'project, baseline, or configuration not specified'
+! !
+
+!MetacelloScriptExecutor methodsFor:'execution callback'!
+
+executeBlock: selectBlock do: projectSpecBlock
+ ((projectSpecGenerator projectSpecListBlock value select: selectBlock) select: self projectSpecSelectBlock)
+ do: [ :projectSpec | projectSpecBlock value: (self applyArgsToProjectSpec: projectSpec copy) ]
+!
+
+executeCollection: aCollection do: projectSpecBlock
+ aCollection
+ do: [ :projectName |
+ ((projectSpecGenerator projectSpecLookupBlock value: projectName) select: self projectSpecSelectBlock)
+ do: [ :projectSpec | projectSpecBlock value: (self applyArgsToProjectSpec: projectSpec copy) ] ]
+!
+
+executeString: aString do: projectSpecBlock
+ self singleRoot: true.
+ ((projectSpecGenerator projectSpecLookupBlock value: aString) select: self projectSpecSelectBlock)
+ do: [ :projectSpec | projectSpecBlock value: (self applyArgsToProjectSpec: projectSpec copy) ]
+!
+
+projectSpecSelectBlock
+ ^ [ :projectSpec | true ]
+! !
+
+!MetacelloScriptExecutor methodsFor:'options api'!
+
+cacheRepository: aRepositoryDescription
+ self options at: #'cacheRepository' put: aRepositoryDescription
+!
+
+ignoreImage: aBool
+ self options at: #'ignoreImage' put: aBool
+!
+
+onConflict: aBlock
+ self options at: #'onConflict' put: aBlock
+!
+
+onDowngrade: aBlock
+ self options at: #'onDowngrade' put: aBlock
+!
+
+onUpgrade: aBlock
+ self options at: #'onUpgrade' put: aBlock
+!
+
+repositoryOverrides: aRepositoryDescriptionList
+ self options at: #'repositoryOverrides' put: aRepositoryDescriptionList
+!
+
+silently: aBool
+ self options at: #'silently' put: aBool
+!
+
+useCurrentVersion: aBool
+ "private option used to implement the classic mode"
+
+ self options at: #'useCurrentVersion' put: aBool
+! !
+
+!MetacelloScriptExecutor class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptGitHubDownloadNotification.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,34 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloScriptGitHubDownloadNotification
+ instanceVariableNames:'projectPath versionString'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptGitHubDownloadNotification methodsFor:'accessing'!
+
+projectPath
+ ^ projectPath
+!
+
+projectPath: anObject
+ projectPath := anObject
+!
+
+versionString
+ ^ versionString
+!
+
+versionString: anObject
+ versionString := anObject
+! !
+
+!MetacelloScriptGitHubDownloadNotification class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptImageExecutor.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,29 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptExecutor subclass:#MetacelloScriptImageExecutor
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptImageExecutor methodsFor:'execution callback'!
+
+projectSpecSelectBlock
+ ^ [ :projectSpec |
+ projectSpec
+ ifNil: [ false ]
+ ifNotNil: [
+ MetacelloProjectRegistration
+ registrationForProjectSpec: projectSpec
+ ifAbsent: [ false ]
+ ifPresent: [ :existingRegistration :newRegistration | existingRegistration loadedInImage ] ] ]
+! !
+
+!MetacelloScriptImageExecutor class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptNotification.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,22 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloScriptNotification
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptNotification methodsFor:'handlers'!
+
+handleResolutionFor: aScriptEngine
+ self subclassResponsibility
+! !
+
+!MetacelloScriptNotification class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptProjectSpecNotification.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,34 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptNotification subclass:#MetacelloScriptProjectSpecNotification
+ instanceVariableNames:'projectSpec'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptProjectSpecNotification methodsFor:'accessing'!
+
+projectSpec
+ ^ projectSpec
+!
+
+projectSpec: anObject
+ projectSpec := anObject
+! !
+
+!MetacelloScriptProjectSpecNotification methodsFor:'exception description'!
+
+defaultAction
+ "Result of signal should be the projectSpec to be used to perform the load"
+
+ ^ self projectSpec
+! !
+
+!MetacelloScriptProjectSpecNotification class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptRegistryExecutor.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,27 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptExecutor subclass:#MetacelloScriptRegistryExecutor
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptRegistryExecutor methodsFor:'actions api'!
+
+prime
+!
+
+remove
+!
+
+reset
+! !
+
+!MetacelloScriptRegistryExecutor class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloScriptingError.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Error subclass:#MetacelloScriptingError
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloScriptingError class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSemanticVersionNumber.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,398 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Magnitude subclass:#MetacelloSemanticVersionNumber
+ instanceVariableNames:'normalVersion preReleaseVersion buildVersion'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Model'
+!
+
+
+!MetacelloSemanticVersionNumber class methodsFor:'instance creation'!
+
+fromString: aString
+ ^ self fromString: aString forPattern: false
+!
+
+fromString: aString forPattern: forPattern
+ | new tokens preRelease build versionString identifierCount normalEnd preReleaseEnd normalComponents preReleaseComponents buildComponents |
+ normalComponents := OrderedCollection new.
+ preReleaseComponents := OrderedCollection new.
+ buildComponents := OrderedCollection new.
+ preRelease := aString indexOf: $- startingAt: 1.
+ build := aString indexOf: $+ startingAt: 1.
+ (build > 0 and: [ preRelease > build ])
+ ifTrue: [ preRelease := 0 ].
+ normalEnd := preRelease = 0
+ ifTrue: [
+ build = 0
+ ifTrue: [ aString size ]
+ ifFalse: [ build - 1 ] ]
+ ifFalse: [ preRelease - 1 ].
+ versionString := aString copyFrom: 1 to: normalEnd.
+ identifierCount := 0.
+ (versionString findTokens: '.')
+ do: [ :subString |
+ | integer |
+ forPattern
+ ifTrue: [ integer := subString ]
+ ifFalse: [
+ integer := subString asInteger.
+ integer < 0
+ ifTrue: [ self error: 'invalid version number: normal version component must be integer ' , subString printString ] ].
+ normalComponents add: integer.
+ identifierCount := identifierCount + 1 ].
+ (forPattern not and: [ identifierCount ~= 3 ])
+ ifTrue: [ self error: 'invalid version number: normal version must have only 3 components' ].
+ preReleaseEnd := build = 0
+ ifTrue: [ aString size ]
+ ifFalse: [ build - 1 ].
+ preRelease > 0
+ ifTrue: [
+ versionString := aString copyFrom: preRelease + 1 to: preReleaseEnd.
+ (versionString findTokens: '.')
+ do: [ :subString |
+ (forPattern or: [ self isSemanticIdentifier: subString ])
+ ifFalse: [ self error: 'invalid version number: preRelease version component must be one of [0-9A-Za-z-]' ].
+ preReleaseComponents add: (self extractNumericComponent: subString forPattern: forPattern) ] ].
+ build > 0
+ ifTrue: [
+ versionString := aString copyFrom: build + 1 to: aString size.
+ (versionString findTokens: '.')
+ do: [ :subString |
+ (forPattern or: [ self isSemanticIdentifier: subString ])
+ ifFalse: [ self error: 'invalid version number: build version component must be one of [0-9A-Za-z-]' ].
+ buildComponents add: (self extractNumericComponent: subString forPattern: forPattern) ] ].
+ ^ self new
+ normalVersion: normalComponents;
+ preReleaseVersion: preReleaseComponents;
+ buildVersion: buildComponents;
+ yourself
+! !
+
+!MetacelloSemanticVersionNumber class methodsFor:'private'!
+
+extractNumericComponent: subString forPattern: forPattern
+ "$. separated components are integers"
+
+ | number |
+ forPattern
+ ifTrue: [ ^ subString ].
+ number := [ subString asNumber ]
+ on: Error
+ do: [ :ex | ex return: subString ].
+ ^ number asString = subString
+ ifTrue: [ number ]
+ ifFalse: [ subString ]
+!
+
+isSemanticIdentifier: aString
+ "whether the receiver is composed entirely of alphanumerics"
+
+ aString
+ do: [ :c |
+ c isAlphaNumeric
+ ifFalse: [
+ c = $-
+ ifFalse: [ ^ false ] ] ].
+ ^ true
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'accessing'!
+
+approximateBase
+
+ | base |
+ base := self copyFrom: 1 to: self size - 1.
+ base at: base size put: (base at: base size) + 1.
+ ^base
+!
+
+buildVersion
+ buildVersion ifNil: [ buildVersion := #() ].
+ ^ buildVersion
+!
+
+buildVersion: anObject
+ buildVersion := anObject
+!
+
+normalVersion
+ normalVersion ifNil: [ normalVersion := #() ].
+ ^ normalVersion
+!
+
+normalVersion: anObject
+ normalVersion := anObject
+!
+
+preReleaseVersion
+ preReleaseVersion ifNil: [ preReleaseVersion := #() ].
+ ^ preReleaseVersion
+!
+
+preReleaseVersion: anObject
+ preReleaseVersion := anObject
+!
+
+versionString
+
+ | strm |
+ strm := WriteStream on: String new.
+ self printOn: strm.
+ ^strm contents
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'comparing'!
+
+< aMetacelloVersionNumber
+ aMetacelloVersionNumber species = self species
+ ifFalse: [ ^ false ].
+ ^ self compareLessThan: aMetacelloVersionNumber
+!
+
+= aMetacelloVersionNumber
+ aMetacelloVersionNumber species = self species
+ ifFalse: [ ^ false ].
+ ^ self compareEqualTo: aMetacelloVersionNumber
+!
+
+hash
+ ^ self versionComponents hash
+!
+
+match: aVersionPattern
+ "Answer whether the version number of the receiver matches the given pattern string.
+
+ A Metacello version number is made up of version sequences delimited by the characters $. and $-.
+ The $. introduces a numeric version sequence and $- introduces an alphanumeric version sequence.
+
+ A version pattern is made up of version pattern match sequences. also delimited by the characters $.
+ and $-.. Each pattern match sequence is tested against the corresponding version sequence of the
+ receiver, using the 'standard' pattern matching rules. All sequences must answer true for a match.
+
+ The special pattern sequence '?' is a match for the corresponding version sequence and all subsequent
+ version sequences. '?' as the version pattern matches all versions. No more version pattern
+ sequences are permitted once the '?' sequence is used. If used, it is the last version pattern
+ sequence. "
+
+ | patternVersion mySize patternSize components |
+ patternVersion := (self class fromString: aVersionPattern forPattern: true) versionComponents.
+ components := self versionComponents.
+ mySize := components size.
+ patternSize := patternVersion size.
+ mySize = patternSize
+ ifFalse: [
+ mySize < patternSize
+ ifTrue: [ ^ false ].
+ (patternVersion at: patternSize) ~= '?'
+ ifTrue: [ ^ false ].
+ mySize := patternSize ].
+ 1 to: mySize do: [ :i |
+ | pattern |
+ pattern := (patternVersion at: i) asString.
+ pattern = '?'
+ ifTrue: [
+ i = mySize
+ ifFalse: [ ^ self error: 'Invalid version match pattern: ' , aVersionPattern printString ] ]
+ ifFalse: [
+ (pattern match: (components at: i) asString)
+ ifFalse: [ ^ false ] ] ].
+ ^ true
+!
+
+~> aMetacelloVersionNumber
+
+ aMetacelloVersionNumber size == 1 ifTrue: [ ^false ].
+ ^self >= aMetacelloVersionNumber and: [ self < aMetacelloVersionNumber approximateBase ]
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'converting'!
+
+asMetacelloSemanticVersionNumber
+ ^ self
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'copying'!
+
+copyFrom: start to: stop
+ "Answer a copy of a subset of the receiver, starting from element at
+ index start until element at index stop."
+
+ | newSize new j |
+ newSize := stop - start + 1.
+ new := self species new: newSize.
+ j := 0.
+ start to: stop do: [:i |
+ new at: j + 1 put: (self at: i).
+ j := j + 1 ].
+ ^new
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'enumerating'!
+
+do: aBlock
+ "Refer to the comment in Collection|do:."
+ 1 to: self size do:
+ [:index | aBlock value: (self at: index)]
+!
+
+do: elementBlock separatedBy: separatorBlock
+ "Evaluate the elementBlock for all elements in the receiver,
+ and evaluate the separatorBlock between."
+
+ | beforeFirst |
+ beforeFirst := true.
+ self do:
+ [:each |
+ beforeFirst
+ ifTrue: [beforeFirst := false]
+ ifFalse: [separatorBlock value].
+ elementBlock value: each]
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'operations'!
+
+decrementMinorVersionNumber
+ | int |
+ self size to: 1 by: -1 do: [ :index |
+ (int := self at: index) isString
+ ifFalse: [
+ int > 0
+ ifTrue: [ self at: index put: int - 1 ].
+ ^ self ] ]
+!
+
+incrementMinorVersionNumber
+
+ | int |
+ self size to: 1 by: -1 do: [:index |
+ (int := self at: index) isString
+ ifFalse: [
+ self at: index put: int + 1.
+ ^self ]].
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'printing'!
+
+asString
+ "Answer a string that represents the receiver."
+
+ ^ self printString
+!
+
+print: components prefix: prefixChar on: aStream
+ | beforeFirst |
+ beforeFirst := true.
+ components
+ do: [ :component |
+ beforeFirst
+ ifTrue: [
+ beforeFirst := false.
+ prefixChar ifNotNil: [ aStream nextPut: prefixChar ] ]
+ ifFalse: [ aStream nextPut: $. ].
+ aStream nextPutAll: component asString ]
+!
+
+printOn: aStream
+ self print: self normalVersion prefix: nil on: aStream.
+ self print: self preReleaseVersion prefix: $- on: aStream.
+ self print: self buildVersion prefix: $+ on: aStream
+! !
+
+!MetacelloSemanticVersionNumber methodsFor:'private'!
+
+compareEqualTo: aMetacelloVersionNumber
+ aMetacelloVersionNumber species = self species
+ ifFalse: [ ^ false ].
+ (self compareEqualTo: self normalVersion other: aMetacelloVersionNumber normalVersion)
+ ifFalse: [ ^ false ].
+ (self compareEqualTo: self preReleaseVersion other: aMetacelloVersionNumber preReleaseVersion)
+ ifFalse: [ ^ false ].
+ ^ self compareEqualTo: self buildVersion other: aMetacelloVersionNumber buildVersion
+!
+
+compareEqualTo: myComponents other: otherComponents
+ | mySize |
+ mySize := myComponents size.
+ mySize = otherComponents size
+ ifFalse: [ ^ false ].
+ 1 to: mySize do: [ :i |
+ (myComponents at: i) = (otherComponents at: i)
+ ifFalse: [ ^ false ] ].
+ ^ true
+!
+
+compareLessThan: aMetacelloVersionNumber
+ | myComponents otherComponents defaultResult |
+ aMetacelloVersionNumber species = self species
+ ifFalse: [ ^ false ].
+ myComponents := self normalVersion.
+ otherComponents := aMetacelloVersionNumber normalVersion.
+ defaultResult := true.
+ (self compareEqualTo: myComponents other: otherComponents)
+ ifTrue: [ defaultResult := false ]
+ ifFalse: [
+ (self compareLessThan: myComponents other: otherComponents version: #'normal')
+ ifFalse: [ ^ false ] ].
+ myComponents := self preReleaseVersion.
+ otherComponents := aMetacelloVersionNumber preReleaseVersion.
+ (self compareEqualTo: myComponents other: otherComponents)
+ ifTrue: [
+ myComponents size > 0
+ ifTrue: [ defaultResult := false ] ]
+ ifFalse: [ ^ self compareLessThan: myComponents other: otherComponents version: #'preRelease' ].
+ myComponents := self buildVersion.
+ otherComponents := aMetacelloVersionNumber buildVersion.
+ ^ (self compareEqualTo: myComponents other: otherComponents)
+ ifTrue: [ defaultResult ]
+ ifFalse: [ self compareLessThan: myComponents other: otherComponents version: #'build' ]
+!
+
+compareLessThan: myComponents other: otherComponents version: version
+ | mySize aSize commonSize count more |
+ mySize := myComponents size.
+ aSize := otherComponents size.
+ commonSize := mySize min: aSize.
+ count := 0.
+ more := true.
+ [ more and: [ count < commonSize ] ]
+ whileTrue: [
+ (myComponents at: count + 1) = (otherComponents at: count + 1)
+ ifTrue: [ count := count + 1 ]
+ ifFalse: [ more := false ] ].
+ count < commonSize
+ ifTrue: [ ^ (myComponents at: count + 1) metacelloSemanticVersionComponentLessThan: (otherComponents at: count + 1) ].
+ mySize < aSize
+ ifTrue: [
+ mySize = 0
+ ifTrue: [
+ #'preRelease' == version
+ ifTrue: [ ^ false ].
+ ^ true ].
+ (myComponents at: commonSize) = (otherComponents at: commonSize)
+ ifFalse: [ ^ true ].
+ ^ true ]
+ ifFalse: [
+ mySize = aSize
+ ifTrue: [ ^ false ].
+ aSize = 0
+ ifTrue: [
+ #'build' == version
+ ifTrue: [ ^ false ].
+ ^ true ].
+ (myComponents at: commonSize) = (otherComponents at: commonSize)
+ ifFalse: [ ^ false ].
+ ^ true ]
+!
+
+versionComponents
+ ^ self normalVersion , self preReleaseVersion , self buildVersion
+! !
+
+!MetacelloSemanticVersionNumber class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSkipDirtyPackageLoad.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,43 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloSkipDirtyPackageLoad
+ instanceVariableNames:'packageSpec'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloSkipDirtyPackageLoad class methodsFor:'signalling'!
+
+signal: aMetacelloPackageSpec
+
+ ^(self new packageSpec: aMetacelloPackageSpec) raiseSignal
+
+ "Modified: / 02-10-2012 / 23:32:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloSkipDirtyPackageLoad methodsFor:'accessing'!
+
+defaultAction
+ "Default action is to skip the load of a dirty package"
+
+ ^true
+!
+
+packageSpec
+
+ ^packageSpec
+!
+
+packageSpec: aMetacelloPackageSpec
+
+ packageSpec := aMetacelloPackageSpec
+! !
+
+!MetacelloSkipDirtyPackageLoad class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,237 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloSpec
+ instanceVariableNames:'project loader mutable'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloSpec class methodsFor:'instance creation'!
+
+for: aVersionMap
+
+ ^(self platformClass new)
+ for: aVersionMap;
+ yourself
+! !
+
+!MetacelloSpec class methodsFor:'accessing'!
+
+platformClass
+
+ ^self
+! !
+
+!MetacelloSpec methodsFor:'accessing'!
+
+loader
+
+ loader == nil
+ ifTrue: [ | prjctLoader |
+ (prjctLoader := self project loader) == nil
+ ifTrue: [ self loader: (self project loaderClass on: self) ]
+ ifFalse: [ self loader: prjctLoader ]].
+ ^loader
+!
+
+loader: aLoader
+ "We're interested in propogating the loader state, _except_ for the spec"
+
+ self shouldBeMutable.
+ loader := aLoader copy.
+ loader spec: self
+! !
+
+!MetacelloSpec methodsFor:'copying'!
+
+postCopy
+ super postCopy.
+ mutable := nil.
+ loader ~~ nil
+ ifTrue: [ self loader: loader ].
+! !
+
+!MetacelloSpec methodsFor:'doits'!
+
+doItBlock: selector
+
+ selector == nil ifTrue: [ ^nil ].
+ selector numArgs = 0
+ ifTrue: [ ^[ self project configuration perform: selector ] ].
+ selector numArgs = 1
+ ifTrue: [ ^[:aLoader | self project configuration perform: selector with: aLoader ] ].
+ selector numArgs = 2
+ ifTrue: [ ^[:aLoader :pkgSpec | self project configuration perform: selector with: aLoader with: pkgSpec ] ].
+ ^nil
+!
+
+postLoadDoIt
+ "noop unless non-nil value returned"
+
+ ^nil
+!
+
+postLoadDoItBlock
+
+ ^self doItBlock: self postLoadDoIt value
+!
+
+preLoadDoIt
+ "noop unless non-nil value returned"
+
+ ^nil
+!
+
+preLoadDoItBlock
+
+ ^self doItBlock: self preLoadDoIt value
+! !
+
+!MetacelloSpec methodsFor:'importing'!
+
+mergeImportLoads: aLoadList
+ self error: 'import: can only be used with baseline project specs'
+! !
+
+!MetacelloSpec methodsFor:'initialization'!
+
+for: aProject
+ self shouldBeMutable.
+ project := aProject
+! !
+
+!MetacelloSpec methodsFor:'merging'!
+
+aboutToCopy
+!
+
+mergeMap
+
+ ^Dictionary new.
+!
+
+mergeSpec: aSpec
+ | newSpec nonOverridable |
+ self validateMergeForSpec: aSpec.
+ newSpec := self copy.
+ nonOverridable := self nonOverridable.
+ aSpec mergeMap
+ keysAndValuesDo: [ :key :value |
+ (nonOverridable includes: key)
+ ifFalse: [
+ value ~~ nil
+ ifTrue: [ newSpec instVarNamed: key asString put: value ] ] ].
+ ^ newSpec
+!
+
+nonOverridable
+
+ ^#()
+!
+
+validateMergeForSpec: aSpec
+ aSpec class = self class
+ ifFalse: [
+ self
+ error:
+ 'The project spec ' , self name printString , ' in project ' , self project label , ' has incompatible specs. '
+ , aSpec class name asString , ' and ' , self class name asString , ' are not compatible.' ]
+! !
+
+!MetacelloSpec methodsFor:'mutability'!
+
+copyOnWrite: aBlock
+ "assume that only registered projects are immutable ... otherwise you'll get an error"
+
+ | copy |
+ copy := self copy.
+ aBlock value: copy.
+ ^ copy
+!
+
+immutable
+ mutable := false
+!
+
+isMutable
+ mutable ifNil: [ ^ true ].
+ ^ mutable
+!
+
+mutable
+ mutable := true
+!
+
+shouldBeMutable
+ self isMutable
+ ifTrue: [ ^ self ].
+ self error: 'Not allowed to modify an immutable object'
+! !
+
+!MetacelloSpec methodsFor:'printing'!
+
+configMethodOn: aStream
+
+ self configMethodOn: aStream indent: 0
+
+!
+
+configMethodOn: aStream indent: indent
+
+ self subclassResponsibility
+
+!
+
+label
+
+ ^self printString
+!
+
+printOn: aStream
+
+ self configMethodOn: aStream indent: 0
+
+! !
+
+!MetacelloSpec methodsFor:'querying'!
+
+answers
+
+ ^#()
+!
+
+project
+
+ ^project
+! !
+
+!MetacelloSpec methodsFor:'spec creation'!
+
+addMember
+
+ ^MetacelloAddMemberSpec for: self project
+!
+
+copyMember
+
+ ^MetacelloCopyMemberSpec for: self project
+!
+
+mergeMember
+
+ ^MetacelloMergeMemberSpec for: self project
+!
+
+removeMember
+
+ ^MetacelloRemoveMemberSpec for: self project
+! !
+
+!MetacelloSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSpecLoader.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,65 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloSpecLoader
+ instanceVariableNames:'spec'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Loaders'
+!
+
+
+!MetacelloSpecLoader class methodsFor:'instance creation'!
+
+on: aMetacelloPackagesSpec
+
+ ^(self new)
+ spec: aMetacelloPackagesSpec;
+ yourself
+! !
+
+!MetacelloSpecLoader methodsFor:'accessing'!
+
+loadType
+ "#atomic or #linear"
+
+ ^self project loadType
+!
+
+project
+
+ ^self spec project
+!
+
+spec
+
+ ^spec
+!
+
+spec: aMetacelloPackagesSpec
+
+ spec := aMetacelloPackagesSpec
+! !
+
+!MetacelloSpecLoader methodsFor:'actions'!
+
+load
+
+ self subclassResponsibility
+!
+
+unload
+
+ self subclassResponsibility
+! !
+
+!MetacelloSpecLoader class methodsFor:'documentation'!
+
+version_HG
+
+ ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloStackCacheNotification.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloStackCacheNotification
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloStackCacheNotification class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSymbolicVersionDoesNotExistError.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,31 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloVersionDoesNotExistError subclass:#MetacelloSymbolicVersionDoesNotExistError
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloSymbolicVersionDoesNotExistError methodsFor:'accessing'!
+
+possibleVersions
+ ^ self project symbolicVersionSymbols
+! !
+
+!MetacelloSymbolicVersionDoesNotExistError methodsFor:'printing'!
+
+description
+ "Return a textual description of the exception."
+
+ ^ 'The symbolic version ' , self versionString printString , ' is not defined in ' , self project label
+ , ' for the current platform. Possible symbolic version values include: ' , self possibleVersions printString
+! !
+
+!MetacelloSymbolicVersionDoesNotExistError class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSymbolicVersionMethodSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,67 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMethodSpec subclass:#MetacelloSymbolicVersionMethodSpec
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloSymbolicVersionMethodSpec methodsFor:'accessing'!
+
+versionString: aStringOrSymbol
+
+ aStringOrSymbol isSymbol ifFalse: [ self error: 'Version symbol ', aStringOrSymbol printString, ' for symbolic version method must be a Symbol' ].
+ super versionString: aStringOrSymbol
+! !
+
+!MetacelloSymbolicVersionMethodSpec methodsFor:'adding'!
+
+addMethodSection: attribute versionString: aString
+ self methodSections
+ add:
+ ((MetacelloSymbolicVersionSpec new)
+ attribute: attribute;
+ versionString: aString;
+ yourself)
+! !
+
+!MetacelloSymbolicVersionMethodSpec methodsFor:'method generation'!
+
+methodSource
+ | strm |
+ strm := WriteStream on: String new.
+ self symbolicMethodSelectorAndPragma: self selector symbolicVersionSymbol: self versionString on: strm.
+ (self methodSections asArray sort: [ :a :b | a attribute <= b attribute ])
+ do: [ :methodSection |
+ | vs |
+ strm
+ cr;
+ tab;
+ nextPutAll: 'spec for: #' , methodSection attribute asString printString , ' version: '.
+ vs := methodSection versionString.
+ vs isSymbol
+ ifTrue: [ strm nextPut: $# ].
+ strm
+ nextPutAll: vs asString printString , '.';
+ cr ].
+ ^ strm contents
+!
+
+symbolicMethodSelectorAndPragma: aSelector symbolicVersionSymbol: symbolicVersionSymbol on: strm
+ strm
+ nextPutAll: aSelector asString , ' spec';
+ cr;
+ tab;
+ nextPutAll: '<symbolicVersion: #' , symbolicVersionSymbol asString printString;
+ nextPutAll: '>';
+ cr
+! !
+
+!MetacelloSymbolicVersionMethodSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSymbolicVersionNotDefinedError.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,25 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloSymbolicVersionDoesNotExistError subclass:#MetacelloSymbolicVersionNotDefinedError
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloSymbolicVersionNotDefinedError methodsFor:'printing'!
+
+description
+ "Return a textual description of the exception."
+
+ ^ 'The symbolic version ' , self versionString printString , ' is EXPLICITLY not defined in ' , self project label
+ , ' for the current platform (i.e., symbolic version defined as #notDefined).'
+! !
+
+!MetacelloSymbolicVersionNotDefinedError class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloSymbolicVersionSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,26 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMethodSection subclass:#MetacelloSymbolicVersionSpec
+ instanceVariableNames:'versionString'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloSymbolicVersionSpec methodsFor:'accessing'!
+
+versionString
+ ^ versionString
+!
+
+versionString: anObject
+ versionString := anObject
+! !
+
+!MetacelloSymbolicVersionSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloToolBoxConstructor.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,130 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloAbstractVersionConstructor subclass:#MetacelloToolBoxConstructor
+ instanceVariableNames:'currentSection methodSections'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloToolBoxConstructor methodsFor:'api'!
+
+for: attribute do: aBlock
+ "conditional version support"
+
+ | methodSection |
+ methodSection := (MetacelloVersionMethodSection new)
+ attribute: attribute;
+ block: aBlock;
+ yourself.
+ currentSection ~~ nil
+ ifTrue: [ currentSection addMethodSection: methodSection ]
+ ifFalse: [ self methodSections add: methodSection]
+!
+
+for: attribute version: aString
+ "conditional symbolicVersion support"
+
+ self methodSections
+ add:
+ ((MetacelloSymbolicVersionSpec new)
+ attribute: attribute;
+ versionString: aString;
+ yourself)
+! !
+
+!MetacelloToolBoxConstructor methodsFor:'enumeration'!
+
+methodSectionsDo: aBlock
+
+ self methodSection: self do: aBlock
+!
+
+methodSectionsInEvaluationOrder: attributes do: aBlock
+ "breadth first traversal ... to collect selected sections, then evaluate individual sections in attribute order"
+
+ | selected |
+ selected := OrderedCollection new.
+ self methodSection: self inEvaluationOrder: attributes do: [:methodSection | selected add: methodSection ].
+ attributes
+ do: [ :attribute | (selected select: [ :methodSection | methodSection attribute == attribute ]) do: aBlock ].
+! !
+
+!MetacelloToolBoxConstructor methodsFor:'extraction'!
+
+extractMethodSectionsFor: sourceVersionString
+ | coll pragma |
+ coll := self extractAllVersionPragmas at: sourceVersionString ifAbsent: [ ^ #() ].
+ coll size > 1
+ ifTrue: [ self error: 'More than one pragma defining ' , sourceVersionString printString ].
+ pragma := coll at: 1.
+ self evaluatePragma: pragma.
+ self methodSections do: [ :methodSection | self evaluateMethodSection: methodSection version: sourceVersionString ].
+!
+
+extractSymbolicVersionSpecsFor: sourceVersionSymbol
+ | coll versionSpec pragma |
+ coll := self extractSymbolicVersionPragmas at: sourceVersionSymbol ifAbsent: [ ^ #() ].
+ coll size > 1
+ ifTrue: [ self error: 'More than one pragma defining ' , sourceVersionSymbol printString ].
+ pragma := coll at: 1.
+ self evaluatePragma: pragma.
+ ^ self methodSections
+
+! !
+
+!MetacelloToolBoxConstructor methodsFor:'initialization'!
+
+reset
+ super reset. "not needed, but included for completeness"
+ methodSections := nil
+! !
+
+!MetacelloToolBoxConstructor methodsFor:'private'!
+
+evaluateMethodSection: methodSection version: sourceVersionString
+ | versionSpec |
+ versionSpec := self project versionSpec.
+ versionSpec versionString: sourceVersionString.
+ methodSection versionSpec: versionSpec.
+ currentSection := methodSection.
+ self with: versionSpec during: methodSection block.
+ methodSection methodSections do: [ :ms | self evaluateMethodSection: ms version: sourceVersionString ]
+!
+
+methodSection: methodSection do: aBlock
+
+ methodSection methodSections do: aBlock.
+ methodSection methodSections do: [ :ms | self methodSection: ms do: aBlock ]
+!
+
+methodSection: methodSection inEvaluationOrder: attributes do: aBlock
+
+ | selected |
+ selected := OrderedCollection new.
+ attributes
+ do: [ :attribute |
+ methodSection methodSections
+ do: [ :ms |
+ attribute == ms attribute
+ ifTrue: [ selected add: ms ] ] ].
+ selected do: aBlock.
+ attributes size == 1
+ ifTrue: [ ^ self ].
+ selected
+ do: [ :ms | self methodSection: ms inEvaluationOrder: (attributes copyFrom: 2 to: attributes size) do: aBlock ]
+!
+
+methodSections
+
+ methodSections == nil ifTrue: [ methodSections := OrderedCollection new ].
+ ^methodSections
+! !
+
+!MetacelloToolBoxConstructor class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloUseUpgradeError.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloScriptingError subclass:#MetacelloUseUpgradeError
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Scripts'
+!
+
+
+!MetacelloUseUpgradeError class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloValidationCriticalWarning.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,30 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloValidationIssue subclass:#MetacelloValidationCriticalWarning
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Validation'
+!
+
+
+!MetacelloValidationCriticalWarning methodsFor:'accessing'!
+
+label
+
+ ^'Critical Warning'
+! !
+
+!MetacelloValidationCriticalWarning methodsFor:'testing'!
+
+isCriticalWarning
+
+ ^true
+! !
+
+!MetacelloValidationCriticalWarning class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloValidationError.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,30 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloValidationIssue subclass:#MetacelloValidationError
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Validation'
+!
+
+
+!MetacelloValidationError methodsFor:'accessing'!
+
+label
+
+ ^'Error'
+! !
+
+!MetacelloValidationError methodsFor:'testing'!
+
+isError
+
+ ^true
+! !
+
+!MetacelloValidationError class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloValidationFailure.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,34 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Error subclass:#MetacelloValidationFailure
+ instanceVariableNames:'issues'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloValidationFailure class methodsFor:'instance creation'!
+
+issues: anObject message: aString
+ ^ self new
+ issues: anObject;
+ signal: aString
+! !
+
+!MetacelloValidationFailure methodsFor:'accessing'!
+
+issues
+ ^ issues
+!
+
+issues: anObject
+ issues := anObject
+! !
+
+!MetacelloValidationFailure class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloValidationIssue.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,127 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Object subclass:#MetacelloValidationIssue
+ instanceVariableNames:'configurationClass explanation reasonCode callSite'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Validation'
+!
+
+
+!MetacelloValidationIssue class methodsFor:'instance creation'!
+
+configurationClass: aClass reasonCode: aSymbol callSite: aCallSite explanation: aString
+
+ ^(self new)
+ configurationClass: aClass;
+ reasonCode: aSymbol;
+ callSite: aCallSite;
+ explanation: aString;
+ yourself
+! !
+
+!MetacelloValidationIssue methodsFor:'accessing'!
+
+callSite
+ ^ callSite
+!
+
+callSite: anObject
+ callSite := anObject
+!
+
+configurationClass
+ ^ configurationClass
+!
+
+configurationClass: aClass
+ configurationClass := aClass
+!
+
+explanation
+ ^ explanation
+!
+
+explanation: aString
+ explanation := aString
+!
+
+label
+
+ ^''
+!
+
+reasonCode
+
+ reasonCode == nil ifTrue: [ reasonCode := #none ].
+ ^ reasonCode
+!
+
+reasonCode: anObject
+ reasonCode := anObject
+! !
+
+!MetacelloValidationIssue methodsFor:'printing'!
+
+printOn: aStream
+ aStream
+ nextPutAll: self label;
+ nextPut: $:;
+ space;
+ nextPutAll: self explanation.
+ self reasonCode ~~ #none
+ ifTrue: [
+ aStream
+ space;
+ nextPut: ${;
+ space;
+ nextPutAll: self reasonCode asString;
+ space;
+ nextPut: $} ].
+ (self configurationClass ~~ nil or: [ self callSite ~~ nil ])
+ ifTrue: [
+ aStream
+ space;
+ nextPut: $[;
+ space.
+ self configurationClass ~~ nil
+ ifTrue: [
+ aStream
+ nextPutAll: self configurationClass name asString;
+ space ].
+ self callSite ~~ nil
+ ifTrue: [
+ aStream
+ nextPutAll: self callSite name asString;
+ space ].
+ aStream nextPut: $] ]
+! !
+
+!MetacelloValidationIssue methodsFor:'testing'!
+
+isCritical
+
+ ^self isError or: [ self isCriticalWarning ]
+!
+
+isCriticalWarning
+
+ ^false
+!
+
+isError
+
+ ^false
+!
+
+isWarning
+
+ ^false
+! !
+
+!MetacelloValidationIssue class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloValidationNotification.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,43 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Notification subclass:#MetacelloValidationNotification
+ instanceVariableNames:'issue'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Notifications'
+!
+
+
+!MetacelloValidationNotification class methodsFor:'exceptioninstantiator'!
+
+signal: aMetacelloValidationIssue
+
+ ^ self new signal: aMetacelloValidationIssue
+! !
+
+!MetacelloValidationNotification methodsFor:'accessing'!
+
+issue
+ ^ issue
+!
+
+issue: anObject
+ issue := anObject
+! !
+
+!MetacelloValidationNotification methodsFor:'signaling'!
+
+signal: aMetacelloValidationIssue
+
+ self issue: aMetacelloValidationIssue.
+ ^ self raiseSignal
+
+ "Modified: / 02-10-2012 / 23:32:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloValidationNotification class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloValidationWarning.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,30 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloValidationIssue subclass:#MetacelloValidationWarning
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Validation'
+!
+
+
+!MetacelloValidationWarning methodsFor:'accessing'!
+
+label
+
+ ^'Warning'
+! !
+
+!MetacelloValidationWarning methodsFor:'testing'!
+
+isWarning
+
+ ^true
+! !
+
+!MetacelloValidationWarning class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloValueHolderSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,83 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloSpec subclass:#MetacelloValueHolderSpec
+ instanceVariableNames:'value'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloValueHolderSpec methodsFor:'accessing'!
+
+value: anObject
+ value := anObject
+! !
+
+!MetacelloValueHolderSpec methodsFor:'construction'!
+
+value: anObject constructor: aVersionConstructor
+ aVersionConstructor valueForValueHolder: anObject
+! !
+
+!MetacelloValueHolderSpec methodsFor:'merging'!
+
+mergeMap
+
+ | map |
+ map := super mergeMap.
+ map at: #value put: value.
+ ^map
+! !
+
+!MetacelloValueHolderSpec methodsFor:'printing'!
+
+configMethodOn: aStream indent: indent
+
+ aStream tab: indent; nextPutAll: 'spec value: ', self value printString
+! !
+
+!MetacelloValueHolderSpec methodsFor:'private'!
+
+setAuthorInMetacelloVersion: aMetacelloVersionSpec
+
+ aMetacelloVersionSpec setAuthor: self
+!
+
+setBlessingInMetacelloVersion: aMetacelloVersionSpec
+
+ aMetacelloVersionSpec setBlessing: self
+!
+
+setDescriptionInMetacelloVersion: aMetacelloVersionSpec
+
+ aMetacelloVersionSpec setDescription: self
+!
+
+setPostLoadDoItInMetacelloSpec: aMetacelloSpec
+
+ aMetacelloSpec setPostLoadDoIt: self
+!
+
+setPreLoadDoItInMetacelloSpec: aMetacelloSpec
+
+ aMetacelloSpec setPreLoadDoIt: self
+!
+
+setTimestampInMetacelloVersion: aMetacelloVersionSpec
+
+ aMetacelloVersionSpec setTimestamp: self
+! !
+
+!MetacelloValueHolderSpec methodsFor:'querying'!
+
+value
+ ^ value
+! !
+
+!MetacelloValueHolderSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersion.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,248 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Magnitude subclass:#MetacelloVersion
+ instanceVariableNames:'spec versionNumber importedVersions versionStatus'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Model'
+!
+
+
+!MetacelloVersion class methodsFor:'instance creation'!
+
+fromSpec: aMetacelloVersionSpec
+ ^ (self new versionNumber: aMetacelloVersionSpec versionNumber)
+ spec: aMetacelloVersionSpec;
+ yourself
+!
+
+fromString: aString
+
+ ^self new versionNumber: aString asMetacelloVersionNumber
+! !
+
+!MetacelloVersion methodsFor:'accessing'!
+
+basicSpec
+ ^ self spec
+!
+
+importedVersions
+
+ importedVersions == nil ifTrue: [ importedVersions := #() ].
+ ^importedVersions
+!
+
+importedVersions: aCollection
+
+ importedVersions := aCollection
+!
+
+projectLabel
+ ^ self basicSpec projectLabel
+!
+
+spec
+
+ ^spec
+!
+
+spec: aMetacellVersionSpec
+
+ spec := aMetacellVersionSpec
+!
+
+versionNumber: aVersionNumber
+
+ versionNumber := aVersionNumber
+!
+
+versionSpec
+
+ ^self spec
+!
+
+versionStatus
+
+ versionStatus == nil ifTrue: [ versionStatus := self computeVersionStatus].
+ ^versionStatus
+!
+
+versionStatus: aSymbol
+
+ versionStatus := aSymbol
+! !
+
+!MetacelloVersion methodsFor:'actions'!
+
+load
+
+ ^self subclassResponsibility
+!
+
+load: required
+
+ ^self subclassResponsibility
+!
+
+unload
+
+ ^self spec unload
+! !
+
+!MetacelloVersion methodsFor:'comparing'!
+
+< aMetacelloVersion
+
+ aMetacelloVersion species = self species ifFalse: [ ^false ].
+ ^self versionNumber < aMetacelloVersion versionNumber
+!
+
+= aMetacelloVersion
+
+ aMetacelloVersion species = self species ifFalse: [ ^false ].
+ ^self versionNumber = aMetacelloVersion versionNumber
+!
+
+hash
+
+ ^self versionNumber hash
+!
+
+~> aMetacelloVersion
+
+ aMetacelloVersion species = self species ifFalse: [ ^false ].
+ ^self versionNumber ~> aMetacelloVersion versionNumber
+! !
+
+!MetacelloVersion methodsFor:'printing'!
+
+printOn: aStream
+ | label vs |
+ self blessing ~~ #'broken'
+ ifTrue: [
+ (vs := self versionStatus) == #'somethingLoaded'
+ ifTrue: [ aStream nextPutAll: '<>' ].
+ vs == #'loadedMatchConstraints'
+ ifTrue: [ aStream nextPutAll: '>=' ].
+ vs == #'loadedToSpec'
+ ifTrue: [ aStream nextPut: $~ ] ].
+ self versionNumber printOn: aStream.
+ self basicSpec ~~ nil
+ ifTrue: [
+ (label := self projectLabel) isEmpty
+ ifFalse: [ aStream nextPutAll: ' [' , label , ']' ] ]
+! !
+
+!MetacelloVersion methodsFor:'private'!
+
+computeVersionStatus
+ "
+ #allLoadedToSpec - all projects and packages are loaded and match specification
+ #loadedToSpec - all loaded projects and packages match specifications (at least one package loaded)
+ #loadedMatchConstraints - all loaded projects and packages match constraints (at least one package loaded)
+ #somethingLoaded - at least one package loaded
+ "
+
+ self spec computeVersionStatus: [ :status | ^ status ].
+ ^ #noStatus
+! !
+
+!MetacelloVersion methodsFor:'querying'!
+
+author
+
+ ^self spec author value
+!
+
+blessing
+ ^ self basicSpec blessing value
+!
+
+description
+ ^ self basicSpec description value
+!
+
+loader
+
+ ^self spec loader
+!
+
+project
+ ^ self basicSpec project
+!
+
+timestamp
+ ^ self basicSpec timestamp value
+!
+
+versionKey
+ "version printString, without the versionStatus decorations, suitable for using as a unique key for the
+ receiver in a dictionary"
+
+ ^ String
+ streamContents: [ :aStream |
+ | label |
+ self versionNumber printOn: aStream.
+ self basicSpec ~~ nil
+ ifTrue: [
+ (label := self projectLabel) isEmpty
+ ifFalse: [ aStream nextPutAll: ' [' , label , ']' ] ] ]
+!
+
+versionNumber
+
+ ^versionNumber
+!
+
+versionNumberFrom: aString
+ ^ self versionNumber class fromString: aString
+!
+
+versionString
+
+ ^self versionNumber versionString
+! !
+
+!MetacelloVersion methodsFor:'testing'!
+
+isAllLoadedToSpec
+ "all projects and packages are loaded and match specification"
+
+ ^self spec isAllLoadedToSpec
+!
+
+isLoadedMatchConstraints
+ "all loaded projects and packages match constraints"
+
+ ^self spec isLoadedMatchConstraints
+!
+
+isLoadedToSpec
+ "all loaded projects and packages match specifications"
+
+ ^self spec isLoadedToSpec
+!
+
+isPossibleBaseline
+
+ ^self spec isPossibleBaseline
+!
+
+isSomethingLoaded
+ "at least one project or package has been loaded"
+
+ ^self spec isSomethingLoaded
+!
+
+name
+
+ ^self versionString
+! !
+
+!MetacelloVersion class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionConstructor.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,556 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloAbstractVersionConstructor subclass:#MetacelloVersionConstructor
+ instanceVariableNames:'errorMap'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloVersionConstructor class methodsFor:'instance creation'!
+
+on: aConfig
+
+ ^(self new)
+ on: aConfig;
+ yourself
+!
+
+on: aConfig project: aProject
+
+ ^(self new)
+ on: aConfig project: aProject;
+ yourself
+! !
+
+!MetacelloVersionConstructor class methodsFor:'deprecated'!
+
+spawnPackageMethodIn: aConfig category: methodCategory named: newSelector sourceVersion: sourceVersionString targetVersion: targetVersionString blessing: blessing
+
+ self deprecated: 'see MetacelloToolBox class>>createDevelopment:for:importFromBaseline:description: for a similar example'.
+ ^self new
+ spawnPackageMethodIn: aConfig
+ category: methodCategory
+ named: newSelector
+ sourceVersion: sourceVersionString
+ targetVersion: targetVersionString
+ blessing: blessing
+!
+
+spawnPackageMethodIn: aConfig named: newSelector sourceVersion: sourceVersionString targetVersion: targetVersionString
+
+ self deprecated: 'see MetacelloToolBox class>>createDevelopment:for:importFromBaseline:description: for a similar example'.
+ ^self
+ spawnPackageMethodIn: aConfig
+ category: 'versions'
+ named: newSelector
+ sourceVersion: sourceVersionString
+ targetVersion: targetVersionString
+ blessing: #development
+!
+
+spawnPackageMethodIn: aConfig named: newSelector sourceVersion: sourceVersionString targetVersion: targetVersionString blessing: blessing
+
+ self deprecated: 'see MetacelloToolBox class>>createDevelopment:for:importFromBaseline:description: for a similar example'.
+ ^self new
+ spawnPackageMethodIn: aConfig
+ category: 'versions'
+ named: newSelector
+ sourceVersion: sourceVersionString
+ targetVersion: targetVersionString
+ blessing: blessing
+!
+
+updatePackageMethodIn: aConfig sourceVersion: sourceVersionString
+
+ self deprecated: 'see MetacelloToolBox class>>updateDevelopment:for:updateProjects:description: for a similar example'.
+ ^self new
+ updatePackageMethodIn: aConfig
+ sourceVersion: sourceVersionString
+! !
+
+!MetacelloVersionConstructor methodsFor:'accessing'!
+
+errorMap
+ errorMap ifNil: [ errorMap := Dictionary new ].
+ ^ errorMap
+! !
+
+!MetacelloVersionConstructor methodsFor:'deprecated'!
+
+prepareForMethodUpdate: aConfig sourceVersion: sourceVersionString forceUpdate: forceUpdate generating: generateBlock
+ | pragmaDict versionSpecs pragmaMap updatedPackageSpecs updatedPackageSpecsMap reversed pragmaColl seenUpdatedPackageSpecs |
+ self deprecated: 'see MetacelloToolBox for replacement methods'.
+ self configuration: aConfig.
+ versionSpecs := Dictionary new.
+ pragmaMap := Dictionary new.
+ pragmaDict := self extractAllVersionPragmas.
+ pragmaColl := pragmaDict at: sourceVersionString ifAbsent: [ ^ self ].
+ pragmaColl
+ do: [ :pragma |
+ | specs versionSpec |
+ specs := Dictionary new.
+ self evaluatePragma: pragma.
+ self attributeMap
+ keysAndValuesDo: [ :attribute :blockList |
+ versionSpec := self project versionSpec.
+ versionSpec versionString: sourceVersionString.
+ specs at: attribute put: versionSpec.
+ blockList do: [ :block | self with: versionSpec during: block ] ].
+ versionSpecs
+ at: pragma selector
+ put:
+ {specs.
+ (self attributeOrder).
+ nil}.
+ pragmaMap at: pragma selector put: pragma.
+ self reset ].
+ versionSpecs
+ keysAndValuesDo: [ :selector :ar |
+ updatedPackageSpecsMap := Dictionary new.
+ seenUpdatedPackageSpecs := Dictionary new.
+ ar at: 3 put: updatedPackageSpecsMap.
+ reversed := aConfig project attributes reverse.
+ reversed
+ do: [ :attribute |
+ | vs |
+ (vs := (ar at: 1) at: attribute ifAbsent: [ ]) ~~ nil
+ ifTrue: [
+ updatedPackageSpecs := forceUpdate
+ ifTrue: [ vs forceUpdatedPackageSpecs ]
+ ifFalse: [ vs updatedPackageSpecs ].
+ updatedPackageSpecs associations
+ do: [ :assoc |
+ | filename |
+ (filename := seenUpdatedPackageSpecs at: assoc key ifAbsent: [ ]) == nil
+ ifTrue: [
+ assoc value == #uptodate
+ ifTrue: [
+ "#uptodate means that the spec is up-to-date and we mark it as
+ seen so that the spec is not update for a 'later' spec"
+ seenUpdatedPackageSpecs at: assoc key put: #uptodate ]
+ ifFalse: [ seenUpdatedPackageSpecs at: assoc key put: assoc value file ] ]
+ ifFalse: [
+ "if the spec was already seen as up-to-date or the file is the same as
+ the one already seen don't propogate the file"
+ (filename == #uptodate or: [ assoc value == #uptodate or: [ filename = assoc value file ] ])
+ ifTrue: [ updatedPackageSpecs removeKey: assoc key ] ] ].
+ updatedPackageSpecsMap at: attribute put: updatedPackageSpecs ] ]. "clear out #uptodate markers"
+ updatedPackageSpecsMap
+ valuesDo: [ :d |
+ d associations
+ do: [ :assoc |
+ assoc value == #uptodate
+ ifTrue: [ d removeKey: assoc key ] ] ]. "remove shadowed packages"
+ 1 to: reversed size do: [ :index |
+ | attribute d |
+ attribute := reversed at: index.
+ ((d := updatedPackageSpecsMap at: attribute ifAbsent: [ ]) ~~ nil and: [ d keys size > 0 ])
+ ifTrue: [
+ index + 1 to: reversed size do: [ :shadowIndex |
+ d
+ keysDo: [ :key |
+ | dict |
+ (dict := updatedPackageSpecsMap at: (reversed at: shadowIndex) ifAbsent: [ ]) ~~ nil
+ ifTrue: [ dict removeKey: key ifAbsent: [ ] ] ] ] ] ].
+ updatedPackageSpecsMap keys
+ do: [ :key |
+ | d |
+ d := updatedPackageSpecsMap at: key.
+ d isEmpty
+ ifTrue: [ updatedPackageSpecsMap removeKey: key ] ]. "ready to generate source for method"
+ generateBlock
+ value: selector
+ value: pragmaMap
+ value: ar
+ value: updatedPackageSpecsMap ]
+!
+
+spawnPackageMethodIn: aConfig category: methodCategory named: newSelector sourceVersion: sourceVersionString targetVersion: targetVersionString blessing: blessing
+
+ self deprecated: 'see MetacelloToolBox class>>createBaseline:for:from:description: for replacement method'.
+ self
+ prepareForMethodUpdate: aConfig
+ sourceVersion: sourceVersionString
+ forceUpdate: blessing ~~ #baseline
+ generating: [:selector :pragmaMap :ar :updatedPackageSpecsMap | | strm |
+ strm := WriteStream on: String new.
+ strm
+ nextPutAll: newSelector asString, ' spec'; cr;
+ tab; nextPutAll:
+ '<version: ',
+ targetVersionString printString,
+ ' imports: #(', sourceVersionString printString,
+ ')>';cr.
+ (ar at: 2) do: [:attribute | | vs d |
+ vs := (ar at: 1) at: attribute.
+ (d := updatedPackageSpecsMap at: attribute ifAbsent: []) ~~ nil
+ ifTrue: [
+ vs packagesSpec list do: [:member | | x |
+ x := d at: member spec name ifAbsent: [].
+ member spec updateForSpawnMethod: x ]]
+ ifFalse: [
+ vs packagesSpec list do: [:member |
+ member spec updateForSpawnMethod: member spec copy ]].
+ strm cr; tab; nextPutAll: 'spec for: ', attribute printString, ' do: ['; cr.
+ attribute == #common
+ ifTrue: [
+ vs
+ author: MetacelloPlatform current authorName;
+ timestamp: MetacelloPlatform current timestamp.
+ blessing ~~ nil
+ ifTrue: [ vs blessing: blessing ]].
+ vs configSpawnMethodOn: strm indent: 2.
+ strm nextPutAll: '].'].
+ (aConfig class
+ compile: strm contents
+ classified: methodCategory) == nil
+ ifTrue: [ self error: 'Error compiling the method' ]].
+ ^true
+!
+
+updatePackageMethodIn: aConfig sourceVersion: sourceVersionString
+
+ self deprecated: 'see MetacelloToolBox class>>updateDevelopment:for:updateProjects:description: for replacement method'.
+ self
+ prepareForMethodUpdate: aConfig
+ sourceVersion: sourceVersionString
+ forceUpdate: false
+ generating: [:selector :pragmaMap :ar :updatedPackageSpecsMap | | strm pragma |
+ updatedPackageSpecsMap isEmpty ifTrue: [ ^false ].
+ strm := WriteStream on: String new.
+ strm
+ nextPutAll: selector asString, ' spec'; cr;
+ tab; nextPutAll: '<version: ', sourceVersionString printString.
+ pragma := pragmaMap at: selector.
+ pragma numArgs = 2
+ ifTrue: [
+ strm nextPutAll: ' imports: #('.
+ (pragma argumentAt: 2) do: [:versionString |
+ strm nextPutAll: versionString printString; space ]].
+ strm nextPutAll: ')>';cr.
+ (ar at: 2) do: [:attribute | | vs d |
+ vs := (ar at: 1) at: attribute.
+ (d := updatedPackageSpecsMap at: attribute ifAbsent: []) ~~ nil
+ ifTrue: [
+ vs packagesSpec list do: [:member |
+ member spec file ~~ nil
+ ifTrue: [ | x |
+ (((x := d at: member spec name ifAbsent: []) ~~ nil) and: [ x ~~ #uptodate ])
+ ifTrue: [ member spec file: x file ]]]].
+ strm cr; tab; nextPutAll: 'spec for: ', attribute printString, ' do: ['; cr.
+ attribute == #common
+ ifTrue: [
+ vs
+ author: MetacelloPlatform current authorName;
+ timestamp: MetacelloPlatform current timestamp ].
+ vs configMethodOn: strm indent: 2.
+ strm nextPutAll: '].'].
+ (aConfig class
+ compile: strm contents
+ classified: (aConfig class whichCategoryIncludesSelector: pragma selector)) == nil
+ ifTrue: [ self error: 'Error compiling the method' ]].
+ ^true
+! !
+
+!MetacelloVersionConstructor methodsFor:'initialization'!
+
+calculate: aConfig project: aProject
+ | versionMap symbolicVersionMap executionBlock pragmaDict |
+ self setProject: aProject.
+ self configuration: aConfig.
+ versionMap := Dictionary new.
+ symbolicVersionMap := Dictionary new.
+ executionBlock := self specResolverBlock.
+ self collectAllVersionsFromVersionPragmasInto: versionMap using: executionBlock.
+ pragmaDict := self extractVersionImportPragmas.
+ self verifyVersionImportPragmas: pragmaDict definedIn: versionMap.
+ self collectAllVersionsFromVersionImportPragmasInto: versionMap using: executionBlock satisfiedPragmas: pragmaDict.
+ self collectAllSymbolicVersionsFromVersionPragmasInto: symbolicVersionMap using: self symbolicVersionResolverBlock.
+ self project map: versionMap.
+ self project errorMap: self errorMap.
+ self project symbolicVersionMap: symbolicVersionMap.
+ self project configuration: aConfig. "now that we have a nearly complete project, we can collect the defaultSymbolicVersions, which expect the project to be fully constructed"
+ self
+ collectDefaultSymbolicVersionsFromVersionPragmasFrom: self extractDefaultSymbolicVersionPragmas
+ into: symbolicVersionMap
+ using: self defaultSymbolicVersionResolverBlock. "Pick up defaults from MetacelloBaseConfiguration"
+ self
+ collectDefaultSymbolicVersionsFromVersionPragmasFrom: self extractCommonDefaultSymbolicVersionPragmas
+ into: symbolicVersionMap
+ using: self commonDefaultSymbolicVersionResolverBlock. "now resolive symbolicVersions defined as symbolicVersions"
+ symbolicVersionMap copy
+ keysAndValuesDo: [ :symbolic :original |
+ | versionString visited |
+ versionString := original.
+ visited := Set new.
+ [
+ visited add: versionString.
+ versionString isSymbol and: [ versionString ~~ #'notDefined' ] ]
+ whileTrue: [
+ versionString := symbolicVersionMap
+ at: versionString
+ ifAbsent: [ self error: 'Cannot resolve symbolic version ' , original printString ].
+ (visited includes: versionString)
+ ifTrue: [ self error: 'Loop detected resolving symbolic version ' , original printString ] ].
+ symbolicVersionMap at: symbolic put: versionString ]
+!
+
+on: aConfig
+
+ | cacheKey |
+ cacheKey := aConfig class.
+ project := MetacelloPlatform current
+ stackCacheFor: #versionConstructor
+ at: cacheKey
+ doing: [ :cache |
+ self calculate: aConfig project: nil.
+ cache at: cacheKey put: self project ].
+ self setProject: project.
+!
+
+on: aConfig project: aProject
+ | cacheKey cachedProject |
+ cacheKey := aConfig class.
+ cachedProject := MetacelloPlatform current
+ stackCacheFor: #'versionConstructor'
+ at: cacheKey
+ doing: [ :cache |
+ self calculate: aConfig project: aProject.
+ cache at: cacheKey put: self project.
+ ^ self ].
+ aProject map: cachedProject map.
+ aProject errorMap: cachedProject errorMap.
+ aProject symbolicVersionMap: cachedProject symbolicVersionMap.
+ aProject configuration: aConfig.
+ self setProject: aProject
+! !
+
+!MetacelloVersionConstructor methodsFor:'private'!
+
+collectAllSymbolicVersionsFromVersionPragmasInto: symbolicVersionMap using: executionBlock
+ | defined versionPragmaDict versionString |
+ versionPragmaDict := self extractSymbolicVersionPragmas.
+ versionPragmaDict
+ keysAndValuesDo: [ :versionSymbol :pragmaColl |
+ defined := false.
+ pragmaColl
+ do: [ :pragma |
+ defined := true.
+ versionString := executionBlock value: versionSymbol value: pragma ].
+ defined
+ ifTrue: [
+ versionString == nil
+ ifFalse: [ symbolicVersionMap at: versionSymbol put: versionString ]].
+ self reset ]
+!
+
+collectAllVersionsFromVersionImportPragmasInto: versionMap using: executionBlock satisfiedPragmas: pragmaDict
+ | defined done completed count |
+ done := false.
+ completed := IdentitySet new.
+ count := 0.
+ [
+ count := count + 1.
+ count > 10000
+ ifTrue: [ self error: 'Apparent loop in import expansion' ].
+ done ]
+ whileFalse: [
+ done := true.
+ pragmaDict
+ keysAndValuesDo: [ :versionString :pragmaColl |
+ | versionSpec |
+ versionSpec := nil.
+ defined := false.
+ [
+ pragmaColl
+ do: [ :pragma |
+ (completed includes: pragma)
+ ifFalse: [
+ | imports |
+ done := false.
+ imports := pragma argumentAt: 2.
+ imports
+ detect: [ :importedVersion | (versionMap includesKey: importedVersion) not ]
+ ifNone: [
+ imports
+ do: [ :importedVersion |
+ | version |
+ (version := versionMap at: importedVersion ifAbsent: [ ]) ~~ nil
+ ifTrue: [
+ defined := true.
+ completed add: pragma.
+ versionSpec == nil
+ ifTrue: [ versionSpec := version spec copy ]
+ ifFalse: [ versionSpec := versionSpec mergeSpec: version spec copy ].
+ versionSpec versionString: versionString.
+ executionBlock value: versionSpec value: pragma ] ] ] ] ] ]
+ on: Error
+ do: [ :ex |
+ (MetacelloErrorInProjectConstructionNotification versionString: versionSpec versionString exception: ex)
+ ifTrue: [ ^ ex pass ]
+ ifFalse: [
+ self errorMap at: versionSpec versionString put: ex.
+ done := true.
+ defined := false ] ].
+ defined
+ ifTrue: [
+ | version importedVersions |
+ importedVersions := OrderedCollection new.
+ version := versionSpec createVersion.
+ pragmaColl do: [ :pragma | importedVersions addAll: (pragma argumentAt: 2) ].
+ version importedVersions: importedVersions.
+ self validateVersionString: versionString againstSpec: versionSpec.
+ versionMap at: versionSpec versionString put: version ].
+ self reset ] ]
+!
+
+collectAllVersionsFromVersionPragmasInto: versionMap using: executionBlock
+ | defined versionPragmaDict |
+ versionPragmaDict := self extractVersionPragmas.
+ versionPragmaDict
+ keysAndValuesDo: [ :versionString :pragmaColl |
+ | versionSpec |
+ versionSpec := self project versionSpec.
+ versionSpec versionString: versionString.
+ defined := false.
+ [
+ pragmaColl
+ do: [ :pragma |
+ executionBlock value: versionSpec value: pragma.
+ defined := true ] ]
+ on: Error
+ do: [ :ex |
+ (MetacelloErrorInProjectConstructionNotification versionString: versionSpec versionString exception: ex)
+ ifTrue: [ ^ ex pass ]
+ ifFalse: [
+ self errorMap at: versionSpec versionString put: ex.
+ defined := false ] ].
+ defined
+ ifTrue: [
+ self validateVersionString: versionString againstSpec: versionSpec.
+ versionMap at: versionSpec versionString put: versionSpec createVersion ].
+ self reset ]
+!
+
+collectDefaultSymbolicVersionsFromVersionPragmasFrom: versionPragmaDict into: symbolicVersionMap using: executionBlock
+ | defined versionString |
+ versionPragmaDict
+ keysAndValuesDo: [ :versionSymbol :pragmaColl |
+ defined := false.
+ symbolicVersionMap
+ at: versionSymbol
+ ifAbsent: [
+ "process the defaultSymbolicVersion only if the symbolicVersion is not defined yet"
+ pragmaColl
+ do: [ :pragma |
+ defined := true.
+ versionString := executionBlock value: versionSymbol value: pragma ].
+ defined
+ ifTrue: [
+ versionString == nil
+ ifFalse: [ symbolicVersionMap at: versionSymbol put: versionString ] ].
+ self reset ] ]
+!
+
+commonDefaultSymbolicVersionResolverBlock
+ ^ self defaultSymbolicVersionResolverBlock: (ConfigurationOf new project: self project)
+!
+
+defaultSymbolicVersionResolverBlock
+ ^ self defaultSymbolicVersionResolverBlock: self configuration
+!
+
+defaultSymbolicVersionResolverBlock: receiver
+ ^ [ :symbolicVrsn :pragma |
+ | result |
+ result := nil.
+ (pragma argumentAt: 1) = symbolicVrsn
+ ifTrue: [
+ self symbolicVersion: symbolicVrsn.
+ result := [ receiver perform: pragma selector ] on: MetacelloVersionDoesNotExistError do: [ :ex | ex return: nil ] ].
+ result ]
+!
+
+specResolverBlock
+ ^ [ :versionSpec :pragma |
+ (pragma argumentAt: 1) = versionSpec versionString
+ ifTrue: [
+ self evaluatePragma: pragma.
+ self project attributes
+ do: [ :attribute |
+ | blockList |
+ (blockList := self attributeMap at: attribute ifAbsent: [ ]) ~~ nil
+ ifTrue: [ blockList do: [ :block | self with: versionSpec during: block ] ] ] ] ]
+!
+
+symbolicVersionResolverBlock
+ ^ [ :symbolicVrsn :pragma |
+ | result |
+ result := nil.
+ (pragma argumentAt: 1) = symbolicVrsn
+ ifTrue: [
+ self symbolicVersion: symbolicVrsn.
+ self evaluatePragma: pragma.
+ self project attributes
+ do: [ :attribute |
+ | versionString |
+ versionString := self attributeMap at: attribute ifAbsent: [ ].
+ versionString ~~ nil
+ ifTrue: [ result := versionString ] ] ].
+ result ]
+!
+
+verifyVersionImportPragmas: pragmaDict definedIn: versionMap
+ pragmaDict copy
+ keysAndValuesDo: [ :versionString :pragmaColl |
+ [
+ pragmaColl
+ do: [ :pragma |
+ (pragma argumentAt: 2)
+ do: [ :importedVersion |
+ versionMap
+ at: importedVersion
+ ifAbsent: [
+ pragmaDict
+ at: importedVersion
+ ifAbsent: [
+ ^ self
+ error:
+ 'The imported version:' , importedVersion printString , ' for version: ' , versionString
+ , ' referenced from the method: ' , pragma selector printString
+ , ' in configuration ' , configuration class printString
+ , ' has not been defined.' ] ] ] ] ]
+ on: Error
+ do: [ :ex |
+ (MetacelloErrorInProjectConstructionNotification versionString: versionString exception: ex)
+ ifTrue: [ ^ ex pass ]
+ ifFalse: [
+ pragmaDict removeKey: versionString.
+ self errorMap at: versionString put: ex ] ] ]
+! !
+
+!MetacelloVersionConstructor methodsFor:'validation'!
+
+validateVersionString: versionString againstSpec: versionSpec
+
+ versionString = versionSpec versionString
+ ifFalse: [
+ MetacelloValidationNotification
+ signal:
+ (MetacelloValidationError
+ configurationClass: self configurationClass
+ reasonCode: #incorrectVersionString
+ callSite: #validateVersionString:againstSpec
+ explanation:
+ 'The version declared in the pragma ', versionString printString , ' does not match the version in the spec '
+ , versionSpec versionString printString) ].
+! !
+
+!MetacelloVersionConstructor class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionDefinitionError.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,44 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloVersionDoesNotExistError subclass:#MetacelloVersionDefinitionError
+ instanceVariableNames:'exception'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloVersionDefinitionError methodsFor:'accessing'!
+
+exception
+ ^ exception
+!
+
+exception: anObject
+ exception := anObject
+! !
+
+!MetacelloVersionDefinitionError methodsFor:'printing'!
+
+description
+ "Return a textual description of the exception."
+
+ ^ 'The version ' , self versionString printString , ' is not defined in ' , self project label
+ , ' for the current platform, because an exception occurred while creating the version:. '
+ , self exception description , '. Evaluate the following to see the error: ''['
+ , self project configuration class name asString
+ ,
+ ' project ]
+ on: MetacelloErrorInProjectConstructionNotification
+ do: [:ex | ex resume: true ].'''
+ ,
+ '
+Possible versions include: ' , self possibleVersions printString
+! !
+
+!MetacelloVersionDefinitionError class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionDoesNotExistError.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,57 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Error subclass:#MetacelloVersionDoesNotExistError
+ instanceVariableNames:'project versionString'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Exceptions-Errors'
+!
+
+
+!MetacelloVersionDoesNotExistError class methodsFor:'instance creation'!
+
+project: aMetacelloProject versionString: aVersionString
+
+ ^(self new)
+ project: aMetacelloProject;
+ versionString: aVersionString;
+ yourself
+! !
+
+!MetacelloVersionDoesNotExistError methodsFor:'accessing'!
+
+possibleVersions
+ ^ self project symbolicVersionSymbols , (self project versions collect: [ :each | each versionString ])
+!
+
+project
+ ^ project
+!
+
+project: anObject
+ project := anObject
+!
+
+versionString
+ ^ versionString
+!
+
+versionString: anObject
+ versionString := anObject
+! !
+
+!MetacelloVersionDoesNotExistError methodsFor:'printing'!
+
+description
+ "Return a textual description of the exception."
+
+ ^ 'Version ' , self versionString printString , ' is not defined in ' , self project label
+ , '. Possible versions include: ' , self possibleVersions printString
+! !
+
+!MetacelloVersionDoesNotExistError class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionMethodSection.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,75 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMethodSection subclass:#MetacelloVersionMethodSection
+ instanceVariableNames:'block versionSpec parent methodSections'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloVersionMethodSection methodsFor:'accessing'!
+
+addMethodSection: methodSection
+
+ methodSection parent: self.
+ self methodSections add: methodSection
+!
+
+attributeOrPath
+ | path |
+ ^self parent == nil
+ ifTrue: [ self attribute ]
+ ifFalse: [ self parent attributePath , {(self attribute)} ]
+!
+
+attributePath
+ | path |
+ path := {self attribute.}.
+ ^self parent == nil
+ ifTrue: [ path ]
+ ifFalse: [ self parent attributePath , path ]
+!
+
+block
+ ^ block
+!
+
+block: anObject
+ block := anObject
+!
+
+methodSections
+
+ methodSections ifNil: [ methodSections := OrderedCollection new ].
+ ^methodSections
+!
+
+parent
+ ^ parent
+!
+
+parent: anObject
+ parent := anObject
+!
+
+topParent
+ self parent == nil
+ ifTrue: [ ^ self ].
+ ^ self parent topParent
+!
+
+versionSpec
+ ^ versionSpec
+!
+
+versionSpec: anObject
+ versionSpec := anObject
+! !
+
+!MetacelloVersionMethodSection class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionMethodSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,164 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloMethodSpec subclass:#MetacelloVersionMethodSpec
+ instanceVariableNames:'imports'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Constructors'
+!
+
+
+!MetacelloVersionMethodSpec methodsFor:'accessing'!
+
+imports
+ imports == nil ifTrue: [ imports := #() ].
+ ^ imports
+!
+
+imports: anObject
+ imports := anObject
+!
+
+versionString: aStringOrSymbol
+
+ aStringOrSymbol isSymbol ifTrue: [ self error: 'Version string ', aStringOrSymbol printString, ' for version method must be a String' ].
+ super versionString: aStringOrSymbol
+! !
+
+!MetacelloVersionMethodSpec methodsFor:'adding'!
+
+addMethodSection: attributeOrPath versionSpec: versionSpec
+ | attribute methodSection index sections found |
+ attributeOrPath isArray
+ ifTrue: [ attribute := attributeOrPath last ]
+ ifFalse: [ attribute := attributeOrPath ].
+ methodSection := (MetacelloVersionMethodSection new)
+ attribute: attribute;
+ versionSpec: versionSpec;
+ yourself.
+ attributeOrPath isArray
+ ifTrue: [
+ index := 1.
+ sections := self methodSections.
+ found := true.
+ [ found ]
+ whileTrue: [
+ found := false.
+ sections
+ do: [ :ms |
+ ms attribute == (attributeOrPath at: index)
+ ifTrue: [
+ index == (attributeOrPath size -1 )
+ ifTrue: [
+ ms methodSections add: methodSection.
+ ^ self ].
+ sections := ms methodSections.
+ index := index + 1.
+ found := true ] ] ].
+ self error: 'Method section for attribute: ' , (attributeOrPath at: index) printString , ' not found.' ]
+ ifFalse: [ self methodSections add: methodSection ]
+!
+
+findMethodSection: attributeOrPath
+ | attribute index sections found |
+ attributeOrPath isArray
+ ifTrue: [ attribute := attributeOrPath last ]
+ ifFalse: [ attribute := attributeOrPath ].
+ attributeOrPath isArray
+ ifTrue: [
+ index := 1.
+ sections := self methodSections.
+ found := true.
+ [ found ]
+ whileTrue: [
+ found := false.
+ sections
+ do: [ :ms |
+ ms attribute == (attributeOrPath at: index)
+ ifTrue: [
+ index == (attributeOrPath size - 1)
+ ifTrue: [ ^ ms ].
+ sections := ms methodSections.
+ index := index + 1.
+ found := true ] ] ].
+ self error: 'Method section for attribute: ' , (attributeOrPath at: index) printString , ' not found.' ]
+ ifFalse: [
+ ^ self methodSections
+ detect: [ :methodSection | methodSection attribute == attribute ]
+ ifNone: [ self error: 'Method section for attribute: ' , attribute printString , ' not found.' ] ]
+! !
+
+!MetacelloVersionMethodSpec methodsFor:'method generation'!
+
+methodSelectorAndPragma: aSelector imports: importList versionString: aString on: strm
+ strm
+ nextPutAll: aSelector asString , ' spec';
+ cr;
+ tab;
+ nextPutAll: '<version: ' , aString printString.
+ importList notEmpty
+ ifTrue: [
+ strm nextPutAll: ' imports: #('.
+ importList
+ do: [ :importVersionString |
+ strm
+ nextPutAll: importVersionString printString;
+ space ].
+ strm nextPut: $) ].
+ strm
+ nextPutAll: '>';
+ cr
+!
+
+methodSource
+ | strm |
+ strm := WriteStream on: String new.
+ self
+ methodSelectorAndPragma: self selector
+ imports: self imports
+ versionString: self versionString
+ on: strm.
+ self
+ methodSection: self
+ pre: [ :methodSection :indent |
+ strm
+ cr;
+ tab: indent;
+ nextPutAll: 'spec for: #' , methodSection attribute asString printString , ' do: [';
+ cr.
+ methodSection versionSpec configMethodOn: strm last: methodSection methodSections isEmpty indent: indent + 1 ]
+ last: false
+ post: [ :methodSection :indent :last |
+ strm nextPutAll: ' ].'.
+ (last or: [ (indent = 1 or: [(methodSection methodSections isEmpty and: [ indent = 1 ])]) ])
+ ifTrue: [ strm cr ] ]
+ indent: 0.
+ ^ strm contents
+! !
+
+!MetacelloVersionMethodSpec methodsFor:'private'!
+
+methodSection: methodSection pre: preBlock last: last post: postBlock indent: indent
+ | list |
+ methodSection ~~ self
+ ifTrue: [ preBlock value: methodSection value: indent ].
+ list := methodSection methodSections.
+ 1 to: list size
+ do: [ :index | | ms |
+ ms := list at: index.
+ self
+ methodSection: ms
+ pre: preBlock
+ last: index ~= list size
+ post: postBlock
+ indent: indent + 1 ].
+ methodSection ~~ self
+ ifTrue: [ postBlock value: methodSection value: indent value: last ]
+! !
+
+!MetacelloVersionMethodSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionNumber.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,345 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+Magnitude variableSubclass:#MetacelloVersionNumber
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Model'
+!
+
+
+!MetacelloVersionNumber class methodsFor:'instance creation'!
+
+fromString: aString
+
+ | new components |
+ components := OrderedCollection new.
+ (aString findTokens: '.') do: [:subString | | strs |
+ strs := subString findTokens: '-'.
+ "first subString token could be an integer"
+ components add: (self extractNumericComponent: strs first).
+ strs size > 1
+ ifTrue: [
+ "remaining are uncoditionally Strings, because of leading $-"
+ components addAll: strs allButFirst ]].
+ new := self new: components size.
+ 1 to: components size do: [:i | new at: i put: (components at: i) ].
+ ^new
+! !
+
+!MetacelloVersionNumber class methodsFor:'private'!
+
+extractNumericComponent: subString
+ "$. separated components are integers"
+
+ | number |
+ number := [subString asNumber]
+ on: Error
+ do: [:ex | ex return: subString ].
+ ^number asString = subString
+ ifTrue: [ number ]
+ ifFalse: [ subString ]
+! !
+
+!MetacelloVersionNumber methodsFor:'accessing'!
+
+approximateBase
+
+ | base |
+ base := self copyFrom: 1 to: self size - 1.
+ base at: base size put: (base at: base size) + 1.
+ ^base
+!
+
+versionString
+
+ | strm |
+ strm := WriteStream on: String new.
+ self printOn: strm.
+ ^strm contents
+! !
+
+!MetacelloVersionNumber methodsFor:'comparing'!
+
+< aMetacelloVersionNumber
+
+ | condensed aCondensed |
+ aMetacelloVersionNumber species = self species
+ ifFalse: [ ^ false ].
+ condensed := self collapseZeros.
+ aCondensed := aMetacelloVersionNumber collapseZeros.
+ (condensed ~~ self or: [ aCondensed ~~ aMetacelloVersionNumber ])
+ ifTrue: [ ^ condensed compareLessThan: aCondensed ].
+ ^ self compareLessThan: aMetacelloVersionNumber
+!
+
+= aMetacelloVersionNumber
+
+ | condensed aCondensed |
+ aMetacelloVersionNumber species = self species
+ ifFalse: [ ^ false ].
+ condensed := self collapseZeros.
+ aCondensed := aMetacelloVersionNumber collapseZeros.
+ (condensed ~~ self or: [ aCondensed ~~ aMetacelloVersionNumber ])
+ ifTrue: [ ^ condensed compareEqualTo: aCondensed ].
+ ^ self compareEqualTo: aMetacelloVersionNumber
+!
+
+hash
+
+"Returns a numeric hash key for the receiver."
+
+| mySize interval hashValue |
+
+(mySize := self size) == 0
+ ifTrue: [ ^15243 ].
+
+"Choose an interval so that we sample at most 5 elements of the receiver"
+interval := ((mySize - 1) // 4) max: 1.
+
+hashValue := 4459.
+1 to: mySize by: interval do: [ :i | | anElement |
+ anElement := self at: i.
+ (anElement isKindOf: SequenceableCollection)
+ ifTrue: [
+ hashValue := (hashValue bitShift: -1) bitXor: anElement size.
+ ]
+ ifFalse: [
+ hashValue := (hashValue bitShift: -1) bitXor: anElement hash.
+ ].
+ ].
+
+^ hashValue abs
+!
+
+match: aVersionPattern
+ "Answer whether the version number of the receiver matches the given pattern string.
+
+ A Metacello version number is made up of version sequences delimited by the characters $. and $-.
+ The $. introduces a numeric version sequence and $- introduces an alphanumeric version sequence.
+
+ A version pattern is made up of version pattern match sequences. also delimited by the characters $.
+ and $-.. Each pattern match sequence is tested against the corresponding version sequence of the
+ receiver, using the 'standard' pattern matching rules. All sequences must answer true for a match.
+
+ The special pattern sequence '?' is a match for the corresponding version sequence and all subsequent
+ version sequences. '?' as the version pattern matches all versions. No more version pattern
+ sequences are permitted once the '?' sequence is used. If used, it is the last version pattern
+ sequence. "
+
+ | patternVersion mySize patternSize |
+ patternVersion := aVersionPattern asMetacelloVersionNumber.
+ mySize := self size.
+ patternSize := patternVersion size.
+ mySize = patternSize
+ ifFalse: [
+ mySize < patternSize ifTrue: [ ^false ].
+ (patternVersion at: patternSize) ~= '?' ifTrue: [ ^false ].
+ mySize := patternSize ].
+ 1 to: mySize do: [:i | | pattern |
+ pattern := (patternVersion at: i) asString.
+ pattern = '?'
+ ifTrue: [i = mySize ifFalse: [ ^self error: 'Invalid version match pattern: ', aVersionPattern printString ]]
+ ifFalse: [ (pattern match: (self at: i) asString) ifFalse: [ ^false ]]].
+ ^true
+"
+ '1.1.1' asMetacelloVersionNumber match: '*.*.*'. -> true
+ '1.1.1' asMetacelloVersionNumber match: '*.#.*'. -> true
+ '1.10.1' asMetacelloVersionNumber match: '*.#.*'. -> false
+ '1.1.1' asMetacelloVersionNumber match: '*.*'. -> false
+ '1.1.1' asMetacelloVersionNumber match: '*.?'. -> true
+ '1.0' asMetacelloVersionNumber match: '1.?'. -> true
+ '2.0' asMetacelloVersionNumber match: '1.?'. -> false
+ '1.1.1' asMetacelloVersionNumber match: '?'. -> true
+ '1' asMetacelloVersionNumber match: '*.?'. -> false
+ '1-alpha5.0' asMetacelloVersionNumber match: '1-alpha*.?'. -> true
+ '1-alpha15.0.1' asMetacelloVersionNumber match: '1-alpha*.?'. -> true
+ '1.1' asMetacelloVersionNumber match: '?.?'. -> ERROR: invalid version match pattern
+"
+!
+
+~> aMetacelloVersionNumber
+
+ aMetacelloVersionNumber size == 1 ifTrue: [ ^false ].
+ ^self >= aMetacelloVersionNumber and: [ self < aMetacelloVersionNumber approximateBase ]
+! !
+
+!MetacelloVersionNumber methodsFor:'converting'!
+
+asMetacelloVersionNumber
+
+ ^self
+! !
+
+!MetacelloVersionNumber methodsFor:'copying'!
+
+copyFrom: start to: stop
+ "Answer a copy of a subset of the receiver, starting from element at
+ index start until element at index stop."
+
+ | newSize new j |
+ newSize := stop - start + 1.
+ new := self species new: newSize.
+ j := 0.
+ start to: stop do: [:i |
+ new at: j + 1 put: (self at: i).
+ j := j + 1 ].
+ ^new
+! !
+
+!MetacelloVersionNumber methodsFor:'enumerating'!
+
+do: aBlock
+ "Refer to the comment in Collection|do:."
+ 1 to: self size do:
+ [:index | aBlock value: (self at: index)]
+!
+
+do: elementBlock separatedBy: separatorBlock
+ "Evaluate the elementBlock for all elements in the receiver,
+ and evaluate the separatorBlock between."
+
+ | beforeFirst |
+ beforeFirst := true.
+ self do:
+ [:each |
+ beforeFirst
+ ifTrue: [beforeFirst := false]
+ ifFalse: [separatorBlock value].
+ elementBlock value: each]
+! !
+
+!MetacelloVersionNumber methodsFor:'operations'!
+
+decrementMinorVersionNumber
+ | int |
+ self size to: 1 by: -1 do: [ :index |
+ (int := self at: index) isString
+ ifFalse: [
+ int > 0
+ ifTrue: [ self at: index put: int - 1 ].
+ ^ self ] ]
+!
+
+incrementMinorVersionNumber
+
+ | int |
+ self size to: 1 by: -1 do: [:index |
+ (int := self at: index) isString
+ ifFalse: [
+ self at: index put: int + 1.
+ ^self ]].
+! !
+
+!MetacelloVersionNumber methodsFor:'printing'!
+
+asString
+ "Answer a string that represents the receiver."
+
+ ^ self printString
+!
+
+printOn: aStream
+
+ | beforeFirst |
+ beforeFirst := true.
+ self do:
+ [:each |
+ beforeFirst
+ ifTrue: [beforeFirst := false]
+ ifFalse: [
+ each isString
+ ifTrue: [ aStream nextPut: $- ]
+ ifFalse: [ aStream nextPut: $. ] ].
+ aStream nextPutAll: each asString ]
+! !
+
+!MetacelloVersionNumber methodsFor:'private'!
+
+collapseZeros
+ "the rule must be that zeros can be collapsed as long as the series of zeros ends in a string term"
+
+ | collection newSize new j lastElementIsStringOrZero canCollapse |
+ (self size = 0 or: [ self at: 1 ]) == 0
+ ifTrue: [ ^ self ].
+ collection := OrderedCollection new.
+ lastElementIsStringOrZero := true.
+ canCollapse := true.
+ self size to: 1 by: -1 do: [ :i |
+ | element |
+ element := self at: i.
+ (canCollapse and: [ element == 0 ])
+ ifTrue: [
+ lastElementIsStringOrZero
+ ifFalse: [
+ canCollapse := false.
+ collection addFirst: element.]]
+ ifFalse: [
+ collection addFirst: element.
+ canCollapse := lastElementIsStringOrZero := element isString ] ].
+ collection size = self size
+ ifTrue: [ ^ self ].
+ newSize := collection size.
+ new := self species new: newSize.
+ j := 0.
+ collection
+ do: [ :element |
+ new at: j + 1 put: element.
+ j := j + 1 ].
+ ^ new
+!
+
+compareEqualTo: aMetacelloVersionNumber
+
+ | mySize |
+ aMetacelloVersionNumber species = self species ifFalse: [ ^false ].
+ mySize := self size.
+ mySize = aMetacelloVersionNumber size
+ ifFalse: [ ^false ].
+ 1 to: mySize do: [:i |
+ (self at: i) = (aMetacelloVersionNumber at: i) ifFalse: [ ^false ]].
+ ^true
+!
+
+compareLessThan: aMetacelloVersionNumber
+
+ | mySize aSize commonSize count more |
+ mySize := self size.
+ aSize := aMetacelloVersionNumber size.
+ commonSize := mySize min: aSize.
+ count := 0.
+ more := true.
+ [ more and: [ count < commonSize ]] whileTrue: [
+ (self at: count + 1) = (aMetacelloVersionNumber at: count + 1)
+ ifTrue: [ count := count + 1 ]
+ ifFalse: [ more := false ]].
+ count < commonSize
+ ifTrue: [
+ ^(self at: count + 1)
+ metacelloVersionComponentLessThan: (aMetacelloVersionNumber at: count + 1) ].
+ mySize < aSize
+ ifTrue: [
+ mySize = 0 ifTrue: [ ^true ].
+ "if the versions at commonSize are equal and the next version slot in aMetacelloVersionNumber
+ is a string, then it's considered that I'm > aMetacelloVersionNumber
+ (i.e., '2.9.9' is greater than '2.9.9-alpha.2')"
+ (self at: commonSize) = (aMetacelloVersionNumber at: commonSize)
+ ifFalse: [ ^true ].
+ ^(aMetacelloVersionNumber at: commonSize+1) isString not]
+ ifFalse: [
+ mySize = aSize ifTrue: [ ^false ].
+ aSize <= 0 ifTrue: [ ^false ].
+ "if the versions at commonSize are equal and the next version slot is a string,
+ then it's considered that I'm < aMetacelloVersionNumber
+ (i.e., '2.9.9-alpha.2' is less than '2.9.9')"
+ (self at: commonSize) = (aMetacelloVersionNumber at: commonSize)
+ ifFalse: [ ^false ].
+ ^(self at: commonSize+1) isString]
+! !
+
+!MetacelloVersionNumber class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,359 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloSpec subclass:#MetacelloVersionSpec
+ instanceVariableNames:'versionString blessing description author timestamp preLoadDoIt
+ postLoadDoIt'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Specs'
+!
+
+
+!MetacelloVersionSpec methodsFor:'accessing'!
+
+author
+
+ author == nil
+ ifTrue: [
+ ^self project valueHolderSpec
+ value: '';
+ yourself].
+ ^ author
+!
+
+author: anObject
+
+ anObject setAuthorInMetacelloVersion: self
+!
+
+blessing
+
+ blessing == nil
+ ifTrue: [
+ ^self project valueHolderSpec
+ value: self project defaultBlessing;
+ yourself].
+ ^ blessing
+!
+
+blessing: anObject
+
+ anObject setBlessingInMetacelloVersion: self
+!
+
+description
+
+ description == nil
+ ifTrue: [
+ ^self project valueHolderSpec
+ value: '';
+ yourself].
+ ^ description
+!
+
+description: anObject
+
+ anObject setDescriptionInMetacelloVersion: self
+!
+
+getAuthor
+ ^author
+!
+
+getBlessing
+ ^blessing
+!
+
+getDescription
+ ^description
+!
+
+getPostLoadDoIt
+ ^postLoadDoIt
+!
+
+getPreLoadDoIt
+ ^preLoadDoIt
+!
+
+getTimestamp
+ ^timestamp
+!
+
+postLoadDoIt: anObject
+
+ anObject setPostLoadDoItInMetacelloSpec: self
+!
+
+preLoadDoIt: anObject
+
+ anObject setPreLoadDoItInMetacelloSpec: self
+!
+
+projectLabel
+
+ ^self project label
+!
+
+setAuthor: anObject
+ author := anObject
+!
+
+setBlessing: anObject
+ blessing := anObject
+!
+
+setDescription: anObject
+ description := anObject
+!
+
+setPostLoadDoIt: aSymbol
+
+ postLoadDoIt := aSymbol
+!
+
+setPreLoadDoIt: aSymbol
+
+ preLoadDoIt := aSymbol
+!
+
+setTimestamp: anObject
+ timestamp := anObject
+!
+
+timestamp
+
+ timestamp == nil
+ ifTrue: [
+ ^self project valueHolderSpec
+ value: '';
+ yourself].
+ ^ timestamp
+!
+
+timestamp: anObject
+
+ anObject setTimestampInMetacelloVersion: self
+!
+
+versionString: anObject
+ versionString := anObject
+! !
+
+!MetacelloVersionSpec methodsFor:'construction'!
+
+author: aBlockOrString constructor: aVersionConstructor
+ aVersionConstructor authorForVersion: aBlockOrString
+!
+
+blessing: aBlockOrString constructor: aVersionConstructor
+ aVersionConstructor blessingForVersion: aBlockOrString
+!
+
+description: aBlockOrString constructor: aVersionConstructor
+ aVersionConstructor descriptionForVersion: aBlockOrString
+!
+
+postLoadDoIt: aSymbol constructor: aVersionConstructor
+ aVersionConstructor postLoadDoItForVersion: aSymbol
+!
+
+preLoadDoIt: aSymbol constructor: aVersionConstructor
+ aVersionConstructor preLoadDoItForVersion: aSymbol
+!
+
+repositories: aBlock constructor: aVersionConstructor
+ aVersionConstructor repositoriesForVersion: aBlock
+!
+
+repository: anObject constructor: aVersionConstructor
+ aVersionConstructor repositoryForVersion: anObject
+!
+
+repository: aString username: username password: password constructor: aVersionConstructor
+ aVersionConstructor repositoryForVersion: aString username: username password: password
+!
+
+timestamp: aBlockOrStringOrDateAndTime constructor: aVersionConstructor
+ aVersionConstructor timestampForVersion: aBlockOrStringOrDateAndTime
+! !
+
+!MetacelloVersionSpec methodsFor:'copying'!
+
+postCopy
+
+ super postCopy.
+ blessing := blessing copy.
+ description := description copy.
+ author := author copy.
+ timestamp := timestamp copy.
+
+! !
+
+!MetacelloVersionSpec methodsFor:'merging'!
+
+mergeMap
+
+ | map |
+ map := super mergeMap.
+ map at: #versionString put: versionString.
+ map at: #blessing put: blessing.
+ map at: #description put: description.
+ map at: #author put: author.
+ map at: #timestamp put: timestamp.
+ map at: #preLoadDoIt put: preLoadDoIt.
+ map at: #postLoadDoIt put: postLoadDoIt.
+ ^map
+! !
+
+!MetacelloVersionSpec methodsFor:'printing'!
+
+configMethodOn: aStream for: spec selector: selector last: last indent: indent
+ spec == nil
+ ifTrue: [ ^ self ].
+ aStream
+ tab: indent;
+ nextPutAll: 'spec ' , selector , ' [';
+ cr.
+ spec configMethodOn: aStream indent: indent + 1.
+ aStream nextPutAll: ' ].'.
+ last
+ ifFalse: [ aStream cr ]
+!
+
+configMethodOn: aStream indent: indent
+
+ self configMethodOn: aStream last: true indent: indent
+!
+
+configMethodOn: aStream last: last indent: indent
+ | values lastIndex lastBlock |
+ last
+ ifTrue: [
+ "need to calculate last statement with a value"
+ values := {(self getBlessing).
+ (self getDescription).
+ (self getPreLoadDoIt).
+ (self getPostLoadDoIt).
+ (self getAuthor).
+ (self getTimestamp)}.
+ 1 to: values size do: [ :index |
+ (values at: index) ~~ nil
+ ifTrue: [ lastIndex := index ] ].
+ lastBlock := [ :arg | arg = lastIndex ] ]
+ ifFalse: [ lastBlock := [ :arg | false ] ].
+ self
+ configMethodValueOn: aStream
+ for: self getBlessing
+ selector: 'blessing:'
+ last: (lastBlock value: 1)
+ indent: indent.
+ self
+ configMethodValueOn: aStream
+ for: self getDescription
+ selector: 'description:'
+ last: (lastBlock value: 2)
+ indent: indent.
+ self
+ configMethodValueOn: aStream
+ for: self getPreLoadDoIt
+ selector: 'preLoadDoIt:'
+ last: (lastBlock value: 3)
+ indent: indent.
+ self
+ configMethodValueOn: aStream
+ for: self getPostLoadDoIt
+ selector: 'postLoadDoIt:'
+ last: (lastBlock value: 4)
+ indent: indent.
+ self
+ configMethodValueOn: aStream
+ for: self getAuthor
+ selector: 'author:'
+ last: (lastBlock value: 5)
+ indent: indent.
+ self
+ configMethodValueOn: aStream
+ for: self getTimestamp
+ selector: 'timestamp:'
+ last: (lastBlock value: 6)
+ indent: indent
+!
+
+configMethodValueOn: aStream for: spec selector: selector last: last indent: indent
+ | valuePrintString |
+ spec == nil
+ ifTrue: [ ^ self ].
+ valuePrintString := spec value isSymbol
+ ifTrue: [ '#' , spec value asString printString ]
+ ifFalse: [ spec value printString ].
+ aStream
+ tab: indent;
+ nextPutAll: 'spec ' , selector , ' ' , valuePrintString , '.'.
+ last
+ ifFalse: [ aStream cr ]
+!
+
+configSpawnMethodOn: aStream indent: indent
+
+ self configMethodValueOn: aStream for: self getBlessing selector: 'blessing:' last: false indent: indent.
+ self configMethodValueOn: aStream for: self getAuthor selector: 'author:' last: false indent: indent.
+ self configMethodValueOn: aStream for: self getTimestamp selector: 'timestamp:' last: false indent: indent.
+
+!
+
+label
+
+ ^self versionString, ' [', self projectLabel, ']'
+! !
+
+!MetacelloVersionSpec methodsFor:'private'!
+
+createVersion
+
+ ^self versionClass fromSpec: self
+!
+
+versionClass
+
+ ^MetacelloVersion
+!
+
+versionNumber
+ ^ self project versionNumberClass fromString: self versionString
+! !
+
+!MetacelloVersionSpec methodsFor:'querying'!
+
+postLoadDoIt
+
+ ^postLoadDoIt
+!
+
+preLoadDoIt
+
+ ^preLoadDoIt
+!
+
+versionString
+ versionString == nil ifTrue: [ ^'' ].
+ ^ versionString
+! !
+
+!MetacelloVersionSpec methodsFor:'testing'!
+
+isPartiallyCurrent: notLoadedMatters useEquality: useEquality
+
+ self subclassResponsibility
+!
+
+isPossibleBaseline
+ self subclassResponsibility
+! !
+
+!MetacelloVersionSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/MetacelloVersionValidator.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,604 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+MetacelloAbstractConstructor subclass:#MetacelloVersionValidator
+ instanceVariableNames:'configurationClass exludededValidations validationReport recurse
+ debug visited'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-Core-Validation'
+!
+
+MetacelloVersionValidator class instanceVariableNames:'reasonCodeDescriptions'
+
+"
+ No other class instance variables are inherited by this class.
+"
+!
+
+
+!MetacelloVersionValidator class methodsFor:'instance creation'!
+
+validateConfiguration: configurationClass
+
+ ^self validateConfiguration: configurationClass debug: #() recurse: false
+!
+
+validateConfiguration: configurationClass debug: debugList recurse: aBool
+ ^ ((self new)
+ configurationClass: configurationClass;
+ debug: debugList;
+ recurse: aBool;
+ yourself) validate
+!
+
+validateConfiguration: configurationClass recurse: aBool
+
+ ^self validateConfiguration: configurationClass debug: #() recurse: aBool
+!
+
+validateProject: aMetacelloProject
+
+ ^self validateProject: aMetacelloProject debug: #() recurse: false
+!
+
+validateProject: aMetacelloProject debug: debugList recurse: aBool
+ ^ ((self new)
+ recurse: aBool;
+ debug: debugList;
+ configurationClass: aMetacelloProject configuration class;
+ yourself) validateProject: aMetacelloProject
+!
+
+validateProject: aMetacelloProject recurse: aBool
+
+ ^self validateProject: aMetacelloProject debug: #() recurse: aBool
+!
+
+validateProject: aMetacelloProject version: versionString
+
+ ^self validateProject: aMetacelloProject version: versionString debug: #() recurse: false
+!
+
+validateProject: aMetacelloProject version: versionString debug: debugList
+
+ ^self validateProject: aMetacelloProject version: versionString debug: debugList recurse: false
+!
+
+validateProject: aMetacelloProject version: versionString debug: debugList recurse: aBool
+
+ ^ ((self new)
+ configurationClass: aMetacelloProject configuration class;
+ debug: debugList;
+ recurse: aBool;
+ yourself) validateProject: aMetacelloProject version: versionString
+!
+
+validateProject: aMetacelloProject version: versionString debug: debugList recurse: aBool visited: visitied
+
+ ^(self new
+ configurationClass: aMetacelloProject configuration class;
+ debug: debugList;
+ recurse: aBool;
+ visited: visitied;
+ yourself) validateProject: aMetacelloProject version: versionString
+! !
+
+!MetacelloVersionValidator class methodsFor:'accessing'!
+
+descriptionForReasonCode: reasonCode
+ ^ self reasonCodeDescriptions at: reasonCode ifAbsent: [ self error: 'Unknown reasonCode: ' , reasonCode printString ]
+!
+
+reasonCodeDescriptions
+
+ reasonCodeDescriptions ifNil: [ reasonCodeDescriptions := self populateReasonCodeDescriptions ].
+ ^reasonCodeDescriptions
+! !
+
+!MetacelloVersionValidator class methodsFor:'private'!
+
+populateReasonCodeDescriptions
+ "update MetacelloMCVersionValidator class comment to include any changes to descriptions"
+
+ | dict |
+ dict := Dictionary new.
+ dict
+ at: #'onlyBaselineVersion'
+ put: 'one or more baseline versions have been defined, but no non-baseline versions are defined.'.
+ dict
+ at: #'duplicateVersionDefinitions' put: 'there are multiple pragma methods specifying the same version.';
+ at: #'packageNameMismatch' put: 'the name in the packageSpec does not match the name of the mcz file.';
+ at: #'projectClassNameFileMismatch'
+ put: 'the class name of the configuration does not match the mcz file containing the configuration.';
+ at: #'cannotResolveVersion'
+ put: 'the version (project reference or symbolic version) was not found in the specified configuration.'.
+ dict
+ at: #'duplicateNames'
+ put: 'multiple independent definitions for an entity with same name (project, package, or group).';
+ at: #'incompleteProjectSpec' put: 'missing required fields in project reference (repository, className).';
+ at: #'incorrectVersionString' put: 'the version declared in pragma doesn''t match version in versionSpec.';
+ at: #'invalidDoItSelector' put: 'doit select must be a Symbol.';
+ at: #'invalidVersionString' put: 'versionString must be a String.';
+ at: #'missingVersionImport' put: 'version specified in import pragma not defined in configuration.';
+ at: #'noVersionsDefined'
+ put: 'no usable baseline or version defined in configuration ... configuration cannot be loaded.';
+ at: #'projectCreationError' put: 'error occured while resolving project reference.';
+ at: #'versionCreationError'
+ put:
+ 'error occured while resolving version specification, error will be thrown if an attempt is made to use the version.';
+ at: #'shadowedNames' put: 'name duplication between packages and projects.';
+ at: #'versionCompositionError' put: 'error while creating versionSpec from pragmas.'.
+ ^ dict
+! !
+
+!MetacelloVersionValidator methodsFor:'accessing'!
+
+configurationClass
+ ^ configurationClass
+!
+
+configurationClass: anObject
+ configurationClass := anObject
+!
+
+debug
+
+ debug == nil ifTrue: [ debug := #() ].
+ ^ debug
+!
+
+debug: aCollection
+ "Any combination of: #error, #criticalWarning, #warning"
+
+ debug := aCollection
+!
+
+exludededValidations
+
+ exludededValidations == nil ifTrue: [ exludededValidations := self extractExcludedValidations ].
+ ^exludededValidations
+!
+
+recordValidationCriticalWarning: aString callSite: callSite reasonCode: aSymbol
+
+ ^self recordValidationCriticalWarning: aString versionString: nil callSite: callSite reasonCode: aSymbol
+!
+
+recordValidationCriticalWarning: aString versionString: versionString callSite: callSite reasonCode: aSymbol
+ "reasonCodes:
+ #packageNameMismatch
+ #projectClassNameFileMismatch
+ #duplicateVersionDefinitions
+ #duplicateAttributeBlocks
+ "
+
+ (self criticalWarningReasonCodes includes: aSymbol)
+ ifFalse: [ self error: 'Unknown critical warning reason code' ].
+ ((self exludededValidations at: versionString ifAbsent: [ #() ]) includes: aSymbol)
+ ifTrue: [ ^self ].
+ (self debug includes: #criticalWarning) ifTrue: [ self halt: 'Debug triggered for critical warning: ', aString ].
+ self validationReport
+ add:
+ (MetacelloValidationCriticalWarning
+ configurationClass:
+ (self recurse
+ ifTrue: [ self configurationClass ]
+ ifFalse: [ nil ])
+ reasonCode: aSymbol
+ callSite: callSite
+ explanation: aString)
+!
+
+recordValidationError: aString callSite: callSite reasonCode: aSymbol
+
+ ^self recordValidationError: aString versionString: nil callSite: callSite reasonCode: aSymbol
+!
+
+recordValidationError: aString versionString: versionString callSite: callSite reasonCode: aSymbol
+ "reasonCodes:
+ #noVersionForSymbolicVersion
+ #duplicateNames
+ #shadowedNames
+ #invalidDoItSelector
+ #invalidVersionString
+ #missingVersionImport
+ #projectCreationError
+ #noVersionsDefined
+ #cannotResolveVersion
+ #incompleteProjectSpec
+ #incorrectVersionString
+ "
+
+ (self errorReasonCodes includes: aSymbol)
+ ifFalse: [ self error: 'Unknown error reason code' ].
+ ((self exludededValidations at: versionString ifAbsent: [ #() ]) includes: aSymbol)
+ ifTrue: [ ^self ].
+ (self debug includes: #error) ifTrue: [ self halt: 'Debug triggered for error: ', aString ].
+ self validationReport
+ add:
+ (MetacelloValidationError
+ configurationClass:
+ (self recurse
+ ifTrue: [ self configurationClass ]
+ ifFalse: [ nil ])
+ reasonCode: aSymbol
+ callSite: callSite
+ explanation: aString)
+!
+
+recordValidationWarning: aString callSite: callSite reasonCode: aSymbol
+
+
+ ^self recordValidationWarning: aString versionString: nil callSite: callSite reasonCode: aSymbol
+!
+
+recordValidationWarning: aString versionString: versionString callSite: callSite reasonCode: aSymbol
+ "reasonCodes:
+ #onlyBaselineVersion
+ #noVersionSpecified
+ "
+
+ (self warningReasonCodes includes: aSymbol)
+ ifFalse: [ self error: 'Unknown warning reason code' ].
+ ((self exludededValidations at: versionString ifAbsent: [ #() ]) includes: aSymbol)
+ ifTrue: [ ^self ].
+ (self debug includes: #warning) ifTrue: [ self halt: 'Debug triggered for critical warning: ', aString ].
+ self validationReport
+ add:
+ (MetacelloValidationWarning
+ configurationClass:
+ (self recurse
+ ifTrue: [ self configurationClass ]
+ ifFalse: [ nil ])
+ reasonCode: aSymbol
+ callSite: callSite
+ explanation: aString)
+!
+
+recurse
+ recurse == nil ifTrue: [ recurse := false ].
+ ^ recurse
+!
+
+recurse: anObject
+ recurse := anObject
+!
+
+validationReport
+
+ validationReport == nil ifTrue: [ validationReport := OrderedCollection new ].
+ ^ validationReport
+!
+
+validationReport: anObject
+ validationReport := anObject
+!
+
+visited
+
+ visited == nil ifTrue: [ visited := IdentitySet new ].
+ ^visited
+!
+
+visited: anIdentitySet
+
+ visited := anIdentitySet
+! !
+
+!MetacelloVersionValidator methodsFor:'pragma extraction'!
+
+extractExcludedValidations
+
+ | exclusionDict |
+ exclusionDict := Dictionary new.
+ (Pragma
+ allNamed: #excludedValidationIssues:
+ in: self configurationClass) do: [:pragma | | exclusions |
+ exclusions := pragma argumentAt: 1.
+ 1 to: exclusions size by: 2 do: [:index |
+ exclusionDict
+ at: (exclusions at: index)
+ put: (exclusions at: index + 1) ]].
+ ^exclusionDict
+! !
+
+!MetacelloVersionValidator methodsFor:'private'!
+
+criticalWarningReasonCodes
+ ^ #(#'packageNameMismatch' #'projectClassNameFileMismatch' #'duplicateVersionDefinitions')
+!
+
+errorReasonCodes
+ ^ #(#'duplicateNames' #'shadowedNames' #'invalidDoItSelector' #'invalidVersionString' #'missingVersionImport' #'projectCreationError' #'noVersionsDefined' #'cannotResolveVersion' #'incompleteProjectSpec' #'incorrectVersionString' #'versionCompositionError' #'versionCreationError')
+!
+
+validateBaselineVersionSpec: versionSpec
+
+ self subclassResponsibility
+!
+
+validateDoIts: aSpec versionString: versionString errorMessage: errorMessage
+ | ar |
+ ar := {
+ #preLoadDoIt. 'preLoadDoIt selector for '.
+ #postLoadDoIt. 'postLoadDoIt selector for '.
+ }.
+ 1 to: ar size by: 2 do: [ :i |
+ | selector |
+ selector := (aSpec perform: (ar at: i)) value.
+ selector ~~ nil
+ ifTrue: [
+ selector isSymbol
+ ifFalse: [
+ self
+ recordValidationError: (ar at: i + 1) , errorMessage , ' is not a symbol'
+ versionString: versionString
+ callSite: #validateDoIts:versionString:errorMessage:
+ reasonCode: #invalidDoItSelector ] ] ]
+!
+
+validatePragmas
+ "Ensure that versions are Strings and symbolic versions are symbols.
+ Ensure that imported versions are defined"
+
+ | versionPragmas versionImportPragmas symbolicVersionPragmas versionStrings |
+ versionPragmas := self extractVersionPragmas.
+ versionImportPragmas := self extractVersionImportPragmas.
+ symbolicVersionPragmas := self extractSymbolicVersionPragmas.
+ versionStrings := Set new.
+ versionPragmas keys , versionImportPragmas keys , symbolicVersionPragmas keys
+ do: [ :versionString |
+ (versionStrings includes: versionString)
+ ifTrue: [
+ self
+ recordValidationCriticalWarning:
+ 'version ' , versionString printString , ' is defined multiple times.'
+ versionString: versionString
+ callSite: #'validatePragmas'
+ reasonCode: #'duplicateVersionDefinitions' ]
+ ifFalse: [ versionStrings add: versionString ] ].
+ versionPragmas
+ keysAndValuesDo: [ :versionString :pragmaList |
+ versionString isString
+ ifFalse: [
+ self
+ recordValidationError: 'version ' , versionString printString , ' is not a String.'
+ versionString: versionString
+ callSite: #'validatePragmas'
+ reasonCode: #'invalidVersionString' ].
+ pragmaList size > 1
+ ifTrue: [
+ self
+ recordValidationCriticalWarning:
+ 'version ' , versionString printString , ' is defined multiple times.'
+ versionString: versionString
+ callSite: #'validatePragmas'
+ reasonCode: #'duplicateVersionDefinitions' ] ].
+ symbolicVersionPragmas
+ keysAndValuesDo: [ :versionString :pragmaList |
+ versionString isSymbol
+ ifFalse: [
+ self
+ recordValidationError: 'symbolic version ' , versionString printString , ' is not a Symbol.'
+ versionString: versionString
+ callSite: #'validatePragmas'
+ reasonCode: #'invalidVersionString' ].
+ pragmaList size > 1
+ ifTrue: [
+ self
+ recordValidationCriticalWarning:
+ 'version ' , versionString printString , ' is defined multiple times.'
+ versionString: versionString
+ callSite: #'validatePragmas'
+ reasonCode: #'duplicateVersionDefinitions' ] ].
+ versionImportPragmas
+ keysAndValuesDo: [ :versionString :pragmaList |
+ versionString isString
+ ifFalse: [
+ self
+ recordValidationError: 'version ' , versionString printString , ' is not a String.'
+ versionString: versionString
+ callSite: #'validatePragmas'
+ reasonCode: #'invalidVersionString' ].
+ pragmaList size > 1
+ ifTrue: [
+ self
+ recordValidationCriticalWarning:
+ 'version ' , versionString printString , ' is defined multiple times.'
+ versionString: versionString
+ callSite: #'validatePragmas'
+ reasonCode: #'duplicateVersionDefinitions' ].
+ pragmaList
+ do: [ :versionImportPragma |
+ (versionImportPragma arguments at: 2)
+ do: [ :importedVersionString |
+ (versionStrings includes: importedVersionString)
+ ifFalse: [
+ self
+ recordValidationError:
+ 'version ' , importedVersionString printString , ' referenced in import list of version ' , versionString printString
+ , ' has not been defined.'
+ versionString: versionString
+ callSite: #'validatePragmas'
+ reasonCode: #'missingVersionImport' ] ] ] ]
+!
+
+validateProject
+ | project |
+ project := self
+ validateProjectCreationFrom: self configurationClass
+ onError: [ :ex |
+ self
+ recordValidationError:
+ 'Error creating project: ' , ex description , ' to reproduce evalutate the following: '''
+ , self configurationClass name asString , ' project'''
+ callSite: #validateProject
+ reasonCode: #projectCreationError.
+ ^ self validationReport ].
+ ^ self validateProject: project
+!
+
+validateProjectCreationFrom: aConfigurationClass onError: aBlock
+ [ ^ aConfigurationClass project ]
+ on: Error , MetacelloValidationNotification , MetacelloErrorInProjectConstructionNotification
+ do: [ :ex |
+ (ex isKindOf: MetacelloValidationNotification)
+ ifTrue: [
+ self validationReport add: ex issue.
+ ex resume ].
+ (ex isKindOf: MetacelloErrorInProjectConstructionNotification)
+ ifTrue: [
+ self
+ recordValidationError:
+ 'Error creating version: ' , ex versionString , ' error: ' , ex exception description
+ , ' to reproduce evalutate the following: ''[' , self configurationClass name asString
+ ,
+ ' project ] on: MetacelloErrorInProjectConstructionNotification do: [:ex | ex resume: true ]'''
+ callSite: #'validateProjectCreationFrom:onError:'
+ reasonCode: #'versionCreationError'.
+ ex resume: false ].
+ ^ aBlock value: ex ]
+!
+
+validateProjectVersion: versionString
+ | project |
+ project := self
+ validateProjectCreationFrom: self configurationClass
+ onError: [ :ex |
+ self
+ recordValidationError:
+ 'Error creating project: ' , ex description , ' to reproduce evalutate the following: '''
+ , self configurationClass name asString , ' project'''
+ callSite: #validateProject
+ reasonCode: #projectCreationError.
+ ^ self validationReport ].
+ ^ self validateProject: project version: versionString
+!
+
+validateVersionSpec: versionSpec
+
+ self subclassResponsibility
+!
+
+validateVersionSpecForSymbolicVersion: versionSpec symbolicVersion: symbolicVersionString
+
+ self subclassResponsibility
+!
+
+warningReasonCodes
+ ^ #(#onlyBaselineVersion )
+! !
+
+!MetacelloVersionValidator methodsFor:'validation'!
+
+validate
+ "Issue 5:
+ []no shadowing of names across project/package/group boundaries
+ Issue 6:
+ []package version supplied for each package
+ []no released (stable/bleedingEdge) versions (only development version)
+ package spec used instead of project spec in baseline (ConfigurationOfPharo-DaleHenrichs.50)
+ Issue 20:
+ []pre and post load doits must be symbols, not blocks
+ Others:
+ []symbolic versions can be resolved.
+ []Ensure that versions are Strings and symbolic versions are symbols.
+ []Ensure that imported versions are defined."
+
+ self validatePragmas.
+ ^self validateProject
+!
+
+validateProject: project
+ | hasNoBaseline hasNoVersion |
+ (self visited includes: project configuration class)
+ ifTrue: [ ^ self validationReport ].
+ self visited add: project configuration class.
+ hasNoBaseline := hasNoVersion := true.
+ project versions
+ do: [ :version |
+ | spec |
+ spec := version spec.
+ [
+ spec blessing value == #baseline
+ ifTrue: [
+ hasNoBaseline := false.
+ self validateBaselineVersionSpec: spec ]
+ ifFalse: [
+ hasNoVersion := false.
+ self validateVersionSpec: spec ] ]
+ on: Error
+ do: [ :ex |
+ self
+ recordValidationError: 'Error composing version ' , version versionString printString , ': ' , ex description
+ versionString: version versionString
+ callSite: #validateProject:
+ reasonCode: #versionCompositionError ] ].
+ project symbolicVersionMap keys
+ do: [ :symbolicVersion |
+ | version |
+ version := [ project version: symbolicVersion ]
+ on: Error , MetacelloSymbolicVersionNotDefinedError
+ do: [ :ex |
+ "MetacelloSymbolicVersionNotDefinedError are explicitly not defined, so are not validation errors"
+ (ex isKindOf: MetacelloSymbolicVersionNotDefinedError)
+ ifFalse: [
+ self
+ recordValidationError:
+ 'symbolic version ' , symbolicVersion printString , ' does not resolve to a literal version.'
+ callSite: #validatePragmas
+ reasonCode: #cannotResolveVersion ].
+ ex return: nil ].
+ version ~~ nil
+ ifTrue: [ self validateVersionSpecForSymbolicVersion: version spec symbolicVersion: symbolicVersion ] ].
+ hasNoVersion
+ ifTrue: [
+ hasNoBaseline
+ ifTrue: [
+ self
+ recordValidationError: 'No usable baseline or versions defined.'
+ callSite: #validatePragmas
+ reasonCode: #noVersionsDefined ]
+ ifFalse: [
+ self
+ recordValidationWarning: 'Only baseline defined (no version defined).'
+ callSite: #validatePragmas
+ reasonCode: #onlyBaselineVersion ] ].
+ ^ self validationReport
+!
+
+validateProject: project version: versionString
+ | version spec |
+ (self visited includes: project configuration class)
+ ifTrue: [ ^ self validationReport ].
+ self visited add: project configuration class.
+ [ version := project version: versionString ]
+ on: Error
+ do: [ :ex |
+ self
+ recordValidationError: 'Could not resolve version ' , versionString printString , ' due to error: ' , ex description
+ versionString: versionString
+ callSite: #validateProject:version:
+ reasonCode: #cannotResolveVersion.
+ ^ self validationReport ].
+ spec := version spec.
+ [
+ spec blessing value == #baseline
+ ifTrue: [ self validateBaselineVersionSpec: spec ]
+ ifFalse: [ self validateVersionSpec: spec ] ]
+ on: Error
+ do: [ :ex |
+ self
+ recordValidationError: 'Error composing version ' , version versionString printString , ': ' , ex description
+ versionString: version versionString
+ callSite: #validateProject:version:
+ reasonCode: #versionCompositionError ].
+ ^ self validationReport
+! !
+
+!MetacelloVersionValidator class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/abbrev.stc Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,87 @@
+# automagically generated by the project definition
+# this file is needed for stc to be able to compile modules independently.
+# it provides information about a classes filename, category and especially namespace.
+MetacelloMethodSectionPath MetacelloMethodSectionPath stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloMethodSpec MetacelloMethodSpec stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloPackageSpecResolutionError MetacelloPackageSpecResolutionError stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloPlatform MetacelloPlatform stx:goodies/metacello/core 'Metacello-Core-Model' 0
+stx_goodies_metacello_core stx_goodies_metacello_core stx:goodies/metacello/core '* Projects & Packages *' 3
+MetacelloSymbolicVersionMethodSpec MetacelloSymbolicVersionMethodSpec stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloVersionMethodSpec MetacelloVersionMethodSpec stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloAbstractConstructor MetacelloAbstractConstructor stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloBaseConfiguration MetacelloBaseConfiguration stx:goodies/metacello/core 'Metacello-Core-Deprecated' 0
+MetacelloCannotUpdateReleasedVersionError MetacelloCannotUpdateReleasedVersionError stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloCleanNotification MetacelloCleanNotification stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloClearStackCacheNotification MetacelloClearStackCacheNotification stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloErrorInProjectConstructionNotification MetacelloErrorInProjectConstructionNotification stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloMethodSection MetacelloMethodSection stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloProject MetacelloProject stx:goodies/metacello/core 'Metacello-Core-Model' 0
+MetacelloProjectRegistration MetacelloProjectRegistration stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloProjectRegistry MetacelloProjectRegistry stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloProjectSpecForLoad MetacelloProjectSpecForLoad stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloProjectSpecGenerator MetacelloProjectSpecGenerator stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloProjectSpecLoadError MetacelloProjectSpecLoadError stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloScriptEngine MetacelloScriptEngine stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloScriptExecutor MetacelloScriptExecutor stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloScriptGitHubDownloadNotification MetacelloScriptGitHubDownloadNotification stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloScriptNotification MetacelloScriptNotification stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloScriptingError MetacelloScriptingError stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloSemanticVersionNumber MetacelloSemanticVersionNumber stx:goodies/metacello/core 'Metacello-Core-Model' 0
+MetacelloSkipDirtyPackageLoad MetacelloSkipDirtyPackageLoad stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloSpec MetacelloSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloSpecLoader MetacelloSpecLoader stx:goodies/metacello/core 'Metacello-Core-Loaders' 0
+MetacelloStackCacheNotification MetacelloStackCacheNotification stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloValidationFailure MetacelloValidationFailure stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloValidationIssue MetacelloValidationIssue stx:goodies/metacello/core 'Metacello-Core-Validation' 0
+MetacelloValidationNotification MetacelloValidationNotification stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloVersion MetacelloVersion stx:goodies/metacello/core 'Metacello-Core-Model' 0
+MetacelloVersionDoesNotExistError MetacelloVersionDoesNotExistError stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloVersionNumber MetacelloVersionNumber stx:goodies/metacello/core 'Metacello-Core-Model' 0
+MetacelloAbstractPackageSpec MetacelloAbstractPackageSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloAbstractVersionConstructor MetacelloAbstractVersionConstructor stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloBaselineSpecGenerator MetacelloBaselineSpecGenerator stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloCleanLoadAndTestsNotification MetacelloCleanLoadAndTestsNotification stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloCleanLoadNotification MetacelloCleanLoadNotification stx:goodies/metacello/core 'Metacello-Core-Exceptions-Notifications' 1
+MetacelloConfigurationSpecGenerator MetacelloConfigurationSpecGenerator stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloConflictingProjectError MetacelloConflictingProjectError stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloLockedProjectError MetacelloLockedProjectError stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloMemberListSpec MetacelloMemberListSpec stx:goodies/metacello/core 'Metacello-Core-Members' 0
+MetacelloMemberSpec MetacelloMemberSpec stx:goodies/metacello/core 'Metacello-Core-Members' 0
+MetacelloProjectSpec MetacelloProjectSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloProjectSpecLoadConflict MetacelloProjectSpecLoadConflict stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloResolveProjectUpgrade MetacelloResolveProjectUpgrade stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloScriptApiExecutor MetacelloScriptApiExecutor stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloScriptEnsureProjectLoadedForDevelopment MetacelloScriptEnsureProjectLoadedForDevelopment stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloScriptImageExecutor MetacelloScriptImageExecutor stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloScriptProjectSpecNotification MetacelloScriptProjectSpecNotification stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloScriptRegistryExecutor MetacelloScriptRegistryExecutor stx:goodies/metacello/core 'Metacello-Core-Scripts' 0
+MetacelloSymbolicVersionDoesNotExistError MetacelloSymbolicVersionDoesNotExistError stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloSymbolicVersionSpec MetacelloSymbolicVersionSpec stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloUseUpgradeError MetacelloUseUpgradeError stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloValidationCriticalWarning MetacelloValidationCriticalWarning stx:goodies/metacello/core 'Metacello-Core-Validation' 0
+MetacelloValidationError MetacelloValidationError stx:goodies/metacello/core 'Metacello-Core-Validation' 0
+MetacelloValidationWarning MetacelloValidationWarning stx:goodies/metacello/core 'Metacello-Core-Validation' 0
+MetacelloValueHolderSpec MetacelloValueHolderSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloVersionDefinitionError MetacelloVersionDefinitionError stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloVersionMethodSection MetacelloVersionMethodSection stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloVersionSpec MetacelloVersionSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloVersionValidator MetacelloVersionValidator stx:goodies/metacello/core 'Metacello-Core-Validation' 1
+MetacelloAddMemberSpec MetacelloAddMemberSpec stx:goodies/metacello/core 'Metacello-Core-Members' 0
+MetacelloAllowConflictingProjectUpgrade MetacelloAllowConflictingProjectUpgrade stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloAllowProjectDowngrade MetacelloAllowProjectDowngrade stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloAllowProjectUpgrade MetacelloAllowProjectUpgrade stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloBaselineConstructor MetacelloBaselineConstructor stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloCopyMemberSpec MetacelloCopyMemberSpec stx:goodies/metacello/core 'Metacello-Core-Members' 0
+MetacelloGenericProjectSpec MetacelloGenericProjectSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloGroupSpec MetacelloGroupSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloLookupBaselineSpecForEnsureLoad MetacelloLookupBaselineSpecForEnsureLoad stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloLookupProjectSpec MetacelloLookupProjectSpec stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloLookupProjectSpecForLoad MetacelloLookupProjectSpecForLoad stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloMergeMemberSpec MetacelloMergeMemberSpec stx:goodies/metacello/core 'Metacello-Core-Members' 0
+MetacelloPackagesSpec MetacelloPackagesSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloProjectReferenceSpec MetacelloProjectReferenceSpec stx:goodies/metacello/core 'Metacello-Core-Specs' 0
+MetacelloProjectSpecLoadedNotification MetacelloProjectSpecLoadedNotification stx:goodies/metacello/core 'Metacello-Core-Scripts' 1
+MetacelloRemoveMemberSpec MetacelloRemoveMemberSpec stx:goodies/metacello/core 'Metacello-Core-Members' 0
+MetacelloSymbolicVersionNotDefinedError MetacelloSymbolicVersionNotDefinedError stx:goodies/metacello/core 'Metacello-Core-Exceptions-Errors' 1
+MetacelloToolBoxConstructor MetacelloToolBoxConstructor stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
+MetacelloVersionConstructor MetacelloVersionConstructor stx:goodies/metacello/core 'Metacello-Core-Constructors' 0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/bc.mak Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,166 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_core.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# Notice, that the name bc.mak is historical (from times, when only borland c was supported).
+# This file contains make rules for the win32 platform using either borland-bcc or visual-c.
+# It shares common definitions with the unix-make in Make.spec.
+# The bc.mak supports the following targets:
+# bmake - compile all st-files to a classLib (dll)
+# bmake clean - clean all temp files
+# bmake clobber - clean all
+#
+# Historic Note:
+# this used to contain only rules to make with borland
+# (called via bmake, by "make.exe -f bc.mak")
+# this has changed; it is now also possible to build using microsoft visual c
+# (called via vcmake, by "make.exe -f bc.mak -DUSEVC")
+#
+TOP=..\..\..
+INCLUDE_TOP=$(TOP)\..
+
+
+
+!INCLUDE $(TOP)\rules\stdHeader_bc
+
+!INCLUDE Make.spec
+
+LIBNAME=libstx_goodies_metacello_core
+RESFILES=core.$(RES)
+
+
+
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\metacello\base -I$(INCLUDE_TOP)\stx\libbasic
+LOCALDEFINES=
+
+STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -varPrefix=$(LIBNAME)
+LOCALLIBS=
+
+OBJS= $(COMMON_OBJS) $(WIN32_OBJS)
+
+ALL:: classLibRule
+
+classLibRule: $(OUTDIR) $(OUTDIR)$(LIBNAME).dll
+
+!INCLUDE $(TOP)\rules\stdRules_bc
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+ pushd ..\..\..\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+ pushd ..\base & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+
+
+
+
+
+
+
+test: $(TOP)\goodies\builder\reports\NUL
+ pushd $(TOP)\goodies\builder\reports & $(MAKE_BAT)
+ $(TOP)\goodies\builder\reports\report-runner.bat -D . -r Builder::TestReport -p $(PACKAGE)
+
+clean::
+ del *.$(CSUFFIX)
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)MetacelloAbstractConstructor.$(O) MetacelloAbstractConstructor.$(H): MetacelloAbstractConstructor.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloBaseConfiguration.$(O) MetacelloBaseConfiguration.$(H): MetacelloBaseConfiguration.st $(INCLUDE_TOP)\stx\goodies\metacello\base\ConfigurationOf.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCannotUpdateReleasedVersionError.$(O) MetacelloCannotUpdateReleasedVersionError.$(H): MetacelloCannotUpdateReleasedVersionError.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCleanNotification.$(O) MetacelloCleanNotification.$(H): MetacelloCleanNotification.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloClearStackCacheNotification.$(O) MetacelloClearStackCacheNotification.$(H): MetacelloClearStackCacheNotification.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloErrorInProjectConstructionNotification.$(O) MetacelloErrorInProjectConstructionNotification.$(H): MetacelloErrorInProjectConstructionNotification.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMethodSection.$(O) MetacelloMethodSection.$(H): MetacelloMethodSection.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMethodSectionPath.$(O) MetacelloMethodSectionPath.$(H): MetacelloMethodSectionPath.st $(INCLUDE_TOP)\stx\libbasic\Array.$(H) $(INCLUDE_TOP)\stx\libbasic\ArrayedCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\SequenceableCollection.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMethodSpec.$(O) MetacelloMethodSpec.$(H): MetacelloMethodSpec.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloPackageSpecResolutionError.$(O) MetacelloPackageSpecResolutionError.$(H): MetacelloPackageSpecResolutionError.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloPlatform.$(O) MetacelloPlatform.$(H): MetacelloPlatform.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProject.$(O) MetacelloProject.$(H): MetacelloProject.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectRegistration.$(O) MetacelloProjectRegistration.$(H): MetacelloProjectRegistration.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectRegistry.$(O) MetacelloProjectRegistry.$(H): MetacelloProjectRegistry.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecForLoad.$(O) MetacelloProjectSpecForLoad.$(H): MetacelloProjectSpecForLoad.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecGenerator.$(O) MetacelloProjectSpecGenerator.$(H): MetacelloProjectSpecGenerator.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecLoadError.$(O) MetacelloProjectSpecLoadError.$(H): MetacelloProjectSpecLoadError.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptEngine.$(O) MetacelloScriptEngine.$(H): MetacelloScriptEngine.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptExecutor.$(O) MetacelloScriptExecutor.$(H): MetacelloScriptExecutor.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptGitHubDownloadNotification.$(O) MetacelloScriptGitHubDownloadNotification.$(H): MetacelloScriptGitHubDownloadNotification.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptNotification.$(O) MetacelloScriptNotification.$(H): MetacelloScriptNotification.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptingError.$(O) MetacelloScriptingError.$(H): MetacelloScriptingError.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSemanticVersionNumber.$(O) MetacelloSemanticVersionNumber.$(H): MetacelloSemanticVersionNumber.st $(INCLUDE_TOP)\stx\libbasic\Magnitude.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSkipDirtyPackageLoad.$(O) MetacelloSkipDirtyPackageLoad.$(H): MetacelloSkipDirtyPackageLoad.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSpec.$(O) MetacelloSpec.$(H): MetacelloSpec.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSpecLoader.$(O) MetacelloSpecLoader.$(H): MetacelloSpecLoader.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStackCacheNotification.$(O) MetacelloStackCacheNotification.$(H): MetacelloStackCacheNotification.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationFailure.$(O) MetacelloValidationFailure.$(H): MetacelloValidationFailure.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationIssue.$(O) MetacelloValidationIssue.$(H): MetacelloValidationIssue.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationNotification.$(O) MetacelloValidationNotification.$(H): MetacelloValidationNotification.st $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersion.$(O) MetacelloVersion.$(H): MetacelloVersion.st $(INCLUDE_TOP)\stx\libbasic\Magnitude.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionDoesNotExistError.$(O) MetacelloVersionDoesNotExistError.$(H): MetacelloVersionDoesNotExistError.st $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionNumber.$(O) MetacelloVersionNumber.$(H): MetacelloVersionNumber.st $(INCLUDE_TOP)\stx\libbasic\Magnitude.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)stx_goodies_metacello_core.$(O) stx_goodies_metacello_core.$(H): stx_goodies_metacello_core.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAbstractPackageSpec.$(O) MetacelloAbstractPackageSpec.$(H): MetacelloAbstractPackageSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAbstractVersionConstructor.$(O) MetacelloAbstractVersionConstructor.$(H): MetacelloAbstractVersionConstructor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloBaselineSpecGenerator.$(O) MetacelloBaselineSpecGenerator.$(H): MetacelloBaselineSpecGenerator.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloProjectSpecGenerator.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCleanLoadAndTestsNotification.$(O) MetacelloCleanLoadAndTestsNotification.$(H): MetacelloCleanLoadAndTestsNotification.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloCleanNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCleanLoadNotification.$(O) MetacelloCleanLoadNotification.$(H): MetacelloCleanLoadNotification.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloCleanNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloConfigurationSpecGenerator.$(O) MetacelloConfigurationSpecGenerator.$(H): MetacelloConfigurationSpecGenerator.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloProjectSpecGenerator.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloConflictingProjectError.$(O) MetacelloConflictingProjectError.$(H): MetacelloConflictingProjectError.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptingError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLockedProjectError.$(O) MetacelloLockedProjectError.$(H): MetacelloLockedProjectError.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptingError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMemberListSpec.$(O) MetacelloMemberListSpec.$(H): MetacelloMemberListSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMemberSpec.$(O) MetacelloMemberSpec.$(H): MetacelloMemberSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpec.$(O) MetacelloProjectSpec.$(H): MetacelloProjectSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecLoadConflict.$(O) MetacelloProjectSpecLoadConflict.$(H): MetacelloProjectSpecLoadConflict.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloProjectSpecLoadError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloResolveProjectUpgrade.$(O) MetacelloResolveProjectUpgrade.$(H): MetacelloResolveProjectUpgrade.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptApiExecutor.$(O) MetacelloScriptApiExecutor.$(H): MetacelloScriptApiExecutor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptExecutor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptEnsureProjectLoadedForDevelopment.$(O) MetacelloScriptEnsureProjectLoadedForDevelopment.$(H): MetacelloScriptEnsureProjectLoadedForDevelopment.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptImageExecutor.$(O) MetacelloScriptImageExecutor.$(H): MetacelloScriptImageExecutor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptExecutor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptProjectSpecNotification.$(O) MetacelloScriptProjectSpecNotification.$(H): MetacelloScriptProjectSpecNotification.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloScriptRegistryExecutor.$(O) MetacelloScriptRegistryExecutor.$(H): MetacelloScriptRegistryExecutor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptExecutor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionDoesNotExistError.$(O) MetacelloSymbolicVersionDoesNotExistError.$(H): MetacelloSymbolicVersionDoesNotExistError.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloVersionDoesNotExistError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionMethodSpec.$(O) MetacelloSymbolicVersionMethodSpec.$(H): MetacelloSymbolicVersionMethodSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMethodSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionSpec.$(O) MetacelloSymbolicVersionSpec.$(H): MetacelloSymbolicVersionSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMethodSection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloUseUpgradeError.$(O) MetacelloUseUpgradeError.$(H): MetacelloUseUpgradeError.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptingError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationCriticalWarning.$(O) MetacelloValidationCriticalWarning.$(H): MetacelloValidationCriticalWarning.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloValidationIssue.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationError.$(O) MetacelloValidationError.$(H): MetacelloValidationError.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloValidationIssue.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValidationWarning.$(O) MetacelloValidationWarning.$(H): MetacelloValidationWarning.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloValidationIssue.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloValueHolderSpec.$(O) MetacelloValueHolderSpec.$(H): MetacelloValueHolderSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionDefinitionError.$(O) MetacelloVersionDefinitionError.$(H): MetacelloVersionDefinitionError.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloVersionDoesNotExistError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionMethodSection.$(O) MetacelloVersionMethodSection.$(H): MetacelloVersionMethodSection.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMethodSection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionMethodSpec.$(O) MetacelloVersionMethodSpec.$(H): MetacelloVersionMethodSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMethodSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionSpec.$(O) MetacelloVersionSpec.$(H): MetacelloVersionSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionValidator.$(O) MetacelloVersionValidator.$(H): MetacelloVersionValidator.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAddMemberSpec.$(O) MetacelloAddMemberSpec.$(H): MetacelloAddMemberSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMemberSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAllowConflictingProjectUpgrade.$(O) MetacelloAllowConflictingProjectUpgrade.$(H): MetacelloAllowConflictingProjectUpgrade.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloResolveProjectUpgrade.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAllowProjectDowngrade.$(O) MetacelloAllowProjectDowngrade.$(H): MetacelloAllowProjectDowngrade.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloResolveProjectUpgrade.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloAllowProjectUpgrade.$(O) MetacelloAllowProjectUpgrade.$(H): MetacelloAllowProjectUpgrade.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloResolveProjectUpgrade.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloBaselineConstructor.$(O) MetacelloBaselineConstructor.$(H): MetacelloBaselineConstructor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloCopyMemberSpec.$(O) MetacelloCopyMemberSpec.$(H): MetacelloCopyMemberSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMemberSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloGenericProjectSpec.$(O) MetacelloGenericProjectSpec.$(H): MetacelloGenericProjectSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloProjectSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloGroupSpec.$(O) MetacelloGroupSpec.$(H): MetacelloGroupSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractPackageSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLookupBaselineSpecForEnsureLoad.$(O) MetacelloLookupBaselineSpecForEnsureLoad.$(H): MetacelloLookupBaselineSpecForEnsureLoad.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLookupProjectSpec.$(O) MetacelloLookupProjectSpec.$(H): MetacelloLookupProjectSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloLookupProjectSpecForLoad.$(O) MetacelloLookupProjectSpecForLoad.$(H): MetacelloLookupProjectSpecForLoad.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloMergeMemberSpec.$(O) MetacelloMergeMemberSpec.$(H): MetacelloMergeMemberSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMemberSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloPackagesSpec.$(O) MetacelloPackagesSpec.$(H): MetacelloPackagesSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMemberListSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectReferenceSpec.$(O) MetacelloProjectReferenceSpec.$(H): MetacelloProjectReferenceSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractPackageSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloProjectSpecLoadedNotification.$(O) MetacelloProjectSpecLoadedNotification.$(H): MetacelloProjectSpecLoadedNotification.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptNotification.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloScriptProjectSpecNotification.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Notification.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloRemoveMemberSpec.$(O) MetacelloRemoveMemberSpec.$(H): MetacelloRemoveMemberSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMemberSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloSymbolicVersionNotDefinedError.$(O) MetacelloSymbolicVersionNotDefinedError.$(H): MetacelloSymbolicVersionNotDefinedError.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSymbolicVersionDoesNotExistError.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloVersionDoesNotExistError.$(H) $(INCLUDE_TOP)\stx\libbasic\Error.$(H) $(INCLUDE_TOP)\stx\libbasic\Exception.$(H) $(INCLUDE_TOP)\stx\libbasic\GenericException.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloToolBoxConstructor.$(O) MetacelloToolBoxConstructor.$(H): MetacelloToolBoxConstructor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloVersionConstructor.$(O) MetacelloVersionConstructor.$(H): MetacelloVersionConstructor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)\stx\libbasic\AbstractTime.$(H) $(INCLUDE_TOP)\stx\libbasic\ArithmeticValue.$(H) $(INCLUDE_TOP)\stx\libbasic\ArrayedCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\Block.$(H) $(INCLUDE_TOP)\stx\libbasic\CharacterArray.$(H) $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\CompiledCode.$(H) $(INCLUDE_TOP)\stx\libbasic\ExecutableFunction.$(H) $(INCLUDE_TOP)\stx\libbasic\Integer.$(H) $(INCLUDE_TOP)\stx\libbasic\Magnitude.$(H) $(INCLUDE_TOP)\stx\libbasic\Number.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\SequenceableCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\String.$(H) $(INCLUDE_TOP)\stx\libbasic\Symbol.$(H) $(INCLUDE_TOP)\stx\libbasic\Timestamp.$(H) $(INCLUDE_TOP)\stx\libbasic\UndefinedObject.$(H) $(INCLUDE_TOP)\stx\libbasic\UninterpretedBytes.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
+# **Must be at end**
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+!IFDEF HGROOT
+$(OUTDIR)stx_goodies_metacello_core.$(O): $(HGROOT)\.hg\dirstate
+!ENDIF
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/bmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,12 @@
+@REM -------
+@REM make using Borland bcc32
+@REM type bmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak %DEFINES% %*
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/core.rc Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,37 @@
+//
+// DO NOT EDIT
+// automagically generated from the projectDefinition: stx_goodies_metacello_core.
+//
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 6,2,32767,32767
+ PRODUCTVERSION 6,2,4,0
+#if (__BORLANDC__)
+ FILEFLAGSMASK VS_FF_DEBUG | VS_FF_PRERELEASE
+ FILEFLAGS VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
+ FILEOS VOS_NT_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE VS_USER_DEFINED
+#endif
+
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+ VALUE "CompanyName", "Dale Henrichs & Jan Vrany\0"
+ VALUE "FileDescription", "Metacello -- a Smalltalk project configuration management tool (LIB)\0"
+ VALUE "FileVersion", "6.2.32767.32767\0"
+ VALUE "InternalName", "stx:goodies/metacello/core\0"
+ VALUE "LegalCopyright", "Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)\0"
+ VALUE "ProductName", "Metacello\0"
+ VALUE "ProductVersion", "6.2.4.0\0"
+ VALUE "ProductDate", "Thu, 21 Aug 2014 08:17:45 GMT\0"
+ END
+
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN // Language | Translation
+ VALUE "Translation", 0x409, 0x4E4 // U.S. English, Windows Multilingual
+ END
+END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/extensions.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,588 @@
+"{ Package: 'stx:goodies/metacello/core' }"!
+
+!Block methodsFor:'*metacello-core-scripting'!
+
+execute: projectSpecBlock against: aScriptExecutor
+ aScriptExecutor executeBlock: self do: projectSpecBlock
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setAuthorInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setAuthorWithBlock: self
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setBaseline: aString withInMetacelloConfig: aMetacelloConfig
+ aMetacelloConfig setBaseline: aString withBlock: self
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setBlessingInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setBlessingWithBlock: self
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setConfiguration: aString withInMetacelloConfig: aMetacelloConfig
+ aMetacelloConfig setConfiguration: aString withBlock: self
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setDescriptionInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setDescriptionWithBlock: self
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setPackage: aString withInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setPackage: aString withBlock: self
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setProject: aString withInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setProject: aString withBlock: self
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setTimestampInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setTimestampWithBlock: self
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+addToMetacelloPackages: aMetacelloPackagesSpec
+
+ self do: [:each | each addToMetacelloPackages: aMetacelloPackagesSpec ]
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+asMetacelloAttributeList
+ ^ self
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+asMetacelloAttributePath
+ ^ MetacelloMethodSectionPath withAll: self
+! !
+
+!Collection methodsFor:'*metacello-core-scripting'!
+
+execute: projectSpecBlock against: aScriptExecutor
+ aScriptExecutor executeCollection: self do: projectSpecBlock
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+mergeIntoMetacelloPackages: aMetacelloPackagesSpec
+
+ self do: [:each | each mergeIntoMetacelloPackages: aMetacelloPackagesSpec ]
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+removeFromMetacelloPackages: aMetacelloPackagesSpec
+
+ self do: [:each | each removeFromMetacelloPackages: aMetacelloPackagesSpec ]
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+setForDo: aBlock withInMetacelloConfig: aMetacelloConstructore
+ aMetacelloConstructore setFor: self do: aBlock
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+setForVersion: aString withInMetacelloConfig: aMetacelloConstructore
+ aMetacelloConstructore setFor: self version: aString
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+setIncludesInMetacelloPackage: aMetacelloPackageSpec
+
+ aMetacelloPackageSpec setIncludes: self asArray.
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+setLoadsInMetacelloProject: aMetacelloPackageSpec
+
+ aMetacelloPackageSpec setLoads: self asArray.
+! !
+
+!Collection methodsFor:'*metacello-core'!
+
+setRequiresInMetacelloPackage: aMetacelloPackageSpec
+
+ aMetacelloPackageSpec setRequires: self asArray.
+! !
+
+!Integer methodsFor:'*metacello-core'!
+
+metacelloIntegerLessThanSelf: anInteger
+
+ ^anInteger < self
+! !
+
+!Integer methodsFor:'*metacello-core'!
+
+metacelloSemanticIntegerLessThanSelf: anInteger
+ ^ anInteger < self
+! !
+
+!Integer methodsFor:'*metacello-core'!
+
+metacelloSemanticStringLessThanSelf: aString
+ "string version components are always '<' integer component"
+
+ ^ true
+! !
+
+!Integer methodsFor:'*metacello-core'!
+
+metacelloSemanticVersionComponentLessThan: aMetacelloVersonComponent
+ ^ aMetacelloVersonComponent metacelloSemanticIntegerLessThanSelf: self
+! !
+
+!Integer methodsFor:'*metacello-core'!
+
+metacelloStringLessThanSelf: aString
+ "string version components are always '<' integer component"
+
+ ^true
+! !
+
+!Integer methodsFor:'*metacello-core'!
+
+metacelloVersionComponentLessThan: aMetacelloVersonComponent
+
+ ^aMetacelloVersonComponent metacelloIntegerLessThanSelf: self
+! !
+
+!Object methodsFor:'*metacello-core'!
+
+metacelloIntegerLessThanSelf: anInteger
+
+ ^self error: 'Invalid Metacello verson component - should be String or Integer.'
+! !
+
+!Object methodsFor:'*metacello-core'!
+
+metacelloSemanticIntegerLessThanSelf: anInteger
+ ^ self error: 'Invalid Metacello verson component - should be String or Integer.'
+! !
+
+!Object methodsFor:'*metacello-core'!
+
+metacelloSemanticStringLessThanSelf: anInteger
+ ^ self error: 'Invalid Metacello verson component - should be String or Integer.'
+! !
+
+!Object methodsFor:'*metacello-core'!
+
+metacelloSemanticVersionComponentLessThan: aMetacelloVersonComponent
+ ^ self error: 'Invalid Metacello verson component - should be String or Integer.'
+! !
+
+!Object methodsFor:'*metacello-core'!
+
+metacelloStringLessThanSelf: anInteger
+
+ ^self error: 'Invalid Metacello verson component - should be String or Integer.'
+! !
+
+!Object methodsFor:'*metacello-core'!
+
+metacelloVersionComponentLessThan: aMetacelloVersonComponent
+
+ ^self error: 'Invalid Metacello verson component - should be String or Integer.'
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+addToMetacelloPackages: aMetacelloPackagesSpec
+
+ | spec |
+ spec :=
+ (aMetacelloPackagesSpec project packageSpec)
+ file: self;
+ yourself.
+ aMetacelloPackagesSpec addMember:
+ (aMetacelloPackagesSpec addMember
+ name: spec name;
+ spec: spec;
+ yourself)
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+asMetacelloSemanticVersionNumber
+ ^ MetacelloSemanticVersionNumber fromString: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+asMetacelloVersionNumber
+
+ ^MetacelloVersionNumber fromString: self
+! !
+
+!String methodsFor:'*metacello-core-scripting'!
+
+execute: projectSpecBlock against: aScriptExecutor
+ aScriptExecutor executeString: self do: projectSpecBlock
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+mergeIntoMetacelloPackages: aMetacelloPackagesSpec
+
+ | spec |
+ spec :=
+ (aMetacelloPackagesSpec project packageSpec)
+ file: self;
+ yourself.
+ aMetacelloPackagesSpec addMember:
+ (aMetacelloPackagesSpec mergeMember
+ name: spec name;
+ spec: spec;
+ yourself)
+! !
+
+!String methodsFor:'*metacello-core-version comparison'!
+
+metacelloIntegerLessThanSelf: anInteger
+ "integer version components are always '>' string component"
+
+ ^false
+! !
+
+!String methodsFor:'*metacello-core-version comparison'!
+
+metacelloSemanticIntegerLessThanSelf: anInteger
+ "integer version components are always '>' string component"
+
+ ^ true
+! !
+
+!String methodsFor:'*metacello-core-version comparison'!
+
+metacelloSemanticStringLessThanSelf: aString
+ ^ aString < self
+! !
+
+!String methodsFor:'*metacello-core-version comparison'!
+
+metacelloSemanticVersionComponentLessThan: aMetacelloVersonComponent
+ ^ aMetacelloVersonComponent metacelloSemanticStringLessThanSelf: self
+! !
+
+!String methodsFor:'*metacello-core-version comparison'!
+
+metacelloStringLessThanSelf: aString
+
+ ^aString < self
+! !
+
+!String methodsFor:'*metacello-core-version comparison'!
+
+metacelloVersionComponentLessThan: aMetacelloVersonComponent
+
+ ^aMetacelloVersonComponent metacelloStringLessThanSelf: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+removeFromMetacelloPackages: aMetacelloPackagesSpec
+
+ aMetacelloPackagesSpec addMember:
+ (aMetacelloPackagesSpec removeMember
+ name: self;
+ yourself)
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setAuthorInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setAuthorWithString: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setAuthorInMetacelloVersion: aMetacelloVersionSpec
+
+ aMetacelloVersionSpec setAuthor:
+ (aMetacelloVersionSpec project valueHolderSpec
+ value: self;
+ yourself)
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setBlessingInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setBlessingWithString: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setBlessingInMetacelloVersion: aMetacelloVersionSpec
+
+ aMetacelloVersionSpec setBlessing:
+ (aMetacelloVersionSpec project valueHolderSpec
+ value: self;
+ yourself)
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setDescriptionInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setDescriptionWithString: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setDescriptionInMetacelloVersion: aMetacelloVersionSpec
+
+ aMetacelloVersionSpec setDescription:
+ (aMetacelloVersionSpec project valueHolderSpec
+ value: self;
+ yourself)
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setIncludesInMetacelloPackage: aMetacelloPackageSpec
+
+ aMetacelloPackageSpec setIncludes: { self }.
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setLoadsInMetacelloProject: aMetacelloPackageSpec
+
+ aMetacelloPackageSpec setLoads: { self }.
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setPackage: aString withInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setPackage: aString withString: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setPostLoadDoItInMetacelloSpec: aMetacelloSpec
+ self asSymbol setPostLoadDoItInMetacelloSpec: aMetacelloSpec
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setPreLoadDoItInMetacelloSpec: aMetacelloSpec
+ self asSymbol setPreLoadDoItInMetacelloSpec: aMetacelloSpec
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setProject: aString withInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setProject: aString withString: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setRequiresInMetacelloPackage: aMetacelloPackageSpec
+
+ aMetacelloPackageSpec setRequires: { self }.
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setTimestampInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setTimestampWithString: self
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setTimestampInMetacelloVersion: aMetacelloVersionSpec
+
+ aMetacelloVersionSpec setTimestamp:
+ (aMetacelloVersionSpec project valueHolderSpec
+ value: self;
+ yourself)
+! !
+
+!Symbol methodsFor:'*metacello-core'!
+
+asMetacelloAttributeList
+ ^ {self}
+! !
+
+!Symbol methodsFor:'*metacello-core'!
+
+asMetacelloAttributePath
+ ^ MetacelloMethodSectionPath with: {self}
+! !
+
+!Symbol methodsFor:'*metacello-core'!
+
+setForDo: aBlock withInMetacelloConfig: aMetacelloConstructore
+ aMetacelloConstructore setFor: {self} do: aBlock
+! !
+
+!Symbol methodsFor:'*metacello-core'!
+
+setForVersion: aString withInMetacelloConfig: aMetacelloConstructore
+ aMetacelloConstructore setFor: {self} version: aString
+! !
+
+!Symbol methodsFor:'*metacello-core'!
+
+setPostLoadDoItInMetacelloSpec: aMetacelloSpec
+ self isUnary ifFalse:[
+ self error:'Invalid symbol'
+ ].
+
+ aMetacelloSpec setPostLoadDoIt:
+ (aMetacelloSpec project valueHolderSpec
+ value: self;
+ yourself)
+
+ "Modified: / 18-09-2012 / 19:18:09 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!Symbol methodsFor:'*metacello-core'!
+
+setPreLoadDoItInMetacelloSpec: aMetacelloSpec
+ self isUnary ifFalse:[
+ self error:'Invalid symbol'
+ ].
+ aMetacelloSpec setPreLoadDoIt:
+ (aMetacelloSpec project valueHolderSpec
+ value: self;
+ yourself)
+
+ "Modified: / 18-09-2012 / 19:19:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!Timestamp methodsFor:'*metacello-core'!
+
+setTimestampInMetacelloConfig: aMetacelloConfig
+ aMetacelloConfig setTimestampWithString: self printString
+! !
+
+!Timestamp methodsFor:'*metacello-core'!
+
+setTimestampInMetacelloVersion: aMetacelloVersionSpec
+
+ aMetacelloVersionSpec setTimestamp:
+ (aMetacelloVersionSpec project valueHolderSpec
+ value: self printString;
+ yourself)
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+asMetacelloSemanticVersionNumber
+ ^ MetacelloSemanticVersionNumber fromString: ''
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+asMetacelloVersionNumber
+
+ ^MetacelloVersionNumber fromString: ''
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+metacelloRegistrationHash
+ ^ self hash
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+registrationsCompareEqual: aMetacelloProjectSpec
+ ^ self = aMetacelloProjectSpec
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+setAuthorInMetacelloVersion: aMetacelloVersionSpec
+
+ aMetacelloVersionSpec setAuthor: self
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+setBlessingInMetacelloVersion: aMetacelloVersionSpec
+
+ aMetacelloVersionSpec setBlessing: self
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+setDescriptionInMetacelloVersion: aMetacelloVersionSpec
+
+ aMetacelloVersionSpec setDescription: self
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+setPostLoadDoItInMetacelloSpec: aMetacelloSpec
+
+ aMetacelloSpec setPostLoadDoIt:
+ (aMetacelloSpec project valueHolderSpec
+ value: self;
+ yourself)
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+setPreLoadDoItInMetacelloSpec: aMetacelloSpec
+
+ aMetacelloSpec setPreLoadDoIt:
+ (aMetacelloSpec project valueHolderSpec
+ value: self;
+ yourself)
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+setProject: aString withInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setProject: aString withString: self
+! !
+
+!UndefinedObject methodsFor:'*metacello-core'!
+
+setTimestampInMetacelloVersion: aMetacelloVersionSpec
+
+ aMetacelloVersionSpec setTimestamp: self
+! !
+
+!stx_goodies_metacello_core class methodsFor:'documentation'!
+
+extensionsVersion_HG
+
+ ^ '$Changeset: <not expanded> $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/lccmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,8 @@
+@REM -------
+@REM make using lcc compiler
+@REM type lccmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+make.exe -N -f bc.mak -DUSELCC=1 %*
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/libInit.cc Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,117 @@
+/*
+ * $Header$
+ *
+ * DO NOT EDIT
+ * automagically generated from the projectDefinition: stx_goodies_metacello_core.
+ */
+#define __INDIRECTVMINITCALLS__
+#include <stc.h>
+
+#ifdef WIN32
+# pragma codeseg INITCODE "INITCODE"
+#endif
+
+#if defined(INIT_TEXT_SECTION) || defined(DLL_EXPORT)
+DLL_EXPORT void _libstx_goodies_metacello_core_Init() INIT_TEXT_SECTION;
+DLL_EXPORT void _libstx_goodies_metacello_core_InitDefinition() INIT_TEXT_SECTION;
+#endif
+
+void _libstx_goodies_metacello_core_InitDefinition(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello_core__DFN", _libstx_goodies_metacello_core_InitDefinition, "stx:goodies/metacello/core");
+_stx_137goodies_137metacello_137core_Init(pass,__pRT__,snd);
+
+__END_PACKAGE__();
+}
+
+void _libstx_goodies_metacello_core_Init(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello_core", _libstx_goodies_metacello_core_Init, "stx:goodies/metacello/core");
+_MetacelloAbstractConstructor_Init(pass,__pRT__,snd);
+_MetacelloBaseConfiguration_Init(pass,__pRT__,snd);
+_MetacelloCannotUpdateReleasedVersionError_Init(pass,__pRT__,snd);
+_MetacelloCleanNotification_Init(pass,__pRT__,snd);
+_MetacelloClearStackCacheNotification_Init(pass,__pRT__,snd);
+_MetacelloErrorInProjectConstructionNotification_Init(pass,__pRT__,snd);
+_MetacelloMethodSection_Init(pass,__pRT__,snd);
+_MetacelloMethodSectionPath_Init(pass,__pRT__,snd);
+_MetacelloMethodSpec_Init(pass,__pRT__,snd);
+_MetacelloPackageSpecResolutionError_Init(pass,__pRT__,snd);
+_MetacelloPlatform_Init(pass,__pRT__,snd);
+_MetacelloProject_Init(pass,__pRT__,snd);
+_MetacelloProjectRegistration_Init(pass,__pRT__,snd);
+_MetacelloProjectRegistry_Init(pass,__pRT__,snd);
+_MetacelloProjectSpecForLoad_Init(pass,__pRT__,snd);
+_MetacelloProjectSpecGenerator_Init(pass,__pRT__,snd);
+_MetacelloProjectSpecLoadError_Init(pass,__pRT__,snd);
+_MetacelloScriptEngine_Init(pass,__pRT__,snd);
+_MetacelloScriptExecutor_Init(pass,__pRT__,snd);
+_MetacelloScriptGitHubDownloadNotification_Init(pass,__pRT__,snd);
+_MetacelloScriptNotification_Init(pass,__pRT__,snd);
+_MetacelloScriptingError_Init(pass,__pRT__,snd);
+_MetacelloSemanticVersionNumber_Init(pass,__pRT__,snd);
+_MetacelloSkipDirtyPackageLoad_Init(pass,__pRT__,snd);
+_MetacelloSpec_Init(pass,__pRT__,snd);
+_MetacelloSpecLoader_Init(pass,__pRT__,snd);
+_MetacelloStackCacheNotification_Init(pass,__pRT__,snd);
+_MetacelloValidationFailure_Init(pass,__pRT__,snd);
+_MetacelloValidationIssue_Init(pass,__pRT__,snd);
+_MetacelloValidationNotification_Init(pass,__pRT__,snd);
+_MetacelloVersion_Init(pass,__pRT__,snd);
+_MetacelloVersionDoesNotExistError_Init(pass,__pRT__,snd);
+_MetacelloVersionNumber_Init(pass,__pRT__,snd);
+_stx_137goodies_137metacello_137core_Init(pass,__pRT__,snd);
+_MetacelloAbstractPackageSpec_Init(pass,__pRT__,snd);
+_MetacelloAbstractVersionConstructor_Init(pass,__pRT__,snd);
+_MetacelloBaselineSpecGenerator_Init(pass,__pRT__,snd);
+_MetacelloCleanLoadAndTestsNotification_Init(pass,__pRT__,snd);
+_MetacelloCleanLoadNotification_Init(pass,__pRT__,snd);
+_MetacelloConfigurationSpecGenerator_Init(pass,__pRT__,snd);
+_MetacelloConflictingProjectError_Init(pass,__pRT__,snd);
+_MetacelloLockedProjectError_Init(pass,__pRT__,snd);
+_MetacelloMemberListSpec_Init(pass,__pRT__,snd);
+_MetacelloMemberSpec_Init(pass,__pRT__,snd);
+_MetacelloProjectSpec_Init(pass,__pRT__,snd);
+_MetacelloProjectSpecLoadConflict_Init(pass,__pRT__,snd);
+_MetacelloResolveProjectUpgrade_Init(pass,__pRT__,snd);
+_MetacelloScriptApiExecutor_Init(pass,__pRT__,snd);
+_MetacelloScriptEnsureProjectLoadedForDevelopment_Init(pass,__pRT__,snd);
+_MetacelloScriptImageExecutor_Init(pass,__pRT__,snd);
+_MetacelloScriptProjectSpecNotification_Init(pass,__pRT__,snd);
+_MetacelloScriptRegistryExecutor_Init(pass,__pRT__,snd);
+_MetacelloSymbolicVersionDoesNotExistError_Init(pass,__pRT__,snd);
+_MetacelloSymbolicVersionMethodSpec_Init(pass,__pRT__,snd);
+_MetacelloSymbolicVersionSpec_Init(pass,__pRT__,snd);
+_MetacelloUseUpgradeError_Init(pass,__pRT__,snd);
+_MetacelloValidationCriticalWarning_Init(pass,__pRT__,snd);
+_MetacelloValidationError_Init(pass,__pRT__,snd);
+_MetacelloValidationWarning_Init(pass,__pRT__,snd);
+_MetacelloValueHolderSpec_Init(pass,__pRT__,snd);
+_MetacelloVersionDefinitionError_Init(pass,__pRT__,snd);
+_MetacelloVersionMethodSection_Init(pass,__pRT__,snd);
+_MetacelloVersionMethodSpec_Init(pass,__pRT__,snd);
+_MetacelloVersionSpec_Init(pass,__pRT__,snd);
+_MetacelloVersionValidator_Init(pass,__pRT__,snd);
+_MetacelloAddMemberSpec_Init(pass,__pRT__,snd);
+_MetacelloAllowConflictingProjectUpgrade_Init(pass,__pRT__,snd);
+_MetacelloAllowProjectDowngrade_Init(pass,__pRT__,snd);
+_MetacelloAllowProjectUpgrade_Init(pass,__pRT__,snd);
+_MetacelloBaselineConstructor_Init(pass,__pRT__,snd);
+_MetacelloCopyMemberSpec_Init(pass,__pRT__,snd);
+_MetacelloGenericProjectSpec_Init(pass,__pRT__,snd);
+_MetacelloGroupSpec_Init(pass,__pRT__,snd);
+_MetacelloLookupBaselineSpecForEnsureLoad_Init(pass,__pRT__,snd);
+_MetacelloLookupProjectSpec_Init(pass,__pRT__,snd);
+_MetacelloLookupProjectSpecForLoad_Init(pass,__pRT__,snd);
+_MetacelloMergeMemberSpec_Init(pass,__pRT__,snd);
+_MetacelloPackagesSpec_Init(pass,__pRT__,snd);
+_MetacelloProjectReferenceSpec_Init(pass,__pRT__,snd);
+_MetacelloProjectSpecLoadedNotification_Init(pass,__pRT__,snd);
+_MetacelloRemoveMemberSpec_Init(pass,__pRT__,snd);
+_MetacelloSymbolicVersionNotDefinedError_Init(pass,__pRT__,snd);
+_MetacelloToolBoxConstructor_Init(pass,__pRT__,snd);
+_MetacelloVersionConstructor_Init(pass,__pRT__,snd);
+
+_stx_137goodies_137metacello_137core_extensions_Init(pass,__pRT__,snd);
+__END_PACKAGE__();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/mingwmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+@REM -------
+@REM make using mingw gnu compiler
+@REM type mingwmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+
+@pushd ..\..\..\rules
+@call find_mingw.bat
+@popd
+make.exe -N -f bc.mak %DEFINES% %USEMINGW_ARG% %*
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/stx_goodies_metacello_core.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,298 @@
+"{ Package: 'stx:goodies/metacello/core' }"
+
+LibraryDefinition subclass:#stx_goodies_metacello_core
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'* Projects & Packages *'
+!
+
+
+!stx_goodies_metacello_core class methodsFor:'description'!
+
+excludedFromPreRequisites
+ "list all packages which should be ignored in the automatic
+ preRequisites scan. See #preRequisites for more."
+
+ ^ #(
+ #'stx:goodies/monticello' "MCHttpRepository - referenced by MetacelloPlatform>>createRepository: "
+
+ )
+
+ "Modified: / 03-10-2012 / 12:53:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+preRequisites
+ "list all required packages.
+ This list can be maintained manually or (better) generated and
+ updated by scanning the superclass hierarchies and looking for
+ global variable accesses. (the browser has a menu function for that)
+ Howevery, often too much is found, and you may want to explicitely
+ exclude individual packages in the #excludedFromPrerequisites method."
+
+ ^ #(
+ #'stx:goodies/metacello/base' "ConfigurationOf - superclass of MetacelloBaseConfiguration "
+ #'stx:libbasic' "ByteArray - superclass of extended Symbol "
+ )
+! !
+
+!stx_goodies_metacello_core class methodsFor:'description - contents'!
+
+classNamesAndAttributes
+ "lists the classes which are to be included in the project.
+ Each entry in the list may be: a single class-name (symbol),
+ or an array-literal consisting of class name and attributes.
+ Attributes are: #autoload or #<os> where os is one of win32, unix,..."
+
+ ^ #(
+ "<className> or (<className> attributes...) in load order"
+ MetacelloMethodSectionPath
+ MetacelloMethodSpec
+ MetacelloPackageSpecResolutionError
+ MetacelloPlatform
+ #'stx_goodies_metacello_core'
+ MetacelloSymbolicVersionMethodSpec
+ MetacelloVersionMethodSpec
+ MetacelloAbstractConstructor
+ MetacelloBaseConfiguration
+ MetacelloCannotUpdateReleasedVersionError
+ MetacelloCleanNotification
+ MetacelloClearStackCacheNotification
+ MetacelloErrorInProjectConstructionNotification
+ MetacelloMethodSection
+ MetacelloProject
+ MetacelloProjectRegistration
+ MetacelloProjectRegistry
+ MetacelloProjectSpecForLoad
+ MetacelloProjectSpecGenerator
+ MetacelloProjectSpecLoadError
+ MetacelloScriptEngine
+ MetacelloScriptExecutor
+ MetacelloScriptGitHubDownloadNotification
+ MetacelloScriptNotification
+ MetacelloScriptingError
+ MetacelloSemanticVersionNumber
+ MetacelloSkipDirtyPackageLoad
+ MetacelloSpec
+ MetacelloSpecLoader
+ MetacelloStackCacheNotification
+ MetacelloValidationFailure
+ MetacelloValidationIssue
+ MetacelloValidationNotification
+ MetacelloVersion
+ MetacelloVersionDoesNotExistError
+ MetacelloVersionNumber
+ MetacelloAbstractPackageSpec
+ MetacelloAbstractVersionConstructor
+ MetacelloBaselineSpecGenerator
+ MetacelloCleanLoadAndTestsNotification
+ MetacelloCleanLoadNotification
+ MetacelloConfigurationSpecGenerator
+ MetacelloConflictingProjectError
+ MetacelloLockedProjectError
+ MetacelloMemberListSpec
+ MetacelloMemberSpec
+ MetacelloProjectSpec
+ MetacelloProjectSpecLoadConflict
+ MetacelloResolveProjectUpgrade
+ MetacelloScriptApiExecutor
+ MetacelloScriptEnsureProjectLoadedForDevelopment
+ MetacelloScriptImageExecutor
+ MetacelloScriptProjectSpecNotification
+ MetacelloScriptRegistryExecutor
+ MetacelloSymbolicVersionDoesNotExistError
+ MetacelloSymbolicVersionSpec
+ MetacelloUseUpgradeError
+ MetacelloValidationCriticalWarning
+ MetacelloValidationError
+ MetacelloValidationWarning
+ MetacelloValueHolderSpec
+ MetacelloVersionDefinitionError
+ MetacelloVersionMethodSection
+ MetacelloVersionSpec
+ MetacelloVersionValidator
+ MetacelloAddMemberSpec
+ MetacelloAllowConflictingProjectUpgrade
+ MetacelloAllowProjectDowngrade
+ MetacelloAllowProjectUpgrade
+ MetacelloBaselineConstructor
+ MetacelloCopyMemberSpec
+ MetacelloGenericProjectSpec
+ MetacelloGroupSpec
+ MetacelloLookupBaselineSpecForEnsureLoad
+ MetacelloLookupProjectSpec
+ MetacelloLookupProjectSpecForLoad
+ MetacelloMergeMemberSpec
+ MetacelloPackagesSpec
+ MetacelloProjectReferenceSpec
+ MetacelloProjectSpecLoadedNotification
+ MetacelloRemoveMemberSpec
+ MetacelloSymbolicVersionNotDefinedError
+ MetacelloToolBoxConstructor
+ MetacelloVersionConstructor
+ )
+!
+
+extensionMethodNames
+ "lists the extension methods which are to be included in the project.
+ Entries are 2-element array literals, consisting of class-name and selector."
+
+ ^ #(
+ Block setAuthorInMetacelloConfig:
+ Block setBlessingInMetacelloConfig:
+ Block setDescriptionInMetacelloConfig:
+ Block setPackage:withInMetacelloConfig:
+ Block setProject:withInMetacelloConfig:
+ Block setTimestampInMetacelloConfig:
+ Collection addToMetacelloPackages:
+ Collection asMetacelloAttributeList
+ Collection asMetacelloAttributePath
+ Collection mergeIntoMetacelloPackages:
+ Collection removeFromMetacelloPackages:
+ Collection setForDo:withInMetacelloConfig:
+ Collection setForVersion:withInMetacelloConfig:
+ Collection setIncludesInMetacelloPackage:
+ Collection setLoadsInMetacelloProject:
+ Collection setRequiresInMetacelloPackage:
+ Integer metacelloIntegerLessThanSelf:
+ Integer metacelloStringLessThanSelf:
+ Integer metacelloVersionComponentLessThan:
+ Object metacelloIntegerLessThanSelf:
+ Object metacelloStringLessThanSelf:
+ Object metacelloVersionComponentLessThan:
+ String addToMetacelloPackages:
+ String asMetacelloVersionNumber
+ String mergeIntoMetacelloPackages:
+ String metacelloIntegerLessThanSelf:
+ String metacelloStringLessThanSelf:
+ String metacelloVersionComponentLessThan:
+ String removeFromMetacelloPackages:
+ String setAuthorInMetacelloConfig:
+ String setAuthorInMetacelloVersion:
+ String setBlessingInMetacelloConfig:
+ String setBlessingInMetacelloVersion:
+ String setDescriptionInMetacelloConfig:
+ String setDescriptionInMetacelloVersion:
+ String setIncludesInMetacelloPackage:
+ String setLoadsInMetacelloProject:
+ String setPackage:withInMetacelloConfig:
+ String setProject:withInMetacelloConfig:
+ String setRequiresInMetacelloPackage:
+ String setTimestampInMetacelloConfig:
+ String setTimestampInMetacelloVersion:
+ Symbol asMetacelloAttributeList
+ Symbol asMetacelloAttributePath
+ Symbol setForDo:withInMetacelloConfig:
+ Symbol setForVersion:withInMetacelloConfig:
+ Symbol setPostLoadDoItInMetacelloSpec:
+ Symbol setPreLoadDoItInMetacelloSpec:
+ Timestamp setTimestampInMetacelloVersion:
+ UndefinedObject asMetacelloVersionNumber
+ UndefinedObject setAuthorInMetacelloVersion:
+ UndefinedObject setBlessingInMetacelloVersion:
+ UndefinedObject setDescriptionInMetacelloVersion:
+ UndefinedObject setPostLoadDoItInMetacelloSpec:
+ UndefinedObject setPreLoadDoItInMetacelloSpec:
+ UndefinedObject setProject:withInMetacelloConfig:
+ UndefinedObject setTimestampInMetacelloVersion:
+ Block execute:against:
+ Block setBaseline:withInMetacelloConfig:
+ Block setConfiguration:withInMetacelloConfig:
+ Collection execute:against:
+ Integer metacelloSemanticIntegerLessThanSelf:
+ Integer metacelloSemanticStringLessThanSelf:
+ Integer metacelloSemanticVersionComponentLessThan:
+ Object metacelloSemanticIntegerLessThanSelf:
+ Object metacelloSemanticStringLessThanSelf:
+ Object metacelloSemanticVersionComponentLessThan:
+ String asMetacelloSemanticVersionNumber
+ String execute:against:
+ String metacelloSemanticIntegerLessThanSelf:
+ String metacelloSemanticStringLessThanSelf:
+ String metacelloSemanticVersionComponentLessThan:
+ String setPostLoadDoItInMetacelloSpec:
+ String setPreLoadDoItInMetacelloSpec:
+ Timestamp setTimestampInMetacelloConfig:
+ UndefinedObject asMetacelloSemanticVersionNumber
+ UndefinedObject metacelloRegistrationHash
+ UndefinedObject registrationsCompareEqual:
+ )
+! !
+
+!stx_goodies_metacello_core class methodsFor:'description - project information'!
+
+applicationIconFileName
+ "Return the name (without suffix) of an icon-file (the app's icon); will be included in the rc-resource file"
+
+ ^ nil
+ "/ ^ self applicationName
+!
+
+companyName
+ "Return a companyname which will appear in <lib>.rc"
+
+ ^ 'Dale Henrichs & Jan Vrany'
+
+ "Modified: / 10-09-2012 / 22:14:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+description
+ "Return a description string which will appear in vc.def / bc.def"
+
+ ^ 'Metacello -- a Smalltalk project configuration management tool'
+
+ "Modified: / 10-09-2012 / 22:15:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+legalCopyright
+ "Return a copyright string which will appear in <lib>.rc"
+
+ ^ 'Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)'
+
+ "Modified: / 10-09-2012 / 22:16:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+productInstallDirBaseName
+ "Returns a default installDir which will appear in <app>.nsi.
+ This is usually not the one you want to keep"
+
+ ^ (self package asCollectionOfSubstringsSeparatedByAny:':/') last
+!
+
+productName
+ "Return a product name which will appear in <lib>.rc"
+
+ ^ 'Metacello'
+
+ "Modified: / 10-09-2012 / 22:16:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_metacello_core class methodsFor:'description - svn'!
+
+svnRepositoryUrlString
+ "Return a SVN repository URL of myself.
+ (Generated since 2011-04-08)
+ Do not make the string shorter!!!!!! We have to use fixed-length keyword!!!!!!
+ "
+
+ ^ '$URL:: $'
+!
+
+svnRevisionNr
+ "Return a SVN revision number of myself.
+ This number is updated after a commit"
+
+ ^ "$SVN-Revision:"'21 '"$"
+! !
+
+!stx_goodies_metacello_core class methodsFor:'documentation'!
+
+version_HG
+
+ ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/core/vcmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,20 @@
+@REM -------
+@REM make using Microsoft Visual C compiler
+@REM type vcmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+
+@if not defined VSINSTALLDIR (
+ pushd ..\..\..\rules
+ call vcsetup.bat
+ popd
+)
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak -DUSEVC=1 %DEFINES% %*
+
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/lccmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,8 @@
+@REM -------
+@REM make using lcc compiler
+@REM type lccmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+make.exe -N -f bc.mak -DUSELCC=1 %*
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/libInit.cc Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,34 @@
+/*
+ * $Header$
+ *
+ * DO NOT EDIT
+ * automagically generated from the projectDefinition: stx_goodies_metacello.
+ */
+#define __INDIRECTVMINITCALLS__
+#include <stc.h>
+
+#ifdef WIN32
+# pragma codeseg INITCODE "INITCODE"
+#endif
+
+#if defined(INIT_TEXT_SECTION) || defined(DLL_EXPORT)
+DLL_EXPORT void _libstx_goodies_metacello_Init() INIT_TEXT_SECTION;
+DLL_EXPORT void _libstx_goodies_metacello_InitDefinition() INIT_TEXT_SECTION;
+#endif
+
+void _libstx_goodies_metacello_InitDefinition(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello__DFN", _libstx_goodies_metacello_InitDefinition, "stx:goodies/metacello");
+_stx_137goodies_137metacello_Init(pass,__pRT__,snd);
+
+__END_PACKAGE__();
+}
+
+void _libstx_goodies_metacello_Init(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello", _libstx_goodies_metacello_Init, "stx:goodies/metacello");
+_stx_137goodies_137metacello_Init(pass,__pRT__,snd);
+
+
+__END_PACKAGE__();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/metacello.rc Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,37 @@
+//
+// DO NOT EDIT
+// automagically generated from the projectDefinition: stx_goodies_metacello.
+//
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 6,2,32767,32767
+ PRODUCTVERSION 6,2,4,0
+#if (__BORLANDC__)
+ FILEFLAGSMASK VS_FF_DEBUG | VS_FF_PRERELEASE
+ FILEFLAGS VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
+ FILEOS VOS_NT_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE VS_USER_DEFINED
+#endif
+
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+ VALUE "CompanyName", "Dale Henrichs & Jan Vrany\0"
+ VALUE "FileDescription", "Metacello -- a Smalltalk project configuration management tool (LIB)\0"
+ VALUE "FileVersion", "6.2.32767.32767\0"
+ VALUE "InternalName", "stx:goodies/metacello\0"
+ VALUE "LegalCopyright", "Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)\0"
+ VALUE "ProductName", "Metacello\0"
+ VALUE "ProductVersion", "6.2.4.0\0"
+ VALUE "ProductDate", "Thu, 21 Aug 2014 08:17:37 GMT\0"
+ END
+
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN // Language | Translation
+ VALUE "Translation", 0x409, 0x4E4 // U.S. English, Windows Multilingual
+ END
+END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/mingwmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+@REM -------
+@REM make using mingw gnu compiler
+@REM type mingwmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+
+@pushd ..\..\rules
+@call find_mingw.bat
+@popd
+make.exe -N -f bc.mak %DEFINES% %USEMINGW_ARG% %*
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/Make.proto Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,160 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_stx.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# The Makefile as generated by this Make.proto supports the following targets:
+# make - compile all st-files to a classLib
+# make clean - clean all temp files
+# make clobber - clean all
+#
+# This file contains definitions for Unix based platforms.
+# It shares common definitions with the win32-make in Make.spec.
+
+#
+# position (of this package) in directory hierarchy:
+# (must point to ST/X top directory, for tools and includes)
+TOP=../../..
+INCLUDE_TOP=$(TOP)/..
+
+# subdirectories where targets are to be made:
+SUBDIRS=
+
+
+# subdirectories where Makefiles are to be made:
+# (only define if different from SUBDIRS)
+# ALLSUBDIRS=
+
+REQUIRED_SUPPORT_DIRS=
+
+# if your embedded C code requires any system includes,
+# add the path(es) here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALINCLUDES=-Ifoo -Ibar
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/goodies/metacello/core -I$(INCLUDE_TOP)/stx/libbasic
+
+
+# if you need any additional defines for embedded C code,
+# add them here:,
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALDEFINES=-Dfoo -Dbar -DDEBUG
+LOCALDEFINES=
+
+LIBNAME=libstx_goodies_metacello_stx
+STCLOCALOPT='-package=$(PACKAGE)' -I. $(LOCALINCLUDES) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -headerDir=. -varPrefix=$(LIBNAME)
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C-libraries that should be pre-linked with the class-objects
+LD_OBJ_LIBS=
+LOCAL_SHARED_LIBS=
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C targets or libraries should be added below
+LOCAL_EXTRA_TARGETS=
+
+OBJS= $(COMMON_OBJS) $(UNIX_OBJS)
+
+
+
+all:: preMake classLibRule postMake
+
+pre_objs::
+
+
+
+
+# Update SVN revision in package definition class
+ifneq (,$(findstring .svn,$(wildcard .svn)))
+.svnversion: *.st
+ if [ -d .svn ]; then \
+ rev=$(shell svnversion -n); \
+ echo -n $$rev > .svnversion; \
+ else \
+ echo -n exported > .svnversion; \
+ fi
+
+stx_goodies_metacello_stx.o: stx_goodies_metacello_stx.st .svnversion
+ @if [ -d .svn ]; then \
+ rev2="$(shell printf "%-16s" $$(cat .svnversion))"; \
+ echo " [SV] Expanding svnRevisionNo in $1.st"; \
+ sed -e "s/\"\$$SVN\-Revision:\".*\"\$$\"/\"\$$SVN-Revision:\"\'$$rev2\'\"\$$\"/g" $< > .stx_goodies_metacello_stx.svn.st; \
+ fi
+ $(MAKE) CC="$(CLASSLIB_CC)" OPT="$(OPT)" SEPINITCODE="$(SEPINITCODE)" STC="$(STC)" STFILE=.stx_goodies_metacello_stx.svn $(C_RULE);
+ sed -i -e "s/\".stx_goodies_metacello_stx.svn.st\");/\"\stx_goodies_metacello_stx.st\");/g" .stx_goodies_metacello_stx.svn.c
+ $(MAKE) .stx_goodies_metacello_stx.svn.$(O)
+ @mv .stx_goodies_metacello_stx.svn.$(O) stx_goodies_metacello_stx.$(O)
+endif
+
+
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+ifneq (**NOHG**, $(shell hg root 2> /dev/null || echo -n '**NOHG**'))
+stx_goodies_metacello_stx.$(O): $(shell hg root)/.hg/dirstate
+endif
+
+
+
+
+# run default testsuite for this package
+test: $(TOP)/goodies/builder/reports
+ $(MAKE) -C $(TOP)/goodies/builder/reports -f Makefile.init
+ $(TOP)/goodies/builder/reports/report-runner.sh -D . -r Builder::TestReport -p $(PACKAGE)
+
+
+
+# add more install actions here
+install::
+
+# add more install actions for aux-files (resources) here
+installAux::
+
+# add more preMake actions here
+preMake::
+
+# add more postMake actions here
+postMake:: cleanjunk
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+ cd ../../../libbasic && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+ cd ../base && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+ cd ../core && $(MAKE) "CFLAGS_LOCAL=$(GLOBALDEFINES)"
+
+
+
+# build all packages containing referenced classes for this package
+# they are nor needed to compile the package
+references:
+
+
+cleanjunk::
+ -rm -f *.s *.s2
+
+clean::
+ -rm -f *.o *.H
+
+clobber:: clean
+ -rm -f *.so *.dll
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)MetacelloStXPackageSpec.$(O) MetacelloStXPackageSpec.$(H): MetacelloStXPackageSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractPackageSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXPlatform.$(O) MetacelloStXPlatform.$(H): MetacelloStXPlatform.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloPlatform.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXProject.$(O) MetacelloStXProject.$(H): MetacelloStXProject.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloProject.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXRepositoriesSpec.$(O) MetacelloStXRepositoriesSpec.$(H): MetacelloStXRepositoriesSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloMemberListSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXRepositorySpec.$(O) MetacelloStXRepositorySpec.$(H): MetacelloStXRepositorySpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXVersion.$(O) MetacelloStXVersion.$(H): MetacelloStXVersion.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloVersion.$(H) $(INCLUDE_TOP)/stx/libbasic/Magnitude.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXVersionConstructor.$(O) MetacelloStXVersionConstructor.$(H): MetacelloStXVersionConstructor.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloVersionConstructor.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXVersionSpec.$(O) MetacelloStXVersionSpec.$(H): MetacelloStXVersionSpec.st $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloSpec.$(H) $(INCLUDE_TOP)/stx/goodies/metacello/core/MetacelloVersionSpec.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
+$(OUTDIR)stx_goodies_metacello_stx.$(O) stx_goodies_metacello_stx.$(H): stx_goodies_metacello_stx.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)/stx/libbasic/ArrayedCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/Block.$(H) $(INCLUDE_TOP)/stx/libbasic/CharacterArray.$(H) $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/CompiledCode.$(H) $(INCLUDE_TOP)/stx/libbasic/ExecutableFunction.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/SequenceableCollection.$(H) $(INCLUDE_TOP)/stx/libbasic/String.$(H) $(INCLUDE_TOP)/stx/libbasic/UninterpretedBytes.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/Make.spec Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,79 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_stx.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# This file contains specifications which are common to all platforms.
+#
+
+# Do NOT CHANGE THESE DEFINITIONS
+# (otherwise, ST/X will have a hard time to find out the packages location from its packageID,
+# to find the source code of a class and to find the library for a package)
+MODULE=stx
+MODULE_DIR=goodies/metacello/stx
+PACKAGE=$(MODULE):$(MODULE_DIR)
+
+
+# Argument(s) to the stc compiler (stc --usage).
+# -headerDir=. : create header files locally
+# (if removed, they will be created as common
+# -Pxxx : defines the package
+# -Zxxx : a prefix for variables within the classLib
+# -Dxxx : defines passed to to CC for inline C-code
+# -Ixxx : include path passed to CC for inline C-code
+# +optspace : optimized for space
+# +optspace2 : optimized more for space
+# +optspace3 : optimized even more for space
+# +optinline : generate inline code for some ST constructs
+# +inlineNew : additionally inline new
+# +inlineMath : additionally inline some floatPnt math stuff
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCLOCALOPTIMIZATIONS=+optinline +inlineNew
+# STCLOCALOPTIMIZATIONS=+optspace3
+STCLOCALOPTIMIZATIONS=+optspace3
+
+
+# Argument(s) to the stc compiler (stc --usage).
+# -warn : no warnings
+# -warnNonStandard : no warnings about ST/X extensions
+# -warnEOLComments : no warnings about EOL comment extension
+# -warnPrivacy : no warnings about privateClass extension
+#
+# ********** OPTIONAL: MODIFY the next line(s) ***
+# STCWARNINGS=-warn
+# STCWARNINGS=-warnNonStandard
+# STCWARNINGS=-warnEOLComments
+STCWARNINGS=-warnNonStandard
+
+COMMON_CLASSES= \
+ MetacelloStXPackageSpec \
+ MetacelloStXPlatform \
+ MetacelloStXProject \
+ MetacelloStXRepositoriesSpec \
+ MetacelloStXRepositorySpec \
+ MetacelloStXVersion \
+ MetacelloStXVersionConstructor \
+ MetacelloStXVersionSpec \
+ stx_goodies_metacello_stx \
+
+
+
+
+COMMON_OBJS= \
+ $(OUTDIR_SLASH)MetacelloStXPackageSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloStXPlatform.$(O) \
+ $(OUTDIR_SLASH)MetacelloStXProject.$(O) \
+ $(OUTDIR_SLASH)MetacelloStXRepositoriesSpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloStXRepositorySpec.$(O) \
+ $(OUTDIR_SLASH)MetacelloStXVersion.$(O) \
+ $(OUTDIR_SLASH)MetacelloStXVersionConstructor.$(O) \
+ $(OUTDIR_SLASH)MetacelloStXVersionSpec.$(O) \
+ $(OUTDIR_SLASH)stx_goodies_metacello_stx.$(O) \
+ $(OUTDIR_SLASH)extensions.$(O) \
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/Makefile.init Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,27 @@
+#
+# DO NOT EDIT
+#
+# make uses this file (Makefile) only, if there is no
+# file named "makefile" (lower-case m) in the same directory.
+# My only task is to generate the real makefile and call make again.
+# Thereafter, I am no longer used and needed.
+#
+# MACOSX caveat:
+# as filenames are not case sensitive (in a default setup),
+# we cannot use the above trick. Therefore, this file is now named
+# "Makefile.init", and you have to execute "make -f Makefile.init" to
+# get the initial makefile. This is now also done by the toplevel CONFIG
+# script.
+
+.PHONY: run
+
+run: makefile
+ $(MAKE) -f makefile
+
+#only needed for the definition of $(TOP)
+include Make.proto
+
+makefile: mf
+
+mf:
+ $(TOP)/rules/stmkmf
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXPackageSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,151 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloAbstractPackageSpec subclass:#MetacelloStXPackageSpec
+ instanceVariableNames:'repository preLoadDoIt postLoadDoIt'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-St/X-Specs'
+!
+
+Collection subclass:#Prerequisites
+ instanceVariableNames:'packageSpec suppressions additions'
+ classVariableNames:''
+ poolDictionaries:''
+ privateIn:MetacelloStXPackageSpec
+!
+
+
+!MetacelloStXPackageSpec methodsFor:'accessing'!
+
+repository
+ ^ repository
+! !
+
+!MetacelloStXPackageSpec methodsFor:'printing & storing'!
+
+configMethodOn: aStream indent: indent
+
+ aStream
+ tab: indent; nextPutAll: 'spec '; nextPutAll: 'name: ', self name storeString; nextPut: $.; cr.
+
+ "Created: / 03-10-2012 / 00:06:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXPackageSpec methodsFor:'querying'!
+
+requires
+
+ requires == nil ifTrue: [ requires := Prerequisites for: self ].
+ ^requires
+
+ "Created: / 19-09-2012 / 02:35:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXPackageSpec methodsFor:'visiting'!
+
+projectDo: projectBlock packageDo: packageBlock groupDo: groupBlock
+ packageBlock value: self
+
+ "Created: / 03-10-2012 / 22:58:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXPackageSpec::Prerequisites class methodsFor:'instance creation'!
+
+for: spec
+ ^self new initializeFor: spec
+
+ "Created: / 05-09-2012 / 19:49:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXPackageSpec::Prerequisites methodsFor:'adding & removing'!
+
+add:anObject
+ "add the argument, anObject to the receiver.
+ If the receiver is ordered, the position of the new element is undefined
+ (i.e. don't depend on where it will be put).
+ An error is raised here - it is to be implemented by a concrete subclass."
+
+ ^ self shouldImplement
+!
+
+addFirst:anObject
+ "add the argument, anObject to the receiver.
+ If the receiver is ordered, the new element will be added at the beginning.
+ An error is raised here - it is to be implemented by a concrete subclass."
+
+ ^ self shouldImplement
+!
+
+remove:anObject ifAbsent:exceptionBlock
+ "search for the first element, which is equal to anObject;
+ if found, remove and return it.
+ If not found, return the the value of the exceptionBlock.
+ Uses equality compare (=) to search for the occurrence.
+ An error is raised here - it is to be implemented by a concrete subclass."
+
+ ^ self shouldImplement
+!
+
+removeIdentical:anObject ifAbsent:exceptionBlock
+ "search for the first element, which is identical to anObject;
+ if found, remove and return it.
+ If not found, return the the value of the exceptionBlock.
+ Uses identity compare (==) to search for the occurrence.
+ An error is raised here - it is to be implemented by a concrete subclass."
+
+ ^ self shouldImplement
+!
+
+removeLast
+ "remove the last element from the receiver.
+ Return the removed element.
+ An error is raised here - it is to be implemented by a concrete subclass."
+
+ ^ self shouldImplement
+! !
+
+!MetacelloStXPackageSpec::Prerequisites methodsFor:'enumerating'!
+
+do:aBlock
+ "evaluate the argument, aBlock for each element"
+
+ | def |
+
+ def := ProjectDefinition definitionClassForPackage: packageSpec name.
+ def preRequisites do:[:each|
+ aBlock value: each
+ ]
+
+ "Modified: / 05-09-2012 / 19:53:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+reverseDo:aBlock
+ "evaluate the argument, aBlock for each element in reverse order."
+
+ ^ self do: aBlock
+
+ "Modified: / 05-09-2012 / 19:51:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXPackageSpec::Prerequisites methodsFor:'growing'!
+
+grow:howBig
+ "change the receivers size"
+
+ ^ self shouldImplement
+! !
+
+!MetacelloStXPackageSpec::Prerequisites methodsFor:'initialization'!
+
+initializeFor: aMetacelloStXPackageSpec
+ packageSpec := aMetacelloStXPackageSpec
+
+ "Created: / 05-09-2012 / 19:48:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXPackageSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXPlatform.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,30 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloPlatform subclass:#MetacelloStXPlatform
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-St/X-Model'
+!
+
+
+!MetacelloStXPlatform class methodsFor:'initialize-release'!
+
+initialize
+ "
+ MetacelloStXPlatform initialize
+ "
+
+ Current := self new
+
+ "Modified (comment): / 05-09-2012 / 17:41:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXPlatform class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
+
+MetacelloStXPlatform initialize!
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXProject.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,71 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloProject subclass:#MetacelloStXProject
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-St/X-Model'
+!
+
+
+!MetacelloStXProject class methodsFor:'accessing'!
+
+versionConstructorClass
+ ^ MetacelloStXVersionConstructor
+
+ "Created: / 05-09-2012 / 18:57:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXProject methodsFor:'spec classes'!
+
+packageSpec
+ ^self packageSpecClass for: self
+
+ "Created: / 19-09-2012 / 02:22:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+packageSpecClass
+ ^MetacelloStXPackageSpec
+
+ "Created: / 05-09-2012 / 19:28:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repositoriesSpec
+
+ ^self repositoriesSpecClass for: self
+
+ "Created: / 03-10-2012 / 11:05:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repositoriesSpecClass
+
+ ^MetacelloStXRepositoriesSpec
+
+ "Created: / 03-10-2012 / 11:05:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repositorySpec
+ ^self repositorySpecClass for: self
+
+ "Created: / 03-10-2012 / 10:53:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repositorySpecClass
+ ^MetacelloStXRepositorySpec
+
+ "Created: / 03-10-2012 / 10:53:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+versionSpecClass
+
+ ^MetacelloStXVersionSpec
+
+ "Created: / 05-09-2012 / 18:44:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXProject class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXRepositoriesSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,86 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloMemberListSpec subclass:#MetacelloStXRepositoriesSpec
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-St/X-Specs'
+!
+
+
+!MetacelloStXRepositoriesSpec methodsFor:'actions'!
+
+add: aSpec
+
+ aSpec addToMetacelloRepositories: self
+
+ "Modified: / 03-10-2012 / 11:10:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+copy: specNamed to: spec
+
+ self addMember:
+ (self copyMember
+ name: spec name;
+ sourceName: specNamed;
+ spec: spec;
+ yourself)
+!
+
+merge: aSpec
+
+ aSpec mergeIntoMetacelloRepositories: self
+
+ "Modified: / 03-10-2012 / 11:10:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+remove: aSpec
+
+ aSpec removeFromMetacelloRepositories: self
+
+ "Modified: / 03-10-2012 / 11:10:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositoriesSpec methodsFor:'printing'!
+
+configMethodOn: aStream indent: indent
+
+ | repoSpecs |
+ repoSpecs := self map values.
+ repoSpecs isEmptyOrNil ifTrue: [ ^aStream nextPutAll: 'spec add: []' ].
+ repoSpecs size = 1
+ ifTrue: [
+ aStream
+ tab: indent;
+ nextPutAll: 'spec add: ['; cr.
+ repoSpecs first configMethodOn: aStream indent: indent + 1.
+ aStream nextPut: $]; cr ]
+ ifFalse: [
+ aStream
+ tab: indent;
+ nextPutAll: 'spec'.
+ 1 to: repoSpecs size do: [:index | | packageSpec |
+ packageSpec := repoSpecs at: index.
+ aStream
+ tab: indent + 1;
+ nextPutAll: 'add: ['; cr.
+ packageSpec configMethodOn: aStream indent: indent + 2.
+ aStream nextPut: $].
+ index < repoSpecs size
+ ifTrue: [ aStream nextPut: $; ].
+ aStream cr ]]
+
+ "Modified: / 03-10-2012 / 11:19:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositoriesSpec class methodsFor:'documentation'!
+
+version_HG
+
+ ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXRepositorySpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,153 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloSpec subclass:#MetacelloStXRepositorySpec
+ instanceVariableNames:'name type url username password keyfile'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-St/X-Specs'
+!
+
+
+!MetacelloStXRepositorySpec methodsFor:'accessing'!
+
+name
+ ^ name
+!
+
+name:aString
+ name := aString.
+!
+
+type
+ ^ type
+!
+
+type: anObject
+ anObject setTypeInMetacelloStXRepository: self
+
+ "Modified: / 03-10-2012 / 11:42:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+url
+ ^ url
+
+ "Created: / 03-10-2012 / 12:47:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+url: anObject
+ anObject setUrlInMetacelloStXRepository: self
+
+ "Created: / 03-10-2012 / 11:42:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositorySpec methodsFor:'accessing-private'!
+
+getType
+ ^ type
+
+ "Created: / 03-10-2012 / 11:40:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+getUrl
+ ^ url
+
+ "Created: / 03-10-2012 / 11:40:59 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setType: anObject
+ type := anObject
+
+ "Created: / 03-10-2012 / 11:41:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setUrl: anObject
+ url := anObject
+
+ "Created: / 03-10-2012 / 11:41:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositorySpec methodsFor:'checkout'!
+
+checkout: packageId
+ self halt.
+
+ "Created: / 20-08-2014 / 10:46:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositorySpec methodsFor:'construction'!
+
+type: aBlockOrString constructor: aVersionConstructor
+ aVersionConstructor typeForVersion: aBlockOrString
+
+ "Created: / 03-10-2012 / 11:34:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+url: aBlockOrString constructor: aVersionConstructor
+ aVersionConstructor urlForVersion: aBlockOrString
+
+ "Created: / 03-10-2012 / 11:35:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositorySpec methodsFor:'merging'!
+
+mergeIntoMetacelloRepositories: aMetacelloRepositoriesSpec
+
+ aMetacelloRepositoriesSpec addMember:
+ (aMetacelloRepositoriesSpec mergeMember
+ name: self name;
+ spec: self;
+ yourself)
+
+ "Created: / 03-10-2012 / 11:11:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+mergeMap
+ ^ super mergeMap
+ at: #type put: type;
+ at: #url put: url;
+ yourself.
+
+ "Created: / 20-08-2014 / 11:16:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+mergeSpec: specToMergeIn
+ | mergedSpec mergeMap |
+
+ mergedSpec := super mergeSpec: specToMergeIn.
+ mergeMap := self mergeMap.
+ "/ Put special rules here.
+ ^ mergedSpec.
+
+ "Created: / 20-08-2014 / 11:18:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositorySpec methodsFor:'printing'!
+
+configMethodOn:aStream indent:indent
+
+ aStream
+ tab: indent; nextPutAll: 'spec '; nextPutAll: 'name: ', self name storeString.
+
+ (type ? url) notNil ifTrue:[
+ aStream
+ nextPutAll: ' with: [' ; cr.
+ type notNil ifTrue:[
+ aStream tab: indent + 1; nextPutAll: 'spec type: '; nextPutAll: self type value storeString; nextPut:$.; cr.
+ ].
+ url notNil ifTrue:[
+ aStream tab: indent + 1; nextPutAll: 'spec url: '; nextPutAll: self url value storeString; nextPut:$.; cr.
+ ].
+ aStream tab: indent; nextPutAll: '].' ; cr.
+ ] ifFalse:[
+ aStream nextPut: $. ; cr.
+ ]
+
+ "Modified: / 03-10-2012 / 12:48:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXRepositorySpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXVersion.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,29 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloVersion subclass:#MetacelloStXVersion
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-St/X-Model'
+!
+
+
+!MetacelloStXVersion methodsFor:'accessing'!
+
+packages
+ "Answers the list of packages associated with this version"
+
+ | packages |
+ packages := OrderedCollection new.
+ self spec projectDo: [:ignored | ] packageDo: [:pkg | packages add: pkg ] groupDo: [:ignored | ].
+ ^packages
+
+ "Created: / 03-10-2012 / 22:50:15 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersion class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXVersionConstructor.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,132 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloVersionConstructor subclass:#MetacelloStXVersionConstructor
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-St/X-Constructors'
+!
+
+
+!MetacelloStXVersionConstructor methodsFor:'api'!
+
+repositories: aBlock
+ self shouldNotImplement. "/use multiple repository:/repository:with:
+
+ "Created: / 03-10-2012 / 10:43:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repository: description username: username password: password
+ self shouldNotImplement. "/ use repository:with:
+"/ self root
+"/ repository: description
+"/ username: username
+"/ password: password
+"/ constructor: self
+
+ "Created: / 03-10-2012 / 10:44:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repository: anObject with: aBlock
+ self root repository: anObject with: aBlock constructor: self
+
+ "Created: / 03-10-2012 / 10:45:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+type: anObject
+ "Defines repository type (for MetacelloStXRepositorySpec).
+ Type must be one of #cvs, #svn or #git."
+
+ self root type: anObject constructor: self
+
+ "Created: / 03-10-2012 / 11:26:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+url: anObject
+ "Defines repository type (for MetacelloStXRepositorySpec).
+ Url may contain %(VAR) style variables that are expanded
+ before URL is used. See MetacelloStXRepositorySpec>>documentation
+ for details"
+
+ self root url: anObject constructor: self
+
+ "Created: / 03-10-2012 / 11:27:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionConstructor methodsFor:'api callbacks'!
+
+setRepository: aString withBlock: aBlock
+
+ | spec |
+ spec :=
+ (self project repositorySpec)
+ name: aString;
+ yourself.
+ self root repositories merge: spec.
+ self with: spec during: aBlock
+
+ "Created: / 03-10-2012 / 10:52:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setTypeWithBlock: aBlock
+
+ | spec |
+ (spec := self root getType) == nil
+ ifTrue: [
+ spec := self project valueHolderSpec.
+ self root setType: spec ].
+ self with: spec during: aBlock
+
+ "Created: / 03-10-2012 / 11:38:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setTypeWithString: aString
+ self root type: aString
+
+ "Created: / 03-10-2012 / 11:38:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setUrlWithBlock: aBlock
+
+ | spec |
+ (spec := self root getUrl) == nil
+ ifTrue: [
+ spec := self project valueHolderSpec.
+ self root setUrl: spec ].
+ self with: spec during: aBlock
+
+ "Created: / 03-10-2012 / 11:39:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+setUrlWithString: aString
+ self root url: aString
+
+ "Created: / 03-10-2012 / 11:38:18 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionConstructor methodsFor:'api spec callbacks'!
+
+repositoryForVersion: packageName with: aBlockOrString
+ aBlockOrString setRepository: packageName withInMetacelloConfig: self
+
+ "Created: / 03-10-2012 / 10:47:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+typeForVersion: aBlockOrString
+ aBlockOrString setTypeInMetacelloConfig: self
+
+ "Created: / 03-10-2012 / 11:35:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+urlForVersion: aBlockOrString
+ aBlockOrString setUrlInMetacelloConfig: self
+
+ "Created: / 03-10-2012 / 11:35:53 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionConstructor class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/MetacelloStXVersionSpec.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,126 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+MetacelloVersionSpec subclass:#MetacelloStXVersionSpec
+ instanceVariableNames:'packages repositories'
+ classVariableNames:''
+ poolDictionaries:''
+ category:'Metacello-St/X-Specs'
+!
+
+
+!MetacelloStXVersionSpec methodsFor:'accessing'!
+
+computeVersionStatus: matchBlock
+ ^#noStatus
+ "/self computeVersionStatus: (self expandToLoadableSpecNames: #('ALL')) matchBlock: matchBlock
+
+ "Created: / 19-09-2012 / 02:27:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+packageSpecsInLoadOrder
+ ^ self packages packageSpecsInLoadOrder
+
+ "Created: / 19-09-2012 / 02:32:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+packages
+ packages isNil ifTrue: [ packages := self project packagesSpec ].
+ ^ packages
+
+ "Created: / 19-09-2012 / 02:24:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+packages: anObject
+ packages := anObject
+
+ "Created: / 19-09-2012 / 02:24:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repositories
+ repositories isNil ifTrue: [ repositories := self project repositoriesSpec ].
+ ^ repositories
+
+ "Created: / 03-10-2012 / 11:04:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repositories: anObject
+ repositories := anObject
+
+ "Created: / 03-10-2012 / 11:04:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionSpec methodsFor:'checkout'!
+
+checkout
+ self packageSpecsInLoadOrder do:[:pkgSpec |
+ | repo |
+ repo := pkgSpec repository.
+ repo isNil ifTrue:[
+ | repos |
+
+ repos := OrderedCollection new.
+ self repositories map valuesDo: [ :e | repos add: e ].
+ repos size ~~ 1 ifTrue:[
+ self error:'Ambiguous repository spec for package ...'.
+ ].
+ repo := repos anElement.
+ ].
+ repo checkout: pkgSpec.
+ ].
+
+ "Created: / 20-08-2014 / 10:57:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionSpec methodsFor:'construction'!
+
+package: aString constructor: aVersionConstructor
+ aVersionConstructor packageForVersion: aString
+
+ "Created: / 19-09-2012 / 02:20:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+package: aString overrides: aBlock constructor: aVersionConstructor
+ aVersionConstructor packageForVersion: aString overrides: aBlock
+
+ "Created: / 19-09-2012 / 02:20:44 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+package: packageName with: aBlockOrString constructor: aVersionConstructor
+ aVersionConstructor packageForVersion: packageName with: aBlockOrString
+
+ "Created: / 19-09-2012 / 02:20:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+repository: repositoryName with: aBlockOrString constructor: aVersionConstructor
+ aVersionConstructor repositoryForVersion: repositoryName with: aBlockOrString
+
+ "Created: / 03-10-2012 / 10:49:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionSpec methodsFor:'enumerating'!
+
+projectDo: projectBlock packageDo: packageBlock groupDo: groupBlock
+ self packageSpecsInLoadOrder do: [:pkgSpec |
+ pkgSpec
+ projectDo: projectBlock
+ packageDo: packageBlock
+ groupDo: groupBlock
+ ]
+
+ "Created: / 03-10-2012 / 22:53:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionSpec methodsFor:'private'!
+
+versionClass
+ ^MetacelloStXVersion
+
+ "Created: / 03-10-2012 / 22:49:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!MetacelloStXVersionSpec class methodsFor:'documentation'!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/abbrev.stc Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,12 @@
+# automagically generated by the project definition
+# this file is needed for stc to be able to compile modules independently.
+# it provides information about a classes filename, category and especially namespace.
+MetacelloStXPlatform MetacelloStXPlatform stx:goodies/metacello/stx 'Metacello-St/X-Model' 0
+MetacelloStXProject MetacelloStXProject stx:goodies/metacello/stx 'Metacello-St/X-Model' 0
+stx_goodies_metacello_stx stx_goodies_metacello_stx stx:goodies/metacello/stx '* Projects & Packages *' 3
+MetacelloStXPackageSpec MetacelloStXPackageSpec stx:goodies/metacello/stx 'Metacello-St/X-Specs' 0
+MetacelloStXVersionConstructor MetacelloStXVersionConstructor stx:goodies/metacello/stx 'Metacello-St/X-Constructors' 0
+MetacelloStXVersionSpec MetacelloStXVersionSpec stx:goodies/metacello/stx 'Metacello-St/X-Specs' 0
+MetacelloStXRepositoriesSpec MetacelloStXRepositoriesSpec stx:goodies/metacello/stx 'Metacello-St/X-Specs' 0
+MetacelloStXRepositorySpec MetacelloStXRepositorySpec stx:goodies/metacello/stx 'Metacello-St/X-Specs' 0
+MetacelloStXVersion MetacelloStXVersion stx:goodies/metacello/stx 'Metacello-St/X-Model' 0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/bc.mak Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,92 @@
+# $Header$
+#
+# DO NOT EDIT
+# automagically generated from the projectDefinition: stx_goodies_metacello_stx.
+#
+# Warning: once you modify this file, do not rerun
+# stmkmp or projectDefinition-build again - otherwise, your changes are lost.
+#
+# Notice, that the name bc.mak is historical (from times, when only borland c was supported).
+# This file contains make rules for the win32 platform using either borland-bcc or visual-c.
+# It shares common definitions with the unix-make in Make.spec.
+# The bc.mak supports the following targets:
+# bmake - compile all st-files to a classLib (dll)
+# bmake clean - clean all temp files
+# bmake clobber - clean all
+#
+# Historic Note:
+# this used to contain only rules to make with borland
+# (called via bmake, by "make.exe -f bc.mak")
+# this has changed; it is now also possible to build using microsoft visual c
+# (called via vcmake, by "make.exe -f bc.mak -DUSEVC")
+#
+TOP=..\..\..
+INCLUDE_TOP=$(TOP)\..
+
+
+
+!INCLUDE $(TOP)\rules\stdHeader_bc
+
+!INCLUDE Make.spec
+
+LIBNAME=libstx_goodies_metacello_stx
+RESFILES=stx.$(RES)
+
+
+
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\goodies\metacello\core -I$(INCLUDE_TOP)\stx\libbasic
+LOCALDEFINES=
+
+STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) -varPrefix=$(LIBNAME)
+LOCALLIBS=
+
+OBJS= $(COMMON_OBJS) $(WIN32_OBJS)
+
+ALL:: classLibRule
+
+classLibRule: $(OUTDIR) $(OUTDIR)$(LIBNAME).dll
+
+!INCLUDE $(TOP)\rules\stdRules_bc
+
+# build all mandatory prerequisite packages (containing superclasses) for this package
+prereq:
+ pushd ..\..\..\libbasic & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+ pushd ..\base & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+ pushd ..\core & $(MAKE_BAT) "CFLAGS_LOCAL=$(GLOBALDEFINES) "
+
+
+
+
+
+
+
+test: $(TOP)\goodies\builder\reports\NUL
+ pushd $(TOP)\goodies\builder\reports & $(MAKE_BAT)
+ $(TOP)\goodies\builder\reports\report-runner.bat -D . -r Builder::TestReport -p $(PACKAGE)
+
+clean::
+ del *.$(CSUFFIX)
+
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+$(OUTDIR)MetacelloStXPackageSpec.$(O) MetacelloStXPackageSpec.$(H): MetacelloStXPackageSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractPackageSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXPlatform.$(O) MetacelloStXPlatform.$(H): MetacelloStXPlatform.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloPlatform.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXProject.$(O) MetacelloStXProject.$(H): MetacelloStXProject.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloProject.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXRepositoriesSpec.$(O) MetacelloStXRepositoriesSpec.$(H): MetacelloStXRepositoriesSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloMemberListSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXRepositorySpec.$(O) MetacelloStXRepositorySpec.$(H): MetacelloStXRepositorySpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXVersion.$(O) MetacelloStXVersion.$(H): MetacelloStXVersion.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloVersion.$(H) $(INCLUDE_TOP)\stx\libbasic\Magnitude.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXVersionConstructor.$(O) MetacelloStXVersionConstructor.$(H): MetacelloStXVersionConstructor.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractConstructor.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloAbstractVersionConstructor.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloVersionConstructor.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)MetacelloStXVersionSpec.$(O) MetacelloStXVersionSpec.$(H): MetacelloStXVersionSpec.st $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloSpec.$(H) $(INCLUDE_TOP)\stx\goodies\metacello\core\MetacelloVersionSpec.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
+$(OUTDIR)stx_goodies_metacello_stx.$(O) stx_goodies_metacello_stx.$(H): stx_goodies_metacello_stx.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
+$(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)\stx\libbasic\ArrayedCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\Block.$(H) $(INCLUDE_TOP)\stx\libbasic\CharacterArray.$(H) $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\CompiledCode.$(H) $(INCLUDE_TOP)\stx\libbasic\ExecutableFunction.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\SequenceableCollection.$(H) $(INCLUDE_TOP)\stx\libbasic\String.$(H) $(INCLUDE_TOP)\stx\libbasic\UninterpretedBytes.$(H) $(STCHDR)
+
+# ENDMAKEDEPEND --- do not remove this line
+
+# **Must be at end**
+
+# Enforce recompilation of package definition class if Mercurial working
+# copy state changes. Together with --guessVersion it ensures that package
+# definition class always contains correct binary revision string.
+!IFDEF HGROOT
+$(OUTDIR)stx_goodies_metacello_stx.$(O): $(HGROOT)\.hg\dirstate
+!ENDIF
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/bmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,12 @@
+@REM -------
+@REM make using Borland bcc32
+@REM type bmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak %DEFINES% %*
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/extensions.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,77 @@
+"{ Package: 'stx:goodies/metacello/stx' }"!
+
+!Block methodsFor:'*metacello-stx'!
+
+setRepository: aString withInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setRepository: aString withBlock: self
+
+ "Created: / 03-10-2012 / 10:51:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setTypeInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setTypeWithBlock: self
+
+ "Created: / 03-10-2012 / 11:37:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!Block methodsFor:'*metacello-stx'!
+
+setUrlInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setUrlWithBlock: self
+
+ "Created: / 03-10-2012 / 11:37:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setTypeInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setTypeWithString: self
+
+ "Created: / 03-10-2012 / 11:36:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setTypeInMetacelloStXRepository: aMetacelloStXRepository
+
+ aMetacelloStXRepository setType:
+ (aMetacelloStXRepository project valueHolderSpec
+ value: self;
+ yourself)
+
+ "Created: / 03-10-2012 / 11:44:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setUrlInMetacelloConfig: aMetacelloConfig
+
+ aMetacelloConfig setUrlWithString: self
+
+ "Created: / 03-10-2012 / 11:36:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!String methodsFor:'*metacello-stx'!
+
+setUrlInMetacelloStXRepository: aMetacelloStXRepository
+
+ aMetacelloStXRepository setUrl:
+ (aMetacelloStXRepository project valueHolderSpec
+ value: self;
+ yourself)
+
+ "Created: / 03-10-2012 / 11:44:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_metacello_stx class methodsFor:'documentation'!
+
+extensionsVersion_HG
+
+ ^ '$Changeset: <not expanded> $'
+! !
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/lccmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,8 @@
+@REM -------
+@REM make using lcc compiler
+@REM type lccmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+make.exe -N -f bc.mak -DUSELCC=1 %*
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/libInit.cc Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,42 @@
+/*
+ * $Header$
+ *
+ * DO NOT EDIT
+ * automagically generated from the projectDefinition: stx_goodies_metacello_stx.
+ */
+#define __INDIRECTVMINITCALLS__
+#include <stc.h>
+
+#ifdef WIN32
+# pragma codeseg INITCODE "INITCODE"
+#endif
+
+#if defined(INIT_TEXT_SECTION) || defined(DLL_EXPORT)
+DLL_EXPORT void _libstx_goodies_metacello_stx_Init() INIT_TEXT_SECTION;
+DLL_EXPORT void _libstx_goodies_metacello_stx_InitDefinition() INIT_TEXT_SECTION;
+#endif
+
+void _libstx_goodies_metacello_stx_InitDefinition(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello_stx__DFN", _libstx_goodies_metacello_stx_InitDefinition, "stx:goodies/metacello/stx");
+_stx_137goodies_137metacello_137stx_Init(pass,__pRT__,snd);
+
+__END_PACKAGE__();
+}
+
+void _libstx_goodies_metacello_stx_Init(pass, __pRT__, snd)
+OBJ snd; struct __vmData__ *__pRT__; {
+__BEGIN_PACKAGE2__("libstx_goodies_metacello_stx", _libstx_goodies_metacello_stx_Init, "stx:goodies/metacello/stx");
+_MetacelloStXPackageSpec_Init(pass,__pRT__,snd);
+_MetacelloStXPlatform_Init(pass,__pRT__,snd);
+_MetacelloStXProject_Init(pass,__pRT__,snd);
+_MetacelloStXRepositoriesSpec_Init(pass,__pRT__,snd);
+_MetacelloStXRepositorySpec_Init(pass,__pRT__,snd);
+_MetacelloStXVersion_Init(pass,__pRT__,snd);
+_MetacelloStXVersionConstructor_Init(pass,__pRT__,snd);
+_MetacelloStXVersionSpec_Init(pass,__pRT__,snd);
+_stx_137goodies_137metacello_137stx_Init(pass,__pRT__,snd);
+
+_stx_137goodies_137metacello_137stx_extensions_Init(pass,__pRT__,snd);
+__END_PACKAGE__();
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/mingwmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,16 @@
+@REM -------
+@REM make using mingw gnu compiler
+@REM type mingwmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+
+@pushd ..\..\..\rules
+@call find_mingw.bat
+@popd
+make.exe -N -f bc.mak %DEFINES% %USEMINGW_ARG% %*
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/stx.rc Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,37 @@
+//
+// DO NOT EDIT
+// automagically generated from the projectDefinition: stx_goodies_metacello_stx.
+//
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 6,2,32767,32767
+ PRODUCTVERSION 6,2,4,0
+#if (__BORLANDC__)
+ FILEFLAGSMASK VS_FF_DEBUG | VS_FF_PRERELEASE
+ FILEFLAGS VS_FF_PRERELEASE | VS_FF_SPECIALBUILD
+ FILEOS VOS_NT_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE VS_USER_DEFINED
+#endif
+
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ BEGIN
+ VALUE "CompanyName", "Dale Henrichs & Jan Vrany\0"
+ VALUE "FileDescription", "Metacello -- a Smalltalk project configuration management tool (LIB)\0"
+ VALUE "FileVersion", "6.2.32767.32767\0"
+ VALUE "InternalName", "stx:goodies/metacello/stx\0"
+ VALUE "LegalCopyright", "Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)\0"
+ VALUE "ProductName", "Metacello\0"
+ VALUE "ProductVersion", "6.2.4.0\0"
+ VALUE "ProductDate", "Thu, 21 Aug 2014 08:17:49 GMT\0"
+ END
+
+ END
+
+ BLOCK "VarFileInfo"
+ BEGIN // Language | Translation
+ VALUE "Translation", 0x409, 0x4E4 // U.S. English, Windows Multilingual
+ END
+END
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/stx_goodies_metacello_stx.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,148 @@
+"{ Package: 'stx:goodies/metacello/stx' }"
+
+LibraryDefinition subclass:#stx_goodies_metacello_stx
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'* Projects & Packages *'
+!
+
+
+!stx_goodies_metacello_stx class methodsFor:'description'!
+
+excludedFromPreRequisites
+ "list all packages which should be ignored in the automatic
+ preRequisites scan. See #preRequisites for more."
+
+ ^ #(
+ )
+!
+
+preRequisites
+ "list all required packages.
+ This list can be maintained manually or (better) generated and
+ updated by scanning the superclass hierarchies and looking for
+ global variable accesses. (the browser has a menu function for that)
+ Howevery, often too much is found, and you may want to explicitely
+ exclude individual packages in the #excludedFromPrerequisites method."
+
+ ^ #(
+ #'stx:goodies/metacello/core' "MetacelloSpec - superclass of MetacelloStXRepositoriesSpec "
+ #'stx:libbasic' "SequenceableCollection - superclass of extended UninterpretedBytes "
+ )
+! !
+
+!stx_goodies_metacello_stx class methodsFor:'description - contents'!
+
+classNamesAndAttributes
+ "lists the classes which are to be included in the project.
+ Each entry in the list may be: a single class-name (symbol),
+ or an array-literal consisting of class name and attributes.
+ Attributes are: #autoload or #<os> where os is one of win32, unix,..."
+
+ ^ #(
+ "<className> or (<className> attributes...) in load order"
+ MetacelloStXPlatform
+ MetacelloStXProject
+ #'stx_goodies_metacello_stx'
+ MetacelloStXPackageSpec
+ MetacelloStXVersionConstructor
+ MetacelloStXVersionSpec
+ MetacelloStXRepositoriesSpec
+ MetacelloStXRepositorySpec
+ MetacelloStXVersion
+ )
+!
+
+extensionMethodNames
+ "lists the extension methods which are to be included in the project.
+ Entries are 2-element array literals, consisting of class-name and selector."
+
+ ^ #(
+ Block setRepository:withInMetacelloConfig:
+ Block setTypeInMetacelloConfig:
+ Block setUrlInMetacelloConfig:
+ String setTypeInMetacelloConfig:
+ String setTypeInMetacelloStXRepository:
+ String setUrlInMetacelloConfig:
+ String setUrlInMetacelloStXRepository:
+ )
+! !
+
+!stx_goodies_metacello_stx class methodsFor:'description - project information'!
+
+applicationIconFileName
+ "Return the name (without suffix) of an icon-file (the app's icon); will be included in the rc-resource file"
+
+ ^ nil
+ "/ ^ self applicationName
+!
+
+companyName
+ "Return a companyname which will appear in <lib>.rc"
+
+ ^ 'Dale Henrichs & Jan Vrany'
+
+ "Modified: / 10-09-2012 / 22:14:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+description
+ "Return a description string which will appear in vc.def / bc.def"
+
+ ^ 'Metacello -- a Smalltalk project configuration management tool'
+
+ "Modified: / 10-09-2012 / 22:15:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+legalCopyright
+ "Return a copyright string which will appear in <lib>.rc"
+
+ ^ 'Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)'
+
+ "Modified: / 10-09-2012 / 22:16:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+productInstallDirBaseName
+ "Returns a default installDir which will appear in <app>.nsi.
+ This is usually not the one you want to keep"
+
+ ^ (self package asCollectionOfSubstringsSeparatedByAny:':/') last
+!
+
+productName
+ "Return a product name which will appear in <lib>.rc"
+
+ ^ 'Metacello'
+
+ "Modified: / 10-09-2012 / 22:16:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_metacello_stx class methodsFor:'description - svn'!
+
+svnRepositoryUrlString
+ "Return a SVN repository URL of myself.
+ (Generated since 2011-04-08)
+ Do not make the string shorter!!!!!! We have to use fixed-length keyword!!!!!!
+ "
+
+ ^ '$URL:: $'
+!
+
+svnRevisionNr
+ "Return a SVN revision number of myself.
+ This number is updated after a commit"
+
+ ^ "$SVN-Revision:"'22 '"$"
+! !
+
+!stx_goodies_metacello_stx class methodsFor:'documentation'!
+
+version_HG
+
+ ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx/vcmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,20 @@
+@REM -------
+@REM make using Microsoft Visual C compiler
+@REM type vcmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+
+@if not defined VSINSTALLDIR (
+ pushd ..\..\..\rules
+ call vcsetup.bat
+ popd
+)
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak -DUSEVC=1 %DEFINES% %*
+
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/stx_goodies_metacello.st Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,135 @@
+"{ Package: 'stx:goodies/metacello' }"
+
+LibraryDefinition subclass:#stx_goodies_metacello
+ instanceVariableNames:''
+ classVariableNames:''
+ poolDictionaries:''
+ category:'* Projects & Packages *'
+!
+
+
+!stx_goodies_metacello class methodsFor:'description'!
+
+excludedFromPreRequisites
+ "list all packages which should be ignored in the automatic
+ preRequisites scan. See #preRequisites for more."
+
+ ^ #(
+ )
+!
+
+preRequisites
+ "list all required packages.
+ This list can be maintained manually or (better) generated and
+ updated by scanning the superclass hierarchies and looking for
+ global variable accesses. (the browser has a menu function for that)
+ Howevery, often too much is found, and you may want to explicitely
+ exclude individual packages in the #excludedFromPrerequisites method."
+
+ ^ #(
+ #'stx:goodies/metacello/base'
+ #'stx:goodies/metacello/core'
+ #'stx:goodies/metacello/stx'
+ #'stx:libbasic' "ProjectDefinition - superclass of stx_goodies_metacello "
+ )
+! !
+
+!stx_goodies_metacello class methodsFor:'description - contents'!
+
+classNamesAndAttributes
+ "lists the classes which are to be included in the project.
+ Each entry in the list may be: a single class-name (symbol),
+ or an array-literal consisting of class name and attributes.
+ Attributes are: #autoload or #<os> where os is one of win32, unix,..."
+
+ ^ #(
+ "<className> or (<className> attributes...) in load order"
+ #'stx_goodies_metacello'
+ )
+!
+
+extensionMethodNames
+ "lists the extension methods which are to be included in the project.
+ Entries are 2-element array literals, consisting of class-name and selector."
+
+ ^ #(
+ )
+! !
+
+!stx_goodies_metacello class methodsFor:'description - project information'!
+
+applicationIconFileName
+ "Return the name (without suffix) of an icon-file (the app's icon); will be included in the rc-resource file"
+
+ ^ nil
+ "/ ^ self applicationName
+!
+
+companyName
+ "Return a companyname which will appear in <lib>.rc"
+
+ ^ 'Dale Henrichs & Jan Vrany'
+
+ "Modified: / 10-09-2012 / 22:14:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+description
+ "Return a description string which will appear in vc.def / bc.def"
+
+ ^ 'Metacello -- a Smalltalk project configuration management tool'
+
+ "Modified: / 10-09-2012 / 22:15:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+legalCopyright
+ "Return a copyright string which will appear in <lib>.rc"
+
+ ^ 'Copyright Dale Henrichs 2008-2012\nCopyright Jan Vrany 2012 (port & Smalltalk/X specific code)'
+
+ "Modified: / 10-09-2012 / 22:16:31 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+productInstallDirBaseName
+ "Returns a default installDir which will appear in <app>.nsi.
+ This is usually not the one you want to keep"
+
+ ^ (self package asCollectionOfSubstringsSeparatedByAny:':/') last
+!
+
+productName
+ "Return a product name which will appear in <lib>.rc"
+
+ ^ 'Metacello'
+
+ "Modified: / 10-09-2012 / 22:16:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!stx_goodies_metacello class methodsFor:'description - svn'!
+
+svnRepositoryUrlString
+ "Return a SVN repository URL of myself.
+ (Generated since 2011-04-08)
+ Do not make the string shorter!!!!!! We have to use fixed-length keyword!!!!!!
+ "
+
+ ^ '$URL:: $'
+!
+
+svnRevisionNr
+ "Return a SVN revision number of myself.
+ This number is updated after a commit"
+
+ ^ "$SVN-Revision:"'6 '"$"
+! !
+
+!stx_goodies_metacello class methodsFor:'documentation'!
+
+version_HG
+
+ ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+ ^ '$Id:: $'
+! !
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/stx/goodies/metacello/vcmake.bat Thu Aug 21 09:19:39 2014 +0100
@@ -0,0 +1,20 @@
+@REM -------
+@REM make using Microsoft Visual C compiler
+@REM type vcmake, and wait...
+@REM do not edit - automatically generated from ProjectDefinition
+@REM -------
+
+@if not defined VSINSTALLDIR (
+ pushd ..\..\rules
+ call vcsetup.bat
+ popd
+)
+@SET DEFINES=
+@REM Kludge got Mercurial, cannot be implemented in Borland make
+@FOR /F "tokens=*" %%i in ('hg root') do SET HGROOT=%%i
+@IF "%HGROOT%" NEQ "" SET DEFINES=%DEFINES% "-DHGROOT=%HGROOT%"
+make.exe -N -f bc.mak -DUSEVC=1 %DEFINES% %*
+
+
+
+