packages/VersionHistory.st
author Claus Gittinger <cg@exept.de>
Tue, 25 Feb 2020 12:24:48 +0100
changeset 4559 e97f85bac732
parent 1445 b8cc2792ab97
child 3011 1997ff6e7e55
permissions -rw-r--r--
#REFACTORING by exept class: CVSSourceCodeManager class eliminate withCRs - use c-strings changed: #executeCVSCommand:module:inDirectory:log:pipe:orElseOutputTo:errorTo: #pathesForClasses: #revisionInfoFromString:inClass:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1445
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
     1
"
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
     2
 COPYRIGHT (c) 2003 by eXept Software AG
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
     3
              All Rights Reserved
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
     4
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
     5
 This software is furnished under a license and may be used
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
     6
 only in accordance with the terms of that license and with the
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
     7
 inclusion of the above copyright notice.   This software may not
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
     8
 be provided or otherwise made available to, or used by, any
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
     9
 other person.  No title to or ownership of the software is
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    10
 hereby transferred.
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    11
"
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    12
1282
d6869c933c83 initial checkin
james
parents:
diff changeset
    13
"{ Package: 'stx:libbasic3' }"
d6869c933c83 initial checkin
james
parents:
diff changeset
    14
d6869c933c83 initial checkin
james
parents:
diff changeset
    15
"{ NameSpace: Packages }"
d6869c933c83 initial checkin
james
parents:
diff changeset
    16
d6869c933c83 initial checkin
james
parents:
diff changeset
    17
Object subclass:#VersionHistory
d6869c933c83 initial checkin
james
parents:
diff changeset
    18
	instanceVariableNames:'versions'
d6869c933c83 initial checkin
james
parents:
diff changeset
    19
	classVariableNames:''
d6869c933c83 initial checkin
james
parents:
diff changeset
    20
	poolDictionaries:''
d6869c933c83 initial checkin
james
parents:
diff changeset
    21
	category:'Package-helpers'
d6869c933c83 initial checkin
james
parents:
diff changeset
    22
!
d6869c933c83 initial checkin
james
parents:
diff changeset
    23
d6869c933c83 initial checkin
james
parents:
diff changeset
    24
VersionHistory comment:'I am a version history.  A version history is a collection of VersionNumbers that together form a tree of versions.  I enforce rules about how versions are added and removed from the history.
d6869c933c83 initial checkin
james
parents:
diff changeset
    25
d6869c933c83 initial checkin
james
parents:
diff changeset
    26
To add a new version to a VersionHistory based on an existing version:
d6869c933c83 initial checkin
james
parents:
diff changeset
    27
d6869c933c83 initial checkin
james
parents:
diff changeset
    28
  VersionHistory startingAt1 addNewVersionBasedOn: ''1'' asVersion; yourself
d6869c933c83 initial checkin
james
parents:
diff changeset
    29
d6869c933c83 initial checkin
james
parents:
diff changeset
    30
If you add 2 new versions based on the same version, a branch will be started:
d6869c933c83 initial checkin
james
parents:
diff changeset
    31
d6869c933c83 initial checkin
james
parents:
diff changeset
    32
  VersionHistory startingAt1 
d6869c933c83 initial checkin
james
parents:
diff changeset
    33
		addNewVersionBasedOn: ''1'' asVersion;
d6869c933c83 initial checkin
james
parents:
diff changeset
    34
		addNewVersionBasedOn: ''1'' asVersion; 
d6869c933c83 initial checkin
james
parents:
diff changeset
    35
		yourself
d6869c933c83 initial checkin
james
parents:
diff changeset
    36
d6869c933c83 initial checkin
james
parents:
diff changeset
    37
To remove a single version (note: only versions at the tip of a branch, or at the base of the trunk (if it has only one successor) can be individually removed):
d6869c933c83 initial checkin
james
parents:
diff changeset
    38
d6869c933c83 initial checkin
james
parents:
diff changeset
    39
  VersionHistory startingAt1 
d6869c933c83 initial checkin
james
parents:
diff changeset
    40
		addNewVersionBasedOn: ''1'' asVersion;
d6869c933c83 initial checkin
james
parents:
diff changeset
    41
		addNewVersionBasedOn: ''1'' asVersion; 
d6869c933c83 initial checkin
james
parents:
diff changeset
    42
		remove: ''1.1'' asVersion;
d6869c933c83 initial checkin
james
parents:
diff changeset
    43
		yourself
d6869c933c83 initial checkin
james
parents:
diff changeset
    44
d6869c933c83 initial checkin
james
parents:
diff changeset
    45
To remove an entire branch:
d6869c933c83 initial checkin
james
parents:
diff changeset
    46
d6869c933c83 initial checkin
james
parents:
diff changeset
    47
  VersionHistory startingAt1 
d6869c933c83 initial checkin
james
parents:
diff changeset
    48
		addNewVersionBasedOn: ''1'' asVersion;
d6869c933c83 initial checkin
james
parents:
diff changeset
    49
		addNewVersionBasedOn: ''1'' asVersion; 
d6869c933c83 initial checkin
james
parents:
diff changeset
    50
		addNewVersionBasedOn: ''1.1'' asVersion; 
d6869c933c83 initial checkin
james
parents:
diff changeset
    51
		addNewVersionBasedOn: ''1.2'' asVersion; 
d6869c933c83 initial checkin
james
parents:
diff changeset
    52
		removeBranch: ''1.1'' asVersion;
d6869c933c83 initial checkin
james
parents:
diff changeset
    53
		yourself
d6869c933c83 initial checkin
james
parents:
diff changeset
    54
d6869c933c83 initial checkin
james
parents:
diff changeset
    55
To remove a portion of the trunk:
d6869c933c83 initial checkin
james
parents:
diff changeset
    56
d6869c933c83 initial checkin
james
parents:
diff changeset
    57
  VersionHistory startingAt1 
d6869c933c83 initial checkin
james
parents:
diff changeset
    58
		addNewVersionBasedOn: ''1'' asVersion;
d6869c933c83 initial checkin
james
parents:
diff changeset
    59
		addNewVersionBasedOn: ''2'' asVersion; 
d6869c933c83 initial checkin
james
parents:
diff changeset
    60
		addNewVersionBasedOn: ''3'' asVersion; 
d6869c933c83 initial checkin
james
parents:
diff changeset
    61
		addNewVersionBasedOn: ''3'' asVersion; 
d6869c933c83 initial checkin
james
parents:
diff changeset
    62
		removeTrunk: ''2'' asVersion;
d6869c933c83 initial checkin
james
parents:
diff changeset
    63
		yourself
d6869c933c83 initial checkin
james
parents:
diff changeset
    64
d6869c933c83 initial checkin
james
parents:
diff changeset
    65
To get a string description of a version history:
d6869c933c83 initial checkin
james
parents:
diff changeset
    66
d6869c933c83 initial checkin
james
parents:
diff changeset
    67
  VersionHistory startingAt1 
d6869c933c83 initial checkin
james
parents:
diff changeset
    68
		addNewVersionBasedOn: ''1'' asVersion;
d6869c933c83 initial checkin
james
parents:
diff changeset
    69
		addNewVersionBasedOn: ''2'' asVersion; 
d6869c933c83 initial checkin
james
parents:
diff changeset
    70
		addNewVersionBasedOn: ''3'' asVersion; 
d6869c933c83 initial checkin
james
parents:
diff changeset
    71
		addNewVersionBasedOn: ''3'' asVersion; 
d6869c933c83 initial checkin
james
parents:
diff changeset
    72
		treeString
d6869c933c83 initial checkin
james
parents:
diff changeset
    73
d6869c933c83 initial checkin
james
parents:
diff changeset
    74
Also, the following methods are useful for accessing the versions:
d6869c933c83 initial checkin
james
parents:
diff changeset
    75
d6869c933c83 initial checkin
james
parents:
diff changeset
    76
	#firstVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
    77
	#versionBefore:
d6869c933c83 initial checkin
james
parents:
diff changeset
    78
	#versionsAfter:
d6869c933c83 initial checkin
james
parents:
diff changeset
    79
	#mainLineStartingAt:
d6869c933c83 initial checkin
james
parents:
diff changeset
    80
	#allVersionsAfter:
d6869c933c83 initial checkin
james
parents:
diff changeset
    81
	#allVersionsBefore:
d6869c933c83 initial checkin
james
parents:
diff changeset
    82
'
d6869c933c83 initial checkin
james
parents:
diff changeset
    83
!
d6869c933c83 initial checkin
james
parents:
diff changeset
    84
d6869c933c83 initial checkin
james
parents:
diff changeset
    85
!VersionHistory class methodsFor:'documentation'!
d6869c933c83 initial checkin
james
parents:
diff changeset
    86
1445
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    87
copyright
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    88
"
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    89
 COPYRIGHT (c) 2003 by eXept Software AG
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    90
              All Rights Reserved
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    91
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    92
 This software is furnished under a license and may be used
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    93
 only in accordance with the terms of that license and with the
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    94
 inclusion of the above copyright notice.   This software may not
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    95
 be provided or otherwise made available to, or used by, any
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    96
 other person.  No title to or ownership of the software is
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    97
 hereby transferred.
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    98
"
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
    99
!
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
   100
1282
d6869c933c83 initial checkin
james
parents:
diff changeset
   101
documentation
d6869c933c83 initial checkin
james
parents:
diff changeset
   102
"
d6869c933c83 initial checkin
james
parents:
diff changeset
   103
    Taken from KomPackaging in squeak.
d6869c933c83 initial checkin
james
parents:
diff changeset
   104
d6869c933c83 initial checkin
james
parents:
diff changeset
   105
    [author:]
d6869c933c83 initial checkin
james
parents:
diff changeset
   106
d6869c933c83 initial checkin
james
parents:
diff changeset
   107
    [instance variables:]
d6869c933c83 initial checkin
james
parents:
diff changeset
   108
d6869c933c83 initial checkin
james
parents:
diff changeset
   109
    [class variables:]
d6869c933c83 initial checkin
james
parents:
diff changeset
   110
d6869c933c83 initial checkin
james
parents:
diff changeset
   111
    [see also:]
d6869c933c83 initial checkin
james
parents:
diff changeset
   112
d6869c933c83 initial checkin
james
parents:
diff changeset
   113
"
d6869c933c83 initial checkin
james
parents:
diff changeset
   114
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   115
d6869c933c83 initial checkin
james
parents:
diff changeset
   116
examples
d6869c933c83 initial checkin
james
parents:
diff changeset
   117
"
d6869c933c83 initial checkin
james
parents:
diff changeset
   118
d6869c933c83 initial checkin
james
parents:
diff changeset
   119
  more examples to be added:
d6869c933c83 initial checkin
james
parents:
diff changeset
   120
                                                                [exBegin]
d6869c933c83 initial checkin
james
parents:
diff changeset
   121
    ... add code fragment for 
d6869c933c83 initial checkin
james
parents:
diff changeset
   122
    ... executable example here ...
d6869c933c83 initial checkin
james
parents:
diff changeset
   123
                                                                [exEnd]
d6869c933c83 initial checkin
james
parents:
diff changeset
   124
"
d6869c933c83 initial checkin
james
parents:
diff changeset
   125
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   126
d6869c933c83 initial checkin
james
parents:
diff changeset
   127
history
d6869c933c83 initial checkin
james
parents:
diff changeset
   128
    "Created: / 20.5.2003 / 08:28:06 / james"
d6869c933c83 initial checkin
james
parents:
diff changeset
   129
! !
d6869c933c83 initial checkin
james
parents:
diff changeset
   130
d6869c933c83 initial checkin
james
parents:
diff changeset
   131
!VersionHistory class methodsFor:'as yet unclassified'!
d6869c933c83 initial checkin
james
parents:
diff changeset
   132
d6869c933c83 initial checkin
james
parents:
diff changeset
   133
fromCollection: aCollection
d6869c933c83 initial checkin
james
parents:
diff changeset
   134
	"Note: this does not validate the continuity of version
d6869c933c83 initial checkin
james
parents:
diff changeset
   135
	numbers passed in aCollection...need to add continuity
d6869c933c83 initial checkin
james
parents:
diff changeset
   136
	checks in the future"
d6869c933c83 initial checkin
james
parents:
diff changeset
   137
d6869c933c83 initial checkin
james
parents:
diff changeset
   138
	^self new
d6869c933c83 initial checkin
james
parents:
diff changeset
   139
		initializeVersionsFrom: aCollection;
d6869c933c83 initial checkin
james
parents:
diff changeset
   140
		yourself
d6869c933c83 initial checkin
james
parents:
diff changeset
   141
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   142
d6869c933c83 initial checkin
james
parents:
diff changeset
   143
startingAt1
d6869c933c83 initial checkin
james
parents:
diff changeset
   144
d6869c933c83 initial checkin
james
parents:
diff changeset
   145
	^self startingAt: '1' asVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   146
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   147
d6869c933c83 initial checkin
james
parents:
diff changeset
   148
startingAt: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   149
d6869c933c83 initial checkin
james
parents:
diff changeset
   150
	^self new
d6869c933c83 initial checkin
james
parents:
diff changeset
   151
		initializeVersionsAt: aVersion;
d6869c933c83 initial checkin
james
parents:
diff changeset
   152
		yourself
d6869c933c83 initial checkin
james
parents:
diff changeset
   153
! !
d6869c933c83 initial checkin
james
parents:
diff changeset
   154
d6869c933c83 initial checkin
james
parents:
diff changeset
   155
!VersionHistory methodsFor:'accessing'!
d6869c933c83 initial checkin
james
parents:
diff changeset
   156
d6869c933c83 initial checkin
james
parents:
diff changeset
   157
allVersionsAfter: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   158
	"Answer all the versions based on aVersion."
d6869c933c83 initial checkin
james
parents:
diff changeset
   159
d6869c933c83 initial checkin
james
parents:
diff changeset
   160
	| answer |
d6869c933c83 initial checkin
james
parents:
diff changeset
   161
	answer := Set new.
d6869c933c83 initial checkin
james
parents:
diff changeset
   162
	versions do: [ :ea |
d6869c933c83 initial checkin
james
parents:
diff changeset
   163
		((ea inSameBranchAs: aVersion) and: 
d6869c933c83 initial checkin
james
parents:
diff changeset
   164
			[ea > aVersion]) ifTrue: [answer add: ea]].
d6869c933c83 initial checkin
james
parents:
diff changeset
   165
	^answer
d6869c933c83 initial checkin
james
parents:
diff changeset
   166
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   167
d6869c933c83 initial checkin
james
parents:
diff changeset
   168
allVersionsBefore: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   169
	"Answer all versions that came before aVersion"
d6869c933c83 initial checkin
james
parents:
diff changeset
   170
d6869c933c83 initial checkin
james
parents:
diff changeset
   171
	| answer |
d6869c933c83 initial checkin
james
parents:
diff changeset
   172
	answer := Set new.
d6869c933c83 initial checkin
james
parents:
diff changeset
   173
	versions do: [ :ea |
d6869c933c83 initial checkin
james
parents:
diff changeset
   174
		((ea inSameBranchAs: aVersion) and: 
d6869c933c83 initial checkin
james
parents:
diff changeset
   175
			[ea < aVersion]) ifTrue: [answer add: ea]].
d6869c933c83 initial checkin
james
parents:
diff changeset
   176
	^answer
d6869c933c83 initial checkin
james
parents:
diff changeset
   177
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   178
d6869c933c83 initial checkin
james
parents:
diff changeset
   179
firstVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   180
	"Answer the first version in the entire version history"
d6869c933c83 initial checkin
james
parents:
diff changeset
   181
d6869c933c83 initial checkin
james
parents:
diff changeset
   182
	^versions inject: versions anyOne into: [ :x :ea |
d6869c933c83 initial checkin
james
parents:
diff changeset
   183
		(x inSameBranchAs: ea)
d6869c933c83 initial checkin
james
parents:
diff changeset
   184
			ifTrue: [(x < ea) ifTrue: [x] ifFalse: [ea]]
d6869c933c83 initial checkin
james
parents:
diff changeset
   185
			ifFalse: [ea]]
d6869c933c83 initial checkin
james
parents:
diff changeset
   186
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   187
d6869c933c83 initial checkin
james
parents:
diff changeset
   188
latestMainLineVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   189
d6869c933c83 initial checkin
james
parents:
diff changeset
   190
	^(self mainLineStartingAt: self firstVersion) last
d6869c933c83 initial checkin
james
parents:
diff changeset
   191
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   192
d6869c933c83 initial checkin
james
parents:
diff changeset
   193
mainLineStartingAt: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   194
	"Answer all versions based on aVersion that are not branches (they have 
d6869c933c83 initial checkin
james
parents:
diff changeset
   195
	the same number of digits with the same values, except the last value is
d6869c933c83 initial checkin
james
parents:
diff changeset
   196
	greater than the last value of aVersion)."
d6869c933c83 initial checkin
james
parents:
diff changeset
   197
d6869c933c83 initial checkin
james
parents:
diff changeset
   198
	| answer tmp |
d6869c933c83 initial checkin
james
parents:
diff changeset
   199
	answer := OrderedCollection new.
d6869c933c83 initial checkin
james
parents:
diff changeset
   200
	tmp := aVersion.
d6869c933c83 initial checkin
james
parents:
diff changeset
   201
	[versions includes: tmp] 
d6869c933c83 initial checkin
james
parents:
diff changeset
   202
		whileTrue: 
d6869c933c83 initial checkin
james
parents:
diff changeset
   203
			[answer add: tmp.
d6869c933c83 initial checkin
james
parents:
diff changeset
   204
			tmp := tmp next].
d6869c933c83 initial checkin
james
parents:
diff changeset
   205
	^answer
d6869c933c83 initial checkin
james
parents:
diff changeset
   206
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   207
d6869c933c83 initial checkin
james
parents:
diff changeset
   208
versionBefore: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   209
d6869c933c83 initial checkin
james
parents:
diff changeset
   210
	"Answer the version immediately preceeding aVersion."
d6869c933c83 initial checkin
james
parents:
diff changeset
   211
d6869c933c83 initial checkin
james
parents:
diff changeset
   212
	| tmp |
d6869c933c83 initial checkin
james
parents:
diff changeset
   213
	(aVersion > '1' asVersion) ifFalse: [^nil].
d6869c933c83 initial checkin
james
parents:
diff changeset
   214
	(versions includes: (tmp := aVersion previous)) ifFalse: [^nil].
d6869c933c83 initial checkin
james
parents:
diff changeset
   215
	^tmp
d6869c933c83 initial checkin
james
parents:
diff changeset
   216
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   217
d6869c933c83 initial checkin
james
parents:
diff changeset
   218
versionsAfter: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   219
	"Answer all the versions immediately following aVersion."
d6869c933c83 initial checkin
james
parents:
diff changeset
   220
d6869c933c83 initial checkin
james
parents:
diff changeset
   221
	| answer tmp |
d6869c933c83 initial checkin
james
parents:
diff changeset
   222
	answer := Set new.
d6869c933c83 initial checkin
james
parents:
diff changeset
   223
	tmp := aVersion next.
d6869c933c83 initial checkin
james
parents:
diff changeset
   224
	(versions includes: aVersion next) ifTrue: [answer add: tmp].
d6869c933c83 initial checkin
james
parents:
diff changeset
   225
d6869c933c83 initial checkin
james
parents:
diff changeset
   226
	tmp := aVersion.
d6869c933c83 initial checkin
james
parents:
diff changeset
   227
	[versions includes: (tmp := tmp branchNext)] whileTrue:
d6869c933c83 initial checkin
james
parents:
diff changeset
   228
		[answer add: tmp].
d6869c933c83 initial checkin
james
parents:
diff changeset
   229
	^answer
d6869c933c83 initial checkin
james
parents:
diff changeset
   230
! !
d6869c933c83 initial checkin
james
parents:
diff changeset
   231
d6869c933c83 initial checkin
james
parents:
diff changeset
   232
!VersionHistory methodsFor:'adding'!
d6869c933c83 initial checkin
james
parents:
diff changeset
   233
d6869c933c83 initial checkin
james
parents:
diff changeset
   234
addNewVersionBasedOn: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   235
d6869c933c83 initial checkin
james
parents:
diff changeset
   236
	| tmp |
d6869c933c83 initial checkin
james
parents:
diff changeset
   237
	(versions includes: aVersion) ifFalse: [^self error: 'Version is not in this history'].
d6869c933c83 initial checkin
james
parents:
diff changeset
   238
d6869c933c83 initial checkin
james
parents:
diff changeset
   239
	tmp := aVersion next.
d6869c933c83 initial checkin
james
parents:
diff changeset
   240
	(versions includes: tmp) ifFalse: 
d6869c933c83 initial checkin
james
parents:
diff changeset
   241
		[versions add: tmp.
d6869c933c83 initial checkin
james
parents:
diff changeset
   242
		^tmp].
d6869c933c83 initial checkin
james
parents:
diff changeset
   243
d6869c933c83 initial checkin
james
parents:
diff changeset
   244
	tmp := aVersion.
d6869c933c83 initial checkin
james
parents:
diff changeset
   245
	[versions includes: (tmp := tmp branchNext)] whileTrue.
d6869c933c83 initial checkin
james
parents:
diff changeset
   246
	versions add: tmp.
d6869c933c83 initial checkin
james
parents:
diff changeset
   247
	^tmp
d6869c933c83 initial checkin
james
parents:
diff changeset
   248
	
d6869c933c83 initial checkin
james
parents:
diff changeset
   249
! !
d6869c933c83 initial checkin
james
parents:
diff changeset
   250
d6869c933c83 initial checkin
james
parents:
diff changeset
   251
!VersionHistory methodsFor:'initialization'!
d6869c933c83 initial checkin
james
parents:
diff changeset
   252
d6869c933c83 initial checkin
james
parents:
diff changeset
   253
initializeVersionsAt: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   254
d6869c933c83 initial checkin
james
parents:
diff changeset
   255
	versions := Set new.
d6869c933c83 initial checkin
james
parents:
diff changeset
   256
	versions add: aVersion.
d6869c933c83 initial checkin
james
parents:
diff changeset
   257
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   258
d6869c933c83 initial checkin
james
parents:
diff changeset
   259
initializeVersionsFrom: aCollection
d6869c933c83 initial checkin
james
parents:
diff changeset
   260
d6869c933c83 initial checkin
james
parents:
diff changeset
   261
	versions := Set new.
d6869c933c83 initial checkin
james
parents:
diff changeset
   262
	aCollection do: [ :ea | versions add: ea ].
d6869c933c83 initial checkin
james
parents:
diff changeset
   263
! !
d6869c933c83 initial checkin
james
parents:
diff changeset
   264
d6869c933c83 initial checkin
james
parents:
diff changeset
   265
!VersionHistory methodsFor:'printing'!
d6869c933c83 initial checkin
james
parents:
diff changeset
   266
d6869c933c83 initial checkin
james
parents:
diff changeset
   267
treeString
d6869c933c83 initial checkin
james
parents:
diff changeset
   268
	"Answer a string that show the entire version history with
d6869c933c83 initial checkin
james
parents:
diff changeset
   269
	each branch starting on a new line"
d6869c933c83 initial checkin
james
parents:
diff changeset
   270
d6869c933c83 initial checkin
james
parents:
diff changeset
   271
	^self treeStringStartingAt: self firstVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   272
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   273
d6869c933c83 initial checkin
james
parents:
diff changeset
   274
treeStringOn: strm startingAt: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   275
d6869c933c83 initial checkin
james
parents:
diff changeset
   276
	| tmp |
d6869c933c83 initial checkin
james
parents:
diff changeset
   277
	tmp := self mainLineStartingAt: aVersion.
d6869c933c83 initial checkin
james
parents:
diff changeset
   278
	tmp do: [ :ea | ea versionStringOn: strm. strm space; space ].
d6869c933c83 initial checkin
james
parents:
diff changeset
   279
	strm cr.
d6869c933c83 initial checkin
james
parents:
diff changeset
   280
	tmp do: 
d6869c933c83 initial checkin
james
parents:
diff changeset
   281
		[ :ea | 
d6869c933c83 initial checkin
james
parents:
diff changeset
   282
		(versions includes: ea branchNext)
d6869c933c83 initial checkin
james
parents:
diff changeset
   283
			ifTrue: [self treeStringOn: strm startingAt: ea branchNext]].
d6869c933c83 initial checkin
james
parents:
diff changeset
   284
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   285
d6869c933c83 initial checkin
james
parents:
diff changeset
   286
treeStringStartingAt: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   287
d6869c933c83 initial checkin
james
parents:
diff changeset
   288
	| strm |
d6869c933c83 initial checkin
james
parents:
diff changeset
   289
	strm := WriteStream on: ''.
d6869c933c83 initial checkin
james
parents:
diff changeset
   290
	self treeStringOn: strm startingAt: aVersion.
d6869c933c83 initial checkin
james
parents:
diff changeset
   291
	^strm contents
d6869c933c83 initial checkin
james
parents:
diff changeset
   292
! !
d6869c933c83 initial checkin
james
parents:
diff changeset
   293
d6869c933c83 initial checkin
james
parents:
diff changeset
   294
!VersionHistory methodsFor:'removing'!
d6869c933c83 initial checkin
james
parents:
diff changeset
   295
d6869c933c83 initial checkin
james
parents:
diff changeset
   296
remove: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   297
	"Remove aVersion from this version history."
d6869c933c83 initial checkin
james
parents:
diff changeset
   298
d6869c933c83 initial checkin
james
parents:
diff changeset
   299
	^self remove: aVersion ifAbsent: [self error: 'version not found'].
d6869c933c83 initial checkin
james
parents:
diff changeset
   300
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   301
d6869c933c83 initial checkin
james
parents:
diff changeset
   302
remove: aVersion ifAbsent: aBlock
d6869c933c83 initial checkin
james
parents:
diff changeset
   303
	"Remove aVersion from this version history."
d6869c933c83 initial checkin
james
parents:
diff changeset
   304
d6869c933c83 initial checkin
james
parents:
diff changeset
   305
	(versions includes: aVersion) ifFalse: [^aBlock value].
d6869c933c83 initial checkin
james
parents:
diff changeset
   306
d6869c933c83 initial checkin
james
parents:
diff changeset
   307
	(self canRemove: aVersion) ifFalse:
d6869c933c83 initial checkin
james
parents:
diff changeset
   308
		[^self error: 'Only versions at the beginning or end with no more than one follower may be removed'].
d6869c933c83 initial checkin
james
parents:
diff changeset
   309
d6869c933c83 initial checkin
james
parents:
diff changeset
   310
	versions remove: aVersion.
d6869c933c83 initial checkin
james
parents:
diff changeset
   311
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   312
d6869c933c83 initial checkin
james
parents:
diff changeset
   313
removeBranch: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   314
	"Remove aVersion and all of it's successors, providing that
d6869c933c83 initial checkin
james
parents:
diff changeset
   315
	aVersion is not the first version."
d6869c933c83 initial checkin
james
parents:
diff changeset
   316
d6869c933c83 initial checkin
james
parents:
diff changeset
   317
	(self versionBefore: aVersion)
d6869c933c83 initial checkin
james
parents:
diff changeset
   318
		ifNil: [^self error: 'version is the first version in the history'].
d6869c933c83 initial checkin
james
parents:
diff changeset
   319
d6869c933c83 initial checkin
james
parents:
diff changeset
   320
	versions removeAll: (self allVersionsAfter: aVersion).
d6869c933c83 initial checkin
james
parents:
diff changeset
   321
	versions remove: aVersion.
d6869c933c83 initial checkin
james
parents:
diff changeset
   322
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   323
d6869c933c83 initial checkin
james
parents:
diff changeset
   324
removeTrunk: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   325
	"Remove aVersion and all of it's predecessors, providing there
d6869c933c83 initial checkin
james
parents:
diff changeset
   326
	are no other branches stemming from the trunk.  Note, a trunk is defined
d6869c933c83 initial checkin
james
parents:
diff changeset
   327
	as all versions, starting with the first version, that have only one successor."
d6869c933c83 initial checkin
james
parents:
diff changeset
   328
d6869c933c83 initial checkin
james
parents:
diff changeset
   329
	| tmp |
d6869c933c83 initial checkin
james
parents:
diff changeset
   330
	(self versionsAfter: aVersion) size > 1 
d6869c933c83 initial checkin
james
parents:
diff changeset
   331
		ifTrue: [^self error: 'version is at a fork'].
d6869c933c83 initial checkin
james
parents:
diff changeset
   332
d6869c933c83 initial checkin
james
parents:
diff changeset
   333
	tmp := self allVersionsBefore: aVersion.
d6869c933c83 initial checkin
james
parents:
diff changeset
   334
	(tmp detect: [ :ea | (self versionsAfter: ea) size > 1 ] ifNone: [nil])
d6869c933c83 initial checkin
james
parents:
diff changeset
   335
		ifNotNil: [^self error: 'not a trunk, other branches detected'].
d6869c933c83 initial checkin
james
parents:
diff changeset
   336
d6869c933c83 initial checkin
james
parents:
diff changeset
   337
	versions removeAll: tmp.
d6869c933c83 initial checkin
james
parents:
diff changeset
   338
	versions remove: aVersion.
d6869c933c83 initial checkin
james
parents:
diff changeset
   339
! !
d6869c933c83 initial checkin
james
parents:
diff changeset
   340
d6869c933c83 initial checkin
james
parents:
diff changeset
   341
!VersionHistory methodsFor:'testing'!
d6869c933c83 initial checkin
james
parents:
diff changeset
   342
d6869c933c83 initial checkin
james
parents:
diff changeset
   343
canRemove: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   344
d6869c933c83 initial checkin
james
parents:
diff changeset
   345
	| hasPriors followers |
d6869c933c83 initial checkin
james
parents:
diff changeset
   346
	(versions includes: aVersion) ifFalse: [^false].
d6869c933c83 initial checkin
james
parents:
diff changeset
   347
	hasPriors := (self versionBefore: aVersion) notNil.
d6869c933c83 initial checkin
james
parents:
diff changeset
   348
	followers := self versionsAfter: aVersion.		
d6869c933c83 initial checkin
james
parents:
diff changeset
   349
d6869c933c83 initial checkin
james
parents:
diff changeset
   350
	"Don't allow versions in the middle to be extracted"
d6869c933c83 initial checkin
james
parents:
diff changeset
   351
	(hasPriors and: [followers size > 0]) ifTrue: [^false].
d6869c933c83 initial checkin
james
parents:
diff changeset
   352
	
d6869c933c83 initial checkin
james
parents:
diff changeset
   353
	"Don't allow versions with more than one follower to be extracted"
d6869c933c83 initial checkin
james
parents:
diff changeset
   354
	(hasPriors not and: [followers size > 1]) ifTrue: [^false].
d6869c933c83 initial checkin
james
parents:
diff changeset
   355
	^true
d6869c933c83 initial checkin
james
parents:
diff changeset
   356
d6869c933c83 initial checkin
james
parents:
diff changeset
   357
!
d6869c933c83 initial checkin
james
parents:
diff changeset
   358
d6869c933c83 initial checkin
james
parents:
diff changeset
   359
includesVersion: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   360
d6869c933c83 initial checkin
james
parents:
diff changeset
   361
	^versions includes: aVersion
d6869c933c83 initial checkin
james
parents:
diff changeset
   362
! !
d6869c933c83 initial checkin
james
parents:
diff changeset
   363
d6869c933c83 initial checkin
james
parents:
diff changeset
   364
!VersionHistory class methodsFor:'documentation'!
d6869c933c83 initial checkin
james
parents:
diff changeset
   365
d6869c933c83 initial checkin
james
parents:
diff changeset
   366
version
1445
b8cc2792ab97 copyright
Claus Gittinger <cg@exept.de>
parents: 1282
diff changeset
   367
    ^ '$Header: /cvs/stx/stx/libbasic3/packages/VersionHistory.st,v 1.2 2006-01-10 09:31:46 cg Exp $'
1282
d6869c933c83 initial checkin
james
parents:
diff changeset
   368
! !