eXept Software AG Logo

Smalltalk/X Webserver

Documentation of class 'AbstractSourceCodeManager':

Home

Documentation
www.exept.de
Everywhere
for:
[back]

Class: AbstractSourceCodeManager


Inheritance:

   Object
   |
   +--AbstractSourceCodeManager
      |
      +--CVSSourceCodeManager
      |
      +--DataBaseSourceCodeManager
      |
      +--FileBasedSourceCodeManager
      |
      +--GitSourceCodeManager
      |
      +--MercurialSourceCodeManager
      |
      +--PerforceSourceCodeManager
      |
      +--StoreSourceCodeManager

Package:
stx:libbasic3
Category:
System-SourceCodeManagement
Version:
rev: 1.390 date: 2019/07/07 21:42:57
user: cg
file: AbstractSourceCodeManager.st directory: libbasic3
module: stx stc-classLibrary: libbasic3
Author:
Claus Gittinger

Description:


Abstract superclass for sourceCodeManagers.

Concrete subclasses provide access to a source repository.
Most protocol here traps into subclassResponsbility errors.
Please read more documentation in concrete subclasses 
(especially: CVSSourceCodeManager) for how to use this manager and
what to redefine in another repository manager if required.


Class protocol:

* uncategorized *
o  repositoryTopDirectoryFromSCMRoot
return the top of the repository.

** This method raises an error - it must be redefined in concrete classes **

accessing
o  availableManagers
self availableManagers

o  branchStartTagFor: branchName
this tag is used to tag the original starting point of a branch;
i.e. the head version from which the branch was created.
Here, we use <branchTagPrefix><branchName>_0

o  branchTagFor: branchName
this tag is used to tag the current branch-head of a branch (or the branch as such);
i.e. the last version checked onto the branch.
Here, we use <branchTagPrefix><branchName>

o  branchTagPrefix

o  cacheDirectoryName
return the name of the cache directory, where checked out class
sources are kept for faster access. The default is '/tmp/stx_sourceCache'.
This cache is shared among all ST/X users on a system.

o  cacheDirectoryName: aStringOrFilename
set the name of the cache directory, where checked out class
sources are kept for faster access. The default is '/tmp/stx_sourceCache'.
This cache is shared among all ST/X users on a system.
The directory is typically set via the launcher's setting menu,
or from a startup rc-file.

o  cachingSources
return true, if source caching is enabled.
(see cacheDirectoryName for what that means)

o  cachingSources: aBoolean
enable/disable the caching of source files.
(see cacheDirectoryName for what that means)

usage example(s):

     AbstractSourceCodeManager cachingSources:true

o  defaultManager
return the default sourceCodeManager class

o  enabledManagers
Return list of source code managers that are enabled

usage example(s):

     self enabledManagers   

o  managerForMatchingModule: aPackageIDMatchString put: aSourceCodeManagerClass
update the per-module manager definitions, adding a manager class for a matchString

o  managerForPackage: aPackageID
return the sourceCodeManager for a aPackageID, nil if unspecified in the manager per package list

usage example(s):

     self managerForPackage:'stx:libbasic' 
     self managerForPackage:'stx:libbasic2'
     self managerForPackage:'exept:expecco'  

o  managerPerMatchingModuleDefinitions
return the sourceCodeManager definitions

o  managerPerMatchingModuleDefinitions: aCollection
set the sourceCodeManager definitions; must be an orderedCollection of packageMatchString -> manager
associations
(not a dictionary, because order is relevant in the matching process, where the first match counts)

o  named: managerTypeName
AbstractSourceCodeManager named: 'CVS'
AbstractSourceCodeManager named: 'Perforce'

o  repositoryInfoPerModule
return the dictionary, which associates CVSRoots to module names.
If no entry is contained in this dictionary for some module,
the default cvsRoot (CVSRoot) will be used.

o  repositoryInfoPerModule: info
ignore here

o  repositoryName
return the name of the repository.
Since this is an abstract class, return nil (i.e. none)

o  repositoryNameForPackage: packageId
Return the repository URL for the given package.
Used for testing/debugging source code management configuration

** This method raises an error - it must be redefined in concrete classes **

o  shownInBrowserMenus
can be redefined in subclasses which can be suppressed in the browser's menus

o  shownInBrowserMenus: aBoolean
can be redefined in subclasses which can be suppressed in the browser's menus

o  useWorkTree
return the setting of useWorkTree, which (eventually)
controls if an up-to-date view of a CVS working tree should be
kept in sync. This is not yet implemented.

o  useWorkTree: aBoolean
enable/disable the useWorkTree feature, which (eventually)
controls if an up-to-date view of a CVS working tree should be
kept in sync. This is not yet implemented.

o  utilities
Returns a 'utilities' object that can be used by tools.

By default, it returns an instance of
SourceCodeManagerUtilities with receiver as its
manager, but individual managers may override this
method and supply its own, customized utilities.

usage example(s):

     SourceCodeManager defaultManager
     SourceCodeManager defaultManager utilities

o  workTreeDirectoryName
return the name of the workTree, which is kept in sync
with the current class versions. This is not yet implemented

o  workTreeDirectoryName: aStringOrFilename
set the name of the workTree, which is kept in sync
with the current class versions. This is not yet implemented

basic access
o  checkinClass: aClass fileName: classFileName directory: packageDir module: moduleDir source: sourceFile logMessage: logMessage force: force
checkin of a class into the source repository.
Return true if ok, false if not.

** This method raises an error - it must be redefined in concrete classes **

o  checkoutModule: aModule directory: aPackage andDo: aBlock
check out everything from a package into a temporary directory.
Then evaluate aBlock, passing the name of that temp-directory.
Afterwards, the tempDir is removed.
Return true, if OK, false if any error occurred.

** This method raises an error - it must be redefined in concrete classes **

o  streamForClass: aClass fileName: classFileName revision: revision directory: packageDir module: moduleDir cache: doCache
extract a classes source code and return an open readStream on it.
A revision of nil selects the current (in image) revision.
The classes source code is extracted using the revision and the sourceCodeInfo,
which itself is extracted from the classes packageString.

** This method raises an error - it must be redefined in concrete classes **

o  streamForExtensionFile: fileName package: package directory: dir module: mod cache: doCache
check for umlaut-remover/adder bug from felix in extensionsRevisionString !!!!

basic administration
o  checkForExistingContainer: fileName inModule: moduleName directory: packageDirName
check for a container to be present. Return a boolean result.

** This method raises an error - it must be redefined in concrete classes **

o  checkForExistingContainer: fileName inModule: moduleName directory: packageDirName warn: doWarn
check for a container to be present. Return a boolean result.

o  checkForExistingContainer: fileName inPackage: aPackage
check if a source-code container is present in a packages directory.

o  checkForExistingContainerForClass: aClass
check if a source-code container for a given class is present in the repository.

o  checkForExistingModule: moduleName
check for a module directory to be present

** This method raises an error - it must be redefined in concrete classes **

o  checkForExistingModule: moduleDir directory: packageDir
check for a package directory to be present

** This method raises an error - it must be redefined in concrete classes **

o  createContainerFor: aClass inModule: moduleName directory: dirName container: fileName
create a new container & check into it an initial version of aClass

** This method raises an error - it must be redefined in concrete classes **

o  createContainerFor: cls inModule: moduleName package: packageDir container: classFileName
create a new container & check into it an initial version of aClass

o  createModule: moduleName
create a new module directory

** This method raises an error - it must be redefined in concrete classes **

o  createModule: module directory: directory
create a new package directory

** This method raises an error - it must be redefined in concrete classes **

o  initialRevisionStringFor: aClass inModule: moduleDir directory: packageDir container: fileName
return a string usable as initial revision string

** This method raises an error - it must be redefined in concrete classes **

o  revisionLogOf: clsOrNil fromRevision: firstRev toRevision: lastRef fileName: classFileName directory: packageDirOrNil module: moduleDir

o  revisionLogOf: clsOrNil fromRevision: rev1OrNil toRevision: rev2OrNil numberOfRevisions: limitOrNil fileName: classFileName directory: packageDirOrNil module: moduleDirOrNil
Return info about the repository container and (part of) the revisionlog as a collection
of revision entries. Return nil on failure.

This must be implemented by a concrete source-code manager

If numRevisionsOrNil is notNil, it limits the number of revision records returned -
only numRevions of the newest revision infos will be collected.

The returned information is a structure (IdentityDictionary)
filled with:
#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
#numberOfRevisions -> the number of revisions in the container (nil for all)
#revisions -> collection of per-revision info (see below)

firstRevOrNil / lastRevOrNil specify from which revisions a logEntry is wanted:
-If firstRevOrNil is nil, the first revision is the initial revision
otherwise, the log starts with that revision.
-If lastRevOrNil is nil, the last revision is the newest revision
otherwise, the log ends with that revision.

-If both are nil, all logEntries are extracted.
-If both are 0 (not nil), no logEntries are extracted (i.e. only the header).

per revision info consists of one record per revision:

#revision -> the revision string
#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
(i.e. the last entry is for the initial revision; the first for the most recent one)
Attention: if state = 'dead' that revision is no longer valid.


** This method raises an error - it must be redefined in concrete classes **

cache administration
o  condenseSourceCache
remove all cached old versions (i.e. leave the newest only)

usage example(s):

     self condenseSourceCache

o  flushSourceCache
remove all cached versions

usage example(s):

     self flushSourceCache

debugging
o  verboseSourceCodeAccess

o  verboseSourceCodeAccess: aBoolean

initialization
o  forgetDisabledModules
intentionally left blank

o  initCacheDirPath
initialize the name of the cacheDirectory.
This is:
<tempDir>/stx_sourceCache (non-UNIX)
~/.smalltalk/source-cache (UNIX, as <tempDir> is pruned upon each reboot)

usage example(s):

     self initCacheDirPath     

o  initialize
setup for caching and no workTree

o  update: something with: aParameter from: changedObject
flush resources on language changes

o  validateCacheDirPath

obsolete backward compatibility
o  checkForExistingModule: moduleDir package: packageDir
check for a package directory to be present

** This is an obsolete interface - do not use it (it may vanish in future versions) **

o  checkoutModule: aModule package: aPackage andDo: aBlock
check out everything from a package into a temporary directory.
Then evaluate aBlock, passing the name of that temp-directory.
Afterwards, the tempDir is removed.
Return true, if OK, false if any error occurred.

** This is an obsolete interface - do not use it (it may vanish in future versions) **

o  createModule: module package: package
create a new package directory

** This is an obsolete interface - do not use it (it may vanish in future versions) **

o  getExistingContainersInModule: aModule package: aPackage
return a collection containing the names of existing containers

** This is an obsolete interface - do not use it (it may vanish in future versions) **

o  getExistingPackagesInModule: aModule
return a collection containing the names of existing packages

** This is an obsolete interface - do not use it (it may vanish in future versions) **

o  initialRevisionStringFor: aClass inModule: moduleDir package: packageDir container: fileName
return a string usable as initial revision string

** This is an obsolete interface - do not use it (it may vanish in future versions) **

private
o  checkMethodPackagesOf: aClass
check if aClass contains methods from another package;
ask if these should be checked in with the class.
Raises abortSignal if checkIn is to be suppressed.
returns:
#base - only check in methods from the classes package
#all - check in all

the old code looked for all extensions, and allowed them to be moved to the base-package.
This was dangerous, as if one presses yes too quickly, extensions move to the base too easy.
The new code only allows for extensions from the __NOPROJECT__ package to be moved.
Extensions always remain extensions, and must be moved by an explicit method-menu action.

o  checkTabSpaceConventionIn: aStream
This method checks whether data in given stream follows
tab-space discipline.

More precisely, this checks that each line starts with zero or more
tabs (16r9) followed by 0-7 spaces (16r32) followed by non-space non-tab
character.
This is done for two reasons:
1) Makefiles (and Make.proto/Make.spec) files MUST not have leading spaces in their rules, but tabs.
otherwise, make fails badly.

2) for diff-comparison, a consisten tab/space discipline avoids false diff-positivies, which resulted from simple
edititing with different editors with different tab conventions.

o  compileVersionMethod: methodName of: aClass for: newRevisionString
self assert: language isSmalltalk.

o  containerFromSourceInfo: info
given a sourceInfo, return the classes container

o  createTempDirectory: packageDir forModule: moduleDir in: aParentDir
create a temp directory for checking out

usage example(s):

self createTempDirectory:'fooPackage' forModule:'fooModule'

o  directoryFromContainerPath: containerPath forClass: aClass
given a full path as in an RCS header,
extract the directory (i.e. package).

usage example(s):

     CVSSourceCodeManager directoryFromContainerPath:'/files/CVS/stx/libbasic/Array.st' forClass:Array

o  directoryFromContainerPath: containerPath forPackage: packageID
given a full path as in an RCS header,
extract the directory (i.e. package) within the module.
Notice:
for top-level folder-only modules (like exept, smalltalk),
an empty string is returned.

usage example(s):

     CVSSourceCodeManager directoryFromContainerPath:'/files/CVS/stx/libbasic/Array.st'

o  directoryFromSourceInfo: info
given a sourceInfo, return the classes package directory

o  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

o  moduleFromContainerPath: containerPath forClass: aClass
given a full path as in an RCS header, extract the module.

usage example(s):

     SourceCodeManager moduleFromContainerPath:'/files/CVS/stx/libbasic/Array.st' forClass:Array

o  moduleFromContainerPath: containerPath forPackage: packageID
given a full path as in an RCS header, extract the module.

usage example(s):

     SourceCodeManager moduleFromContainerPath:'/files/CVS/stx/libbasic/Array.st'

o  moduleFromSourceInfo: info
given a sourceInfo, return the classes module directory

o  packageFromSourceInfo: info
given a sourceInfo, return the classes package directory

** This is an obsolete interface - do not use it (it may vanish in future versions) **

o  pathInRepositoryFrom: containerPath forPackage: packageID
this tries to extract the path within a repository,
given some path as present in an RCS Header string.
Typically, this ought to be that string directly;
however, if the repository directory is accessed via a symbolic link during
ci/co, some systems extract different strings with co.
One such system here had a symbolic link from /phys/ibm/CVS... to /file/CVS,
and extracted sources had /phys/ibm/CVS in their header.
Do not depend on the code below to work correctly all the time.

usage example(s):

     SourceCodeManager pathInRepositoryFrom:'/files/CVS/stx/libbasic/Array.st'    forPackage:Array package 
     SourceCodeManager pathInRepositoryFrom:'/phys/ibm/CVS/stx/libbasic/Array.st' forPackage:Array package 

     SourceCodeManager pathInRepositoryFrom:'/files/CVS/stx/libbasic/Array.st'    forPackage:nil          
     SourceCodeManager pathInRepositoryFrom:'/phys/ibm/CVS/stx/libbasic/Array.st' forPackage:nil 

o  postCheckInClass: aClass
invoked after a checkIn

o  postCheckInExtensionsForPackage: aPackageId
invoked after a checkIn

o  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

o  reportError: msg

o  repositoryTopDirectory
return the name of the repository

o  sourceCacheDirectory
return the sourceCache directories name.
Ensure that it exists.

o  sourceInfoOfClass: aClass
helper: return a classes sourceCodeInfo by extracting its
versionString components.

usage example(s):

     SourceCodeManager sourceInfoOfClass:Array

o  updateVersionMethod: selector of: aClass for: newRevisionString
helper for the checkin procedure.
Update my #version_XXX method, to now return newRevisionString.

o  updateVersionMethodOf: aClass for: newRevisionString
helper for the checkin procedure.
Update my #version_XXX method, to now return newRevisionString.

queries
o  enabled
JV@2012-01-19: Quick hack, see senders. Is that what you mean?

o  initialRevisionString
redefinable in subclasses

o  isAbstract
Return if this class is an abstract class.
True is returned here for myself only; false for subclasses.
Abstract subclasses must redefine this again.

o  isContainerBased
true, if the SCM uses some kind of source container (,v files).
False, if it is like a database or filesystem.

o  isExperimental

o  isExtensionsVersionMethodSelector: selector
true if the given selector is for ANY of the manager's extensions version methods.
These are all named extensionVersion_XXX, where XXX is manager-specific (CVS, P4, SVN etc.).
For backward compatibility (times, when there was only one CVS sourcecode manager,
the selector named 'extensionsVersion' alone also counts as a version method
(which might be a somewhat bad idea in the long term...).

o  isResponsibleForModule: module

o  isResponsibleForPackage: aStringOrSymbol
Returns true if the manager can handle source code for given package.

Answering true does not imply that receiver is configured default
manager for that package, it only means that it has a repository
configured for given package.

** This method raises an error - it must be redefined in concrete classes **

o  isRevision: revision1 after: revision2
true, if the dotted revision string revision1 is > than revision2

usage example(s):

     SourceCodeManager isRevision:'1' after:'2'      
     SourceCodeManager isRevision:'2' after:'1'      
     SourceCodeManager isRevision:'1.1' after:'2.1.2' 
     SourceCodeManager isRevision:'2.1' after:'1.2.3' 
     SourceCodeManager isRevision:'1' after:'1.1'    
     SourceCodeManager isRevision:'1.1' after:'1'    
     SourceCodeManager isRevision:'1.1' after:'1.2' 
     SourceCodeManager isRevision:'1.10' after:'1.2' 
     SourceCodeManager isRevision:'1.2' after:'1.1' 
     SourceCodeManager isRevision:'1.2.3.4' after:'1.2.3.5' 
     SourceCodeManager isRevision:'1.2.3.4' after:'1.2.3.3' 
     SourceCodeManager isRevision:'1.2.3.4' after:'1.2.3'   
     SourceCodeManager isRevision:'1.2.3.4' after:'1.2.3.4'   

o  isRevision: revision1 sameOrAfter: revision2
true, if the dotted revision string revision1 is >= than revision2

o  isVersionMethodForExtensionsSelector: selector
true if the given selector is for one of the manager's extensions version methods.
These are all named extensionVersion_XXX, where XXX is manager-specific (CVS, P4, SVN etc.).
For backward compatibility (times, when there was only one CVS sourcecode manager,
the selector named 'extensionsVersion' alone also counts as a version method
(which might be a somewhat bad idea in the long term...).

** This is an obsolete interface - do not use it (it may vanish in future versions) **

o  isVersionMethodSelector: selector
true if the given selector is for one of the manager's version methods.
These are all named version_XXX, where XXX is manager-specific (CVS, P4, SVN etc.).
For backward compatibility (times, when there was only one CVS sourcecode manager,
the selector named 'version' alone also counts as a version method
(which might be a somewhat bad idea in the long term...).

o  managerTypeName
Answers version manager name suitable for UI,
i,e., CVS, SubVersion, Perforce

** This method raises an error - it must be redefined in concrete classes **

o  managerTypeNameShort
Answers short version manager name suitable for UI,
i,e., CVS, SVN, P4. Used in cases where sorter strings
are preferred. Defaults to #managerTypeName

o  nameOfVersionMethodForExtensions
that is the old name; now, we use extensionsVersion_<SCM>

o  nameOfVersionMethodInClasses
that is the old name; now, we use version_<SCM>

o  performsCompilabilityChecks
Should return true, if the manager itself performs
compilability checks, false otherwise.

Basically a hack, see my senders...

o  prefixOfVersionMethodForExtensionsSelector
all scm-extensionsVersion methods start with this prefix

o  prefixOfVersionMethodSelector
all scm-version methods start with this prefix

o  revisionAfter: aRevisionString
generate the next revision number after the given number

usage example(s):

     SourceCodeManager revisionAfter:'1.2.3.4' 
     SourceCodeManager revisionAfter:'123'  
     SourceCodeManager revisionAfter:'1.24'  

o  settingsApplicationClass
link to my settings application (needed for the settings dialog

** This method raises an error - it must be redefined in concrete classes **

o  sourceCodeManagerForPackage: aPackageID
JV@2012-01-23: If source code management is disabled, return #().

usage example(s):

     self sourceCodeManagerForPackage:'stx:libbasic'.
     self sourceCodeManagerForPackage:'stx:libboss'.
     self managerForMatchingModule:'stx:libba*' put:SVNSourceCodeManager.
     self sourceCodeManagerForPackage:'stx:libbasic'.
     self sourceCodeManagerForPackage:'stx:libboss'.

o  supportsCheckinLogMessages
true, if log-messages are supported

o  versionInfoClass

o  versionMethodKeyword
Answers the keyword used by the version management system to
expand a current version in a file (_without_ dollars). For
CVS it is 'Header', for SVN 'Id', others may use different
keywords. If nil is returned, then the version management does
not use any keyword.

o  versionMethodTemplateForJavaScript
CVSSourceCodeManager versionMethodTemplateForJavaScript

o  versionMethodTemplateForJavaScriptFor: aSelector
do not make the thing below a single string - otherwise
it would get expanded by the sourcecodemanager, which we do not want here

o  versionMethodTemplateForRuby
CVSSourceCodeManager versionMethodTemplateForRuby

o  versionMethodTemplateForRubyFor: aSelector
do not make the thing below a single string - otherwise
it would get expanded by the sourcecodemanager, which we do not want here

o  versionMethodTemplateForSmalltalk
CVSSourceCodeManager versionMethodTemplateForSmalltalk

o  versionMethodTemplateForSmalltalkFor: aSelector
do not make the thing below a single string - otherwise
it would get expanded by the sourcecodemanager, which we do not want here

o  versionString: stringA isLessThan: stringB

source code access
o  basicCheckinClass: aClass fileName: classFileName directory: packageDir module: moduleDir logMessage: logMessage force: force
low level checkin of a class into the source repository. Does not deal with any version method updates,
only does the checkin, using a temporary file.
Return true if ok, false if not.

o  checkin: containerFilename text: someText directory: packageDir module: moduleName logMessage: logMessage force: force
enter some (source) code (which is someText)
into the source repository. If the force argument is true, no merge is done;
instead, the code is checked in as given (Dangerous).
Return true if ok, false if not.

o  checkin: containerFilename text: someText directory: packageDir module: moduleName logMessage: logMessage force: force onBranch: branchNameOrNil
enter some (source) code (which is someText)
into the source repository. If the force argument is true, no merge is done;
instead, the code is checked in as given (Dangerous).
Return true if ok, false if not.

** This method raises an error - it must be redefined in concrete classes **

o  checkinClass: aClass fileName: classFileName directory: packageDir module: moduleDir logMessage: logMessage
checkin of a class into the source repository.
Return true if ok, false if not.

o  checkinClass: aClass fileName: classFileName directory: packageDir module: moduleDir logMessage: logMessage force: force
checkin of a class into the source repository.
Return true if ok, false if not.

usage example(s):

     SourceCodeManager checkinClass:Array

o  checkinClass: aClass fileName: classFileName directory: packageDir module: moduleDir logMessage: logMessage onBranch: branchNameOrNil
checkin of a class into the source repository.
Return true if ok, false if not.

o  checkinClass: aClass logMessage: logMessage
checkin of a class into the source repository.
Return true if ok, false if not.

usage example(s):

     SourceCodeManager checkinClass:Array logMessage:'foo'

o  checkinClass: aClass logMessage: logMessage onBranch: branchNameOrNil
checkin of a class into the source repository.
Return true if ok, false if not.

usage example(s):

     SourceCodeManager checkinClass:Array logMessage:'foo'

o  getFile: fileName revision: revision directory: packageDir module: moduleDir
SourceCodeManager
getFile:'Make.spec'
revision:#newest
directory:'libbasic2'
module:'stx'

o  getMostRecentSourceStreamForClassNamed: aClassName
given a class, return an open stream to its most recent source
(not knowing anything about its version).
Used when autoloading classes.

o  getMostRecentSourceStreamForClassNamed: aClassName inPackage: forcedPackage
given a class, return an open stream to its most recent source
(not knowing anything about its version).
Used when autoloading classes or to compare a classes source with the most
recent found in the repostitory.
The forcePackage argument passes the classes package information
and is only required when autoloading or when the class is not already
present (i.e. there is no way to extract the package info).
If nil, the package is extracted from the class - which must exist.

o  getMostRecentSourceStreamForFile: aFileName inPackage: aPackage
given a filename, return an open stream to its most recent contents
(not knowing anything about its version).
Used when autoloading extensions or to compare a classes source with the most
recent found in the repostitory.

o  getSourceStreamFor: aClass
extract a classes source code and return an open readStream on it.
The classes source code is extracted using the revision and the sourceCodeInfo,
which itself is extracted from the classes packageString.

o  getSourceStreamFor: aClass revision: aRevisionStringOrNil
extract a classes source code and return an open readStream on it.
A revision of nil selects the current (in image) revision.
The classes source code is extracted using the revision and the sourceCodeInfo,
which itself is extracted from the classes packageString.

o  getSourceStreamFor: aClass revision: aRevisionStringOrNil cache: cache
extract a classes source code and return an open readStream on it.
A revision of nil selects the current (in image) revision.
The classes source code is extracted using the revision and the sourceCodeInfo,
which itself is extracted from the classes packageString.

o  loadPackageWithId: aPackageId fromRepositoryAsAutoloaded: doLoadAsAutoloaded
Should be redefined by subclasses.
Raise an exception, if load failed.

o  streamForFile: fileName revision: revision directory: packageDir module: moduleDir
SourceCodeManager
streamForFile:'Make.spec'
revision:#newest
directory:'libbasic2'
module:'stx'

o  withClass: aClass classFileName: classFileName filedOutToTemporaryFileDo: aBlock
helper. fileout and eval aBlock

source code administration
o  fileOutSourceCodeExtensions: extensions package: package on: stream
File out extension methods for given package on stream.
Not programming-language safe - can handle smalltalk methods.

o  fileOutSourceCodeExtensions: extensions package: pkg on: stream version: versionIt
File out extension methods for given package on stream.
Not programming-language safe - can handle smalltalk methods.

o  fileOutSourceCodeOf: aClass on: aStream

o  fileOutSourceCodeOf: aClass on: aStream withTimeStamp: withTimeStamp withInitialize: withInitialize withDefinition: withDefinition methodFilter: methodFilter
JV@2012-02-02: Do not fileout extensionVersion methods, that one is filed out
when extensions are filed out.

o  getExistingContainersInModule: aModule directory: aPackage
return a collection containing the names of existing containers

** This method raises an error - it must be redefined in concrete classes **

o  getExistingDirectoriesInModule: aModule
return a collection containing the names of existing packages

** This method raises an error - it must be redefined in concrete classes **

o  getExistingModules
return a collection containing the names of existing modules

** This method raises an error - it must be redefined in concrete classes **

o  knownBranchTagsAndRevisionsFor: aClass
retrieve a list of branch (symbolic tags -> versionNr) associations known for that class.
I.e. which tags/symbolic versions exist, and which revision-nr is attached to it

usage example(s):

     CVSSourceCodeManager knownBranchTagsAndRevisionsFor:Array

o  knownBranchTagsAndRevisionsForContainer: classFileName directory: packageDir module: moduleDir
retrieve all branch tages.

usage example(s):

     CVSSourceCodeManager knownBranchTagsAndRevisionsFor:cg_test2
     CVSSourceCodeManager knownBranchTagsAndRevisionsForContainer:'cg_test2.st' directory:'test2' module:'cg'

o  knownTagsAndRevisionsFor: aClass
retrieve a list of (symbolic tags -> versionNr) associations known for that class.
I.e. which tags/symbolic versions exist, and which revision-nr is attached to it

usage example(s):

     CVSSourceCodeManager knownTagsAndRevisionsFor:Array

o  knownTagsAndRevisionsForContainer: fileName directory: packageDir module: moduleDir
retrieve a list of (symbolic tags -> versionNr) associations.
I.e. which tags/symbolic versions exist, and which revision-nr is attached to it

usage example(s):

     CVSSourceCodeManager knownTagsAndRevisionsForContainer:'Make.proto' directory:'libbasic' module:'stx'

o  knownTagsFor: aClass
retrieve a list of symbolic tags known for that class.
I.e. which tags/symbolic versions exist

o  newestRevisionInFile: classFileName directory: packageDirOrNil module: moduleDir
return the newest revision found in a container.
Return nil on failure.

usage example(s):

     SourceCodeManager newestRevisionInFile:'Array.st' directory:'libbasic' module:'stx'       

o  newestRevisionLogEntryOf: aClass
return the newest revisions log found in the repository.
Return nil on failure.

usage example(s):

     SourceCodeManager newestRevisionLogEntryOf:Array       
     SourceCodeManager newestRevisionLogEntryOf:Connection 

o  newestRevisionOf: aClass
return the newest revision (as string) found in the repository.
Return nil on failure.

usage example(s):

     SourceCodeManager newestRevisionOf:Array       
     SourceCodeManager newestRevisionOf:Connection 

o  oldestRevisionLogEntryOf: aClass
return the oldest revisions log found in the repository.
Return nil on failure.
Can be used to determine the time of initial checkin or the original author

usage example(s):

     SourceCodeManager oldestRevisionLogEntryOf:Array       

o  onlyBranchTagsFrom: tagsAndVersions
retrieve a list of branch (symbolic tags -> versionNr) associations known for that class.
I.e. which tags/symbolic versions exist, and which revision-nr is attached to it

o  printClassRepositorySummaryForClass: aClass on: aStream
returns summary info from the repository:
current version,
newest in repository,
original checkin date (i.e. age),
tags on the current version
maybe more in the future

o  removeContainer: container inModule: module directory: directory
remove a container

** This method raises an error - it must be redefined in concrete classes **

o  revisionForSymbolicName: tag class: cls fileName: classFileName directory: packageDir module: moduleDir
given a tag, return the corresponding revision

usage example(s):

     CVSSourceCodeManager  
        revisionForSymbolicName:'stable' 
        class:Array fileName:'Array.st' 
        directory:'libbasic' module:'stx' 

     CVSSourceCodeManager  
        revisionForSymbolicName:'stable' 
        class:Array fileName:nil 
        directory:'libbasic' module:'stx' 

o  revisionForTag: tagName inClass: aClass
retrieve the revision number associated to a particular tag/symbolic version.
Nil if unknown

usage example(s):

     SourceCodeManager revisionForTag:'stable' inClass:Array

o  revisionForTag: tagName inContainer: classFileName directory: packageDir module: moduleDir
retrieve the revision number associated to a particular tag/symbolic version.
Nil if unknown

usage example(s):

     SourceCodeManager revisionForTag:'stable' inClass:Array
     SourceCodeManager revisionForTag:'stable' inContainer:'Make.proto' directory:'libbasic' module:'stx'

o  revisionInfoFromRCSString: aString
return a dictionary filled with revision info.
This extracts the relevant info from aString.

o  revisionInfoFromStandardVersionString: aString
return a VersionInfo object filled with revision info.
This extracts the relevant info from aString which is in the format as created
by standardRevisionStringFor:....

usage example(s):

     self revisionInfoFromStandardVersionString:'Path: stx/libbasic/Array.st, Version: 123, User: cg, Time: 2011-12-21T21:03:08.826' 

o  revisionInfoFromString: aString
return a dictionary filled with revision info.
This extracts the relevant info from aString.

** This method raises an error - it must be redefined in concrete classes **

o  revisionInfoFromString: vsnString inClass: class

o  revisionLogOf: aClass
return info about the repository container and
the revisionlog as a collection of revision entries.
Return nil on failure.
The returned information is a structure (IdentityDictionary)
filled with:
#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
#revisions -> collection of per-revision info

per revision info consists of one record per revision:

#revision -> the revision string
#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

revisions are ordered newest first
(i.e. the last entry is for the initial revision; the first for the most recent one)

usage example(s):

     SourceCodeManager revisionLogOf:Array 

o  revisionLogOf: aClass fromRevision: rev1
return info about the repository container and
(part of) the revisionlog as a collection of revision entries.
Return nil on failure.

The returned information is a structure (IdentityDictionary)
filled with:
#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
#revisions -> collection of per-revision info (see below)

for some classes, additional info is returned:

#renamed -> true if the class has been renamed or copied
and the sourceInfo is from the previous one
#expectedFileName -> the filename we would expect (i.e. for the new class)

rev1 specifies from which revisions a logEntry is wanted:
If rev1 is nil, the first revision is the initial revision
otherwise, the log starts with that revision.

per revision info consists of one record per revision:

#revision -> the revision string
#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

revisions are ordered newest first
(i.e. the last entry is for the initial revision;
the first for the most recent one)

usage example(s):

     SourceCodeManager revisionLogOf:Array fromRevision:'1.40'

o  revisionLogOf: aClass fromRevision: rev1 toRevision: rev2
return info about the repository container and
(part of) the revisionlog as a collection of revision entries.
Return nil on failure.

The returned information is a structure (IdentityDictionary)
filled with:
#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
#revisions -> collection of per-revision info (see below)

for some classes, additional info is returned:

#renamed -> true if the class has been renamed or copied
and the sourceInfo is from the previous one
#expectedFileName -> the filename we would expect (i.e. for the new class)

rev1 / rev2 specify from which revisions a logEntry is wanted:
If rev1 is nil, the first revision is the initial revision
otherwise, the log starts with that revision.
If rev2 is nil, the last revision is the newest revision
otherwise, the log ends with that revision.
If both are nil, no logEntries are extracted (i.e. only the header).

per revision info consists of one record per revision:

#revision -> the revision string
#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

revisions are ordered newest first
(i.e. the last entry is for the initial revision;
the first for the most recent one)

o  revisionLogOf: aClass fromRevision: rev1 toRevision: rev2 finishAfter: maxCountOrNil
return info about the repository container and
(part of) the revisionlog as a collection of revision entries.
Return nil on failure.

The returned information is a structure (IdentityDictionary)
filled with:
#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
#revisions -> collection of per-revision info (see below)

for some classes, additional info is returned:

#renamed -> true if the class has been renamed or copied
and the sourceInfo is from the previous one
#expectedFileName -> the filename we would expect (i.e. for the new class)

rev1 / rev2 specify from which revisions a logEntry is wanted:
If rev1 is nil, the first revision is the initial revision
otherwise, the log starts with that revision.
If rev2 is nil, the last revision is the newest revision
otherwise, the log ends with that revision.
If both are nil, no logEntries are extracted (i.e. only the header).

per revision info consists of one record per revision:

#revision -> the revision string
#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

revisions are ordered newest first
(i.e. the last entry is for the initial revision;
the first for the most recent one)

usage example(s):

     SourceCodeManager revisionLogOf:Array fromRevision:'1.40' toRevision:'1.43' 
     SourceCodeManager revisionLogOf:XtBoxNew 

o  revisionLogOf: aClass numberOfRevisions: numRevisions
return info about the repository container and
(part of) the revisionlog (numRevisions newest revisions)
as a collection of revision entries.
Return nil on failure.

The returned information is a structure (IdentityDictionary)
filled with:
#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)
#revisions -> collection of per-revision info (see below)

for some classes, additional info is returned:

#renamed -> true if the class has been renamed or copied
and the sourceInfo is from the previous one
#expectedFileName -> the filename we would expect (i.e. for the new class)

rev1 / rev2 specify from which revisions a logEntry is wanted:
If rev1 is nil, the first revision is the initial revision
otherwise, the log starts with that revision.
If rev2 is nil, the last revision is the newest revision
otherwise, the log ends with that revision.
If both are nil, no logEntries are extracted (i.e. only the header).

per revision info consists of one record per revision:

#revision -> the revision string
#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
(i.e. the last entry is for the initial revision;
the first for the most recent one)

usage example(s):

     SourceCodeManager revisionLogOf:Array numberOfRevisions:10 

o  revisionLogOf: clsOrNil numberOfRevisions: numRevisions fileName: classFileName directory: packageDirOrNil module: moduleDirOrNil
Modified (format): / 07-07-2019 / 23:17:22 / Claus Gittinger

o  revisionLogOfContainer: classFileName directory: packageDir module: moduleDir
return info about the repository container and
(part of) the revisionlog as a collection of revision entries.
Return nil on failure.

The returned information is a structure (IdentityDictionary)
filled with:
#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
#revisions -> collection of per-revision info (see below)

per revision info consists of one record per revision:

#revision -> the revision string
#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

revisions are ordered newest first
(i.e. the last entry is for the initial revision;
the first for the most recent one)

o  revisionLogOfContainer: fileName module: moduleDir directory: packageDir fromRevision: rev1 toRevision: rev2
return info about the repository container and
(part of) the revisionlog as a collection of revision entries.
Return nil on failure.

The returned information is a structure (IdentityDictionary)
filled with:
#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
#revisions -> collection of per-revision info (see below)

for some classes, additional info is returned:

#renamed -> true if the class has been renamed or copied
and the sourceInfo is from the previous one
#expectedFileName -> the filename we would expect (i.e. for the new class)

rev1 / rev2 specify from which revisions a logEntry is wanted:
If rev1 is nil, the first revision is the initial revision
otherwise, the log starts with that revision.
If rev2 is nil, the last revision is the newest revision
otherwise, the log ends with that revision.
If both are nil, no logEntries are extracted (i.e. only the header).

per revision info consists of one record per revision:

#revision -> the revision string
#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

revisions are ordered newest first
(i.e. the last entry is for the initial revision;
the first for the most recent one)

usage example(s):

     SourceCodeManager 
        revisionLogOfContainer:'Array.st' 
        module:'stx' 
        directory:'libbasic' 
        fromRevision:'1.1' 
        toRevision:nil 

o  revisionLogOfFile: aFilename fromRevision: rev1 toRevision: rev2
return info about the repository container and
(part of) the revisionlog as a collection of revision entries.
Return nil on failure.

The returned information is a structure (IdentityDictionary)
filled with:
#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
#revisions -> collection of per-revision info (see below)

for some classes, additional info is returned:

#renamed -> true if the class has been renamed or copied
and the sourceInfo is from the previous one
#expectedFileName -> the filename we would expect (i.e. for the new class)

rev1 / rev2 specify from which revisions a logEntry is wanted:
If rev1 is nil, the first revision is the initial revision
otherwise, the log starts with that revision.
If rev2 is nil, the last revision is the newest revision
otherwise, the log ends with that revision.
If both are nil, no logEntries are extracted (i.e. only the header).

per revision info consists of one record per revision:

#revision -> the revision string
#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

revisions are ordered newest first
(i.e. the last entry is for the initial revision;
the first for the most recent one)

o  revisionLogOfFile: aFilename fromRevision: rev1 toRevision: rev2 finishAfter: maxCountOrNil
return info about the repository container and
(part of) the revisionlog as a collection of revision entries.
Return nil on failure.

The returned information is a structure (IdentityDictionary)
filled with:
#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
#revisions -> collection of per-revision info (see below)

for some classes, additional info is returned:

#renamed -> true if the class has been renamed or copied
and the sourceInfo is from the previous one
#expectedFileName -> the filename we would expect (i.e. for the new class)

rev1 / rev2 specify from which revisions a logEntry is wanted:
If rev1 is nil, the first revision is the initial revision
otherwise, the log starts with that revision.
If rev2 is nil, the last revision is the newest revision
otherwise, the log ends with that revision.
If both are nil, no logEntries are extracted (i.e. only the header).

per revision info consists of one record per revision:

#revision -> the revision string
#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

revisions are ordered newest first
(i.e. the last entry is for the initial revision;
the first for the most recent one)

usage example(s):

     SourceCodeManager revisionLogOfFile:'../../libbasic/Array.st' fromRevision:'1.40' toRevision:'1.43' 

o  revisionLogOfFile: aFilename numberOfRevisions: numRevisions
return info about the repository container and
(part of) the revisionlog (numRevisions newest revisions)
as a collection of revision entries.
Return nil on failure.

The returned information is a structure (IdentityDictionary)
filled with:
#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)
#revisions -> collection of per-revision info (see below)

for some classes, additional info is returned:

#renamed -> true if the class has been renamed or copied
and the sourceInfo is from the previous one
#expectedFileName -> the filename we would expect (i.e. for the new class)

rev1 / rev2 specify from which revisions a logEntry is wanted:
If rev1 is nil, the first revision is the initial revision
otherwise, the log starts with that revision.
If rev2 is nil, the last revision is the newest revision
otherwise, the log ends with that revision.
If both are nil, no logEntries are extracted (i.e. only the header).

per revision info consists of one record per revision:

#revision -> the revision string
#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
(i.e. the last entry is for the initial revision;
the first for the most recent one)

usage example(s):

     SourceCodeManager revisionLogOfFile:'../../libbasic/Array.st' numberOfRevisions:10 
     SourceCodeManager revisionLogOfFile:'../../libbasic/Array.st' numberOfRevisions:nil 

o  revisionStringFor: aClass inModule: moduleDir directory: packageDir container: fileName revision: revisionString
utility function: return a string usable as initial revision string.
Can be redefined in subclasses

usage example(s):

     self 
        revisionStringFor:Array 
        inModule:'stx' 
        directory:'libbasic' 
        container:'Array.st' 
        revision:'123'          

o  revisionsOf: aClass
return a collection of revisions (as strings) found in the repository.
The most recent (newest) revision will be the first in the list.
Return nil on failure.

usage example(s):

     SourceCodeManager revisionsOf:Array       
     SourceCodeManager newestRevisionOf:Array 

o  standardRevisionStringFor: aClass inModule: moduleDir directory: packageDir container: fileName revision: revisionString
utility function: return a string usable as initial revision string

o  withSourceRewriteHandlerDo: aBlock
hook for just-in-time rewriting of a method's sourceCode while filing out
used when saving version_XXX methods in a non-XXX sourceCodeManager,
or when generating sourcecode for another Smalltalk system (VSE fileout)

o  writeHistoryLogSince: timeGoal filterSTSources: filterSTSourcesBoolean filterUser: userFilter filterRepository: repositoryFilter filterModules: moduleFilter filterProjects: projectFilterArg to: aStream
send a full historyLog to some stream.
This walks over all possible repository roots.

o  writeHistoryLogSince: timeGoal filterSTSources: filter filterUser: userFilter filterRepository: repositoryFilter filterModules: moduleFilter to: aStream
send a full historyLog to some stream.
This walks over all possible repository roots.

o  writeHistoryLogSince: timeGoal filterSTSources: filter filterUser: userFilter filterRepository: repositoryFilter to: aStream
send a full historyLog to some stream.
This walks over all possible repository roots.

o  writeHistoryLogSince: timeGoal filterSTSources: filter filterUser: userFilter to: aStream
send a full historyLog to some stream.
This walks over all possible repository roots.

o  writeHistoryLogSince: timeGoal filterSTSources: filter to: aStream
send a repositories historyLog to some stream

o  writeHistoryLogSince: timeGoal to: aStream
send a repositories historyLog to some stream

o  writeRevisionLogMessagesFrom: log to: aStream
helper; send the revisionlog to aStream

o  writeRevisionLogMessagesFrom: log withHeader: header to: aStream
helper; send the revisionlog to aStream

o  writeRevisionLogOf: aClass fromRevision: rev1 toRevision: rev2 finishAfter: maxCount to: aStream
extract a classes log and append it to aStream.

usage example(s):

     SourceCodeManager writeRevisionLogOf:Array fromRevision:'1.40' toRevision:'1.43' to:Transcript 

o  writeRevisionLogOf: aClass fromRevision: rev1 toRevision: rev2 to: aStream
extract a classes log and append it to aStream.

usage example(s):

     SourceCodeManager writeRevisionLogOf:Array fromRevision:'1.40' toRevision:'1.43' to:Transcript 

o  writeRevisionLogOf: aClass short: shortOrNot to: aStream
extract a classes log and append it to aStream.

usage example(s):

     SourceCodeManager writeRevisionLogOf:Array to:Transcript 

o  writeRevisionLogOf: aClass to: aStream
extract a classes log and append it to aStream.

usage example(s):

     SourceCodeManager writeRevisionLogOf:Array to:Transcript 

source code utilities
o  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)

o  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

o  ensureDollarsInVersionMethod: aString
given the source code of my version method, ensure that it contains dollars for
proper keyword expansion

o  ensureKeyword: keyword inVersionMethod: source
nil keyword means that given source code management system

o  ensureKeywordExpansionWith: aCharacter inVersionMethod: aString
given the source code of my version method, ensure that it contains aCharacter for
proper keyword expansion

usage example(s):

     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 $'' '    

     self ensureKeywordExpansionWith: $§ inVersionMethod: 'foo ^ ''§Head'' '  
     self ensureKeywordExpansionWith: $§ inVersionMethod: 'foo ^ ''Header§'' '   

o  ensureKeywordInVersionMethod: source

o  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

o  extractKeyValueFor: key fromRevisionString: aString
extract a particular value from a string which has the format:
key1: value1, key2: value2, .... keyN: valueN

usage example(s):

     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'

subclass responsibility
o  reportHistoryLogSince: timeGoal filterSTSources: filter filterUser: userFilter filterRepository: repositoryFilter filterModules: moduleFilter inTo: aBlock
process a full historyLog, evaluate aBlock for each entry, passing
each logs' info in a dictionary.
This walks over all possible repositories.
filterRep may be a collection of repository names (eg. 'stx', 'exept', 'phx' etc.) to only report changes made to one
of those repositories.
userFilter, if a non-nil string or stringCollection,
will filter only changes made by that user(s) (eg. 'sv' or #('sv' 'cg')).
filterModules, if non-empty, will only present changes in that module (eg. 'stx:libbasic')

** This method raises an error - it must be redefined in concrete classes **

testing
o  isCVS

o  isGit

o  isMercurial

o  isSVN

o  isSmallTeam

o  isStore


Private classes:

    PackageAndManager


ST/X 7.2.0.0; WebServer 1.670 at bd0aa1f87cdd.unknown:8081; Wed, 21 Aug 2019 22:32:42 GMT