*** empty log message ***
authorfm
Wed, 23 Sep 2009 18:53:30 +0200
changeset 102 61343482b6c7
parent 101 e2b07b2791a3
child 103 a06c88b0d5bb
*** empty log message ***
extensions.st
--- a/extensions.st	Wed Sep 23 18:53:27 2009 +0200
+++ b/extensions.st	Wed Sep 23 18:53:30 2009 +0200
@@ -0,0 +1,1710 @@
+"{ Package: 'cvut:stx/goodies/libsvn' }"
+!
+
+!ApplicationDefinition class methodsFor:'file templates'!
+
+make_dot_proto
+
+^ 
+'# $','Header','$
+#
+# -------------- no need to change anything below ----------
+#
+# This makefile generates some standalone demo applications
+#
+#    make
+#       generates %(APPLICATION)
+#
+
+TOP=%(TOP)
+INCLUDE_TOP=$(TOP)/..
+
+PACKAGE=%(APPLICATION_PACKAGE)
+SUBDIRS=
+SUPPRESS_LOCAL_ABBREVS="yes"
+NOAUTOLOAD=1
+NOSUBAUTOLOAD=1
+
+LOCALINCLUDES=-I$(INCLUDE_TOP)/stx/libbasic %(LOCAL_INCLUDES)
+LOCALDEFINES=%(LOCAL_DEFINES)
+GLOBALDEFINES=%(GLOBAL_DEFINES)
+MAIN_DEFINES=%(MAIN_DEFINES)
+
+RCSSOURCES=Make.proto *.st
+LINKSOURCES=Make.proto *.st
+
+DELIVERBINARIES=
+
+target: %(BUILD_TARGET) 
+
+all::   prereq exe
+
+exe:    %(APPLICATION) $(REQUIRED_SUPPORT_DIRS)
+
+LIBNAME=%(LIBRARY_NAME)
+STCLOCALOPT=''-package=$(PACKAGE)'' -I. -H. $(LOCALINCLUDES) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) %(HEADEROUTPUTARG) %(COMMONSYMFLAG) -varPrefix=$(LIBNAME)
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C-libraries that should be pre-linked with the class-objects
+LD_OBJ_LIBS=%(ADDITIONAL_LINK_LIBRARIES)
+LOCAL_SHARED_LIBS=%(ADDITIONAL_SHARED_LINK_LIBRARIES)
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C targets or libraries should be added below
+LOCAL_EXTRA_TARGETS=
+
+OBJS= $(COMMON_OBJS) $(UNIX_OBJS)
+
+%(ADDITIONAL_DEFINITIONS)
+
+%(ADDITIONAL_DEFINITIONS_SVN)
+
+LIBLIST = $(REQUIRED_LIBS)
+
+# required libs:
+#
+
+REQUIRED_LIBS=%(REQUIRED_LIBS)
+
+REQUIRED_LIBOBJS=%(REQUIRED_LIBOBJS)
+
+REQUIRED_LINK_LIBOBJS=%(REQUIRED_LINK_LIBOBJS)
+
+REQUIRED_SUPPORT_DIRS=%(REQUIRED_SUPPORT_DIRS)
+
+
+%(APPLICATION):   %(STARTUP_CLASSFILENAME).$(O) $(APP_DIRS_TO_MAKE) $(APP_LIBOBJS) $(OBJS)
+        $(MAKE) %(APPLICATION_TYPE) \
+                    TARGET=%(APPLICATION) \
+                    APPLICATION_CLASSES="%(STARTUP_CLASSFILENAME)" \
+                    APPLICATION_OBJS="$(OBJS)" \
+                    APPLICATION_LIBLIST="$(REQUIRED_LIBS)" \
+                    APPLICATION_LIBOBJS="$(REQUIRED_LIBOBJS)" \
+                    APPLICATION_LINK_LIBOBJS="$(REQUIRED_LINK_LIBOBJS)" \
+                    STARTUP_CLASS="%(STARTUP_CLASS)" \
+                    STARTUP_SELECTOR="%(STARTUP_SELECTOR)" \
+                    MAIN_DEFINES="%(MAIN_DEFINES)"
+
+# build all prerequisite packages for this package
+prereq:
+%(MAKE_PREREQUISITES)
+
+SOURCEFILES: %(APPLICATION)_SOURCES \
+        stx_SOURCES
+
+%(SOURCE_RULES)
+%(STX_SOURCE_RULES)
+
+RESOURCEFILES: %(APPLICATION)_RESOURCES %(APPLICATION)_BITMAPS %(ADDITIONAL_RESOURCE_TARGETS) \
+        stx_RESOURCES stx_STYLES stx_BITMAPS
+
+%(RESOURCE_RULES)
+%(STX_RESOURCE_RULES)
+
+%(PREREQUISITES_LIBS)      
+%(SUBPROJECTS_LIBS)
+
+%(ADDITIONAL_RULES)
+
+%(ADDITIONAL_RULES_SVN)
+
+clean::
+        -rm -f *.so %(APPLICATION).$(O)
+
+clobber:: clean
+        -rm -f %(APPLICATION) *.img *.sav
+
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+%(DEPENDENCIES)
+# ENDMAKEDEPEND --- do not remove this line
+'
+
+    "Modified: / 09-08-2006 / 16:50:23 / fm"
+    "Created: / 29-09-2006 / 23:47:07 / cg"
+    "Modified: / 24-06-2009 / 21:40:26 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Change methodsFor:'queries'!
+
+isForGeneratedSubject
+    "
+    Answers true iff subject of this method is somewhat
+    auto-generated by some tool - just like version methods
+    are.
+    "
+
+    ^ false
+
+    "Created: / 08-04-2009 / 09:45:26 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 17-08-2009 / 18:55:20 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Change methodsFor:'queries'!
+
+isMethodPackageChange
+    ^ false
+
+    "Created: / 08-04-2009 / 09:00:21 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ChangeSet methodsFor:'queries'!
+
+changesForPackage:aPackageSymbol
+
+    "
+        ChangeSet current changesForPackage:#'stx:goodies/libsvn'.
+
+    "
+
+    ^(self select:[:aChange | 
+        |removeThis mClass mthd|
+
+        removeThis := false.
+        (aChange isMethodChange or:[aChange isMethodRemoveChange]) ifTrue:[
+            mClass := aChange changeClass.
+            mClass notNil ifTrue:[
+                mthd := mClass compiledMethodAt:(aChange selector).
+                mthd isNil ifTrue:[
+                    aChange isMethodRemoveChange ifTrue:[
+                        removeThis := (mClass package = aPackageSymbol)
+                    ].
+                ] ifFalse:[
+                    removeThis := (mthd package = aPackageSymbol)
+                ]
+            ].
+        ] ifFalse:[
+            (aChange isClassChange) ifTrue:[
+                (aChange changeClass notNil) ifTrue:[
+                    removeThis := (aChange changeClass package = aPackageSymbol)     
+                ].
+            ].
+        ].
+        removeThis
+    ])
+
+    "Created: / 05-11-2001 / 14:21:17 / cg"
+    "Modified: / 12-10-2006 / 16:51:27 / cg"
+    "Modified: / 22-10-2008 / 13:25:02 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ChangeSet methodsFor:'utilities'!
+
+condenseChanges
+
+    | changesToRemove changesToKeep |
+    changesToKeep := self class new.
+    changesToRemove := self class new.
+    self reverseDo:
+        [:change|
+        (changesToKeep anySatisfy:[:each|each isForSameAs: change])
+            ifTrue:[changesToRemove add: change]
+            ifFalse:[changesToKeep add: change]
+        ].
+    self condenseChanges: changesToRemove.
+
+    "Created: / 22-10-2008 / 13:05:13 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ChangeSet methodsFor:'utilities'!
+
+condenseChangesForPackage2:aPackageSymbol
+    "remove more changes for aPackageSymbol
+     This is invoked when a project is checked into the repository."
+
+    |changesToRemove|
+
+    changesToRemove := self select:[:aChange | 
+        |removeThis mClass mthd|
+
+        removeThis := false.
+        (aChange isMethodChange or:[aChange isMethodRemoveChange]) ifTrue:[
+            mClass := aChange changeClass.
+            mClass notNil ifTrue:[
+                mthd := mClass compiledMethodAt:(aChange selector).
+                mthd isNil ifTrue:[
+                    removeThis := (mClass package = aPackageSymbol)
+                ] ifFalse:[
+                    removeThis := (mthd package = aPackageSymbol)
+                ]
+            ].
+        ] ifFalse:[
+            (aChange isClassChange) ifTrue:[
+                (aChange changeClass notNil) ifTrue:[
+                    removeThis := (aChange changeClass package = aPackageSymbol)     
+                ].
+            ].
+        ].
+        removeThis
+    ].
+
+    self condenseChanges:changesToRemove
+
+    "Modified: / 12-10-2006 / 16:51:27 / cg"
+    "Created: / 09-08-2009 / 14:29:17 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ChangeSet methodsFor:'utilities'!
+
+diffSetsAgainstImage
+
+    |imageChangeSet|
+
+    imageChangeSet := self class new.
+    self changedClasses do:
+        [:class|
+        (class isMetaclass or:[class isPrivate]) ifFalse:
+            [imageChangeSet addAll:
+                (self class fromStream: class source asString readStream)]].
+    ^self diffSetsAgainst: imageChangeSet
+
+    "Created: / 04-12-2007 / 16:03:28 / janfrog"
+! !
+
+!ChangeSet class methodsFor:'instance creation'!
+
+forPackage: package
+
+    ^self forPackage: package ignoreAutoloaded: false.
+
+    "Created: / 20-05-2008 / 17:56:18 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 12-08-2009 / 14:23:15 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ChangeSet class methodsFor:'instance creation'!
+
+forPackage: package ignoreAutoloaded: ignoreAutoloaded
+    "build a changeSet for a given package"
+
+    |changeSet packageClasses packageExtensions|
+
+    packageClasses := ProjectDefinition searchForClassesWithProject: package.
+    packageExtensions := ProjectDefinition searchForExtensionsWithProject: package.
+    changeSet := self forExistingMethods: packageExtensions.
+    packageClasses do:
+        [:cls|
+        (ignoreAutoloaded not and:[cls isLoaded not])
+            ifTrue:[cls autoload].
+        cls isLoaded 
+            ifTrue:
+                [changeSet addAll:
+                    (self 
+                        forExistingClass:cls 
+                        withExtensions:false 
+                        extensionsOnly:false)]].
+    ^changeSet
+
+    "Created: / 12-08-2009 / 14:22:44 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Class methodsFor:'accessing'!
+
+classFilename
+    "return the name of the file from which the class was compiled.
+     If the class was loaded via an explicit load (i.e. from the fileBrowser),
+     this will be an absolute path. Oherwise, it will be a basename only.
+     See classBaseFilename for a method which always returns the basename."
+
+    |owner info fn|
+
+    (SVN::CompatModeQuery notNil and:[SVN::CompatModeQuery query not])
+        ifTrue:[^SVN::Repository containerNameForClass: self].
+
+    (owner := self owningClass) notNil ifTrue:[^ owner classFilename].
+    classFilename notNil 
+        ifTrue:[ ^ classFilename ].
+
+    (info := self revisionInfo) notNil ifTrue:[
+        fn := info fileName.
+        fn notNil ifTrue:[
+            ^ fn
+        ].
+    ].
+    ^ (Smalltalk fileNameForClass:self), '.st'
+
+    "
+     SVN::Repository classFilename
+    "
+
+    "Modified: / 22-10-2008 / 20:58:21 / cg"
+    "Modified: / 13-08-2009 / 16:07:07 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Class methodsFor:'fileOut'!
+
+fileOutAsMethodIn: class selector: selector
+
+    ^self fileOutAsMethodIn: class selector: selector category: 'sources'
+
+    "Created: / 08-04-2009 / 20:58:06 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Class methodsFor:'accessing'!
+
+svnRepository
+
+    ^SVN::RepositoryManager repositoryForPackage: self package
+
+    "Created: / 19-04-2008 / 18:24:54 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ClassChange methodsFor:'queries'!
+
+isForMeta
+    ^ (self className endsWith:' class')
+! !
+
+!ClassChange methodsFor:'accessing'!
+
+nonMetaClassName
+    ^ self isForMeta 
+        ifTrue:[ self className copyTo:(self className size - 6) ]
+        ifFalse:[ self className ]
+
+    "Created: / 06-11-2008 / 17:26:03 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Filename methodsFor:'reading-directories'!
+
+directoryContentsAsFilenamesMatching: patternOrCollectionOfThose
+
+    "
+        Same as directoryContentsAsFilenames, but returns only files
+        that matches given patterns. This uses String>>matches:
+        for pattern matching    
+    "
+
+    |names|
+
+    names := self directoryContentsMatching: patternOrCollectionOfThose .
+    names isNil ifTrue:[^ nil].
+    ^ names asOrderedCollection collect:[:entry | self construct:entry].
+
+    "
+    '/etc' asFilename 
+        directoryContentsAsFilenamesMatching: 'pass*'
+
+    '/etc' asFilename 
+            directoryContentsAsFilenamesMatching: #('pass*' 'nsswitch.conf')
+    "
+
+    "Created: / 03-06-2009 / 09:57:45 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Filename methodsFor:'reading-directories'!
+
+directoryContentsMatching: patternOrCollectionOfThose
+
+    "
+        Same as directoryContants, but returns only files
+        that matches given patterns. This uses String>>matches:
+        for pattern matching
+    "
+
+    | names patterns |
+    patterns := patternOrCollectionOfThose isString
+                    ifTrue: [Array with: patternOrCollectionOfThose]
+                    ifFalse:[patternOrCollectionOfThose].
+    names := self directoryContents.
+    names ifNil:[^nil].
+    ^names select:
+        [:e|patterns anySatisfy:[:pattern|e matches: pattern]]
+
+    "
+     '/etc' asFilename 
+        directoryContentsMatching: 'pass*'
+
+    '/etc' asFilename 
+        directoryContentsMatching: #('pass*' 'nsswitch.conf')
+
+    '/etc' asFilename 
+        directoryContentsMatching: #('does-not-exists.txt')
+
+    "
+
+    "Created: / 03-06-2009 / 09:52:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!LibraryDefinition class methodsFor:'file templates'!
+
+make_dot_proto
+
+^ 
+'# $','Header','$
+#
+# DO NOT EDIT 
+# automagically generated from the projectDefinition: ',self name,'.
+#
+# 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=%(TOP)
+INCLUDE_TOP=$(TOP)/..
+
+# subdirectories where targets are to be made:
+SUBDIRS=%(SUBDIRECTORIES)
+
+
+# subdirectories where Makefiles are to be made:
+# (only define if different from SUBDIRS)
+# ALLSUBDIRS=
+
+REQUIRED_SUPPORT_DIRS=%(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=%(LOCAL_INCLUDES)
+
+
+# if you need any additional defines for embedded C code, 
+# add them here:, 
+# ********** OPTIONAL: MODIFY the next lines ***
+# LOCALDEFINES=-Dfoo -Dbar -DDEBUG
+LOCALDEFINES=%(LOCAL_DEFINES)
+
+LIBNAME=%(LIBRARY_NAME)
+STCLOCALOPT=''-package=$(PACKAGE)'' -I. $(LOCALINCLUDES) $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES) %(HEADEROUTPUTARG) %(COMMONSYMFLAG) -varPrefix=$(LIBNAME)
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C-libraries that should be pre-linked with the class-objects
+LD_OBJ_LIBS=%(ADDITIONAL_LINK_LIBRARIES)
+LOCAL_SHARED_LIBS=%(ADDITIONAL_SHARED_LINK_LIBRARIES)
+
+
+# ********** OPTIONAL: MODIFY the next line ***
+# additional C targets or libraries should be added below
+LOCAL_EXTRA_TARGETS=
+
+OBJS= $(COMMON_OBJS) $(UNIX_OBJS)
+
+%(ADDITIONAL_DEFINITIONS)
+
+all:: preMake %(PRIMARY_TARGET) postMake
+
+pre_objs:: %(ADDITIONAL_TARGETS) %(ADDITIONAL_TARGETS_SVN)
+
+%(ADDITIONAL_RULES)
+
+%(ADDITIONAL_RULES_SVN)
+
+# 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
+
+prereq: $(REQUIRED_SUPPORT_DIRS)
+%(MAKE_PREREQUISITES)
+
+cleanjunk::
+
+clean::
+%(TAB)-rm -f *.o *.H
+
+clobber:: clean
+%(TAB)-rm -f *.so *.dll
+
+',
+"
+$(INSTALLBASE)::
+%(TAB)@test -d $@ || mkdir $@
+
+$(INSTALLBASE)/packages:: $(INSTALLBASE)
+%(TAB)@test -d $@ || mkdir $@
+
+$(INSTALLBASE)/packages/$(MODULE):: $(INSTALLBASE)/packages
+%(TAB)@test -d $@ || mkdir $@
+
+$(INSTALLBASE)/packages/$(MODULE)/dapasx:: $(INSTALLBASE)/packages/$(MODULE)
+%(TAB)@test -d $@ || mkdir $@
+
+$(INSTALLBASE)/packages/$(MODULE)/dapasx/interactiver_editor:: $(INSTALLBASE)/packages/$(MODULE)/dapasx
+%(TAB)@test -d $@ || mkdir $@
+
+$(INSTALLBASE)/packages/$(MODULE)/$(MODULE_DIR):: $(INSTALLBASE)/packages/$(MODULE)
+%(TAB)@test -d $@ || mkdir $@
+"
+'
+# BEGINMAKEDEPEND --- do not remove this line; make depend needs it
+%(DEPENDENCIES)
+# ENDMAKEDEPEND --- do not remove this line
+
+'
+
+    "Created: / 08-08-2006 / 20:45:36 / fm"
+    "Modified: / 09-08-2006 / 16:50:23 / fm"
+    "Modified: / 14-09-2006 / 15:48:02 / cg"
+    "Modified: / 24-06-2009 / 21:39:29 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Method methodsFor:'accessing'!
+
+makeSourceFileAbsolute
+
+    "
+        Makes a source file reference absolute.
+        This is required by SVN, because svn working copy
+        is in package path, so it's existence may corrupt source
+        files.
+    "
+
+    | fileStream |
+    
+    "check whether my source is in external file. If not, this is noop"
+    sourcePosition ifNil:[^nil].
+    "already absolute"
+    source asFilename isAbsolute ifTrue:[^self].
+    fileStream := self rawSourceStream.
+    fileStream isFileStream ifTrue:
+        [source := fileStream fileName asAbsoluteFilename pathName].
+
+    "
+        (Method compiledMethodAt:#mclass:)
+            makeSourceFileAbsolute
+    "
+
+    "Created: / 21-08-2009 / 17:24:08 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!MethodChange methodsFor:'queries'!
+
+isForGeneratedSubject
+    "
+    Answers true iff subject of this method is somewhat
+    auto-generated by some tool - just like version methods
+    are.
+    "
+
+    ^self isForMeta and: [self selector = #version]
+
+    "Created: / 17-08-2009 / 18:56:59 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!MethodChange methodsFor:'printing & storing'!
+
+printOn:aStream
+    "append a user printed representation of the receiver to aStream.
+     The format is suitable for a human - not meant to be read back."
+
+    aStream 
+        nextPutAll:(self className ? 'unnamed'); 
+        nextPutAll:'>>'; 
+        nextPutAll:(selector ? '?'); 
+        nextPutAll:' {'; 
+        nextPutAll:(methodCategory ? '?'); 
+        nextPutAll:'}'
+
+    "Modified: / 04-10-2006 / 16:46:01 / cg"
+    "Modified: / 07-11-2008 / 08:29:03 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!NewLauncher methodsFor:'change & update'!
+
+infoLineTemplate
+    "available values:
+        PACKAGE         - the current packageID
+        PACKAGEOREMPTY  - the current packageID or empty if its __NoPackage__
+        IMAGE           - the current snapshot image
+        CVS             - the CVS source repository or empty
+        DB              - the Store source repository DB or empty
+        SVN_WORKING_COPY- the SVN working copy dir or empty
+        NOREPOSITORY    - the tring 'No Repository' empty
+        NS              - the default namespace, or empty (if Smalltalk)
+        PROJECTDIR      - the default fileOut directory or empty (if current)
+    "
+
+    ^ '%(PACKAGEOREMPTY)%(IMAGE)  %(CVS)%(DB)%(SVN_WORKING_COPY)'
+    "/ ^ '%(PACKAGEOREMPTY)%(IMAGE)%(CVS)%(DB)%(NOREPOSITORY)%(NS)'
+    "/ ^ '%(PACKAGE)%(IMAGE)%(CVS)%(DB)%(NOREPOSITORY)%(NS)%(PROJECTDIR)'
+
+    "Modified: / 30-09-2008 / 12:45:49 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!NewLauncher methodsFor:'change & update'!
+
+updateInfo
+    "update the infoView from the current project"
+
+    |project projectName projectDir packageName packageNameOrNil defNameSpace projectInfo
+     cvsRepository storeDB image bindings|
+
+    (Project notNil and:[(project := Project current) notNil]) ifTrue:[
+        projectName := project name.
+        projectDir := project directory.
+        packageName := packageNameOrNil := project package.
+        defNameSpace := project defaultNameSpace.
+        packageNameOrNil = Project noProjectID ifTrue:[
+            packageNameOrNil := nil
+        ].
+    ].
+    defNameSpace isNil ifTrue:[
+        defNameSpace := Smalltalk.
+    ].
+    image := ((ObjectMemory imageName ? 'none') asFilename baseName).
+
+    SourceCodeManager notNil ifTrue:[
+        SourceCodeManager isCVS ifTrue:[                
+            cvsRepository := SourceCodeManager repositoryName.
+            (cvsRepository notNil and:[cvsRepository startsWith:':pserver:']) ifTrue:[
+                cvsRepository := cvsRepository copyFrom:':pserver:'size+1.
+            ].
+        ] ifFalse:[
+            SourceCodeManager isStore ifTrue:[
+                storeDB := SourceCodeManager hostAndDBName
+            ]
+        ]
+    ].
+
+    bindings := Dictionary new.
+    packageName isNil ifTrue:[
+        bindings
+            at:'PACKAGE'
+            put:''.
+    ] ifFalse:[
+        bindings
+            at:'PACKAGE'
+            put:((resources string:'Pkg') allBold,':'
+                 ,(packageName asText colorizeAllWith:(Color blue darkened)),' ').
+    ].
+    packageNameOrNil isNil ifTrue:[
+        bindings
+            at:'PACKAGEOREMPTY'
+            put:''.
+    ] ifFalse:[
+        bindings
+            at:'PACKAGEOREMPTY'
+            put:((resources string:'Pkg') allBold,':'
+                 ,(packageNameOrNil asText colorizeAllWith:(Color blue darkened)),' ').
+    ].
+
+    bindings
+        at:'IMAGE'
+        put:((resources string:'Img') allBold,':'
+             ,(image asText colorizeAllWith:(Color blue darkened)),' ').
+
+    cvsRepository isNil ifTrue:[
+        bindings
+            at:'CVS'
+            put:''
+    ] ifFalse:[
+        bindings
+            at:'CVS'
+            put:((resources string:'CVS') allBold,':'
+                 ,(cvsRepository asText colorizeAllWith:(Color blue darkened)),' ').
+    ].
+    storeDB isNil ifTrue:[
+        bindings
+            at:'DB'
+            put:''.
+    ] ifFalse:[
+        bindings
+            at:'DB'
+            put:((resources string:'DB') allBold,':'
+                 ,(storeDB asText colorizeAllWith:(Color blue darkened)),' ').
+    ].
+    (cvsRepository isNil and:[storeDB isNil]) ifTrue:[
+        bindings
+            at:'NOREPOSITORY'
+            put:' >','No Repository'allBold,'< '.
+    ] ifFalse:[
+        bindings
+            at:'NOREPOSITORY'
+            put:''.
+    ].
+
+    bindings
+        at:'NS'
+        put:( defNameSpace == Smalltalk ifTrue:'' ifFalse:[ '"',defNameSpace name,'" '] ).
+
+    bindings
+        at:'PROJECTDIR'
+        put:((resources string:'Dir') allBold,':'
+             , (projectDir contractTo: 30)),' '.
+
+    SVN::RepositoryManager enabled 
+        ifTrue:
+            [bindings
+                at:  'SVN_WORKING_COPY'
+                put: ('Working copy' allBold, ': ',
+                        (SVN::RepositoryManager current workingCopyBase asFilename baseName asString colorizeAllWith:(Color blue darkened)))]
+        ifFalse:
+            [bindings
+                at:  'SVN_WORKING_COPY'
+                put: ''].
+
+
+    projectInfo := self infoLineTemplate bindWithArguments:bindings.
+    self infoLabelHolder value:projectInfo.
+    ^projectInfo.
+
+    "Modified: / 30-09-2008 / 12:46:01 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProjectDefinition class methodsFor:'description - compilation'!
+
+additionalRulesSvn_make_dot_proto
+
+    (self class includesSelector: #svnRevisionNr) ifFalse:[^''].
+
+    ^ String streamContents:
+        [:s|s 
+        nextPutLine:'update-svn-revision:';
+        tab; nextPutLine: 'sed -i -e "s/\"\$$SVN\-Revision:\".*\"\$$\"/\"\$$SVN-Revision:\"''$(shell svnversion -n)''\"\$$\"/g" \';
+        tab; tab; nextPutLine: (self name , '.st');
+        nextPutLine: '.PHONY: update-svn-revision']
+
+    "Created: / 24-06-2009 / 21:33:32 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProjectDefinition class methodsFor:'description - compilation'!
+
+additionalTargetsSvn_make_dot_proto
+
+    (self class includesSelector: #svnRevisionNr) ifFalse:[^''].
+
+    ^ 'update-svn-revision'
+
+    "Created: / 24-06-2009 / 21:35:15 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProjectDefinition class methodsFor:'private loading'!
+
+loadAllClassesAsAutoloaded:asAutoloaded
+    "load (fileIn) classes that should be present -
+     install as autoloaded classes marked to be autoloaded.
+     If asAutoloaded == true, all classes will be installed as autoloaded, even if not marked.
+
+     Answer true, if classes have been loaded"
+
+    |classNamesToLoad classNamesToAutoload hasClassesToLoad loadedClasses platformName
+     classesWhichFailedToLoad|
+
+    platformName := OperatingSystem platformName.
+    classNamesToLoad := OrderedCollection new.
+    classNamesToAutoload := OrderedCollection new.
+
+    self classNamesAndAttributesDo:[:eachClassname :eachAttributes | |eachClassnameSym isAutoload cls|
+        eachClassnameSym := eachClassname asSymbol.
+        isAutoload := asAutoloaded or:[eachAttributes includes:#autoload].
+
+        "no need to (re-)load an existing class, but install if should be loaded"
+        cls := Smalltalk loadedClassNamed:eachClassnameSym.
+        (cls isNil or:[cls isLoaded not and:[isAutoload not]]) ifTrue:[
+            (eachAttributes isEmpty 
+             or:[(eachAttributes size == 1 and:[isAutoload])
+             or:[eachAttributes includes:platformName]]) ifTrue:[
+                hasClassesToLoad := true.
+                isAutoload ifTrue:[
+                    classNamesToAutoload add:eachClassnameSym.
+                ] ifFalse:[
+                    classNamesToLoad add:eachClassnameSym.
+                ].
+            ].
+        ].
+    ].
+
+    hasClassesToLoad ifTrue:[
+        loadedClasses := OrderedCollection new.
+
+        "we need the abbreviations, since sometimes there is no 1-to-1 mapping
+         of class name to file name"
+
+        Smalltalk recursiveReadAllAbbreviationsFrom:self packageDirectory maxLevels:1.
+
+        "install autoloaded classes first,
+         some others may depend on them"
+
+        classNamesToAutoload withIndexDo:[:eachClassName :index|
+            ActivityNotification
+                raiseRequestWith: ((100 / classNamesToAutoload size ) * index) rounded
+                errorString: 'Autoloading class ', eachClassName.
+
+            Smalltalk
+                installAutoloadedClassNamed:eachClassName 
+                category:#autoloaded    "FIXME"
+                package:self package 
+                revision:nil 
+                numClassInstVars:0.     "FIXME"
+        ].
+
+        classesWhichFailedToLoad := OrderedCollection new.
+        classNamesToLoad withIndexDo:[:eachClassName :index| 
+            |cls|
+            ActivityNotification
+                raiseRequestWith: ((100 / classNamesToLoad size) * index) rounded
+                errorString: 'Loading class ', eachClassName.
+
+            Error handle:[:ex |
+                "maybe, fileIn failed, because the load order is wrong.
+                 Work around this by installing the class as autoloaded and
+                 loading it"
+
+                classesWhichFailedToLoad add:eachClassName.
+                Smalltalk
+                    installAutoloadedClassNamed:eachClassName 
+                    category:#autoloaded    "FIXME"
+                    package:self package 
+                    revision:nil 
+                    numClassInstVars:0.     "FIXME"
+            ] do:[
+                cls := Smalltalk 
+                            fileInClass:eachClassName
+                            package:self package
+                            initialize:false
+                            lazy:false
+                            silent:true.
+                cls notNil ifTrue:[
+                    loadedClasses add:cls
+                ].
+            ].
+        ].
+
+        classesWhichFailedToLoad do:[:eachClassName |
+            (Smalltalk at:eachClassName) autoload.
+        ].
+
+        loadedClasses do:[:eachLoadedClass | 
+            "do not initialize, if initialize method is inherited"
+            (eachLoadedClass theMetaclass implements:#initialize) ifTrue:[
+                eachLoadedClass initialize
+            ].
+        ].
+        ^ true.
+    ].
+    ^ false.
+
+    "Created: / 17-08-2006 / 01:01:14 / cg"
+    "Modified: / 26-10-2006 / 12:30:01 / cg"
+    "Modified: / 16-08-2009 / 13:31:40 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 22-08-2009 / 12:00:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!ProjectDefinition class methodsFor:'loading'!
+
+loadAsAutoloaded:asAutoloaded    
+    "load the project.
+     If asAutoloaded == true, install all new classes as autoloaded.
+     Answer true, if new classes have been installed for this package, 
+     false if the package's classes have been already present."
+
+    |newStuffHasBeenLoaded|
+
+    self projectIsLoaded ifTrue:[^ false].
+    thisContext isRecursive ifTrue:[^ false].
+
+    newStuffHasBeenLoaded := false.
+
+    (self infoPrinting and:[Smalltalk silentLoading not]) ifTrue:[
+        "/ thisContext fullPrintAll.
+        Transcript show:'loading '.
+        asAutoloaded ifTrue:[
+            Transcript show:'as autoloaded '.
+        ].
+        Transcript showCR:self name.
+    ].
+
+
+    self activityNotification:'Executing pre-load action'.
+    self preLoadAction.
+    Class withoutUpdatingChangesDo:[
+        self activityNotification:'Loading prerequisities'.
+        self loadPreRequisitesAsAutoloaded:asAutoloaded.
+        asAutoloaded ifFalse:[
+            self loadClassLibrary.
+        ].
+
+        self activityNotification:'Loading extensions'.
+        newStuffHasBeenLoaded := newStuffHasBeenLoaded | self loadExtensions.
+        self activityNotification:'Loading classes'.
+        newStuffHasBeenLoaded := newStuffHasBeenLoaded | (self loadAllClassesAsAutoloaded:asAutoloaded).
+        self activityNotification:'Loading sub projects'.
+        self loadSubProjectsAsAutoloaded:asAutoloaded.
+    ].
+    self activityNotification:'Executing post-load action'.        
+    self postLoadAction.
+    self projectIsLoaded:true.
+
+    ^ newStuffHasBeenLoaded
+
+    "Created: / 17-08-2006 / 01:01:41 / cg"
+    "Modified: / 21-11-2006 / 15:07:09 / cg"
+    "Modified: / 30-10-2008 / 08:16:21 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 22-08-2009 / 12:02:14 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!ProjectDefinition class methodsFor:'mappings'!
+
+make_dot_proto_mappings
+    ^ Dictionary new
+        at: 'TAB' put: ( Character tab asString );
+        at: 'TOP' put: ( self pathToTop_unix );
+        at: 'LIBRARY_NAME' put: ( self libraryName );
+        at: 'SUBDIRECTORIES' put: (self generateSubDirectories);
+        at: 'LOCAL_INCLUDES' put: (self generateLocalIncludes_unix);
+        at: 'LOCAL_DEFINES' put: self localDefines_unix;
+        at: 'GLOBAL_DEFINES' put: self globalDefines_unix;
+        at: 'COMMONSYMFLAG' put: (self commonSymbolsFlag);
+        at: 'HEADEROUTPUTARG' put: (self headerFileOutputArg);
+        at: 'PRIMARY_TARGET' put: (self primaryTarget_make_dot_proto);
+        at: 'ADDITIONAL_DEFINITIONS' put: (self additionalDefinitions_make_dot_proto);
+        at: 'ADDITIONAL_RULES' put: (self additionalRules_make_dot_proto);
+        at: 'ADDITIONAL_RULES_SVN' put: (self additionalRulesSvn_make_dot_proto);
+        at: 'ADDITIONAL_TARGETS' put: (self additionalTargets_make_dot_proto);
+        at: 'ADDITIONAL_TARGETS_SVN' put: (self additionalTargetsSvn_make_dot_proto);
+        at: 'ADDITIONAL_LINK_LIBRARIES' put: (self additionalLinkLibraries_make_dot_proto);
+        at: 'ADDITIONAL_SHARED_LINK_LIBRARIES' put: (self additionalSharedLinkLibraries_make_dot_proto);
+        at: 'DEPENDENCIES' put: (self generateDependencies_unix);
+        at: 'MODULE' put: ( self module );  
+        at: 'MODULE_DIRECTORY' put: ( self moduleDirectory ); 
+        at: 'MODULE_PATH' put: ( self moduleDirectory );
+        at: 'MAKE_PREREQUISITES' put: (self generateRequiredMakePrerequisites_make_dot_proto);
+        yourself
+
+    "Created: / 09-08-2006 / 11:20:45 / fm"
+    "Modified: / 09-08-2006 / 16:44:48 / fm"
+    "Modified: / 14-09-2006 / 18:57:52 / cg"
+    "Modified: / 24-06-2009 / 21:50:13 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 22-08-2009 / 12:03:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!ProjectDefinition class methodsFor:'accessing'!
+
+packageDirectory
+
+    ^Smalltalk packageDirectoryForPackageId: self package
+
+    "Created: / 15-06-2009 / 12:01:18 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProjectDefinition class methodsFor:'accessing - svn'!
+
+svnRevision
+
+    "
+        Answers SVN revision of given package. The revision is computed
+        as follows:
+        1) Look at package directory if there is .svn administration
+           directory. If so, uses SVN to obtain SVN revision & return
+        2) If svnRevisionNr return non-nil, use that as SVN revision & return
+        3) If everything fails, compute maximum from all revision of all 
+           classes & extensions
+    "
+    | pkgDir revNr |
+    
+    "1)"        
+    pkgDir := self packageDirectory.
+    (pkgDir notNil and: [pkgDir exists and: [(pkgDir / '.svn') exists]]) ifTrue:
+        [[revNr := (SVN::InfoCommand new
+                    workingCopy: (SVN::WorkingCopy branch: (SVN::Branch new) path: pkgDir);
+                    execute) anyOne revision] 
+                        value
+                        "/on: Error do: [revNr := nil]
+                        ].
+    revNr ifNotNil:[^SVN::Revision number:revNr].
+    "2)"
+    "We have to explicitly check for existence of svnRevisionNr,
+     because we don't want to invoke inherited method"
+    (self class methodDictionary includesKey: #svnRevisionNr)
+        ifTrue:[revNr := self perform:#svnRevisionNr].
+    revNr ifNotNil:[^SVN::Revision number:(revNr asString select:[:e|e isDigit])].
+
+    "3)"
+    revNr := (self searchForClassesWithProject: self package)
+                inject: 0 
+                into:
+                    [:rev :cls|
+                    rev max: (cls revision ? '0') asNumber].
+    ^revNr ~= 0 
+        ifTrue: [SVN::Revision number:revNr]
+        ifFalse:[SVN::Revision head]
+
+    "
+        stx_libbasic svnRevision 
+        stx_goodies_libsvn svnRevision
+        stx_goodies_libsvn revision
+
+    "
+
+    "Created: / 15-06-2009 / 11:54:33 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 22-08-2009 / 09:06:29 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!ProjectDefinition class methodsFor:'code generation'!
+
+svnRevisionNr_code: revisionNrOrNil
+    ^ String streamContents:[:s |
+        s nextPutLine:'svnRevisionNr'.
+        s nextPutLine:'    "Return a SVN revision number of myself.'.
+        s nextPutLine:'     This number is updated after a commit"'.
+        s cr; 
+        nextPutLine:'    ^ "$SVN-Revision:"''', revisionNrOrNil printString , '''"$"'.
+    ].
+
+    "
+     self svnRevisionNr_code       
+     stx_libbasic3 svnRevisionNr_code 
+    "
+
+    "Created: / 16-06-2009 / 12:12:37 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 22-08-2009 / 09:05:05 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Smalltalk class methodsFor:'system management-files'!
+
+fileNameForClass:aClassOrClassName
+    "return a actual or expected (or most wanted) filename for aClassOrClassName."
+
+    |cls nonMetaclass nm nm1 nm2 compatQuery|
+
+
+    compatQuery := Smalltalk classNamed: 'SVN::CompatModeQuery'.        
+    (compatQuery notNil and:
+            [compatQuery isLoaded  and:[compatQuery query not]])
+        ifTrue:
+        [nm := aClassOrClassName isBehavior
+                    ifTrue:[aClassOrClassName name]
+                    ifFalse:[aClassOrClassName].
+        nm := nm copyReplaceAll:$: with:$_.
+        ^nm].
+
+    aClassOrClassName isBehavior ifTrue:[
+        nonMetaclass := aClassOrClassName theNonMetaclass.
+        nm := nonMetaclass getClassFilename.
+        nm notNil ifTrue:[^ nm asFilename withoutSuffix baseName].
+        nm1 := nonMetaclass name.
+        nm2 := nonMetaclass nameWithoutPrefix.
+    ] ifFalse:[
+        cls := Smalltalk classNamed:aClassOrClassName.
+        cls notNil ifTrue:[
+            nonMetaclass := cls theNonMetaclass.
+            nm := nonMetaclass getClassFilename.
+            nm notNil ifTrue:[^ nm asFilename withoutSuffix baseName].
+            nm1 := nonMetaclass name.
+            nm2 := nonMetaclass nameWithoutPrefix.
+        ] ifFalse:[
+            nm1 := aClassOrClassName.
+            nm2 := (aClassOrClassName copyFrom:(aClassOrClassName lastIndexOf:$:)+1).
+        ].
+    ].
+    nm1 := nm1 asSymbol.
+    nm2 := nm2 asSymbol.
+
+    CachedAbbreviations notNil ifTrue:[
+        (CachedAbbreviations includesKey:nm1) ifTrue:[
+            ^ (CachedAbbreviations at:nm1) asFilename baseName
+        ].
+        (CachedAbbreviations includesKey:nm2) ifTrue:[
+            ^ (CachedAbbreviations at:nm2) asFilename baseName
+        ].
+    ].
+    ^ nm1 copyReplaceAll:$: with:$_
+
+    "
+     Smalltalk fileNameForClass:#Complex
+     Smalltalk fileNameForClass:'SmallInteger'
+     Smalltalk fileNameForClass:'UnixOperatingSystem'
+     Smalltalk fileNameForClass:'Launcher'
+     Smalltalk fileNameForClass:'SomeUnknownClass'
+     Smalltalk fileNameForClass:OSI::FTAMOperation
+     Smalltalk fileNameForClass:'OSI::Foobar'
+     Smalltalk fileNameForClass:(Workflow::UnsuccessfulFinishReasons)
+     Workflow::UnsuccessfulFinishReasons classFilename
+    "
+
+    "Modified: / 06-10-2006 / 16:16:01 / cg"
+    "Modified: / 15-07-2009 / 20:18:17 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 22-08-2009 / 11:57:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!Smalltalk class methodsFor:'system management-packages'!
+
+loadPackageWithId:aPackageId asAutoloaded:doLoadAsAutoloaded
+    "make certain, that some particular package is loaded into the system.
+     Experimental."
+
+    |packageDir|
+
+    packageDir := self packageDirectoryForPackageId:aPackageId.
+    packageDir isNil ifTrue:[
+        (aPackageId includes:$:) ifFalse:[
+            "/ assume stx
+            packageDir := self packageDirectoryForPackageId:('stx:',aPackageId).
+        ].
+    ].
+    (packageDir isNil and: [SVN::RepositoryManager notNil]) ifTrue:
+        [^self loadPackageWithId: aPackageId fromRepositoryAsAutoloaded: doLoadAsAutoloaded].
+
+    ^ self
+        loadPackageWithId:aPackageId
+        fromDirectory:packageDir
+        asAutoloaded:doLoadAsAutoloaded.
+
+    "
+     Smalltalk loadPackageWithId:'stx:libbasic'
+     Smalltalk loadPackageWithId:'stx:goodies/persistency'
+     Smalltalk loadPackageWithId:'exept:ctypes'
+    "
+
+    "Modified: / 07-12-2006 / 15:04:39 / cg"
+    "Modified: / 28-10-2008 / 15:56:15 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 22-08-2009 / 11:58:43 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!Smalltalk class methodsFor:'system management-packages'!
+
+loadPackageWithId:aPackageId fromRepositoryAsAutoloaded:doLoadAsAutoloaded  
+
+    self
+        loadPackageWithId:aPackageId 
+        fromRepositoryAsAutoloaded:doLoadAsAutoloaded  
+        usingRepositoryManager: SVN::RepositoryManager current
+
+    "Created: / 28-10-2008 / 15:53:37 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 09-04-2009 / 17:20:43 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Smalltalk class methodsFor:'system management-packages'!
+
+loadPackageWithId:aPackageId fromRepositoryAsAutoloaded:doLoadAsAutoloaded usingRepositoryManager: manager  
+
+    | retval loadBlock |
+    loadBlock :=
+        [| repo packageDir |
+        repo := manager repositoryForPackage: aPackageId.
+        retval := (repo notNil and:[repo exists]) 
+            ifTrue:
+                [repo workingCopy checkout.
+                packageDir := self packageDirectoryForPackageId:aPackageId.
+                self
+                    loadPackageWithId:aPackageId
+                    fromDirectory:packageDir
+                    asAutoloaded:doLoadAsAutoloaded]
+            ifFalse:
+                [false]].
+
+    (Query query == true)
+        ifTrue:
+            [loadBlock value]
+        ifFalse:
+            [Query answer: true do:
+                [SVN::ProgressDialog 
+                    openOn: loadBlock 
+                    title: ' Loading...'
+                    subtitle: aPackageId asText allItalic]].
+    ^retval
+
+    "Created: / 09-04-2009 / 17:20:01 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!TimestampChange methodsFor:'applying'!
+
+apply
+    "apply the change"
+
+    "Nothing to do"
+
+    "Created: / 06-11-2008 / 08:57:44 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-class'!
+
+classMenuSubversionCommit
+
+    | classesPerPackage |
+    classesPerPackage := Dictionary new.
+    self selectedClasses value do:
+        [:class|
+        (classesPerPackage at: class theNonMetaclass package ifAbsentPut:[Set new])
+            add: class theNonMetaclass].
+    classesPerPackage keysAndValuesDo:
+        [:package :classes| | repo |
+        repo := SVN::RepositoryManager repositoryForPackage:package.
+        SVN::CommitWizard new
+                task: (repo workingCopy commitTask
+                        classes: classes;
+                        extensionMethods: #()
+                        yourself);
+                open]
+
+    "Modified: / 16-06-2009 / 21:05:21 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-class'!
+
+classMenuSubversionCompareImageWithRevision
+
+    | cls branch revisionLog revision |
+    cls := self theSingleSelectedClass theNonMetaclass.
+    branch := cls theNonMetaclass svnRepository branch.
+    revisionLog := branch log: cls.
+    revision := SVN::RevisionSelectionDialog openOn: revisionLog.
+    self classMenuSubversionCompareImageWithRevision: revision
+
+    "Created: / 19-04-2008 / 18:38:15 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-class'!
+
+classMenuSubversionCompareImageWithRevision: revision
+
+    | cls branch  diffSet |
+    revision ifNil:[^self].
+    cls := self theSingleSelectedClass theNonMetaclass.
+    branch := cls theNonMetaclass svnRepository branch.
+    SVN::ProgressDialog 
+        openOn:[diffSet := branch diffSetForClass: cls betweenImageAndRevision: revision]
+        title: 'Creating diffset for class ', cls fullName asText allItalic
+        subtitle:   
+            ('Package: ' , branch package asText allItalic ,
+             ' Revision ' , revision asString).
+    Tools::SmalltalkDiffTool 
+        openOnDiffSet:diffSet 
+        labelA: 'Image' 
+        labelB: 'r',revision printString
+        title: 'Differences of ',cls fullName,' between image and revision ',revision printString.
+
+    "Created: / 19-04-2008 / 18:54:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 09-08-2009 / 14:14:37 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-class'!
+
+classMenuSubversionCompareImageWithRevisionHead
+
+    self classMenuSubversionCompareImageWithRevision: SVN::Revision head
+
+    "Created: / 19-04-2008 / 18:56:08 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-class'!
+
+classMenuSubversionUpdate
+    "automatically generated by UIEditor ..."
+
+    "*** the code below performs no action"
+    "*** (except for some feedback on the Transcript)"
+    "*** Please change as required and accept in the browser."
+    "*** (and replace this comment by something more useful ;-)"
+
+    "action to be added ..."
+
+    Transcript showCR:self class name, ': action for #classMenuSubversionUpdate ...'.
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menus-dynamic'!
+
+projectMenuSubversionBranches
+
+    <resource: #programMenu >
+
+    | menu repository |
+    menu := Menu new.
+    repository := self selectedProjectSubversionRepository.
+    repository branches do:
+        [:branch|
+        menu addItem:
+            (MenuItem new
+                label: branch name;
+                choiceValue: branch;
+                choice:(repository workingCopy branch);
+                enabled:(repository workingCopy branch) = branch;
+                yourself)
+        ].
+
+    ^menu
+
+    "Created: / 19-04-2008 / 11:06:15 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionBrowseWorkingCopy
+
+    self selectedProjects value do:
+        [:package|
+        | pkg repo |
+        pkg := self theSingleSelectedProject.
+        repo := (SVN::RepositoryManager repositoryForPackage: pkg) .
+        FileBrowserV2 openOn: repo workingCopy path]
+
+    "Created: / 09-04-2009 / 13:19:43 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionCommit
+
+    self selectedProjects value do:
+        [:package|
+        | repo |
+        repo := SVN::RepositoryManager repositoryForPackage:package.
+        SVN::CommitWizard new
+            task: repo workingCopy commitTask;
+            open]
+
+    "Created: / 01-04-2008 / 19:02:42 / janfrog"
+    "Modified: / 16-08-2009 / 19:17:15 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionCommitMode
+
+    ^(PluggableAdaptor on: self theSingleSelectedProject)
+        getBlock:
+            [:prjHolder| | wc |
+            wc := SVN::RepositoryManager workingCopyForPackage: self theSingleSelectedProject value.
+            wc ifNotNil:[wc commitMode] ifNil:[nil]]
+        putBlock:
+            [:prjHolder :value| | wc |
+            wc := SVN::RepositoryManager workingCopyForPackage: self theSingleSelectedProject value.
+            wc ifNotNil:[wc commitMode:value]]
+        updateBlock:
+            [:prjHolder :aspect :value|true].
+
+    "Created: / 13-08-2009 / 15:05:45 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionCompareExtensionsInImageWithRevision
+
+    | pkg branch revisionLog revision  |
+    pkg := self theSingleSelectedProject.
+    branch := (SVN::RepositoryManager repositoryForPackage: pkg) branch.
+    revisionLog := branch log:(branch repository containerNameForExtensions).
+    revision := SVN::RevisionSelectionDialog openOn: revisionLog.
+    self projectMenuSubversionCompareExtensionsInImageWithRevision: revision
+
+    "Created: / 19-04-2008 / 19:13:55 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionCompareExtensionsInImageWithRevision: revision
+
+    | pkg diffSet  branch|
+    revision ifNil:[^self].
+    pkg := self theSingleSelectedProject.
+    branch := (SVN::RepositoryManager repositoryForPackage: pkg) branch.
+    SVN::ProgressDialog 
+        openOn:[diffSet := branch diffSetForExtensionsBetweenImageAndRevision: revision.]
+        title: 'Creating diffset for extensions'
+        subtitle:   
+            ('Package: ' , branch package asText allItalic ,
+             ' Revision ' , revision asString).
+    Tools::SmalltalkDiffTool 
+        openOnDiffSet:diffSet 
+        labelA: 'Image' 
+        labelB: 'r',revision printString
+        title: 'Differences of extensions for ',pkg,' between image and revision ',revision printString.
+
+    "Created: / 19-04-2008 / 19:13:55 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 09-08-2009 / 14:14:15 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionCompareImageWithRevision
+
+    | pkg branch revisionLog revision  |
+    pkg := self theSingleSelectedProject.
+    branch := (SVN::RepositoryManager repositoryForPackage: pkg) branch.
+    revisionLog := branch log:'.'.
+    revision := SVN::RevisionSelectionDialog openOn: revisionLog.
+    self projectMenuSubversionCompareImageWithRevision: revision
+
+    "Created: / 20-05-2008 / 18:09:20 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionCompareImageWithRevision: revision
+
+    | pkg diffSet  branch|
+    revision ifNil:[^self].
+    pkg := self theSingleSelectedProject.
+    branch := (SVN::RepositoryManager repositoryForPackage: pkg) branch.
+    SVN::ProgressDialog 
+        openOn:[diffSet := branch diffSetBetweenImageAndRevision: revision]
+        title: 'Creating diffset'
+        subtitle:   
+            ('Package: ' , branch package asText allItalic ,
+             ' Revision ' , revision asString).
+
+    Tools::SmalltalkDiffTool 
+        openOnDiffSet:diffSet 
+        labelA: 'Image' 
+        labelB: 'r',revision printString
+        title: 'Differences for ',pkg,' between image and revision ',revision printString.
+
+    "Created: / 20-05-2008 / 18:09:52 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 09-08-2009 / 14:14:10 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionCompareImageWithRevisionHEAD
+
+    self projectMenuSubversionCompareImageWithRevision: SVN::Revision head
+
+    "Created: / 20-05-2008 / 18:10:16 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionLoadRevision
+
+    ^self projectMenuSubversionLoadRevision: nil
+
+    "Created: / 22-10-2008 / 11:49:35 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 09-04-2009 / 09:38:17 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionLoadRevision: aRevision
+
+    self selectedProjects value do:
+        [:package|
+        | pkg task |
+        pkg := self theSingleSelectedProject.
+        task := (SVN::RepositoryManager repositoryForPackage: pkg) updateTask.
+        task revision: aRevision.
+        SVN::UpdateWizard openOn: task]
+
+    "Created: / 09-04-2009 / 09:38:55 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionMergeImageWithRevision
+
+    | pkg branch revisionLog revision  |
+    pkg := self theSingleSelectedProject.
+    branch := (SVN::RepositoryManager repositoryForPackage: pkg) branch.
+    revisionLog := branch log:'.'.
+    revision := SVN::RevisionSelectionDialog openOn: revisionLog.
+    self projectMenuSubversionMergeImageWithRevision: revision
+
+    "Created: / 20-05-2008 / 23:41:26 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionMergeImageWithRevision: revision
+
+    | pkg diffSet  branch|
+    revision ifNil:[^self].
+    pkg := self theSingleSelectedProject.
+    branch := (SVN::RepositoryManager repositoryForPackage: pkg) branch.
+    SVN::ProgressDialog 
+        openOn:[diffSet := branch diffSetBetweenImageAndRevision: revision]
+        title: 'Creating diffset'
+        subtitle:   
+            ('Package: ' , branch package asText allItalic ,
+             ' Revision ' , revision asString).
+
+    Tools::SmalltalkMergeTool 
+        openOnDiffSet:diffSet 
+        labelA: 'Image' 
+        labelB: 'r',revision printString
+        title: 'Merge ',pkg,' revision ',revision printString, ' into image'
+
+    "Created: / 20-05-2008 / 23:44:22 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 09-08-2009 / 14:15:28 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionMergeImageWithRevisionHEAD
+
+    self projectMenuSubversionMergeImageWithRevision: SVN::Revision head
+
+    "Created: / 20-05-2008 / 23:44:46 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionRemoveWorkingCopy
+
+    self selectedProjects value do:
+        [:package|
+        | pkg repo |
+        pkg := self theSingleSelectedProject.
+        repo := (SVN::RepositoryManager repositoryForPackage: pkg) .
+        repo workingCopy path asFilename recursiveRemove]
+
+    "Created: / 09-04-2009 / 13:19:08 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionShowRevisionLog
+
+     | pkg branch revisionLog revision  |
+    pkg := self theSingleSelectedProject.
+    branch := (SVN::RepositoryManager repositoryForPackage: pkg) branch.
+    revisionLog := branch log:'.'.
+    revision := SVN::RevisionLogBrowser openOn: revisionLog.
+
+    "Created: / 21-05-2008 / 09:37:51 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 21-10-2008 / 19:52:16 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'menu actions-subversion-project'!
+
+projectMenuSubversionUpdate
+
+    ^self projectMenuSubversionLoadRevision: SVN::Revision head
+
+    "Created: / 22-10-2008 / 11:49:35 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 09-04-2009 / 09:38:34 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!Tools::NewSystemBrowser methodsFor:'private-helpers'!
+
+selectedProjectSubversionRepository
+
+    self selectedProjects value size ~= 1 ifTrue:[^nil].
+    ^SVN::RepositoryManager repositoryForPackage: self selectedProjects value anyOne.
+
+    "Created: / 19-04-2008 / 11:09:02 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!URL methodsFor:'queries'!
+
+isValidSvnRepositoryUrl
+
+    ^#('file' 'http' 'https' 'svn' 'svn+ssh')
+        includes: self method
+
+    "Created: / 16-08-2009 / 16:39:38 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!URL methodsFor:'printing & storing'!
+
+printOn: aStream 
+    method notNil ifTrue: [
+        aStream nextPutAll: method; nextPut: $:
+    ].
+    aStream nextPutAll: '//'.
+    host notNil ifTrue: [
+        aStream nextPutAll: host
+    ].
+    port notNil ifTrue: [
+        aStream nextPut: $:; nextPutAll: port printString
+    ].
+    path notNil ifTrue: [
+        aStream nextPutAll: path
+    ].
+    (otherPart notNil and: [self hasPostData not]) ifTrue:[
+        self hasFragmentPart ifTrue: [
+            aStream nextPut: $#
+        ] ifFalse:[
+            aStream nextPut: $?
+        ].
+        aStream nextPutAll: otherPart
+    ].
+
+    "Modified: / 19-08-2009 / 13:14:21 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing - subversion'!
+
+svnConfigurations
+
+    ^(self at:#'libsvn.configurations' ifAbsent:#())
+        collect:[:cfg|cfg decodeAsLiteralArray]
+
+    "Created: / 03-10-2008 / 11:14:14 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 19-08-2009 / 12:08:44 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing - subversion'!
+
+svnConfigurations: aCollection
+
+    "
+        UserPreferences current svnConfigurations: #()  
+    "
+
+    SVN::RepositoryManager allInstances do:
+        [:e|e configurations: aCollection].
+
+    ^self 
+        at: #'libsvn.configurations'
+        put: (aCollection asArray collect:[:cfg|cfg literalArrayEncoding])
+
+    "Created: / 03-10-2008 / 11:14:01 / Jan Vrany <vranyj1@fel.cvut.cz>"
+    "Modified: / 19-08-2009 / 12:09:22 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing - subversion'!
+
+svnEnabled
+
+    ^self at:#svnEnabled ifAbsent:[true]
+
+    "Created: / 03-10-2008 / 11:11:39 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing - subversion'!
+
+svnEnabled: aBoolean
+
+    ^self at:#svnEnabled put: aBoolean
+
+    "Created: / 03-10-2008 / 11:13:14 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing - subversion'!
+
+svnVerbose
+
+    ^self at:#svnVerbose ifAbsent: false
+
+    "Created: / 19-03-2009 / 14:00:05 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!UserPreferences methodsFor:'accessing - subversion'!
+
+svnVerbose: aBoolean
+
+    ^self at:#svnVerbose put: aBoolean
+
+    "Created: / 19-03-2009 / 13:59:46 / Jan Vrany <vranyj1@fel.cvut.cz>"
+! !
+
+!XML::NodeSet methodsFor:'navigation'!
+
+@ attributeName 
+    "XPath like processing - if singleton set, answer an value of
+    atribute named attributeName, error otherwise.
+    This method is used in libsvn"
+
+    self size = 1 ifTrue:[^self first @ attributeName].
+    self error:'More than one element in node set'
+! !
+