Merge jv
authorJan Vrany <jan.vrany@fit.cvut.cz>
Mon, 28 Nov 2016 17:11:46 +0000
branchjv
changeset 4166 66a7a47f9253
parent 4162 e96794cd9edd (current diff)
parent 4161 55ad833b981e (diff)
child 4167 ee0c93ae59e0
Merge
AbstractSourceCodeManager.st
CVSSourceCodeManager.st
CVSVersionInfo.st
ChangeSet.st
DataBaseSourceCodeManager.st
FileBasedSourceCodeManager.st
HTMLDocGenerator.st
Make.proto
Make.spec
MessageTracer.st
MethodChange.st
MethodFinder.st
PerforceSourceCodeManager.st
SVNVersionInfo.st
SourceCodeManagerUtilities.st
VersionInfo.st
WrappedMethod.st
abbrev.stc
bc.mak
bmake.bat
libInit.cc
mingwmake.bat
stx_libbasic3.st
stx_libbasic3WINrc.rc
vcmake.bat
--- a/AbstractSourceCodeManager.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/AbstractSourceCodeManager.st	Mon Nov 28 17:11:46 2016 +0000
@@ -14,19 +14,21 @@
 "{ NameSpace: Smalltalk }"
 
 Object subclass:#AbstractSourceCodeManager
-	instanceVariableNames:''
-	classVariableNames:'CacheDirectoryName CachingSources DefaultManager ManagerPerModule
-		UseWorkTree Verbose WorkTreeDirectoryName
-		ManagerForPackageCache'
-	poolDictionaries:''
-	category:'System-SourceCodeManagement'
+        instanceVariableNames:''
+        classVariableNames:'CacheDirectoryName CachingSources DefaultManager ManagerPerModule
+                UseWorkTree Verbose WorkTreeDirectoryName
+                PackagesWithoutExtensionMethodConfirmation		
+                SuppressExtensionMethodConfirmation
+                ManagerForPackageCache'               
+        poolDictionaries:''
+        category:'System-SourceCodeManagement'
 !
 
 Object subclass:#PackageAndManager
-	instanceVariableNames:'package managerTypeName'
-	classVariableNames:''
-	poolDictionaries:''
-	privateIn:AbstractSourceCodeManager
+        instanceVariableNames:'package managerTypeName'
+        classVariableNames:''
+        poolDictionaries:''
+        privateIn:AbstractSourceCodeManager
 !
 
 !AbstractSourceCodeManager class methodsFor:'documentation'!
@@ -701,7 +703,7 @@
 
      The returned information is a structure (IdentityDictionary)
      filled with:
-            #container          -> the RCS/CVS container file name 
+            #container          -> the container file name (for container-based SCMs)
             #cvsRoot            -> the CVS root (repository) 
             #filename           -> the actual source file name
             #newestRevision     -> the revisionString of the newest revision
@@ -1071,16 +1073,28 @@
             actions := #(#cancel false #browse true).
         ].
 
-        answer := OptionBox 
-                      request:(SystemBrowser classResources
-                                stringWithCRs:msg
-                                withArgs:args) 
-                      label:'Change packageID ?'
-                      image:(InfoBox iconBitmap)
-                      buttonLabels:(Dialog resources array:labels)
-                      values:actions
-                      default:true.
-
+        (SuppressExtensionMethodConfirmation == true
+        or:[ self isPackageWithoutExtensionMethodConfirmation:aClass package])
+        ifTrue:[
+            answer := true
+        ] ifFalse:[    
+            Dialog
+                withOptoutOption:[ self rememberPackageWithoutExtensionMethodConfirmation:aClass package ]
+                labelled:(SystemBrowser classResources string:'Do not show this dialog again (for this package)')
+                andOptoutOption:[ SuppressExtensionMethodConfirmation := true ]
+                labelled:(SystemBrowser classResources string:'Do not show this dialog again (for any package)')
+                do:[
+                    answer := OptionBox 
+                                  request:(SystemBrowser classResources
+                                            stringWithCRs:msg
+                                            withArgs:args) 
+                                  label:'Change packageID ?'
+                                  image:(InfoBox iconBitmap)
+                                  buttonLabels:(Dialog resources array:labels)
+                                  values:actions
+                                  default:true.
+                ].
+        ].            
         answer == #browse ifTrue:[
             UserPreferences systemBrowserClass
                 browseMethods:unassignedMethods
@@ -1133,7 +1147,7 @@
     ].
     ^ #base
 
-    "Modified: / 24-07-2011 / 07:13:58 / cg"
+    "Modified: / 18-11-2016 / 11:34:14 / cg"
 !
 
 checkTabSpaceConventionIn: aStream
@@ -1360,6 +1374,17 @@
     "Created: / 23-08-2006 / 14:10:29 / cg"
 !
 
+isPackageWithoutExtensionMethodConfirmation:aPackageID
+    "usually, the checkin dialog asks if unpackaged methods should be moved
+     to the package. 
+     This can be suppressed on a per-package base with a checkbox ('do not...again')
+     in the dialog.
+     This method returns true, if this was done for a particular package"
+
+    ^ PackagesWithoutExtensionMethodConfirmation notNil
+    and:[ PackagesWithoutExtensionMethodConfirmation includes:aPackageID]
+!
+
 moduleFromContainerPath:containerPath forClass:aClass
     "given a full path as in an RCS header, extract the module."
 
@@ -1522,6 +1547,19 @@
     ].
 !
 
+rememberPackageWithoutExtensionMethodConfirmation:aPackageID
+    "usually, the checkin dialog asks if unpackaged methods should be moved
+     to the package. 
+     This can be suppressed on a per-package base with a checkbox ('do not...again')
+     in the dialog.
+     This method adds a package to the set of non-asking packages"
+
+    PackagesWithoutExtensionMethodConfirmation isNil ifTrue:[
+        PackagesWithoutExtensionMethodConfirmation := Set new
+    ].    
+    PackagesWithoutExtensionMethodConfirmation add:aPackageID
+!
+
 reportError:msg
     |fullMsg|
 
@@ -2016,8 +2054,7 @@
 sourceCodeManagerForPackage:aPackageID
     |defaultManager module mgr|
 
-    "JV@2012-01-23: If source code management is disabled, return #(). Following code
-     is hack since there is no global boolean flag, sigh"
+    "JV@2012-01-23: If source code management is disabled, return #()."
     defaultManager := Smalltalk at:#SourceCodeManager.
     defaultManager isNil ifTrue:[ "eg. disabled" ^ nil ].
 
@@ -2626,178 +2663,6 @@
 
 !AbstractSourceCodeManager class methodsFor:'source code administration'!
 
-ensureDollarsInVersionMethod:aString
-    "given the source code of my version method, ensure that it contains dollars for
-     proper keyword expansion"
-
-    |versionString|
-
-    versionString := aString copyWithout: (Character codePoint: 167).
-    ^ self ensureKeywordExpansionWith: $$ inVersionMethod:versionString.
-
-    "
-     self ensureDollarsInVersionMethod:'foo ^ ''hello'' ' 
-     self ensureDollarsInVersionMethod:'foo ^ ''hello'' ' 
-     self ensureDollarsInVersionMethod:'foo ^ ''   hello   '' '    
-     self ensureDollarsInVersionMethod:'foo ^ ''$','Header: /cvs/stx/stx/libbasic3/AbstractSourceCodeManager.st,v 1.228 2009/10/20 09:55:58 fm Exp $'' '      
-    -- errors:
-     self ensureDollarsInVersionMethod:'foo ^ ''$Head'' '    
-     self ensureDollarsInVersionMethod:'foo ^ ''Header$'' '    
-    "
-
-    "Modified: / 04-05-2016 / 10:51:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-ensureKeyword: keyword inVersionMethod: source
-
-    | startQuote endQuote doubleColon |
-
-    "/nil keyword means that given source code management system
-    "/does not expand keywords (StORE or Monticello, for example)
-    keyword isNil ifTrue:[
-        ^source.
-    ].
-
-    startQuote := source indexOf: $'.
-    startQuote == 0 ifTrue:[
-        self error:'Does not seem to be a valid version method source. Invalid source?'
-    ].
-    (source at: startQuote + 1) == $$ ifFalse:[
-        self error:'Does not seem to be a valid version method source. Invalid source?'
-    ].
-
-    endQuote := source lastIndexOf: $'.
-    startQuote == endQuote ifTrue:[
-        self error:'Does not seem to be a valid version method source. Invalid source?'
-    ].
-    (source at: endQuote - 1) == $$ ifFalse:[
-        self error:'Does not seem to be a valid version method source. Invalid source?'
-    ].
-
-    doubleColon := source indexOf: $: startingAt: startQuote + 2.
-    "/ There may be no double colon at all, if the version method
-    "/ is fresh, like 'dollar-Header-dollar' (no real dollar here, as cvs expands the string)
-    (doubleColon == 0 or:[doubleColon > endQuote]) ifTrue:[
-        doubleColon := endQuote - 1.
-    ].
-
-    (source copyFrom: startQuote + 2 to: doubleColon - 1) = keyword ifTrue:[
-        "/ Good, desired keyword is already there
-        ^source
-    ].
-
-    ^(source copyTo: startQuote + 1) , keyword , (source copyFrom: doubleColon)
-
-    "Created: / 27-09-2011 / 15:00:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified (comment): / 26-01-2012 / 14:52:19 / cg"
-!
-
-ensureKeywordExpansionWith: aCharacter inVersionMethod:aString
-    "given the source code of my version method, ensure that it contains aCharacter for
-     proper keyword expansion"
-
-    |indexOfFirstQuote indexOfNextAfterFirstQuote indexOfSecondDollar indexOfNextAfterSecondDollar indexOfLastQuote|
-
-    indexOfFirstQuote := aString indexOf:$'.
-    indexOfFirstQuote == 0 ifTrue:[
-        "/ no ' found - mhmh is this a valid version method's source ?
-        ^ aString
-    ].
-    indexOfNextAfterFirstQuote := aString indexOfNonSeparatorStartingAt:indexOfFirstQuote+1.
-    (aString at:indexOfNextAfterFirstQuote) = aCharacter ifTrue:[
-        indexOfSecondDollar := aString indexOf:aCharacter startingAt:indexOfNextAfterFirstQuote+1.
-        ((indexOfSecondDollar == 0) 
-        or:[ indexOfNextAfterSecondDollar := aString indexOfNonSeparatorStartingAt:indexOfSecondDollar+1.
-             (aString at:indexOfNextAfterSecondDollar) ~= $' 
-        ]) ifTrue:[ 
-            self error:'invalid source (no valid version method string)' 
-        ].
-        "/ fine
-        ^ aString
-    ].
-
-    indexOfLastQuote := aString lastIndexOf:$'.
-
-    ^ (aString copyTo:indexOfFirstQuote)
-        , aCharacter asString
-        ,(aString copyFrom:indexOfFirstQuote+1 to:indexOfLastQuote-1)
-        ,aCharacter asString ,(aString copyFrom:indexOfLastQuote)
-
-    "
-     self ensureKeywordExpansionWith: $ inVersionMethod: 'foo ^ ''hello'' '  
-     self ensureKeywordExpansionWith: $ inVersionMethod: 'foo ^ ''   hello   '' '
-     self ensureKeywordExpansionWith: $ inVersionMethod: 'foo ^ ''Header: /cvs/stx/stx/libbasic3/AbstractSourceCodeManager.st,v 1.218 2009/10/07 12:12:30 fm Exp '' '    
-
-     self ensureKeywordExpansionWith: $$ inVersionMethod: 'foo ^ ''hello'' '  
-     self ensureKeywordExpansionWith: $$ inVersionMethod: 'foo ^ ''   hello   '' '
-     self ensureKeywordExpansionWith: $$ inVersionMethod: 'foo ^ ''$','Header: /cvs/stx/stx/libbasic3/AbstractSourceCodeManager.st,v 1.228 2009/10/20 09:55:58 fm Exp $'' '    
-
-    -- errors:
-     self ensureKeywordExpansionWith: $ inVersionMethod: 'foo ^ ''Head'' '  
-     self ensureKeywordExpansionWith: $ inVersionMethod: 'foo ^ ''Header'' '   
-    "
-!
-
-ensureKeywordInVersionMethod: source
-
-    ^self ensureKeyword: self versionMethodKeyword inVersionMethod: source
-
-    "Created: / 27-09-2011 / 14:50:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-ensureNoDollarsInVersionMethod:aString
-    "given the source code of another manager's version method, ensure that it does NOT
-     contain dollars and add $ instead, to avoid that CVS expands keywords in it"
-
-    |versionString|
-
-    versionString := aString copyWithout: $$.
-    ^ self ensureKeywordExpansionWith: $ inVersionMethod:versionString.
-
-    "
-        self ensureNoDollarsInVersionMethod:'foo ^ ''$','Header: /cvs/stx/stx/libbasic3/AbstractSourceCodeManager.st,v 1.228 2009/10/20 09:55:58 fm Exp $'' '           
-        self ensureNoDollarsInVersionMethod:'foo ^ ''$','Head'' '                
-        self ensureNoDollarsInVersionMethod:'foo ^ ''Header$'' '             
-        self ensureNoDollarsInVersionMethod:'foo ^ ''Header'' '    
-
-      -- errors:
-
-        self ensureNoDollarsInVersionMethod:'foo ^ ''Header'' '   
-        self ensureNoDollarsInVersionMethod:'foo ^ ''Header'' '             
-
-    "
-!
-
-extractKeyValueFor:key fromRevisionString:aString 
-    "{ Pragma: +optSpace }"
-
-    "extract a particular value from a string which has the format:
-        key1: value1, key2: value2, .... keyN: valueN"
-
-    |value idx1 idx2|
-
-    "/ 'Path: stx/libbasic/Array.st, Version: 123, User: cg, Time: 2011-12-21T21:03:08.826'
-
-    idx1 := aString indexOfSubCollection:(key,': ').
-    idx1 ~~ 0 ifTrue:[
-        idx1 := idx1 + (key,': ') size.
-        idx2 := aString indexOfSubCollection:', ' startingAt:idx1.
-        idx2 == 0 ifTrue:[ idx2 := aString size + 1 ].
-        value := aString copyFrom:idx1 to:idx2-1.     
-    ].
-    ^ value
-
-    "
-     self 
-        extractKeyValueFor:'Path' 
-        fromRevisionString:'Path: stx/libbasic/Array.st, Version: 123, User: cg, Time: 2011-12-21T21:03:08.826'
-
-     self 
-        extractKeyValueFor:'Time' 
-        fromRevisionString:'Path: stx/libbasic/Array.st, Version: 123, User: cg, Time: 2011-12-21T21:03:08.826'
-    "
-!
-
 fileOutSourceCodeExtensions: extensions package: package on: stream
     "File out extension methods for given package on stream. 
      Not programming-language safe  - can handle smalltalk methods."
@@ -2911,43 +2776,6 @@
     "Created: / 20.5.1998 / 19:38:23 / cg"
 !
 
-initialRCSRevisionStringFor:aClass in:dir container:fileName
-    "return a string usable as initial revision string"
-
-    "/ do not make the string below into one string;
-    "/ RCS would expand it into a wrong rev-string
-
-    |nm oldRev idx special|
-
-    nm := fileName.
-    (nm endsWith:',v') ifTrue:[
-        nm := nm copyButLast:2
-    ].
-    (nm endsWith:'.st') ifFalse:[
-        nm := nm , '.st'
-    ].
-
-    oldRev := aClass revisionString.
-    special := ''.
-
-    oldRev notNil ifTrue:[
-        idx := oldRev lastIndexOf:$[.
-        idx ~~ 0 ifTrue:[
-            idx := oldRev indexOf:$[ startingAt:idx+1.
-            idx ~~ 0 ifTrue:[
-                special := ' ' , (oldRev copyFrom:idx).
-            ]
-        ]
-    ].
-
-
-    ^ '$' , 'Header: ' , dir , '/' , fileName , ',v $'
-      , special
-
-    "Modified: 17.9.1996 / 15:57:15 / cg"
-    "Created: 14.2.1997 / 20:59:28 / cg"
-!
-
 knownTagsAndRevisionsFor:aClass
     "retrieve a list of symbolic tags -> versionNr associations
      known for that class.
@@ -3080,7 +2908,7 @@
     "return a dictionary filled with revision info.
      This extracts the relevant info from aString."
 
-    ^ CVSVersionInfo fromRCSString:aString.
+    ^ CVSSourceCodeManager versionInfoClass fromRCSString:aString.
 
     "
      SourceCodeManager revisionInfoFromString:'$' , 'Revision: 1.122 $'
@@ -3145,7 +2973,7 @@
      Return nil on failure.
      The returned information is a structure (IdentityDictionary)
      filled with:
-            #container          -> the RCS container file name
+            #container          -> the container file name (for container-based SCMs)
             #filename           -> the actual source file name
             #newestRevision     -> the revisionString of the newest revision
             #numberOfRevisions  -> the number of revisions in the container
@@ -3181,7 +3009,7 @@
 
      The returned information is a structure (IdentityDictionary)
      filled with:
-            #container          -> the RCS container file name 
+            #container          -> the container file name (for container-based SCMs)
             #filename           -> the actual source file name
             #newestRevision     -> the revisionString of the newest revision
             #numberOfRevisions  -> the number of revisions in the container
@@ -3227,7 +3055,7 @@
 
      The returned information is a structure (IdentityDictionary)
      filled with:
-            #container          -> the RCS container file name 
+            #container          -> the container file name (for container-based SCMs)
             #filename           -> the actual source file name
             #newestRevision     -> the revisionString of the newest revision
             #numberOfRevisions  -> the number of revisions in the container
@@ -3271,7 +3099,7 @@
 
      The returned information is a structure (IdentityDictionary)
      filled with:
-            #container          -> the RCS container file name 
+            #container          -> the container file name (for container-based SCMs)
             #filename           -> the actual source file name
             #newestRevision     -> the revisionString of the newest revision
             #numberOfRevisions  -> the number of revisions in the container
@@ -3348,7 +3176,7 @@
 
      The returned information is a structure (IdentityDictionary)
      filled with:
-            #container          -> the RCS container file name 
+            #container          -> the container file name (for container-based SCMs)
             #filename           -> the actual source file name
             #newestRevision     -> the revisionString of the newest revision
             #numberOfRevisions  -> the number of revisions in the container (nil for all)
@@ -3432,7 +3260,7 @@
 
      The returned information is a structure (IdentityDictionary)
      filled with:
-            #container          -> the RCS container file name 
+            #container          -> the container file name (for container-based SCMs)
             #filename           -> the actual source file name
             #newestRevision     -> the revisionString of the newest revision
             #numberOfRevisions  -> the number of revisions in the container
@@ -3474,7 +3302,7 @@
 
      The returned information is a structure (IdentityDictionary)
      filled with:
-            #container          -> the RCS container file name 
+            #container          -> the container file name (for container-based SCMs)
             #filename           -> the actual source file name
             #newestRevision     -> the revisionString of the newest revision
             #numberOfRevisions  -> the number of revisions in the container
@@ -3950,6 +3778,279 @@
     "
 ! !
 
+!AbstractSourceCodeManager class methodsFor:'source code utilities'!
+
+diffListFor:clsOrNil fileName:classFileName directory:packageDir module:moduleDir revision1:rev1 revision2:rev2
+    "return diff info. This is supposed to return a standard diff-like
+     list of lines, representing the diffs between two revisions.
+     experimental (for ownershipGraph)"
+
+    ^  self
+        diffListFor:clsOrNil fileName:classFileName directory:packageDir module:moduleDir revision1:rev1 revision2:rev2 
+        cache:true
+!
+
+diffListFor:clsOrNil fileName:classFileNameArg directory:packageDirArg module:moduleDirArg revision1:rev1 revision2:rev2 cache:cacheIt
+    "return diff info. This is supposed to return a standard diff-like
+     list of lines, representing the diffs between two revisions.
+     experimental (for ownershipGraph).
+     This fallback retrieves the two versions and calls a diff"
+
+    |fullName modulePath inStream list msg cacheDir cachedFile classFileName diffDir
+     sourceStream1 sourceStream2 source1 source2 tmpSource1 tmpSource2
+     moduleDir packageDir|
+
+    moduleDir := moduleDirArg.
+    packageDir := packageDirArg.
+    
+    clsOrNil notNil ifTrue:[
+        modulePath :=  clsOrNil package copyReplaceAll:$: with:$/.
+        moduleDir := clsOrNil package asPackageId module.
+        packageDir := clsOrNil package asPackageId directory.
+        fullName :=  modulePath , '/' , (classFileName := clsOrNil classFilename).
+    ] ifFalse:[
+        modulePath :=  moduleDir , '/' , packageDir. 
+        fullName :=  modulePath , '/' , (classFileName := classFileNameArg).
+    ].
+
+   (cacheIt) ifTrue:[
+        (cacheDir := self sourceCacheDirectory) isNil ifTrue:[
+            ('SourceCodeManager [warning]: no source cache directory') infoPrintCR.
+        ] ifFalse:[
+            diffDir := (cacheDir / modulePath / '.diffs').
+            diffDir exists ifFalse:[
+                diffDir recursiveMakeDirectory.
+            ].
+            cachedFile := diffDir / (classFileName,'_',rev1,'_',rev2).
+            cachedFile exists ifTrue:[
+                ^ cachedFile contents
+            ].
+        ].
+    ].
+
+    msg := 'SourceCodeManager: Fetching diff list of '.
+    clsOrNil isNil ifTrue:[
+        msg := msg , fullName.
+    ] ifFalse:[
+        msg := msg , clsOrNil name.
+    ].
+    msg := msg , ' ' , rev1 , ' vs. ' , rev2.
+    self activityNotification:msg.
+
+    sourceStream1 := self 
+                        streamForClass:clsOrNil
+                        fileName:classFileName 
+                        revision:rev1 
+                        directory:packageDir 
+                        module:moduleDir
+                        cache:cacheIt.
+    source1 := sourceStream1 contents.
+    sourceStream1 close.
+    tmpSource1 := Filename newTemporary.
+    tmpSource1 contents:source1.
+    
+    sourceStream2 := self 
+                        streamForClass:clsOrNil
+                        fileName:classFileName 
+                        revision:rev2 
+                        directory:packageDir 
+                        module:moduleDir
+                        cache:cacheIt.
+    source2 := sourceStream2 contents.
+    sourceStream2 close.
+    tmpSource2 := Filename newTemporary.
+    tmpSource2 contents:source2.
+    
+    [
+        inStream := PipeStream readingFrom:('diff %1 %2' bindWith:tmpSource1 pathName with:tmpSource1 pathName ). 
+        inStream isNil ifTrue:[
+            ('SourceCodeManager [error]: cannot open pipe to diff ', fullName) errorPrintCR.
+            ^ nil
+        ].
+        list := inStream contents.
+    ] ensure:[
+        inStream close.
+        tmpSource1 remove.
+        tmpSource2 remove.
+    ].
+    list := list reject:[:line | line startsWith:'\ '].
+
+    cachedFile notNil ifTrue:[
+        cachedFile contents:list.
+    ].
+    ^ list
+!
+
+ensureDollarsInVersionMethod:aString
+    "given the source code of my version method, ensure that it contains dollars for
+     proper keyword expansion"
+
+    |versionString|
+
+    versionString := aString copyWithout: (Character codePoint: 167).
+    ^ self ensureKeywordExpansionWith: $$ inVersionMethod:versionString.
+
+    "
+     self ensureDollarsInVersionMethod:'foo ^ ''hello'' ' 
+     self ensureDollarsInVersionMethod:'foo ^ ''hello'' ' 
+     self ensureDollarsInVersionMethod:'foo ^ ''   hello   '' '    
+     self ensureDollarsInVersionMethod:'foo ^ ''$','Header: /cvs/stx/stx/libbasic3/AbstractSourceCodeManager.st,v 1.228 2009/10/20 09:55:58 fm Exp $'' '      
+    -- errors:
+     self ensureDollarsInVersionMethod:'foo ^ ''$Head'' '    
+     self ensureDollarsInVersionMethod:'foo ^ ''Header$'' '    
+    "
+!
+
+ensureKeyword: keyword inVersionMethod: source
+
+    | startQuote endQuote doubleColon |
+
+    "/nil keyword means that given source code management system
+    "/does not expand keywords (StORE or Monticello, for example)
+    keyword isNil ifTrue:[
+        ^source.
+    ].
+
+    startQuote := source indexOf: $'.
+    startQuote == 0 ifTrue:[
+        self error:'Does not seem to be a valid version method source. Invalid source?'
+    ].
+    (source at: startQuote + 1) == $$ ifFalse:[
+        self error:'Does not seem to be a valid version method source. Invalid source?'
+    ].
+
+    endQuote := source lastIndexOf: $'.
+    startQuote == endQuote ifTrue:[
+        self error:'Does not seem to be a valid version method source. Invalid source?'
+    ].
+    (source at: endQuote - 1) == $$ ifFalse:[
+        self error:'Does not seem to be a valid version method source. Invalid source?'
+    ].
+
+    doubleColon := source indexOf: $: startingAt: startQuote + 2.
+    "/ There may be no double colon at all, if the version method
+    "/ is fresh, like 'dollar-Header-dollar' (no real dollar here, as cvs expands the string)
+    (doubleColon == 0 or:[doubleColon > endQuote]) ifTrue:[
+        doubleColon := endQuote - 1.
+    ].
+
+    (source copyFrom: startQuote + 2 to: doubleColon - 1) = keyword ifTrue:[
+        "/ Good, desired keyword is already there
+        ^source
+    ].
+
+    ^(source copyTo: startQuote + 1) , keyword , (source copyFrom: doubleColon)
+
+    "Created: / 27-09-2011 / 15:00:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 26-01-2012 / 14:52:19 / cg"
+!
+
+ensureKeywordExpansionWith: aCharacter inVersionMethod:aString
+    "given the source code of my version method, ensure that it contains aCharacter for
+     proper keyword expansion"
+
+    |indexOfFirstQuote indexOfNextAfterFirstQuote indexOfSecondDollar indexOfNextAfterSecondDollar indexOfLastQuote|
+
+    indexOfFirstQuote := aString indexOf:$'.
+    indexOfFirstQuote == 0 ifTrue:[
+        "/ no ' found - mhmh is this a valid version method's source ?
+        ^ aString
+    ].
+    indexOfNextAfterFirstQuote := aString indexOfNonSeparatorStartingAt:indexOfFirstQuote+1.
+    (aString at:indexOfNextAfterFirstQuote) = aCharacter ifTrue:[
+        indexOfSecondDollar := aString indexOf:aCharacter startingAt:indexOfNextAfterFirstQuote+1.
+        ((indexOfSecondDollar == 0) 
+        or:[ indexOfNextAfterSecondDollar := aString indexOfNonSeparatorStartingAt:indexOfSecondDollar+1.
+             (aString at:indexOfNextAfterSecondDollar) ~= $' 
+        ]) ifTrue:[ 
+            self error:'invalid source (no valid version method string)' 
+        ].
+        "/ fine
+        ^ aString
+    ].
+
+    indexOfLastQuote := aString lastIndexOf:$'.
+
+    ^ (aString copyTo:indexOfFirstQuote)
+        , aCharacter asString
+        ,(aString copyFrom:indexOfFirstQuote+1 to:indexOfLastQuote-1)
+        ,aCharacter asString ,(aString copyFrom:indexOfLastQuote)
+
+    "
+     self ensureKeywordExpansionWith: $ inVersionMethod: 'foo ^ ''hello'' '  
+     self ensureKeywordExpansionWith: $ inVersionMethod: 'foo ^ ''   hello   '' '
+     self ensureKeywordExpansionWith: $ inVersionMethod: 'foo ^ ''Header: /cvs/stx/stx/libbasic3/AbstractSourceCodeManager.st,v 1.218 2009/10/07 12:12:30 fm Exp '' '    
+
+     self ensureKeywordExpansionWith: $$ inVersionMethod: 'foo ^ ''hello'' '  
+     self ensureKeywordExpansionWith: $$ inVersionMethod: 'foo ^ ''   hello   '' '
+     self ensureKeywordExpansionWith: $$ inVersionMethod: 'foo ^ ''$','Header: /cvs/stx/stx/libbasic3/AbstractSourceCodeManager.st,v 1.228 2009/10/20 09:55:58 fm Exp $'' '    
+
+    -- errors:
+     self ensureKeywordExpansionWith: $ inVersionMethod: 'foo ^ ''Head'' '  
+     self ensureKeywordExpansionWith: $ inVersionMethod: 'foo ^ ''Header'' '   
+    "
+!
+
+ensureKeywordInVersionMethod: source
+
+    ^self ensureKeyword: self versionMethodKeyword inVersionMethod: source
+
+    "Created: / 27-09-2011 / 14:50:46 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+ensureNoDollarsInVersionMethod:aString
+    "given the source code of another manager's version method, ensure that it does NOT
+     contain dollars and add $ instead, to avoid that CVS expands keywords in it"
+
+    |versionString|
+
+    versionString := aString copyWithout: $$.
+    ^ self ensureKeywordExpansionWith: $ inVersionMethod:versionString.
+
+    "
+        self ensureNoDollarsInVersionMethod:'foo ^ ''$','Header: /cvs/stx/stx/libbasic3/AbstractSourceCodeManager.st,v 1.228 2009/10/20 09:55:58 fm Exp $'' '           
+        self ensureNoDollarsInVersionMethod:'foo ^ ''$','Head'' '                
+        self ensureNoDollarsInVersionMethod:'foo ^ ''Header$'' '             
+        self ensureNoDollarsInVersionMethod:'foo ^ ''Header'' '    
+
+      -- errors:
+
+        self ensureNoDollarsInVersionMethod:'foo ^ ''Header'' '   
+        self ensureNoDollarsInVersionMethod:'foo ^ ''Header'' '             
+
+    "
+!
+
+extractKeyValueFor:key fromRevisionString:aString 
+    "{ Pragma: +optSpace }"
+
+    "extract a particular value from a string which has the format:
+        key1: value1, key2: value2, .... keyN: valueN"
+
+    |value idx1 idx2|
+
+    "/ 'Path: stx/libbasic/Array.st, Version: 123, User: cg, Time: 2011-12-21T21:03:08.826'
+
+    idx1 := aString indexOfSubCollection:(key,': ').
+    idx1 ~~ 0 ifTrue:[
+        idx1 := idx1 + (key,': ') size.
+        idx2 := aString indexOfSubCollection:', ' startingAt:idx1.
+        idx2 == 0 ifTrue:[ idx2 := aString size + 1 ].
+        value := aString copyFrom:idx1 to:idx2-1.     
+    ].
+    ^ value
+
+    "
+     self 
+        extractKeyValueFor:'Path' 
+        fromRevisionString:'Path: stx/libbasic/Array.st, Version: 123, User: cg, Time: 2011-12-21T21:03:08.826'
+
+     self 
+        extractKeyValueFor:'Time' 
+        fromRevisionString:'Path: stx/libbasic/Array.st, Version: 123, User: cg, Time: 2011-12-21T21:03:08.826'
+    "
+! !
+
 !AbstractSourceCodeManager class methodsFor:'subclass responsibility'!
 
 reportHistoryLogSince:timeGoal filterSTSources:filter filterUser:userFilter 
@@ -4094,13 +4195,15 @@
 !AbstractSourceCodeManager::PackageAndManager methodsFor:'queries'!
 
 match: packageId
-    | manager |
+    | manager packageMatches|
 
     manager := self manager.
     manager isNil ifTrue:[^false].
 
-    ^ (package match: packageId) 
-        and: [manager isResponsibleForPackage: packageId]
+    packageMatches := package includesMatchCharacters
+                        ifTrue:[ package match: packageId ]
+                        ifFalse:[ packageId startsWith:(package,':') ].
+    ^ packageMatches and: [manager isResponsibleForPackage: packageId]
 
     "
      self managerForModule:'stx:libbasic' 
--- a/CVSSourceCodeManager.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/CVSSourceCodeManager.st	Mon Nov 28 17:11:46 2016 +0000
@@ -23,6 +23,13 @@
 	category:'System-SourceCodeManagement'
 !
 
+VersionInfo subclass:#CVSVersionInfo
+	instanceVariableNames:'repositoryPathName timeZone changedLinesInfo'
+	classVariableNames:''
+	poolDictionaries:''
+	privateIn:CVSSourceCodeManager
+!
+
 !CVSSourceCodeManager class methodsFor:'documentation'!
 
 copyright
@@ -1324,7 +1331,7 @@
     "read and parse a single revision info-entry from the cvs log output.
      Return nil on end.
 
-     The returned information is a structure (IdentityDictionary)
+     The returned information is a CVSVersionInfo object (used to be an IdentityDictionary)
      filled with:
               #revision              -> the revision string
               #author                -> who checked that revision into the repository
@@ -1348,7 +1355,7 @@
     ].
     revLine2 := inStream nextLine.
     (revLine1 notNil and:[revLine2 notNil]) ifTrue:[
-        record := IdentityDictionary new.
+        record := CVSVersionInfo "IdentityDictionary" new.
         record at:#revision put:(revLine1 asCollectionOfWords at:2).
         "/ decompose date/author/state etc.
         (revLine2 asCollectionOfSubstringsSeparatedBy:$;) do:[:info |
@@ -1367,8 +1374,8 @@
             ].
         ].
 
-        "first revision does not hav a 'lines:' entry"
-        (record includesKey:#numberOfChangedLines) ifFalse:[
+        "first revision does not have a 'lines:' entry"
+        (record at:#numberOfChangedLines ifAbsent:[nil]) isNil ifTrue:[
             record at:#numberOfChangedLines put:''
         ].
 
@@ -3141,104 +3148,6 @@
 
 !CVSSourceCodeManager class methodsFor:'source code administration'!
 
-annotationsFor:clsOrNil fileName:classFileName directory:packageDir module:moduleDir
-    "return info about who changed what and when.
-     Return nil on failure.
-
-     The returned information is a structure entry for each line
-            #revision           -> version of last change
-            #author             -> author 
-            #date               -> change date 
-        "
-
-    |tempDir fullName modulePath inStream inHeaderInfo line info msg|
-
-    tempDir := self createTempDirectory:nil forModule:nil.
-    tempDir isNil ifTrue:[
-        ('CVSSourceCodeManager [error]: no tempDir - cannot extract log') errorPrintCR.
-        ^ nil.
-    ].
-
-    [
-        |cmd revArg|
-
-        modulePath :=  moduleDir , '/' , packageDir. 
-        fullName :=  modulePath , '/' , classFileName.
-
-        self createEntryFor:fullName 
-             module:moduleDir
-             in:(tempDir construct:modulePath) 
-             revision:'1.1' 
-             date:'dummy' 
-             special:''
-             overwrite:false.
-
-        msg := 'Fetching annotation log '.
-        clsOrNil isNil ifTrue:[
-            msg := msg , 'in ' , fullName.
-        ] ifFalse:[
-            msg := msg , 'of ', clsOrNil name.
-        ].
-        self activityNotification:msg,'...'.
-
-        inStream := self 
-                        executeCVSCommand:('annotate ' , fullName) 
-                        module:moduleDir 
-                        inDirectory:tempDir 
-                        log:true 
-                        pipe:true.
-
-        inStream isNil ifTrue:[
-            ('CVSSourceCodeManager [error]: cannot open pipe to cvs annotate ', fullName) errorPrintCR.
-            ^ nil
-        ].
-
-        "/
-        "/ read the commands pipe output and extract the info
-        "/
-        info := IdentityDictionary new.
-        inHeaderInfo := true.
-        [inHeaderInfo and:[inStream atEnd not]] whileTrue:[
-            line:= inStream nextLine.
-            ((line ? '') startsWith:'*******') ifTrue:[
-                inHeaderInfo := false.
-            ]
-        ].
-
-        "/
-        "/ continue to read the commands pipe output 
-        "/ and extract change info records
-        "/
-        [inStream atEnd] whileFalse:[
-            line := inStream nextLine.
-Transcript showCR:line.
-        ].
-    ] ensure:[
-        inStream notNil ifTrue:[inStream close].
-
-        tempDir notNil ifTrue:[
-            OperatingSystem accessDeniedErrorSignal handle:[:ex |
-                ('CVSSourceCodeManager [warning]: could not remove tempDir ', tempDir pathName) infoPrintCR.
-            ] do:[
-                tempDir recursiveRemove
-            ].
-        ].
-        self activityNotification:nil.
-    ].
-    ^ info
-
-    "
-     SourceCodeManager 
-        annotationsFor:Array 
-        fileName:'Array.st' directory:'libbasic' module:'stx'
-    "
-    "
-     SourceCodeManager 
-        annotationsFor:MenuPanel 
-        fileName:'MenuPanel.st' directory:'libwidg2' module:'stx'
-    "
-!
-
 checkForExistingContainer:fileName inModule:moduleDir directory:packageDir
     "check for a container to exist"
 
@@ -4006,108 +3915,6 @@
     "
 !
 
-diffListFor:clsOrNil fileName:classFileName directory:packageDir module:moduleDir revision1:rev1 revision2:rev2
-    "return diff info. This is supposed to return a standard diff-like
-     list of lines, representing the diffs between two revisions.
-     experimental (for ownershipGraph)"
-
-    ^  self
-        diffListFor:clsOrNil fileName:classFileName directory:packageDir module:moduleDir revision1:rev1 revision2:rev2 
-        cache:true
-!
-
-diffListFor:clsOrNil fileName:classFileNameArg directory:packageDir module:moduleDir revision1:rev1 revision2:rev2 cache:cacheIt
-    "return diff info. This is supposed to return a standard diff-like
-     list of lines, representing the diffs between two revisions.
-     experimental (for ownershipGraph)"
-
-    |tempDir fullName modulePath inStream list msg cacheDir cachedFile classFileName|
-
-    clsOrNil notNil ifTrue:[
-        modulePath :=  clsOrNil package copyReplaceAll:$: with:$/.
-        fullName :=  modulePath , '/' , (classFileName := clsOrNil getClassFilename).
-    ] ifFalse:[
-        modulePath :=  moduleDir , '/' , packageDir. 
-        fullName :=  modulePath , '/' , (classFileName := classFileNameArg).
-    ].
-
-   (cacheIt) ifTrue:[
-        (cacheDir := self sourceCacheDirectory) isNil ifTrue:[
-            ('CVSSourceCodeManager [warning]: no source cache directory') infoPrintCR.
-        ] ifFalse:[
-            (cacheDir / modulePath / '.diffs') exists ifFalse:[
-                (cacheDir / modulePath / '.diffs') makeDirectory.
-            ].
-            cachedFile := cacheDir / modulePath / '.diffs' / (classFileName,'_',rev1,'_',rev2).
-            cachedFile exists ifTrue:[
-                ^ cachedFile contents
-            ].
-        ].
-    ].
-
-    tempDir := self createTempDirectory:nil forModule:nil.
-    tempDir isNil ifTrue:[
-        ('CVSSourceCodeManager [error]: no tempDir - cannot extract status') errorPrintCR.
-        ^ nil.
-    ].
-
-    [
-        self createEntryFor:fullName 
-             module:moduleDir
-             in:(tempDir construct:modulePath) 
-             revision:'1.1' 
-             date:'dummy' 
-             special:''
-             overwrite:false.
-
-        msg := 'CVS: Fetching diff list of '.
-        clsOrNil isNil ifTrue:[
-            msg := msg , fullName.
-        ] ifFalse:[
-            msg := msg , clsOrNil name.
-        ].
-        msg := msg , ' ' , rev1 , ' vs. ' , rev2.
-        self activityNotification:msg.
-
-        inStream := self 
-                        executeCVSCommand:('diff -w -r%1 -r%2 %3' bindWith:rev1 with:rev2 with:fullName) 
-                        module:moduleDir 
-                        inDirectory:tempDir 
-                        log:true 
-                        pipe:true.
-
-        inStream isNil ifTrue:[
-            ('CVSSourceCodeManager [error]: cannot open pipe to cvs diff ', fullName) errorPrintCR.
-            ^ nil
-        ].
-
-        "/
-        "/ read the commands pipe output and extract the container info
-        "/
-        [ inStream nextLine startsWith:'diff -'] whileFalse.
-
-        list := inStream contents.
-    ] ensure:[
-        inStream notNil ifTrue:[inStream close].
-        tempDir recursiveRemove
-    ].
-    list := list reject:[:line | line startsWith:'\ '].
-
-    cachedFile notNil ifTrue:[
-        cachedFile contents:list.
-    ].
-    ^ list
-
-    "
-     SourceCodeManager statusOf:Array 
-     SourceCodeManager statusOf:Array fileName:'Array.st' directory:'libbasic' module:'stx'  
-     SourceCodeManager statusOf:Filename fileName:'Filename.st' directory:'libbasic' module:'stx'  
-     SourceCodeManager statusOf:NewSystemBrowser fileName:'NewSystemBrowser.st' directory:'libtool' module:'stx'  
-    "
-
-    "Modified: / 29-08-2006 / 13:18:00 / cg"
-!
-
 getExistingContainersInModule:aModule directory:aPackage
     "return a list of existing containers."
 
@@ -4146,27 +3953,6 @@
     "
 !
 
-initialRevisionStringFor:aClass inModule:moduleDir directory:packageDir container:fileName
-    "return a string usable as initial revision string"
-
-    |cvsRoot fullName|
-
-    cvsRoot := self getCVSROOTForModule:moduleDir.
-    cvsRoot := self repositoryTopDirectoryFromCVSRoot:cvsRoot.
-    packageDir isEmptyOrNil ifTrue:[
-        fullName := (cvsRoot , '/' , moduleDir)
-    ] ifFalse:[
-        fullName := (cvsRoot , '/' , moduleDir , '/' , packageDir)
-    ].        
-    ^ self
-        initialRCSRevisionStringFor:aClass 
-        in:fullName
-        container:fileName
-
-    "Modified: / 16-01-1998 / 17:34:13 / stefan"
-    "Created: / 23-08-2006 / 14:05:46 / cg"
-!
-
 listDirectories:cvsPath
     "return a list of all directories in cvsPath.
      cvsPath is the path relative to the cvs root"
@@ -4821,7 +4607,7 @@
 
      The returned information is a structure (IdentityDictionary)
      filled with:
-            #container          -> the RCS/CVS container file name 
+            #container          -> the CVS container file name 
             #cvsRoot            -> the CVS root (repository) 
             #filename           -> the actual source file name
             #newestRevision     -> the revisionString of the newest revision
@@ -4843,7 +4629,7 @@
               #author                -> who checked that revision into the repository
               #date                  -> when was it checked in
               #state                 -> the RCS state
-              #numberOfChangedLines  -> the number of changed line w.r.t the previous
+              #numberOfChangedLines  -> the number of changed lines w.r.t the previous (as string with +n -n)
               #logMessage            -> the checkIn log message
 
             revisions are ordered newest first 
@@ -5049,7 +4835,7 @@
     "
      The returned information is a list of structures (IdentityDictionary)
      each filled with:
-            #container          -> the RCS/CVS container file name 
+            #container          -> the CVS container file name 
             #cvsRoot            -> the CVS root (repository) 
             #filename           -> the actual source file name
             #newestRevision     -> the revisionString of the newest revision
@@ -5071,7 +4857,7 @@
               #author                -> who checked that revision into the repository
               #date                  -> when was it checked in
               #state                 -> the RCS state
-              #numberOfChangedLines  -> the number of changed line w.r.t the previous
+              #numberOfChangedLines  -> the number of changed lines w.r.t the previous (as string with +n -n)
               #logMessage            -> the checkIn log message
 
             revisions are ordered newest first 
@@ -5721,6 +5507,255 @@
     "Modified: / 29-08-2006 / 13:18:00 / cg"
 ! !
 
+!CVSSourceCodeManager class methodsFor:'source code utilities'!
+
+annotationsFor:clsOrNil fileName:classFileName directory:packageDir module:moduleDir
+    "return info about who changed what and when.
+     Return nil on failure.
+
+     The returned information is a structure entry for each line
+            #revision           -> version of last change
+            #author             -> author 
+            #date               -> change date 
+        "
+
+    |tempDir fullName modulePath inStream inHeaderInfo line info msg|
+
+    tempDir := self createTempDirectory:nil forModule:nil.
+    tempDir isNil ifTrue:[
+        ('CVSSourceCodeManager [error]: no tempDir - cannot extract log') errorPrintCR.
+        ^ nil.
+    ].
+
+    [
+        |cmd revArg|
+
+        modulePath :=  moduleDir , '/' , packageDir. 
+        fullName :=  modulePath , '/' , classFileName.
+
+        self createEntryFor:fullName 
+             module:moduleDir
+             in:(tempDir construct:modulePath) 
+             revision:'1.1' 
+             date:'dummy' 
+             special:''
+             overwrite:false.
+
+        msg := 'Fetching annotation log '.
+        clsOrNil isNil ifTrue:[
+            msg := msg , 'in ' , fullName.
+        ] ifFalse:[
+            msg := msg , 'of ', clsOrNil name.
+        ].
+        self activityNotification:msg,'...'.
+
+        inStream := self 
+                        executeCVSCommand:('annotate ' , fullName) 
+                        module:moduleDir 
+                        inDirectory:tempDir 
+                        log:true 
+                        pipe:true.
+
+        inStream isNil ifTrue:[
+            ('CVSSourceCodeManager [error]: cannot open pipe to cvs annotate ', fullName) errorPrintCR.
+            ^ nil
+        ].
+
+        "/
+        "/ read the commands pipe output and extract the info
+        "/
+        info := IdentityDictionary new.
+        inHeaderInfo := true.
+        [inHeaderInfo and:[inStream atEnd not]] whileTrue:[
+            line:= inStream nextLine.
+            ((line ? '') startsWith:'*******') ifTrue:[
+                inHeaderInfo := false.
+            ]
+        ].
+
+        "/
+        "/ continue to read the commands pipe output 
+        "/ and extract change info records
+        "/
+        [inStream atEnd] whileFalse:[
+            line := inStream nextLine.
+Transcript showCR:line.
+        ].
+    ] ensure:[
+        inStream notNil ifTrue:[inStream close].
+
+        tempDir notNil ifTrue:[
+            OperatingSystem accessDeniedErrorSignal handle:[:ex |
+                ('CVSSourceCodeManager [warning]: could not remove tempDir ', tempDir pathName) infoPrintCR.
+            ] do:[
+                tempDir recursiveRemove
+            ].
+        ].
+        self activityNotification:nil.
+    ].
+    ^ info
+
+    "
+     SourceCodeManager 
+        annotationsFor:Array 
+        fileName:'Array.st' directory:'libbasic' module:'stx'
+    "
+    "
+     SourceCodeManager 
+        annotationsFor:MenuPanel 
+        fileName:'MenuPanel.st' directory:'libwidg2' module:'stx'
+    "
+!
+
+diffListFor:clsOrNil fileName:classFileNameArg directory:packageDir module:moduleDir revision1:rev1 revision2:rev2 cache:cacheIt
+    "return diff info. This is supposed to return a standard diff-like
+     list of lines, representing the diffs between two revisions.
+     experimental (for ownershipGraph).
+     Here we ask cvs to give us the diff list"
+
+    |tempDir fullName modulePath inStream list msg cacheDir cachedFile classFileName diffDir|
+
+    clsOrNil notNil ifTrue:[
+        modulePath :=  clsOrNil package copyReplaceAll:$: with:$/.
+        fullName :=  modulePath , '/' , (classFileName := clsOrNil getClassFilename).
+    ] ifFalse:[
+        modulePath :=  moduleDir , '/' , packageDir. 
+        fullName :=  modulePath , '/' , (classFileName := classFileNameArg).
+    ].
+
+   (cacheIt) ifTrue:[
+        (cacheDir := self sourceCacheDirectory) isNil ifTrue:[
+            ('CVSSourceCodeManager [warning]: no source cache directory') infoPrintCR.
+        ] ifFalse:[
+            diffDir := (cacheDir / modulePath / '.diffs').
+            diffDir exists ifFalse:[
+                diffDir makeDirectory.
+            ].
+            cachedFile := diffDir / (classFileName,'_',rev1,'_',rev2).
+            cachedFile exists ifTrue:[
+                ^ cachedFile contents
+            ].
+        ].
+    ].
+
+    tempDir := self createTempDirectory:nil forModule:nil.
+    tempDir isNil ifTrue:[
+        ('CVSSourceCodeManager [error]: no tempDir - cannot extract status') errorPrintCR.
+        ^ nil.
+    ].
+
+    [
+        self createEntryFor:fullName 
+             module:moduleDir
+             in:(tempDir construct:modulePath) 
+             revision:'1.1' 
+             date:'dummy' 
+             special:''
+             overwrite:false.
+
+        msg := 'CVS: Fetching diff list of '.
+        clsOrNil isNil ifTrue:[
+            msg := msg , fullName.
+        ] ifFalse:[
+            msg := msg , clsOrNil name.
+        ].
+        msg := msg , ' ' , rev1 , ' vs. ' , rev2.
+        self activityNotification:msg.
+
+        inStream := self 
+                        executeCVSCommand:('diff -w -r%1 -r%2 %3' bindWith:rev1 with:rev2 with:fullName) 
+                        module:moduleDir 
+                        inDirectory:tempDir 
+                        log:true 
+                        pipe:true.
+
+        inStream isNil ifTrue:[
+            ('CVSSourceCodeManager [error]: cannot open pipe to cvs diff ', fullName) errorPrintCR.
+            ^ nil
+        ].
+
+        "/
+        "/ read the command's pipe output, skipping some administrative info
+        "/
+        [ inStream nextLine startsWith:'diff -'] whileFalse.
+
+        list := inStream contents.
+    ] ensure:[
+        inStream notNil ifTrue:[inStream close].
+        tempDir recursiveRemove
+    ].
+    list := list reject:[:line | line startsWith:'\ '].
+
+    cachedFile notNil ifTrue:[
+        cachedFile contents:list.
+    ].
+    ^ list
+
+    "
+     SourceCodeManager statusOf:Array 
+     SourceCodeManager statusOf:Array fileName:'Array.st' directory:'libbasic' module:'stx'  
+     SourceCodeManager statusOf:Filename fileName:'Filename.st' directory:'libbasic' module:'stx'  
+     SourceCodeManager statusOf:NewSystemBrowser fileName:'NewSystemBrowser.st' directory:'libtool' module:'stx'  
+    "
+
+    "Modified: / 29-08-2006 / 13:18:00 / cg"
+!
+
+initialRCSRevisionStringFor:aClass in:dir container:fileName
+    "return a string usable as initial revision string"
+
+    "/ do not make the string below into one string;
+    "/ RCS would expand it into a wrong rev-string
+
+    |nm oldRev idx special|
+
+    nm := fileName.
+    (nm endsWith:',v') ifTrue:[
+        nm := nm copyButLast:2
+    ].
+    (nm endsWith:'.st') ifFalse:[
+        nm := nm , '.st'
+    ].
+
+    oldRev := aClass revisionString.
+    special := ''.
+
+    oldRev notNil ifTrue:[
+        idx := oldRev lastIndexOf:$[.
+        idx ~~ 0 ifTrue:[
+            idx := oldRev indexOf:$[ startingAt:idx+1.
+            idx ~~ 0 ifTrue:[
+                special := ' ' , (oldRev copyFrom:idx).
+            ]
+        ]
+    ].
+
+
+    ^ '$' , 'Header: ' , dir , '/' , fileName , ',v $'
+      , special
+
+    "Modified: 17.9.1996 / 15:57:15 / cg"
+    "Created: 14.2.1997 / 20:59:28 / cg"
+!
+
+initialRevisionStringFor:aClass inModule:moduleDir directory:packageDir container:fileName
+    "return a string usable as initial revision string"
+
+    |cvsRoot fullName|
+
+    cvsRoot := self getCVSROOTForModule:moduleDir.
+    cvsRoot := self repositoryTopDirectoryFromCVSRoot:cvsRoot.
+    packageDir isEmptyOrNil ifTrue:[
+        fullName := (cvsRoot , '/' , moduleDir)
+    ] ifFalse:[
+        fullName := (cvsRoot , '/' , moduleDir , '/' , packageDir)
+    ].        
+    ^ self initialRCSRevisionStringFor:aClass in:fullName container:fileName
+
+    "Modified: / 16-01-1998 / 17:34:13 / stefan"
+    "Created: / 23-08-2006 / 14:05:46 / cg"
+! !
+
 !CVSSourceCodeManager class methodsFor:'testing'!
 
 isCVS
@@ -5729,6 +5764,179 @@
     "Created: / 16-08-2006 / 10:58:19 / cg"
 ! !
 
+!CVSSourceCodeManager::CVSVersionInfo class methodsFor:'documentation'!
+
+copyright
+"
+ COPYRIGHT (c) 2009 by eXept Software AG
+              All Rights Reserved
+
+ This software is furnished under a license and may be used
+ only in accordance with the terms of that license and with the
+ inclusion of the above copyright notice.   This software may not
+ be provided or otherwise made available to, or used by, any
+ other person.  No title to or ownership of the software is
+ hereby transferred.
+"
+!
+
+documentation
+"
+    In ancient times, Class used to return a Dictionary when asked for versionInfo.
+    This has been replaced by instances of VersionInfo and subclasses.
+
+    CVSVersionInfo adds some CVS specific data.
+
+    [author:]
+        cg (cg@AQUA-DUO)
+"
+!
+
+version
+    ^ '$Header$'
+!
+
+version_CVS
+    ^ '$Header$'
+! !
+
+!CVSSourceCodeManager::CVSVersionInfo class methodsFor:'instance creation'!
+
+fromRCSString:aString
+    "{ Pragma: +optSpace }"
+
+    "I know how to parse RCS/CVS version id strings.
+     Return an instance filled with revision info which is
+     extracted from aString. This must be in RCS/CVS format."
+
+    |words firstWord nextWord info nm s fn revString d |
+
+    s := aString readStream.
+    s skipSeparators.
+    firstWord := s upToSeparator.
+
+    info := self new.
+
+    "/
+    "/ supported formats:
+    "/
+    "/ $-Header:   pathName rev date time user state $
+    "/ $-Revision: rev $
+    "/ $-Id:       fileName rev date time user state $
+    "/
+    (firstWord = '$Header:' or:[firstWord = 'Header:']) ifTrue:[
+        d := firstWord first.
+        s skipSeparators.
+        nm := s throughAll:',v '.
+        nm := nm withoutSeparators.
+        info repositoryPathName:nm.
+        info fileName:(nm asFilename baseName copyButLast:2).
+        words := s upToEnd asCollectionOfWords readStream.
+
+        words atEnd ifFalse:[
+            nextWord := words next.
+            nextWord first ~= d ifTrue:[
+                info revision:nextWord.
+                nextWord := words next.
+                (nextWord notNil and:[nextWord first ~= d]) ifTrue:[
+                    info date:nextWord.
+                    info time:words next.
+                    nextWord := words next.
+                    (nextWord notNil and:[nextWord startsWithAnyOf:'+-']) ifTrue:[
+                        info timezone:nextWord.
+                        nextWord := words next.
+                    ].
+                    info user:nextWord.
+                    info state:words next.
+                ]
+            ].
+        ].
+        ^ info
+    ].
+
+    (firstWord = '$Revision:' or:[firstWord = 'Revision:']) ifTrue:[
+        info revision:(s upToEnd asCollectionOfWords first).
+        ^ info
+    ].
+
+    (firstWord = '$Id:' or:[firstWord = 'Id:']) ifTrue:[
+        "/commented out by Jan Vrany, 2009/10/20
+        "/according to http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special.keywords.html
+        "/svn has no support for $ Header $ expansion. Therefore
+        "/libsvn uses $Id$ instead.
+        "/self halt:'no longer supported'.        
+        words := s upToEnd asCollectionOfWords readStream.
+        info fileName:(fn := words next).
+        (fn endsWith:',v') ifFalse:[
+            "/ not a CVS version
+            ^ nil
+        ].
+        info revision:(revString := words next).
+
+        "/ do not use matchesRegex:'[0-9]+\.[0-9]+.*') here: regex is an optional package
+        ((revString conform:[:c | c isDigit or:[c == $.]])
+        and:[revString includes:$.]) ifFalse:[
+            "/ not a CVS version
+            ^ nil
+        ].
+        info date:(words next).
+        info time:(words next).
+        info user:(words next).
+        info state:(words next).
+        ^ info
+    ].
+
+    ^ nil
+
+    "
+     CVSVersionInfo fromRCSString:('$' , 'Revision: 1.122 $')
+     CVSVersionInfo fromRCSString:(CVSSourceCodeManager version)
+     CVSVersionInfo fromRCSString:(SVNSourceCodeManager version_CVS)
+    "
+
+    "Modified (comment): / 11-10-2011 / 23:41:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 22-11-2011 / 16:15:49 / cg"
+    "Modified (format): / 24-11-2011 / 10:56:51 / cg"
+! !
+
+!CVSSourceCodeManager::CVSVersionInfo methodsFor:'accessing'!
+
+changedLinesInfo
+    ^ changedLinesInfo
+!
+
+changedLinesInfo:aString
+    changedLinesInfo := aString.
+!
+
+repositoryPathName
+    ^ repositoryPathName
+!
+
+repositoryPathName:something
+    repositoryPathName := something.
+!
+
+timeZone
+    ^ timeZone
+!
+
+timeZone:something
+    timeZone := something.
+!
+
+timezone
+    ^ timeZone
+
+    "Created: / 22-10-2008 / 20:50:39 / cg"
+!
+
+timezone:something
+    timeZone := something.
+
+    "Created: / 22-10-2008 / 20:50:32 / cg"
+! !
+
 !CVSSourceCodeManager class methodsFor:'documentation'!
 
 version
--- a/CVSVersionInfo.st	Wed Sep 07 16:04:00 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,195 +0,0 @@
-"
- COPYRIGHT (c) 2009 by eXept Software AG
-              All Rights Reserved
-
- This software is furnished under a license and may be used
- only in accordance with the terms of that license and with the
- inclusion of the above copyright notice.   This software may not
- be provided or otherwise made available to, or used by, any
- other person.  No title to or ownership of the software is
- hereby transferred.
-"
-"{ Package: 'stx:libbasic3' }"
-
-VersionInfo subclass:#CVSVersionInfo
-	instanceVariableNames:'repositoryPathName timeZone state'
-	classVariableNames:''
-	poolDictionaries:''
-	category:'System-SourceCodeManagement'
-!
-
-!CVSVersionInfo class methodsFor:'documentation'!
-
-copyright
-"
- COPYRIGHT (c) 2009 by eXept Software AG
-              All Rights Reserved
-
- This software is furnished under a license and may be used
- only in accordance with the terms of that license and with the
- inclusion of the above copyright notice.   This software may not
- be provided or otherwise made available to, or used by, any
- other person.  No title to or ownership of the software is
- hereby transferred.
-"
-!
-
-documentation
-"
-    In ancient times, Class used to return a Dictionary when asked for versionInfo.
-    This has been replaced by instances of VersionInfo and subclasses.
-
-    CVSVersionInfo adds some CVS specific data.
-
-    [author:]
-        cg (cg@AQUA-DUO)
-"
-! !
-
-!CVSVersionInfo class methodsFor:'instance creation'!
-
-fromRCSString:aString
-    "{ Pragma: +optSpace }"
-
-    "I know how to parse RCS/CVS version id strings.
-     Return an instance filled with revision info which is
-     extracted from aString. This must be in RCS/CVS format."
-
-    |words firstWord nextWord info nm s fn revString d |
-
-    s := aString readStream.
-    s skipSeparators.
-    firstWord := s upToSeparator.
-
-    info := self new.
-
-    "/
-    "/ supported formats:
-    "/
-    "/ $-Header:   pathName rev date time user state $
-    "/ $-Revision: rev $
-    "/ $-Id:       fileName rev date time user state $
-    "/
-    (firstWord = '$Header:' or:[firstWord = '§Header:']) ifTrue:[
-        d := firstWord first.
-        s skipSeparators.
-        nm := s throughAll:',v '.
-        nm := nm withoutSeparators.
-        info repositoryPathName:nm.
-        info fileName:(nm asFilename baseName copyButLast:2).
-        words := s upToEnd asCollectionOfWords readStream.
-
-        words atEnd ifFalse:[
-            nextWord := words next.
-            nextWord first ~= d ifTrue:[
-                info revision:nextWord.
-                nextWord := words next.
-                (nextWord notNil and:[nextWord first ~= d]) ifTrue:[
-                    info date:nextWord.
-                    info time:words next.
-                    nextWord := words next.
-                    (nextWord notNil and:[nextWord startsWithAnyOf:'+-']) ifTrue:[
-                        info timezone:nextWord.
-                        nextWord := words next.
-                    ].
-                    info user:nextWord.
-                    info state:words next.
-                ]
-            ].
-        ].
-        ^ info
-    ].
-
-    (firstWord = '$Revision:' or:[firstWord = '§Revision:']) ifTrue:[
-        info revision:(s upToEnd asCollectionOfWords first).
-        ^ info
-    ].
-
-    (firstWord = '$Id:' or:[firstWord = '§Id:']) ifTrue:[
-        "/commented out by Jan Vrany, 2009/10/20
-        "/according to http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special.keywords.html
-        "/svn has no support for $ Header $ expansion. Therefore
-        "/libsvn uses $Id: CVSVersionInfo.st,v 1.13 2014-11-28 17:28:37 cg Exp $ instead.
-        "/self halt:'no longer supported'.        
-        words := s upToEnd asCollectionOfWords readStream.
-        info fileName:(fn := words next).
-        (fn endsWith:',v') ifFalse:[
-            "/ not a CVS version
-            ^ nil
-        ].
-        info revision:(revString := words next).
-
-        "/ do not use matchesRegex:'[0-9]+\.[0-9]+.*') here: regex is an optional package
-        ((revString conform:[:c | c isDigit or:[c == $.]])
-        and:[revString includes:$.]) ifFalse:[
-            "/ not a CVS version
-            ^ nil
-        ].
-        info date:(words next).
-        info time:(words next).
-        info user:(words next).
-        info state:(words next).
-        ^ info
-    ].
-
-    ^ nil
-
-    "
-     CVSVersionInfo fromRCSString:('$' , 'Revision: 1.122 $')
-     CVSVersionInfo fromRCSString:(CVSSourceCodeManager version)
-     CVSVersionInfo fromRCSString:(SVNSourceCodeManager version_CVS)
-    "
-
-    "Modified (comment): / 11-10-2011 / 23:41:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 22-11-2011 / 16:15:49 / cg"
-    "Modified (format): / 24-11-2011 / 10:56:51 / cg"
-! !
-
-!CVSVersionInfo methodsFor:'accessing'!
-
-repositoryPathName
-    ^ repositoryPathName
-!
-
-repositoryPathName:something
-    repositoryPathName := something.
-!
-
-state
-    ^ state
-!
-
-state:something
-    state := something.
-!
-
-timeZone
-    ^ timeZone
-!
-
-timeZone:something
-    timeZone := something.
-!
-
-timezone
-    ^ timeZone
-
-    "Created: / 22-10-2008 / 20:50:39 / cg"
-!
-
-timezone:something
-    timeZone := something.
-
-    "Created: / 22-10-2008 / 20:50:32 / cg"
-! !
-
-!CVSVersionInfo class methodsFor:'documentation'!
-
-version
-    ^ '$Header: /cvs/stx/stx/libbasic3/CVSVersionInfo.st,v 1.13 2014-11-28 17:28:37 cg Exp $'
-!
-
-version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic3/CVSVersionInfo.st,v 1.13 2014-11-28 17:28:37 cg Exp $'
-! !
-
--- a/ChangeSet.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/ChangeSet.st	Mon Nov 28 17:11:46 2016 +0000
@@ -2040,15 +2040,17 @@
                         |isForSame|
                         
                         isForSame := false.
-                        (((aChangeInA isMethodChange and:[aChangeInB isMethodChange]) 
-                        and:[aChangeInA changeSelector = aChangeInB changeSelector])
-                        and:[aChangeInA changeClass isMeta = aChangeInB changeClass isMeta])
+                        (aChangeInA isMethodChange 
+                            and:[aChangeInB isMethodChange
+                            and:[aChangeInA changeSelector = aChangeInB changeSelector
+                            and:[aChangeInA changeClass isMeta = aChangeInB changeClass isMeta]]])
                         ifTrue:[
                             isForSame := true.
                         ] ifFalse:[
-                            ((aChangeInA isClassChange and:[aChangeInB isClassChange]) 
+                            (aChangeInA isClassChange 
+                                and:[aChangeInB isClassChange 
                                 and:[aChangeInA changeClass nameWithoutNameSpacePrefix 
-                                     = aChangeInB changeClass nameWithoutNameSpacePrefix])
+                                     = aChangeInB changeClass nameWithoutNameSpacePrefix]])
                             ifTrue:[
                                 isForSame := true.
                             ]
--- a/DataBaseSourceCodeManager.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/DataBaseSourceCodeManager.st	Mon Nov 28 17:11:46 2016 +0000
@@ -21,7 +21,7 @@
 !
 
 VersionInfo subclass:#DBVersionInfo
-	instanceVariableNames:'state symbolicVersionName'
+	instanceVariableNames:'symbolicVersionName'
 	classVariableNames:''
 	poolDictionaries:''
 	privateIn:DataBaseSourceCodeManager
@@ -735,14 +735,6 @@
 
 !DataBaseSourceCodeManager::DBVersionInfo methodsFor:'accessing'!
 
-state
-    ^ state
-!
-
-state:something
-    state := something.
-!
-
 symbolicVersionName
     "return an additional symbolic version name, which is used for human readers (and not unique)"
 
--- a/FileBasedSourceCodeManager.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/FileBasedSourceCodeManager.st	Mon Nov 28 17:11:46 2016 +0000
@@ -237,7 +237,9 @@
     |targetDir newestRevision newRevision newFile packageMode filter outStream|
 
     targetDir := self packageDirectoryForModule:moduleDir package:packageDir.
-
+    targetDir exists ifFalse:[
+        targetDir recursiveMakeDirectory
+    ].
     (targetDir filesMatching:(classFileName,'_*')) do:[:eachVersionFile |
         |versionString|
 
--- a/HTMLDocGenerator.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/HTMLDocGenerator.st	Mon Nov 28 17:11:46 2016 +0000
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
 "
  COPYRIGHT (c) 1996 by Claus Gittinger
               All Rights Reserved
@@ -48,10 +46,13 @@
 documentation
 "
     Generates HTML documentation for a class.
-    Although this is normally used with the SystemBrowser
-    (classes-generate documentation menu),
-    it may be useful on its own, to programatically generate
-    up-to-date documents from a classes source.
+    
+    This is used with the SystemBrowser (classes-generate documentation menu),
+    and the online documentation (which generates up-to-date documents just-in-time
+    out of the running system).
+    
+    It may also be useful, to programatically generate up-to-date documents 
+    into a folder of self contained html files (eg. for deployment).
 
     This generator extracts the documentation methods source
     (or comment), individual method comments (the first comment in
@@ -211,7 +212,8 @@
     CachedKWIC := nil
     "
     CachedKWIC isNil ifTrue:[
-        CachedKWIC := self generateKWIC.
+        "/ CachedKWIC := self generateKWIC.
+        CachedKWIC := self generateKWICForClassAndMethodNames.
         "/ to flush the cached kwic, whenever a class-documentation method is changed
         Smalltalk addDependent:self class. 
     ].
@@ -368,6 +370,54 @@
 
 !HTMLDocGenerator class methodsFor:'document generation-helpers'!
 
+camelCaseSeparatedWordsOf:wordIn do:aBlock
+    "
+     self camelCaseSeparatedWordsOf:'HelloWorld' do:[:w | Transcript showCR:w]
+     self camelCaseSeparatedWordsOf:'abcDef' do:[:w | Transcript showCR:w]
+     self camelCaseSeparatedWordsOf:'UTFEncoder' do:[:w | Transcript showCR:w]
+     self camelCaseSeparatedWordsOf:'JisEncoder' do:[:w | Transcript showCR:w]
+     self camelCaseSeparatedWordsOf:'JISEncode' do:[:w | Transcript showCR:w]
+    "
+    |state newState in out ch part|
+
+    in := wordIn readStream.
+    out := '' writeStream.
+    [in atEnd] whileFalse:[
+        ch := in next.
+        (ch isDigit or:[ch == $_]) ifFalse:[
+            newState := ch isUppercase.
+        ].
+        (newState ~~ state) ifTrue:[
+            newState == true ifTrue:[
+                "/ going from lower- to uppercase
+                part := out contents.
+                part notEmpty ifTrue:[ aBlock value:part ].
+                out :=  '' writeStream.
+                out nextPut:ch.
+                state := newState.
+            ] ifFalse:[
+                "/ going upper- to lowercase
+                out size <= 1 ifTrue:[
+                    out nextPut:ch.
+                ] ifFalse:[
+                    |prev|
+
+                    prev := out contents.
+                    aBlock value:(prev copyButLast).
+                    out := '' writeStream.
+                    out nextPut:prev last.
+                    out nextPut:ch.
+                ].    
+                state := newState.
+            ].    
+        ] ifFalse:[
+            out nextPut:ch.
+        ].    
+    ].
+    part := out contents.
+    part notEmpty ifTrue:[ aBlock value:part ].
+!
+
 generateKWIC
     |fillWords kwic|
 
@@ -375,37 +425,117 @@
         #(
             'the' 'a'
             'can' 'you' 
-            'to' 'in' 'at' 'of' 
+            'to' 'in' 'out' 'at' 'of' 
             'also' 'with' 'without' 'all' 'any' 'how' 
-            'however' 'although' 'always' 
+            'however' 'although' 'always' 'either' 'neither'
             'anywhere' 'anyway' 'anything' 'anyone'
-            'not' 'but'
+            'not' 'but' 'else' 'elsewhere'
             'am' 'are' 'is' 'be' 'will' 'wont' 'won''t' 'do' 'don''t'
+            'no' 'non' 'now' 'old' 'on' 'only'
             'my' 'their' 'your' 'its'
             'one' 'two' 'three'
-            'etc' 'for'
+            'etc' 'for' 'lot' 'lots' 'made' 'may' 'most' 'mostly' 'much'
             'use' 'this' 'that' 'which' 'what' 'why'
+            'or' 'other' 'please'
         ).
         
     kwic := KeywordInContextIndexBuilder new.
     kwic excluded:fillWords.
-    kwic separatorAlgorithm:[:line | line asCollectionOfSubstringsSeparatedByAny:' ^~=@.:,;-+*/()[]|{}#"''<>',Character cr].
+    kwic separatorAlgorithm:[:line | 
+            line asCollectionOfSubstringsSeparatedByAny:' ^~=@.:,;-+*/()[]|{}#"''<>',Character cr
+        ].
     kwic exclusionFilter:[:word | 
                 word size == 1
                 or:[ word conform:#isDigit ]].
-    
+
     Smalltalk allClassesDo:[:eachClass |
-        |doc|
+        eachClass isLoaded ifTrue:[
+            |doc|
+
+            doc := eachClass commentOrDocumentationString.
+            doc notEmptyOrNil ifTrue:[
+                kwic addLine:doc reference:eachClass ignoreCase:true.
+            ].    
+        ].
+    ].
+
+    "/ if we have a key like 'startWith:' in the list,
+    "/ and 'starts' is also there, place the 'startsWith:' entries into the same bin.
+    kwic remapKeywordsWith:[:oldKey :knownMappings |
+        |newKey|
+
+        6 to:oldKey size - 1 do:[:len |
+            newKey isNil ifTrue:[
+                |part|
+                
+                part := (oldKey copyTo:len).
+                (knownMappings includes:part) ifTrue:[
+                    newKey := part.
+                ].
+            ].
+        ].
+        newKey ? oldKey.
+    ].
+
+    ^ kwic
+
+    "
+     CachedKWIC := nil.
+     self generateKWIC
+    "
+!
+
+generateKWICForClassAndMethodNames
+    |fillWords kwic|
+
+    fillWords := 
+        #(
+"/            'the' 'a'
+"/            'can' 'you' 
+"/            'to' 'in' 'out' 'at' 'of' 
+"/            'also' 'with' 'without' 'all' 'any' 'how' 
+"/            'however' 'although' 'always' 'either' 'neither'
+"/            'anywhere' 'anyway' 'anything' 'anyone'
+"/            'not' 'but' 'else' 'elsewhere'
+"/            'am' 'are' 'is' 'be' 'will' 'wont' 'won''t' 'do' 'don''t'
+"/            'no' 'non' 'now' 'old' 'on' 'only'
+"/            'my' 'their' 'your' 'its'
+"/            'one' 'two' 'three'
+"/            'etc' 'for' 'lot' 'lots' 'made' 'may' 'most' 'mostly' 'much'
+"/            'use' 'this' 'that' 'which' 'what' 'why'
+"/            'or' 'other' 'please'
+        ).
         
-        doc := eachClass commentOrDocumentationString.
-        doc notEmptyOrNil ifTrue:[
-            kwic addLine:doc reference:eachClass ignoreCase:true.
-        ].    
+    kwic := KeywordInContextIndexBuilder new.
+    kwic excluded:fillWords.
+    kwic separatorAlgorithm:[:name |
+            |words|
+            words := Set new.
+            (name asCollectionOfSubstringsSeparatedBy:$:) do:[:eachPart |
+                eachPart notEmpty ifTrue:[
+                    self camelCaseSeparatedWordsOf:eachPart do:[:w | words add:w].
+                ].
+            ].
+            words := words reject:[:w | w isEmpty].
+            words 
+        ].
+
+    Smalltalk allClassesDo:[:eachClass |
+        kwic addLine:eachClass name reference:eachClass ignoreCase:true.
+"/        eachClass isLoaded ifTrue:[
+"/            eachClass theNonMetaclass selectorsAndMethodsDo:[:sel :mthd |
+"/                kwic addLine:sel reference:mthd ignoreCase:true.
+"/            ].
+"/            eachClass theMetaclass selectorsAndMethodsDo:[:sel :mthd|
+"/                kwic addLine:sel reference:mthd ignoreCase:true.
+"/            ].
+"/        ].    
     ].
     ^ kwic
 
     "
-     self generateKWIC
+     CachedKWIC := nil.
+     self generateKWICForClassAndMethodNames
     "
 !
 
@@ -2317,13 +2447,13 @@
         ].
     ].
 
-    aKWIC matchSorter:[:a :b | a value name < b value name].
+    aKWIC matchSorter:[:a :b | a key < b key].
     
-    aKWIC entriesDo:[:word :left :right :class|
+    aKWIC entriesDo:[:word :left :right :classOrMethod|
         |ref lcWord ctx|
 
         ctx := (HTMLUtilities escapeCharacterEntities:(left contractAtBeginningTo:25))
-               ,' <b>',(HTMLUtilities escapeCharacterEntities:word),'</b> '
+               , ' <b>',(HTMLUtilities escapeCharacterEntities:word),'</b> '
                ,(HTMLUtilities escapeCharacterEntities:(right contractAtEndTo:25)).
         
         lcWord := word asLowercase.
@@ -2334,14 +2464,22 @@
             "/ outStream nextPutLine:'<dt>',(HTMLUtilities escapeCharacterEntities:(caseMapping at:lcWord ifAbsent:[word])),'</dt>'.
             outStream nextPutLine:'<dt>',(HTMLUtilities escapeCharacterEntities:word),'</dt>'.
             outStream nextPutLine:'<dd><ul><li>'.
-            self generateClassDocReferenceFor:class name.
+            classOrMethod isBehavior ifTrue:[
+                self generateClassDocReferenceFor:classOrMethod name.
+            ] ifFalse:[
+                self generateMethodDocReferenceFor:classOrMethod selector inClass:classOrMethod mclass name text:classOrMethod selector autoloading:nil.
+            ].    
             outStream nextPutAll:'<tab indent=300>'.
             outStream nextPutLine:ctx. 
             outStream nextPutLine:'</li>'.
             prevWord := lcWord.
         ] ifFalse:[
             outStream nextPutLine:'</li><li>'.
-            self generateClassDocReferenceFor:class name.
+            classOrMethod isBehavior ifTrue:[
+                self generateClassDocReferenceFor:classOrMethod name.
+            ] ifFalse:[
+                self generateMethodDocReferenceFor:classOrMethod selector inClass:classOrMethod mclass name text:classOrMethod selector autoloading:nil.
+            ].    
             outStream nextPutAll:'<tab indent=300>'.
             outStream nextPutLine:ctx.
             outStream nextPutLine:'</li>'.
@@ -2363,7 +2501,21 @@
 !
 
 htmlPackageList
-    "generate an HTML string for a given list of selectors"
+    "generate an HTML string for a list of all packages in the system"
+
+    ^ self 
+        htmlPackageListFor:(Smalltalk allPackageIDs) 
+        withDocumentation:true "/ false
+
+    "
+     self new
+        generateDocumentForOfflineReading:true;
+        htmlPackageList.
+    "
+!
+
+htmlPackageListFor:packageNames withDocumentation:withDocumentation
+    "generate an HTML string for a given list of packages"
 
     |s|
 
@@ -2377,7 +2529,7 @@
     self generateH1:'Package Index'.
     s nextPutLine:'<ul>'.
 
-    Smalltalk allPackageIDs
+    packageNames
         do:[:p |
             |pckgString|
 
@@ -2910,6 +3062,38 @@
     outStream nextPutLine:'<hr>'.
 !
 
+generateMethodDocReferenceFor:selector inClass:className text:text autoloading:autoloadedClass
+    "generates a link to a classes documentation"
+
+    |href serviceLinkName action|
+
+    self generatingForSTXBrowser ifTrue:[
+        action := self class name , ' htmlDocOf:' , className.
+        autoloadedClass notNil ifTrue:[
+            action := autoloadedClass , ' autoload,', action.
+        ].
+
+        href := self 
+                    anchorForHTMLAction:action
+                    info:('Show documentation of ' , className )
+                    text:text.
+    ] ifFalse:[
+        "/ page is generated for a real http service;
+        "/ generate a link to the services classDocOf page,
+        "/ Assumes that the server has a classDoc service running.
+        httpRequestOrNil notNil ifTrue:[
+            serviceLinkName := httpRequestOrNil serviceLinkName.    
+        ].
+        href := self
+                    anchorFor:(serviceLinkName, '/classDocOf,', (HTMLUtilities escape:className) ) 
+                    info:('Show documentation of ' , className ) 
+                    text:text 
+                    name:nil
+    ].
+
+    outStream nextPutAll:href.
+!
+
 generatePackageDocReferenceFor:packageID text:text
     "generates a link to a package documentation"
 
--- a/Make.proto	Wed Sep 07 16:04:00 2016 +0100
+++ b/Make.proto	Mon Nov 28 17:11:46 2016 +0000
@@ -151,8 +151,6 @@
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
 $(OUTDIR)AbstractSourceCodeManager.$(O) AbstractSourceCodeManager.$(C) AbstractSourceCodeManager.$(H): AbstractSourceCodeManager.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)BeeProjectWriter.$(O) BeeProjectWriter.$(C) BeeProjectWriter.$(H): BeeProjectWriter.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)BeeSourceWriter.$(O) BeeSourceWriter.$(C) BeeSourceWriter.$(H): BeeSourceWriter.st $(INCLUDE_TOP)/stx/libbasic/AbstractSourceFileWriter.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/SmalltalkChunkFileSourceWriter.$(H) $(STCHDR)
 $(OUTDIR)CallChain.$(O) CallChain.$(C) CallChain.$(H): CallChain.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)Change.$(O) Change.$(C) Change.$(H): Change.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)ChangeDeltaInformation.$(O) ChangeDeltaInformation.$(C) ChangeDeltaInformation.$(H): ChangeDeltaInformation.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
@@ -174,15 +172,11 @@
 $(OUTDIR)SourceCodeManagerUtilities.$(O) SourceCodeManagerUtilities.$(C) SourceCodeManagerUtilities.$(H): SourceCodeManagerUtilities.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)SystemEnvironment.$(O) SystemEnvironment.$(C) SystemEnvironment.$(H): SystemEnvironment.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)SystemOrganizer.$(O) SystemOrganizer.$(C) SystemOrganizer.$(H): SystemOrganizer.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
-$(OUTDIR)SystemProfiler.$(O) SystemProfiler.$(C) SystemProfiler.$(H): SystemProfiler.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)TraceBuffer.$(O) TraceBuffer.$(C) TraceBuffer.$(H): TraceBuffer.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)VersionInfo.$(O) VersionInfo.$(C) VersionInfo.$(H): VersionInfo.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)WrappedMethod.$(O) WrappedMethod.$(C) WrappedMethod.$(H): WrappedMethod.st $(INCLUDE_TOP)/stx/libbasic/CompiledCode.$(H) $(INCLUDE_TOP)/stx/libbasic/ExecutableFunction.$(H) $(INCLUDE_TOP)/stx/libbasic/Method.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(STCHDR)
 $(OUTDIR)stx_libbasic3.$(O) stx_libbasic3.$(C) stx_libbasic3.$(H): stx_libbasic3.st $(INCLUDE_TOP)/stx/libbasic/LibraryDefinition.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/ProjectDefinition.$(H) $(STCHDR)
-$(OUTDIR)BeeProjectDefinitionWriter.$(O) BeeProjectDefinitionWriter.$(C) BeeProjectDefinitionWriter.$(H): BeeProjectDefinitionWriter.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/BeeProjectWriter.$(H) $(STCHDR)
-$(OUTDIR)BeeProjectSourceWriter.$(O) BeeProjectSourceWriter.$(C) BeeProjectSourceWriter.$(H): BeeProjectSourceWriter.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/BeeProjectWriter.$(H) $(STCHDR)
-$(OUTDIR)CVSSourceCodeManager.$(O) CVSSourceCodeManager.$(C) CVSSourceCodeManager.$(H): CVSSourceCodeManager.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/AbstractSourceCodeManager.$(H) $(STCHDR)
-$(OUTDIR)CVSVersionInfo.$(O) CVSVersionInfo.$(C) CVSVersionInfo.$(H): CVSVersionInfo.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/VersionInfo.$(H) $(STCHDR)
+$(OUTDIR)CVSSourceCodeManager.$(O) CVSSourceCodeManager.$(C) CVSSourceCodeManager.$(H): CVSSourceCodeManager.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/AbstractSourceCodeManager.$(H) $(INCLUDE_TOP)/stx/libbasic3/VersionInfo.$(H) $(STCHDR)
 $(OUTDIR)ChangeSetDiffEntry.$(O) ChangeSetDiffEntry.$(C) ChangeSetDiffEntry.$(H): ChangeSetDiffEntry.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/ChangeSetDiffComponent.$(H) $(STCHDR)
 $(OUTDIR)ChangeSetDiffSet.$(O) ChangeSetDiffSet.$(C) ChangeSetDiffSet.$(H): ChangeSetDiffSet.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/ChangeSetDiffComponent.$(H) $(STCHDR)
 $(OUTDIR)ClassChange.$(O) ClassChange.$(C) ClassChange.$(H): ClassChange.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/Change.$(H) $(STCHDR)
@@ -199,7 +193,6 @@
 $(OUTDIR)NameSpaceCreationChange.$(O) NameSpaceCreationChange.$(C) NameSpaceCreationChange.$(H): NameSpaceCreationChange.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/Change.$(H) $(STCHDR)
 $(OUTDIR)OtherChange.$(O) OtherChange.$(C) OtherChange.$(H): OtherChange.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/Change.$(H) $(STCHDR)
 $(OUTDIR)PerforceSourceCodeManager.$(O) PerforceSourceCodeManager.$(C) PerforceSourceCodeManager.$(H): PerforceSourceCodeManager.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) $(INCLUDE_TOP)/stx/libbasic/ProceedableError.$(H) $(INCLUDE_TOP)/stx/libbasic3/AbstractSourceCodeManager.$(H) $(INCLUDE_TOP)/stx/libbasic3/VersionInfo.$(H) $(STCHDR)
-$(OUTDIR)SVNVersionInfo.$(O) SVNVersionInfo.$(C) SVNVersionInfo.$(H): SVNVersionInfo.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/VersionInfo.$(H) $(STCHDR)
 $(OUTDIR)SourceCodeManagerUtilitiesForContainerBasedManagers.$(O) SourceCodeManagerUtilitiesForContainerBasedManagers.$(C) SourceCodeManagerUtilitiesForContainerBasedManagers.$(H): SourceCodeManagerUtilitiesForContainerBasedManagers.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/SourceCodeManagerUtilities.$(H) $(STCHDR)
 $(OUTDIR)SourceCodeManagerUtilitiesForWorkspaceBasedManagers.$(O) SourceCodeManagerUtilitiesForWorkspaceBasedManagers.$(C) SourceCodeManagerUtilitiesForWorkspaceBasedManagers.$(H): SourceCodeManagerUtilitiesForWorkspaceBasedManagers.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/SourceCodeManagerUtilities.$(H) $(STCHDR)
 $(OUTDIR)StoreSourceCodeManager.$(O) StoreSourceCodeManager.$(C) StoreSourceCodeManager.$(H): StoreSourceCodeManager.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/AbstractSourceCodeManager.$(H) $(STCHDR)
@@ -228,6 +221,11 @@
 $(OUTDIR)MethodPackageChange.$(O) MethodPackageChange.$(C) MethodPackageChange.$(H): MethodPackageChange.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/Change.$(H) $(INCLUDE_TOP)/stx/libbasic3/ClassChange.$(H) $(INCLUDE_TOP)/stx/libbasic3/MethodChange.$(H) $(STCHDR)
 $(OUTDIR)MethodPrivacyChange.$(O) MethodPrivacyChange.$(C) MethodPrivacyChange.$(H): MethodPrivacyChange.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/Change.$(H) $(INCLUDE_TOP)/stx/libbasic3/ClassChange.$(H) $(INCLUDE_TOP)/stx/libbasic3/MethodChange.$(H) $(STCHDR)
 $(OUTDIR)MethodRemoveChange.$(O) MethodRemoveChange.$(C) MethodRemoveChange.$(H): MethodRemoveChange.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/Change.$(H) $(INCLUDE_TOP)/stx/libbasic3/ClassChange.$(H) $(INCLUDE_TOP)/stx/libbasic3/MethodChange.$(H) $(STCHDR)
+$(OUTDIR)MethodCategoryChange.$(O) MethodCategoryChange.$(C) MethodCategoryChange.$(H): MethodCategoryChange.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/Change.$(H) $(INCLUDE_TOP)/stx/libbasic3/ClassChange.$(H) $(INCLUDE_TOP)/stx/libbasic3/MethodChange.$(H) $(STCHDR)
+$(OUTDIR)MethodDefinitionChange.$(O) MethodDefinitionChange.$(C) MethodDefinitionChange.$(H): MethodDefinitionChange.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/Change.$(H) $(INCLUDE_TOP)/stx/libbasic3/ClassChange.$(H) $(INCLUDE_TOP)/stx/libbasic3/MethodChange.$(H) $(STCHDR)
+$(OUTDIR)MethodPackageChange.$(O) MethodPackageChange.$(C) MethodPackageChange.$(H): MethodPackageChange.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/Change.$(H) $(INCLUDE_TOP)/stx/libbasic3/ClassChange.$(H) $(INCLUDE_TOP)/stx/libbasic3/MethodChange.$(H) $(STCHDR)
+$(OUTDIR)MethodPrivacyChange.$(O) MethodPrivacyChange.$(C) MethodPrivacyChange.$(H): MethodPrivacyChange.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/Change.$(H) $(INCLUDE_TOP)/stx/libbasic3/ClassChange.$(H) $(INCLUDE_TOP)/stx/libbasic3/MethodChange.$(H) $(STCHDR)
+$(OUTDIR)MethodRemoveChange.$(O) MethodRemoveChange.$(C) MethodRemoveChange.$(H): MethodRemoveChange.st $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic3/Change.$(H) $(INCLUDE_TOP)/stx/libbasic3/ClassChange.$(H) $(INCLUDE_TOP)/stx/libbasic3/MethodChange.$(H) $(STCHDR)
 $(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)/stx/libbasic/Collection.$(H) $(INCLUDE_TOP)/stx/libbasic/CompiledCode.$(H) $(INCLUDE_TOP)/stx/libbasic/ConfigurableFeatures.$(H) $(INCLUDE_TOP)/stx/libbasic/Dictionary.$(H) $(INCLUDE_TOP)/stx/libbasic/ExecutableFunction.$(H) $(INCLUDE_TOP)/stx/libbasic/IdentityDictionary.$(H) $(INCLUDE_TOP)/stx/libbasic/Object.$(H) $(INCLUDE_TOP)/stx/libbasic/Set.$(H) $(INCLUDE_TOP)/stx/libbasic/UserPreferences.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
--- a/Make.spec	Wed Sep 07 16:04:00 2016 +0100
+++ b/Make.spec	Mon Nov 28 17:11:46 2016 +0000
@@ -83,7 +83,6 @@
 	BeeProjectDefinitionWriter \
 	BeeProjectSourceWriter \
 	CVSSourceCodeManager \
-	CVSVersionInfo \
 	ChangeSetDiffEntry \
 	ChangeSetDiffSet \
 	ClassChange \
@@ -100,7 +99,6 @@
 	NameSpaceCreationChange \
 	OtherChange \
 	PerforceSourceCodeManager \
-	SVNVersionInfo \
 	SourceCodeManagerUtilitiesForContainerBasedManagers \
 	SourceCodeManagerUtilitiesForWorkspaceBasedManagers \
 	StoreSourceCodeManager \
@@ -166,7 +164,6 @@
     $(OUTDIR_SLASH)BeeProjectDefinitionWriter.$(O) \
     $(OUTDIR_SLASH)BeeProjectSourceWriter.$(O) \
     $(OUTDIR_SLASH)CVSSourceCodeManager.$(O) \
-    $(OUTDIR_SLASH)CVSVersionInfo.$(O) \
     $(OUTDIR_SLASH)ChangeSetDiffEntry.$(O) \
     $(OUTDIR_SLASH)ChangeSetDiffSet.$(O) \
     $(OUTDIR_SLASH)ClassChange.$(O) \
@@ -183,7 +180,6 @@
     $(OUTDIR_SLASH)NameSpaceCreationChange.$(O) \
     $(OUTDIR_SLASH)OtherChange.$(O) \
     $(OUTDIR_SLASH)PerforceSourceCodeManager.$(O) \
-    $(OUTDIR_SLASH)SVNVersionInfo.$(O) \
     $(OUTDIR_SLASH)SourceCodeManagerUtilitiesForContainerBasedManagers.$(O) \
     $(OUTDIR_SLASH)SourceCodeManagerUtilitiesForWorkspaceBasedManagers.$(O) \
     $(OUTDIR_SLASH)StoreSourceCodeManager.$(O) \
--- a/MessageTracer.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/MessageTracer.st	Mon Nov 28 17:11:46 2016 +0000
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
 "
  COPYRIGHT (c) 1994 by Claus Gittinger
 	      All Rights Reserved
@@ -1750,7 +1748,7 @@
      MessageTracer untraceMethod:(SequenceableCollection compiledMethodAt:#quickSortFrom:to:).
     "
     "
-     dont do this:
+     don't do this:
     "
     "
      MessageTracer traceMethod:(Object compiledMethodAt:#at:).
@@ -2045,12 +2043,12 @@
 !MessageTracer class methodsFor:'method wrapping'!
 
 unwrapAllMethods
-    "just in case you dont know what methods have break/trace-points
+    "just in case you don't know what methods have break/trace-points
      on them; this removes them all"
 
     WrappedMethod allInstancesDo:[:aWrapperMethod |
-	aWrapperMethod unregister.
-	self unwrapMethod:aWrapperMethod.
+        aWrapperMethod unregister.
+        self unwrapMethod:aWrapperMethod.
     ]
 
     "
--- a/MethodChange.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/MethodChange.st	Mon Nov 28 17:11:46 2016 +0000
@@ -274,24 +274,56 @@
                 class nameWithoutPrefix = className    
             ]])
             ifFalse:[
-                "/ ask for a replacement class
-                replacementClassName := Dialog 
-                                requestClassName:('Cannot apply change for missing class: %1\\Use replacement class (or press cancel)' bindWith:className) withCRs
-                                initialAnswer:suggestion.
-                replacementClassName isNil ifTrue:[ AbortOperationRequest raise ].
+                |action resources|
 
-                (replacementClassName isEmptyOrNil
-                or:[ (class := Smalltalk classNamed:replacementClassName) isNil]) ifTrue:[
-                    self error:('Cannot apply change for missing class: ' , replacementClassName) mayProceed:true.
-                    ^ self
+                resources := self class projectDefinitionClass classResources.
+                
+                "/ ask for a repair action
+                action := OptionBox
+                            request:(resources stringWithCRs:'Cannot apply change for missing class: %1\\Please choose a repair action:\- choose a replacement class\- define a dummy class\- skip this change\- cancel the load operation' 
+                                     with:className) 
+                            buttonLabels:(resources array:#('Replace...' 'Create New...' 'Skip' 'Cancel'))
+                            values:#(replace create skip cancel).
+                action == #skip ifTrue:[^ self].
+                action == #cancel ifTrue:[ AbortOperationRequest raise].
+                action == #replace ifTrue:[
+                    replacementClassName := Dialog 
+                                    requestClassName:(resources 
+                                                            string:'Replacement class for "%1"?' 
+                                                            with:className)
+                                    initialAnswer:suggestion.
+                ] ifFalse:[
+                    replacementClassName := Dialog 
+                                    requestClassName:(resources 
+                                                            stringWithCRs:'Create dummy class for "%1"?\(will be created in Namespace "%2")' 
+                                                            with:className with:(Class nameSpaceQuerySignal query ? Smalltalk) name)
+                                    initialAnswer:suggestion.
+                ].    
+                replacementClassName isEmptyOrNil ifTrue:[ AbortOperationRequest raise ].
+
+                action == #create ifTrue:[
+                    Object 
+                        subclass:(replacementClassName asSymbol)
+                        instanceVariableNames:''
+                        classVariableNames:''
+                        poolDictionaries:''
+                        category:'* dummy for porting *'
+                ].    
+                class := Smalltalk classNamed:replacementClassName.
+                class isNil ifTrue:[
+                    class := (Class nameSpaceQuerySignal query ? Smalltalk) classNamed:replacementClassName.
+                    class isNil ifTrue:[
+                        self error:(resources string:'Cannot apply change for missing class: %1' with:replacementClassName) mayProceed:true.
+                        ^ self
+                    ].
                 ].
-                class := Smalltalk classNamed:replacementClassName.
 "/                (className endsWith:' class') ifTrue:[
 "/                    class := class theMetaclass
 "/                ] ifFalse:[
 "/                    class := class theNonMetaclass
 "/                ].
-                LastReplacementClass := replacementClassName
+
+                LastReplacementClass := replacementClassName.
             ]
         ]
     ].
--- a/MethodFinder.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/MethodFinder.st	Mon Nov 28 17:11:46 2016 +0000
@@ -1061,7 +1061,7 @@
         #(#'doubleWordAt:put:' #'wordAt:put:' #'longAt:put:bigEndian:' #'shortAt:put:bigEndian:' #'unsignedLongAt:put:bigEndian:' #'unsignedShortAt:put:bigEndian:'
         ) do: [:sel | AddAndRemove add: sel].
 
-"FloatArray"            "Dont know what happens when prims not here"
+"FloatArray"            "Don't know what happens when prims not here"
         false ifTrue: [#(
     "accessing" 
     "arithmetic" 
--- a/PerforceSourceCodeManager.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/PerforceSourceCodeManager.st	Mon Nov 28 17:11:46 2016 +0000
@@ -399,7 +399,7 @@
 ensureDollarsInVersionMethod:aString
     "given the source code of my version method, ensure that it contains dollars for
      proper keyword expansion
-     do nothing here because we dont need this - make our own version
+     do nothing here because we don't need this - make our own version
     "
 
     ^aString
@@ -732,7 +732,7 @@
 !
 
 createModule:moduleName
-    "we dont need to create directories in perforce before checkin"
+    "we don't need to create directories in perforce before checkin"
 
     ^self checkForExistingModule:moduleName
 !
@@ -827,7 +827,6 @@
               #author                -> who checked that revision into the repository
               #date                  -> when was it checked in
               #state                 -> the RCS state
-              #numberOfChangedLines  -> the number of changed line w.r.t the previous
               #logMessage            -> the checkIn log message
 
             revisions are ordered newest first
--- a/SVNVersionInfo.st	Wed Sep 07 16:04:00 2016 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,165 +0,0 @@
-"
- COPYRIGHT (c) 2011 by eXept Software AG
-              All Rights Reserved
-
- This software is furnished under a license and may be used
- only in accordance with the terms of that license and with the
- inclusion of the above copyright notice.   This software may not
- be provided or otherwise made available to, or used by, any
- other person.  No title to or ownership of the software is
- hereby transferred.
-"
-"{ Package: 'stx:libbasic3' }"
-
-"{ NameSpace: Smalltalk }"
-
-VersionInfo subclass:#SVNVersionInfo
-	instanceVariableNames:''
-	classVariableNames:''
-	poolDictionaries:''
-	category:'System-SourceCodeManagement'
-!
-
-!SVNVersionInfo class methodsFor:'documentation'!
-
-copyright
-"
- COPYRIGHT (c) 2011 by eXept Software AG
-              All Rights Reserved
-
- This software is furnished under a license and may be used
- only in accordance with the terms of that license and with the
- inclusion of the above copyright notice.   This software may not
- be provided or otherwise made available to, or used by, any
- other person.  No title to or ownership of the software is
- hereby transferred.
-"
-!
-
-documentation
-"
-    In ancient times, Class used to return a Dictionary when asked for versionInfo.
-    This has been replaced by instances of VersionInfo and subclasses.
-
-    SVNVersionInfo adds some SVN specific data.
-
-    [author:]
-        cg (cg@AQUA-DUO)
-"
-! !
-
-!SVNVersionInfo class methodsFor:'instance creation'!
-
-fromSVNString:aString
-    "{ Pragma: +optSpace }"
-
-    "I know how to parse SVN version id strings.
-     Return an instance filled with revision info which is
-     extracted from aString. This must be in SVN format.
-     Return nil for non-SVN strings"
-
-    |words firstWord info s fn revString user |
-
-    s := aString readStream.
-    s skipSeparators.
-    firstWord := s through:$:.
-
-    info := self new.
-
-    "/
-    "/ supported formats:
-    "/
-    "/ $ Id:       baseFileName rev-int date time user $
-    "/
-    ((firstWord = '$Id:') 
-        or:[ (firstWord = '$ Id:') 
-        or:[ (firstWord = '§Id:')
-        or:[ (firstWord = '§ Id:')]]]
-    ) ifTrue:[
-        "/Skip next : it might be SVN's fixed-width keyword"
-        s peek == $: ifTrue:[s next].
-
-        words := s upToEnd asCollectionOfWords readStream.
-        (words peek = '$') ifTrue:[
-            "/ empty fixed-width version method - '$Id: SVNVersionInfo.st,v 1.10 2015-03-02 12:01:06 cg Exp $'
-            ^nil
-        ].
-        info fileName:(fn := words next).
-        (fn endsWith:',v') ifTrue:[
-            "/ not an SVN version
-            ^ nil
-        ].
-        info revision:(revString := words next).
-        "/ do not use matchesRegex: here (regex is an optional package)
-        (revString conform:[:c | c isDigit]) ifFalse:[
-            "/ not an SVN version
-            ^ nil
-        ].
-        info date:(words next).
-        info time:(words next).
-        user := words next.
-        (user includesAny:'$§') ifTrue:[
-            info user: (user copyTo: (user indexOfAny:'$§') - 1)
-        ] ifFalse:[
-            info user: user.
-            ( '$§' includes:words next first) ifFalse:[
-                "/ not an SVN version
-                ^ nil
-            ]
-        ].
-        words atEnd ifFalse:[
-            ^ nil
-        ].
-        ^ info
-    ].
-
-    ^ nil
-
-    "
-     SVNVersionInfo fromSVNString:('$' , 'Revision: 1.122 $')   
-     SVNVersionInfo fromSVNString:(SourceCodeManager version)   
-     SVNVersionInfo fromSVNString:(ApplicationDefinition version_SVN)
-     SVNVersionInfo fromSVNString:(ApplicationDefinition version_CVS)
-     CVSVersionInfo fromRCSString:(ApplicationDefinition version_SVN)   
-     CVSVersionInfo fromRCSString:(ApplicationDefinition version_CVS)   
-    "
-
-    "Created: / 29-09-2011 / 17:14:56 / cg"
-    "Modified: / 31-03-2012 / 01:12:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!SVNVersionInfo methodsFor:'accessing'!
-
-keysAndValuesDo:aBlock
-
-    super keysAndValuesDo:aBlock.
-    "JV@2011-11-25: Fake repositoryPathName, as other tools
-     requires this. Returning nil should be fine, but then,
-     SourceCodeManagerUtilities constructs names as they are
-     in CVS, sigh"
-    aBlock value: #repositoryPathName value: self repositoryPathName
-
-    "Created: / 25-11-2011 / 18:58:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-repositoryPathName
-
-    ^fileName
-
-    "Created: / 25-11-2011 / 18:57:23 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!SVNVersionInfo class methodsFor:'documentation'!
-
-version
-    ^ '$Header: /cvs/stx/stx/libbasic3/SVNVersionInfo.st,v 1.10 2015-03-02 12:01:06 cg Exp $'
-!
-
-version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic3/SVNVersionInfo.st,v 1.10 2015-03-02 12:01:06 cg Exp $'
-!
-
-version_SVN
-    ^ '$Id: SVNVersionInfo.st,v 1.10 2015-03-02 12:01:06 cg Exp $'
-! !
-
--- a/SourceCodeManagerUtilities.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/SourceCodeManagerUtilities.st	Mon Nov 28 17:11:46 2016 +0000
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
 "
  COPYRIGHT (c) 2000 eXept Software AG
               All Rights Reserved
@@ -2494,6 +2492,21 @@
     "Modified: / 12-09-2011 / 11:56:01 / cg"
 !
 
+compareProject:aProject withRepositoryVersionTaggedAs:aTag extensionsOnly:extensionsOnly
+    |diffSet|
+
+    diffSet := self diffSetOfProject:aProject againstRepositoryVersionTaggedAs:aTag extensionsOnly:extensionsOnly.
+    VersionDiffBrowser 
+        openOnDiffSet:diffSet 
+        labelA:'Repository' 
+        labelB:'Image' 
+        title:('Differences of %1' bindWith:aProject)
+        ignoreExtensions:true
+        ignoreVersionMethods:true.
+
+    "Created: / 12-11-2016 / 03:39:48 / cg"
+!
+
 compareProjectWithRepository:aProject
     ^ self compareProject:aProject withRepositoryVersionFrom:nil
 !
@@ -3212,6 +3225,16 @@
         orTag:symbolicName
 !
 
+diffSetOfProject:aProject againstRepositoryVersionTaggedAs:aTag extensionsOnly:extensionsOnly
+    ^ self
+        diffSetOfProject:aProject 
+        againstRepositoryVersionFrom:nil
+        orTag:aTag
+        extensionsOnly:extensionsOnly
+
+    "Created: / 12-11-2016 / 03:41:23 / cg"
+!
+
 ensureCorrectVersionMethodsInClass:aClass usingManager:aManager
     |theMetaclass versionMthd src newSrc versionMethodName oldVersionMethodName|
 
@@ -4068,15 +4091,30 @@
 
         "/ fill in timestamps
         revisions do:[:each |
-            |timestampString timestamp|
-
-            timestampString := each at:#date ifAbsent:nil.
-            timestampString notNil ifTrue:[
-                timestamp := Timestamp readFrom:timestampString onError:nil.
-                timestamp notNil ifTrue:[
-                    each at:#timestamp put:timestamp.
-                    each at:#day put:timestamp asDate.
-                ].
+            |dateOrDateString timeOrTimeString timestampString timestamp|
+
+            dateOrDateString := each at:#date ifAbsent:nil.
+            timeOrTimeString := each at:#time ifAbsent:nil.
+            dateOrDateString notNil ifTrue:[
+                dateOrDateString isString ifTrue:[
+                    timestamp := Timestamp readFrom:dateOrDateString onError:nil.
+                    timestamp notNil ifTrue:[
+                        each at:#timestamp put:timestamp.
+                        each at:#day put:timestamp asDate.
+                    ].
+                ] ifFalse:[
+                    timeOrTimeString isString ifTrue:[
+                    self halt.
+    
+                    ] ifFalse:[
+                        (dateOrDateString notNil and:[timeOrTimeString notNil]) ifTrue:[
+                            timestamp := Timestamp fromDate:dateOrDateString andTime:timeOrTimeString.
+                            each at:#timestamp put:timestamp.
+                        ] ifFalse:[
+                            self halt
+                        ]    
+                    ]
+                ].    
             ].
         ].
 
--- a/SystemEnvironment.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/SystemEnvironment.st	Mon Nov 28 17:11:46 2016 +0000
@@ -335,6 +335,7 @@
 !
 
 allKeysDo:aBlock
+    <resource: #obsolete>
     "evaluate the argument, aBlock for all keys in the Smalltalk dictionary"
 
     self keysDo:aBlock
--- a/VersionInfo.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/VersionInfo.st	Mon Nov 28 17:11:46 2016 +0000
@@ -14,7 +14,8 @@
 "{ NameSpace: Smalltalk }"
 
 Object subclass:#VersionInfo
-	instanceVariableNames:'revision binaryRevision user date time fileName'
+	instanceVariableNames:'moreAttributes logMessage revision binaryRevision user timestamp
+		date time fileName state'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'System-SourceCodeManagement'
@@ -52,13 +53,12 @@
 
 !VersionInfo methodsFor:'accessing'!
 
-at:aKey
+at:aSymbolKey
     "backward compatible dictionary-like accessing"
 
-    (self respondsTo:aKey) ifTrue:[
-        ^ self perform:aKey
-    ].
-    ^ self errorKeyNotFound:aKey
+    ^ self 
+        at:aSymbolKey 
+        ifAbsent:[ self warn:'VersionInfo: no such property: ',aSymbolKey. nil]
 
     "
      self new at:#binaryRevision
@@ -68,13 +68,16 @@
     "Modified: / 22-10-2008 / 20:23:31 / cg"
 !
 
-at:aKey ifAbsent:replacement
+at:aSymbolKey ifAbsent:replacement
     "backward compatible dictionary-like accessing"
 
-    (self respondsTo:aKey) ifTrue:[
-        ^ (self perform:aKey) ? replacement
+    (self respondsTo:aSymbolKey) ifTrue:[
+        ^ (self perform:aSymbolKey)
     ].
-    ^ replacement
+    moreAttributes notNil ifTrue:[
+        ^ moreAttributes at:aSymbolKey ifAbsent:replacement
+    ].    
+    ^ replacement value
 
     "
      self new at:#binaryRevision
@@ -84,18 +87,25 @@
     "Created: / 22-10-2008 / 20:19:42 / cg"
 !
 
-at:aKey put:value
+at:aSymbolKey put:value
     "backward compatible dictionary-like accessing"
 
-    (self respondsTo:aKey) ifTrue:[
-        self perform:aKey asMutator with:value.
+    |setter|
+
+    setter := aSymbolKey asMutator.
+    (self respondsTo:setter) ifTrue:[
+        self perform:setter with:value.
         ^ value "/ sigh
     ].
-    ^ self errorKeyNotFound:aKey
+    moreAttributes isNil ifTrue:[
+        moreAttributes := IdentityDictionary new.
+    ].
+    moreAttributes at:aSymbolKey put:value.
+    ^ value "/ sigh
 
     "
      self new at:#binaryRevision put:#bar
-     self new at:#foo put:#bar
+     self new at:#foo put:#bar; yourself
     "
 
     "Created: / 22-10-2008 / 20:20:54 / cg"
@@ -107,15 +117,22 @@
     "Created: / 21-12-2011 / 23:09:54 / cg"
 !
 
+author:aString
+    ^ self user:aString
+
+    "Created: / 21-12-2011 / 23:09:54 / cg"
+!
+
 binaryRevision
     ^ binaryRevision
 !
 
-binaryRevision:something
-    binaryRevision := something.
+binaryRevision:aString
+    binaryRevision := aString.
 !
 
 date
+    timestamp notNil ifTrue:[^ timestamp asDate].
     ^ date
 !
 
@@ -123,20 +140,37 @@
     date := something.
 !
 
+day
+    ^ date
+!
+
 fileName
     ^ fileName
 !
 
-fileName:something
-    fileName := something.
+fileName:aString
+    fileName := aString.
 !
 
 keysAndValuesDo:aBlock
     self class instVarNames do:[:nm |
-        aBlock value:(nm asSymbol) value:(self perform:nm asSymbol)
+        nm ~= 'moreAttributes' ifTrue:[   
+            aBlock value:(nm asSymbol) value:(self perform:nm asSymbol)
+        ].
+    ].
+    moreAttributes notNil ifTrue:[
+        moreAttributes keysAndValuesDo:aBlock
     ].
+    
+    "Created: / 22-10-2008 / 20:48:08 / cg"
+!
 
-    "Created: / 22-10-2008 / 20:48:08 / cg"
+logMessage
+    ^ logMessage
+!
+
+logMessage:aString
+    logMessage := aString.
 !
 
 majorVersion
@@ -179,8 +213,16 @@
     ^ revision
 !
 
-revision:something
-    revision := something.
+revision:aString
+    revision := aString.
+!
+
+state
+    ^ state
+!
+
+state:something
+    state := something.
 !
 
 symbolicVersionName
@@ -195,6 +237,7 @@
 !
 
 time
+    timestamp notNil ifTrue:[^ timestamp asTime].
     ^ time
 !
 
@@ -209,9 +252,22 @@
     "Created: / 04-12-2011 / 10:06:02 / cg"
 !
 
+timestamp
+    timestamp notNil ifTrue:[^ timestamp].
+    date isNil ifTrue:[^ nil].
+    time isNil ifTrue:[^ date asTimestamp].
+    ^ Timestamp fromDate:date andTime:time
+!
+
+timestamp:aTimestamp
+    timestamp := aTimestamp
+
+    "Created: / 04-12-2011 / 10:06:02 / cg"
+!
+
 timezone
-    "raise an error: must be redefined in concrete subclass(es)"
-
+    timestamp notNil ifTrue:[^ timestamp timezone].
+    
     ^ nil "Not known"
 
     "Modified: / 23-11-2011 / 13:54:56 / Jan Vrany <jan.vrany@fit.cvut.cz>"
@@ -221,17 +277,17 @@
     ^ user
 !
 
-user:something
-    user := something.
+user:aString
+    user := aString.
 ! !
 
 !VersionInfo class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic3/VersionInfo.st,v 1.10 2015-02-03 17:51:15 cg Exp $'
+    ^ '$Header$'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic3/VersionInfo.st,v 1.10 2015-02-03 17:51:15 cg Exp $'
+    ^ '$Header$'
 ! !
 
--- a/WrappedMethod.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/WrappedMethod.st	Mon Nov 28 17:11:46 2016 +0000
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
 "
  COPYRIGHT (c) 1994 by Claus Gittinger
 	      All Rights Reserved
@@ -421,7 +419,7 @@
 
 isBreakpointed
     "return true, if the receiver is a wrapped method for a breakpoint.
-     Ask the messageTracer, since I dont know if its a break or trace"
+     Ask the messageTracer, since I don't know if its a break or trace"
 
     ^ (MessageTracer isTrapped:self)
 
@@ -438,7 +436,7 @@
 
 isTimed
     "return true, if the receiver is a wrapped method for a time measurement.
-     Ask the messageTracer, since I dont know if its a break or trace"
+     Ask the messageTracer, since I don't know if its a break or trace"
 
     ^ (MessageTracer isTiming:self)
 
@@ -447,7 +445,7 @@
 
 isTraced
     "return true, if the receiver is a wrapped method for a trace point.
-     Ask the messageTracer, since I dont know if its a break or trace"
+     Ask the messageTracer, since I don't know if its a break or trace"
 
     ^ (MessageTracer isTrapped:self) not
 
@@ -515,14 +513,14 @@
 !WrappedMethod class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic3/WrappedMethod.st,v 1.45 2015-05-27 14:26:30 cg Exp $'
+    ^ '$Header$'
 !
 
 version_CVS
-    ^ '$Header: /cvs/stx/stx/libbasic3/WrappedMethod.st,v 1.45 2015-05-27 14:26:30 cg Exp $'
+    ^ '$Header$'
 !
 
 version_SVN
-    ^ '$Id: WrappedMethod.st,v 1.45 2015-05-27 14:26:30 cg Exp $'
+    ^ '$Id$'
 ! !
 
--- a/abbrev.stc	Wed Sep 07 16:04:00 2016 +0100
+++ b/abbrev.stc	Mon Nov 28 17:11:46 2016 +0000
@@ -33,7 +33,6 @@
 BeeProjectDefinitionWriter BeeProjectDefinitionWriter stx:libbasic3 'Kernel-Classes-Support' 0
 BeeProjectSourceWriter BeeProjectSourceWriter stx:libbasic3 'Kernel-Classes-Support' 0
 CVSSourceCodeManager CVSSourceCodeManager stx:libbasic3 'System-SourceCodeManagement' 0
-CVSVersionInfo CVSVersionInfo stx:libbasic3 'System-SourceCodeManagement' 0
 ChangeSetDiffEntry ChangeSetDiffEntry stx:libbasic3 'System-Changes-Diff' 0
 ChangeSetDiffSet ChangeSetDiffSet stx:libbasic3 'System-Changes-Diff' 0
 ClassChange ClassChange stx:libbasic3 'System-Changes' 0
@@ -50,7 +49,6 @@
 NameSpaceCreationChange NameSpaceCreationChange stx:libbasic3 'System-Changes' 0
 OtherChange OtherChange stx:libbasic3 'System-Changes' 0
 PerforceSourceCodeManager PerforceSourceCodeManager stx:libbasic3 'System-SourceCodeManagement' 0
-SVNVersionInfo SVNVersionInfo stx:libbasic3 'System-SourceCodeManagement' 0
 SourceCodeManagerUtilitiesForContainerBasedManagers SourceCodeManagerUtilitiesForContainerBasedManagers stx:libbasic3 'System-SourceCodeManagement' 0
 SourceCodeManagerUtilitiesForWorkspaceBasedManagers SourceCodeManagerUtilitiesForWorkspaceBasedManagers stx:libbasic3 'System-SourceCodeManagement' 0
 StoreSourceCodeManager StoreSourceCodeManager stx:libbasic3 'System-SourceCodeManagement' 0
--- a/bc.mak	Wed Sep 07 16:04:00 2016 +0100
+++ b/bc.mak	Mon Nov 28 17:11:46 2016 +0000
@@ -79,8 +79,6 @@
 
 # BEGINMAKEDEPEND --- do not remove this line; make depend needs it
 $(OUTDIR)AbstractSourceCodeManager.$(O) AbstractSourceCodeManager.$(C) AbstractSourceCodeManager.$(H): AbstractSourceCodeManager.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)BeeProjectWriter.$(O) BeeProjectWriter.$(C) BeeProjectWriter.$(H): BeeProjectWriter.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)BeeSourceWriter.$(O) BeeSourceWriter.$(C) BeeSourceWriter.$(H): BeeSourceWriter.st $(INCLUDE_TOP)\stx\libbasic\AbstractSourceFileWriter.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\SmalltalkChunkFileSourceWriter.$(H) $(STCHDR)
 $(OUTDIR)CallChain.$(O) CallChain.$(C) CallChain.$(H): CallChain.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)Change.$(O) Change.$(C) Change.$(H): Change.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)ChangeDeltaInformation.$(O) ChangeDeltaInformation.$(C) ChangeDeltaInformation.$(H): ChangeDeltaInformation.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
@@ -102,15 +100,11 @@
 $(OUTDIR)SourceCodeManagerUtilities.$(O) SourceCodeManagerUtilities.$(C) SourceCodeManagerUtilities.$(H): SourceCodeManagerUtilities.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)SystemEnvironment.$(O) SystemEnvironment.$(C) SystemEnvironment.$(H): SystemEnvironment.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)SystemOrganizer.$(O) SystemOrganizer.$(C) SystemOrganizer.$(H): SystemOrganizer.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
-$(OUTDIR)SystemProfiler.$(O) SystemProfiler.$(C) SystemProfiler.$(H): SystemProfiler.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)TraceBuffer.$(O) TraceBuffer.$(C) TraceBuffer.$(H): TraceBuffer.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)VersionInfo.$(O) VersionInfo.$(C) VersionInfo.$(H): VersionInfo.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)WrappedMethod.$(O) WrappedMethod.$(C) WrappedMethod.$(H): WrappedMethod.st $(INCLUDE_TOP)\stx\libbasic\CompiledCode.$(H) $(INCLUDE_TOP)\stx\libbasic\ExecutableFunction.$(H) $(INCLUDE_TOP)\stx\libbasic\Method.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(STCHDR)
 $(OUTDIR)stx_libbasic3.$(O) stx_libbasic3.$(C) stx_libbasic3.$(H): stx_libbasic3.st $(INCLUDE_TOP)\stx\libbasic\LibraryDefinition.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\ProjectDefinition.$(H) $(STCHDR)
-$(OUTDIR)BeeProjectDefinitionWriter.$(O) BeeProjectDefinitionWriter.$(C) BeeProjectDefinitionWriter.$(H): BeeProjectDefinitionWriter.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\BeeProjectWriter.$(H) $(STCHDR)
-$(OUTDIR)BeeProjectSourceWriter.$(O) BeeProjectSourceWriter.$(C) BeeProjectSourceWriter.$(H): BeeProjectSourceWriter.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\BeeProjectWriter.$(H) $(STCHDR)
-$(OUTDIR)CVSSourceCodeManager.$(O) CVSSourceCodeManager.$(C) CVSSourceCodeManager.$(H): CVSSourceCodeManager.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\AbstractSourceCodeManager.$(H) $(STCHDR)
-$(OUTDIR)CVSVersionInfo.$(O) CVSVersionInfo.$(C) CVSVersionInfo.$(H): CVSVersionInfo.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\VersionInfo.$(H) $(STCHDR)
+$(OUTDIR)CVSSourceCodeManager.$(O) CVSSourceCodeManager.$(C) CVSSourceCodeManager.$(H): CVSSourceCodeManager.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\AbstractSourceCodeManager.$(H) $(INCLUDE_TOP)\stx\libbasic3\VersionInfo.$(H) $(STCHDR)
 $(OUTDIR)ChangeSetDiffEntry.$(O) ChangeSetDiffEntry.$(C) ChangeSetDiffEntry.$(H): ChangeSetDiffEntry.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\ChangeSetDiffComponent.$(H) $(STCHDR)
 $(OUTDIR)ChangeSetDiffSet.$(O) ChangeSetDiffSet.$(C) ChangeSetDiffSet.$(H): ChangeSetDiffSet.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\ChangeSetDiffComponent.$(H) $(STCHDR)
 $(OUTDIR)ClassChange.$(O) ClassChange.$(C) ClassChange.$(H): ClassChange.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\Change.$(H) $(STCHDR)
@@ -127,7 +121,6 @@
 $(OUTDIR)NameSpaceCreationChange.$(O) NameSpaceCreationChange.$(C) NameSpaceCreationChange.$(H): NameSpaceCreationChange.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\Change.$(H) $(STCHDR)
 $(OUTDIR)OtherChange.$(O) OtherChange.$(C) OtherChange.$(H): OtherChange.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\Change.$(H) $(STCHDR)
 $(OUTDIR)PerforceSourceCodeManager.$(O) PerforceSourceCodeManager.$(C) PerforceSourceCodeManager.$(H): PerforceSourceCodeManager.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) $(INCLUDE_TOP)\stx\libbasic\ProceedableError.$(H) $(INCLUDE_TOP)\stx\libbasic3\AbstractSourceCodeManager.$(H) $(INCLUDE_TOP)\stx\libbasic3\VersionInfo.$(H) $(STCHDR)
-$(OUTDIR)SVNVersionInfo.$(O) SVNVersionInfo.$(C) SVNVersionInfo.$(H): SVNVersionInfo.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\VersionInfo.$(H) $(STCHDR)
 $(OUTDIR)SourceCodeManagerUtilitiesForContainerBasedManagers.$(O) SourceCodeManagerUtilitiesForContainerBasedManagers.$(C) SourceCodeManagerUtilitiesForContainerBasedManagers.$(H): SourceCodeManagerUtilitiesForContainerBasedManagers.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\SourceCodeManagerUtilities.$(H) $(STCHDR)
 $(OUTDIR)SourceCodeManagerUtilitiesForWorkspaceBasedManagers.$(O) SourceCodeManagerUtilitiesForWorkspaceBasedManagers.$(C) SourceCodeManagerUtilitiesForWorkspaceBasedManagers.$(H): SourceCodeManagerUtilitiesForWorkspaceBasedManagers.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\SourceCodeManagerUtilities.$(H) $(STCHDR)
 $(OUTDIR)StoreSourceCodeManager.$(O) StoreSourceCodeManager.$(C) StoreSourceCodeManager.$(H): StoreSourceCodeManager.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\AbstractSourceCodeManager.$(H) $(STCHDR)
@@ -156,6 +149,11 @@
 $(OUTDIR)MethodPackageChange.$(O) MethodPackageChange.$(C) MethodPackageChange.$(H): MethodPackageChange.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\Change.$(H) $(INCLUDE_TOP)\stx\libbasic3\ClassChange.$(H) $(INCLUDE_TOP)\stx\libbasic3\MethodChange.$(H) $(STCHDR)
 $(OUTDIR)MethodPrivacyChange.$(O) MethodPrivacyChange.$(C) MethodPrivacyChange.$(H): MethodPrivacyChange.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\Change.$(H) $(INCLUDE_TOP)\stx\libbasic3\ClassChange.$(H) $(INCLUDE_TOP)\stx\libbasic3\MethodChange.$(H) $(STCHDR)
 $(OUTDIR)MethodRemoveChange.$(O) MethodRemoveChange.$(C) MethodRemoveChange.$(H): MethodRemoveChange.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\Change.$(H) $(INCLUDE_TOP)\stx\libbasic3\ClassChange.$(H) $(INCLUDE_TOP)\stx\libbasic3\MethodChange.$(H) $(STCHDR)
+$(OUTDIR)MethodCategoryChange.$(O) MethodCategoryChange.$(C) MethodCategoryChange.$(H): MethodCategoryChange.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\Change.$(H) $(INCLUDE_TOP)\stx\libbasic3\ClassChange.$(H) $(INCLUDE_TOP)\stx\libbasic3\MethodChange.$(H) $(STCHDR)
+$(OUTDIR)MethodDefinitionChange.$(O) MethodDefinitionChange.$(C) MethodDefinitionChange.$(H): MethodDefinitionChange.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\Change.$(H) $(INCLUDE_TOP)\stx\libbasic3\ClassChange.$(H) $(INCLUDE_TOP)\stx\libbasic3\MethodChange.$(H) $(STCHDR)
+$(OUTDIR)MethodPackageChange.$(O) MethodPackageChange.$(C) MethodPackageChange.$(H): MethodPackageChange.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\Change.$(H) $(INCLUDE_TOP)\stx\libbasic3\ClassChange.$(H) $(INCLUDE_TOP)\stx\libbasic3\MethodChange.$(H) $(STCHDR)
+$(OUTDIR)MethodPrivacyChange.$(O) MethodPrivacyChange.$(C) MethodPrivacyChange.$(H): MethodPrivacyChange.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\Change.$(H) $(INCLUDE_TOP)\stx\libbasic3\ClassChange.$(H) $(INCLUDE_TOP)\stx\libbasic3\MethodChange.$(H) $(STCHDR)
+$(OUTDIR)MethodRemoveChange.$(O) MethodRemoveChange.$(C) MethodRemoveChange.$(H): MethodRemoveChange.st $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic3\Change.$(H) $(INCLUDE_TOP)\stx\libbasic3\ClassChange.$(H) $(INCLUDE_TOP)\stx\libbasic3\MethodChange.$(H) $(STCHDR)
 $(OUTDIR)extensions.$(O): extensions.st $(INCLUDE_TOP)\stx\libbasic\Collection.$(H) $(INCLUDE_TOP)\stx\libbasic\CompiledCode.$(H) $(INCLUDE_TOP)\stx\libbasic\ConfigurableFeatures.$(H) $(INCLUDE_TOP)\stx\libbasic\Dictionary.$(H) $(INCLUDE_TOP)\stx\libbasic\ExecutableFunction.$(H) $(INCLUDE_TOP)\stx\libbasic\IdentityDictionary.$(H) $(INCLUDE_TOP)\stx\libbasic\Object.$(H) $(INCLUDE_TOP)\stx\libbasic\Set.$(H) $(INCLUDE_TOP)\stx\libbasic\UserPreferences.$(H) $(STCHDR)
 
 # ENDMAKEDEPEND --- do not remove this line
--- a/bmake.bat	Wed Sep 07 16:04:00 2016 +0100
+++ b/bmake.bat	Mon Nov 28 17:11:46 2016 +0000
@@ -4,9 +4,7 @@
 @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% %*
 
--- a/libInit.cc	Wed Sep 07 16:04:00 2016 +0100
+++ b/libInit.cc	Mon Nov 28 17:11:46 2016 +0000
@@ -17,8 +17,6 @@
 #endif
 
 extern void _AbstractSourceCodeManager_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
-extern void _BeeProjectWriter_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
-extern void _BeeSourceWriter_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _CallChain_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _Change_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _ChangeDeltaInformation_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
@@ -40,15 +38,11 @@
 extern void _SourceCodeManagerUtilities_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _SystemEnvironment_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _SystemOrganizer_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
-extern void _SystemProfiler_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _TraceBuffer_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _VersionInfo_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _WrappedMethod_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _stx_137libbasic3_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
-extern void _BeeProjectDefinitionWriter_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
-extern void _BeeProjectSourceWriter_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _CVSSourceCodeManager_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
-extern void _CVSVersionInfo_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _ChangeSetDiffEntry_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _ChangeSetDiffSet_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _ClassChange_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
@@ -65,7 +59,6 @@
 extern void _NameSpaceCreationChange_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _OtherChange_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _PerforceSourceCodeManager_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
-extern void _SVNVersionInfo_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _SourceCodeManagerUtilitiesForContainerBasedManagers_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _SourceCodeManagerUtilitiesForWorkspaceBasedManagers_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _StoreSourceCodeManager_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
@@ -94,6 +87,14 @@
 extern void _MethodPackageChange_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _MethodPrivacyChange_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 extern void _MethodRemoveChange_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _MethodPackageChange_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _MethodPrivacyChange_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _MethodRemoveChange_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _BeeProjectWriter_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _BeeSourceWriter_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _SystemProfiler_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _BeeProjectDefinitionWriter_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
+extern void _BeeProjectSourceWriter_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 
 extern void _stx_137libbasic3_extensions_Init(int pass, struct __vmData__ *__pRT__, OBJ snd);
 
@@ -140,7 +141,6 @@
     _BeeProjectDefinitionWriter_Init(pass,__pRT__,snd);
     _BeeProjectSourceWriter_Init(pass,__pRT__,snd);
     _CVSSourceCodeManager_Init(pass,__pRT__,snd);
-    _CVSVersionInfo_Init(pass,__pRT__,snd);
     _ChangeSetDiffEntry_Init(pass,__pRT__,snd);
     _ChangeSetDiffSet_Init(pass,__pRT__,snd);
     _ClassChange_Init(pass,__pRT__,snd);
@@ -157,7 +157,6 @@
     _NameSpaceCreationChange_Init(pass,__pRT__,snd);
     _OtherChange_Init(pass,__pRT__,snd);
     _PerforceSourceCodeManager_Init(pass,__pRT__,snd);
-    _SVNVersionInfo_Init(pass,__pRT__,snd);
     _SourceCodeManagerUtilitiesForContainerBasedManagers_Init(pass,__pRT__,snd);
     _SourceCodeManagerUtilitiesForWorkspaceBasedManagers_Init(pass,__pRT__,snd);
     _StoreSourceCodeManager_Init(pass,__pRT__,snd);
--- a/mingwmake.bat	Wed Sep 07 16:04:00 2016 +0100
+++ b/mingwmake.bat	Mon Nov 28 17:11:46 2016 +0000
@@ -4,9 +4,6 @@
 @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
@@ -16,3 +13,5 @@
 
 
 
+
+
--- a/stx_libbasic3.st	Wed Sep 07 16:04:00 2016 +0100
+++ b/stx_libbasic3.st	Mon Nov 28 17:11:46 2016 +0000
@@ -1,5 +1,5 @@
 "
- COPYRIGHT (c) 2006 by eXept Software AG
+ COPYRIGHT (c) Claus Gittinger / eXept Software AG
               All Rights Reserved
 
  This software is furnished under a license and may be used
@@ -24,7 +24,7 @@
 
 copyright
 "
- COPYRIGHT (c) 2006 by eXept Software AG
+ COPYRIGHT (c) Claus Gittinger / eXept Software AG
               All Rights Reserved
 
  This software is furnished under a license and may be used
@@ -42,6 +42,12 @@
 
     This library contains source-code-management, packaging, change and history related stuff.
     It is normally not required in end-user stand alone applications.
+
+    [author:]
+        cg
+
+    [primary maintainer:]
+        cg
 "
 ! !
 
@@ -218,7 +224,6 @@
         BeeProjectDefinitionWriter
         BeeProjectSourceWriter
         CVSSourceCodeManager
-        CVSVersionInfo
         ChangeSetDiffEntry
         ChangeSetDiffSet
         ClassChange
@@ -235,7 +240,6 @@
         NameSpaceCreationChange
         OtherChange
         PerforceSourceCodeManager
-        SVNVersionInfo
         SourceCodeManagerUtilitiesForContainerBasedManagers
         SourceCodeManagerUtilitiesForWorkspaceBasedManagers
         StoreSourceCodeManager
@@ -302,7 +306,9 @@
 companyName
     "Return a companyname which will appear in <lib>.rc"
 
-    ^ 'eXept Software AG'
+    ^ 'Claus Gittinger / eXept Software AG'
+
+    "Modified: / 18-11-2016 / 11:48:34 / cg"
 !
 
 description
@@ -316,9 +322,9 @@
 legalCopyright
     "Return a copyright string which will appear in <lib>.rc"
 
-    ^ 'Copyright Claus Gittinger 1988-2012\nCopyright eXept Software AG 2012'
+    ^ 'Copyright Claus Gittinger 1988\nCopyright eXept Software AG 2012'
 
-    "Modified: / 18-07-2012 / 19:11:26 / cg"
+    "Modified: / 18-11-2016 / 12:17:42 / cg"
 !
 
 productName
--- a/vcmake.bat	Wed Sep 07 16:04:00 2016 +0100
+++ b/vcmake.bat	Mon Nov 28 17:11:46 2016 +0000
@@ -10,9 +10,7 @@
     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% %*