core/MetacelloVersionNumber.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Tue, 18 Sep 2012 18:24:44 +0000
changeset 16 25ac697dc747
parent 14 f01fe37493e9
permissions -rw-r--r--
- Updated from branch master
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11
d354ac2af7ec Metacello package refactoring - phase 2~
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 10
diff changeset
     1
"{ Package: 'stx:goodies/metacello/core' }"
1
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     2
2
7b5f1be6a996 Make MetacelloVersionNumber a variableSubclass
jv
parents: 1
diff changeset
     3
Magnitude variableSubclass:#MetacelloVersionNumber
1
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     4
	instanceVariableNames:''
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     5
	classVariableNames:''
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     6
	poolDictionaries:''
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     7
	category:'Metacello-Core-Model'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     8
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     9
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    10
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    11
!MetacelloVersionNumber class methodsFor:'instance creation'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    12
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    13
fromString: aString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    14
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    15
	| new components |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    16
	components := OrderedCollection new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    17
	(aString findTokens: '.') do: [:subString | | strs |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    18
		strs := subString findTokens: '-'.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    19
		"first subString token could be an integer"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    20
		components add: (self extractNumericComponent: strs first).
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    21
		strs size > 1
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    22
			ifTrue: [
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    23
				"remaining are uncoditionally Strings, because of leading $-"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    24
				components addAll: strs allButFirst ]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    25
	new := self new: components size.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    26
	1 to: components size do: [:i | new at: i put: (components at: i) ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    27
	^new
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    28
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    29
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    30
!MetacelloVersionNumber class methodsFor:'private'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    31
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    32
extractNumericComponent: subString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    33
	"$. separated components are integers"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    34
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    35
	| number |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    36
	number := [subString asNumber] 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    37
						on: Error 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    38
						do: [:ex | ex return: subString ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    39
	^number asString = subString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    40
		ifTrue: [ number ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    41
		ifFalse: [ subString ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    42
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    43
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    44
!MetacelloVersionNumber methodsFor:'accessing'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    45
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    46
approximateBase
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    47
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    48
	| base |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    49
	base := self copyFrom: 1 to: self size - 1.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    50
	base at: base size put: (base at: base size) + 1.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    51
	^base
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    52
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    53
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    54
versionString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    55
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    56
	| strm |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    57
	strm := WriteStream on: String new.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    58
	self printOn: strm.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    59
	^strm contents
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    60
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    61
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    62
!MetacelloVersionNumber methodsFor:'comparing'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    63
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    64
< aMetacelloVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    65
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    66
	| condensed aCondensed |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    67
	aMetacelloVersionNumber species = self species
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    68
		ifFalse: [ ^ false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    69
	condensed := self collapseZeros.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    70
	aCondensed := aMetacelloVersionNumber collapseZeros.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    71
	(condensed ~~ self or: [ aCondensed ~~ aMetacelloVersionNumber ])
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    72
		ifTrue: [ ^ condensed compareLessThan: aCondensed ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    73
	^ self compareLessThan: aMetacelloVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    74
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    75
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    76
= aMetacelloVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    77
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    78
	| condensed aCondensed |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    79
	aMetacelloVersionNumber species = self species
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    80
		ifFalse: [ ^ false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    81
	condensed := self collapseZeros.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    82
	aCondensed := aMetacelloVersionNumber collapseZeros.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    83
	(condensed ~~ self or: [ aCondensed ~~ aMetacelloVersionNumber ])
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    84
		ifTrue: [ ^ condensed compareEqualTo: aCondensed ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    85
	^ self compareEqualTo: aMetacelloVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    86
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    87
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    88
hash
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    89
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    90
"Returns a numeric hash key for the receiver."
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    91
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    92
| mySize interval hashValue |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    93
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    94
(mySize := self size) == 0
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    95
  ifTrue: [ ^15243 ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    96
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    97
"Choose an interval so that we sample at most 5 elements of the receiver"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    98
interval := ((mySize - 1) // 4) max: 1.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
    99
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   100
hashValue := 4459.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   101
1 to: mySize by: interval do: [ :i | | anElement |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   102
  anElement := self at: i.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   103
  (anElement isKindOf: SequenceableCollection)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   104
    ifTrue: [
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   105
      hashValue := (hashValue bitShift: -1) bitXor: anElement size.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   106
      ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   107
    ifFalse: [
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   108
      hashValue := (hashValue bitShift: -1) bitXor: anElement hash.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   109
      ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   110
  ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   111
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   112
^ hashValue abs
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   113
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   114
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   115
match: aVersionPattern
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   116
	"Answer whether the version number of the receiver matches the given pattern string.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   117
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   118
	 A Metacello version number is made up of version sequences delimited by the characters $. and $-.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   119
	 The $. introduces a numeric version sequence and $- introduces an alphanumeric version sequence.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   120
	 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   121
	 A version pattern is made up of version pattern match sequences. also delimited by the characters $. 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   122
	 and $-.. Each pattern match sequence is tested against the corresponding version sequence of the 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   123
	 receiver, using the 'standard' pattern matching rules. All sequences must answer true for a match.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   124
	
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   125
	 The special pattern sequence '?' is a match for the corresponding version sequence and all subsequent 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   126
	 version sequences. '?' as the version pattern matches all versions. No more version pattern 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   127
	 sequences are permitted once the '?' sequence is used. If used, it is the last version pattern
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   128
	 sequence. "
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   129
	
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   130
	| patternVersion mySize patternSize |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   131
	patternVersion := aVersionPattern asMetacelloVersionNumber.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   132
	mySize := self size.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   133
	patternSize := patternVersion size.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   134
	mySize = patternSize 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   135
		ifFalse: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   136
			mySize < patternSize ifTrue: [ ^false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   137
			(patternVersion at: patternSize) ~= '?' ifTrue: [ ^false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   138
			mySize := patternSize ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   139
	1 to: mySize do: [:i | | pattern |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   140
		pattern := (patternVersion at: i) asString.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   141
		pattern = '?'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   142
			ifTrue: [i = mySize ifFalse: [ ^self error: 'Invalid version match pattern: ', aVersionPattern printString ]]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   143
			ifFalse: [ (pattern match: (self at: i) asString)  ifFalse: [ ^false ]]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   144
	^true
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   145
"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   146
  '1.1.1' asMetacelloVersionNumber match: '*.*.*'. -> true
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   147
  '1.1.1' asMetacelloVersionNumber match: '*.#.*'. -> true
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   148
  '1.10.1' asMetacelloVersionNumber match: '*.#.*'. -> false
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   149
  '1.1.1' asMetacelloVersionNumber match: '*.*'. -> false
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   150
  '1.1.1' asMetacelloVersionNumber match: '*.?'. -> true
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   151
  '1.0' asMetacelloVersionNumber match: '1.?'. -> true
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   152
  '2.0' asMetacelloVersionNumber match: '1.?'. -> false
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   153
  '1.1.1' asMetacelloVersionNumber match: '?'. -> true
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   154
  '1' asMetacelloVersionNumber match: '*.?'. -> false
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   155
  '1-alpha5.0' asMetacelloVersionNumber match: '1-alpha*.?'. -> true
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   156
  '1-alpha15.0.1' asMetacelloVersionNumber match: '1-alpha*.?'. -> true
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   157
  '1.1' asMetacelloVersionNumber match: '?.?'. -> ERROR: invalid version match pattern
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   158
"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   159
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   160
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   161
~> aMetacelloVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   162
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   163
	aMetacelloVersionNumber size == 1 ifTrue: [ ^false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   164
	^self >= aMetacelloVersionNumber and: [ self < aMetacelloVersionNumber approximateBase ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   165
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   166
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   167
!MetacelloVersionNumber methodsFor:'converting'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   168
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   169
asMetacelloVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   170
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   171
	^self
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   172
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   173
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   174
!MetacelloVersionNumber methodsFor:'copying'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   175
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   176
copyFrom: start to: stop 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   177
	"Answer a copy of a subset of the receiver, starting from element at 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   178
	index start until element at index stop."
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   179
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   180
	| newSize new j |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   181
	newSize := stop - start + 1.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   182
	new := self species new: newSize.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   183
	j := 0.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   184
	start to: stop do: [:i |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   185
		new at: j + 1 put: (self at: i).
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   186
		j := j + 1 ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   187
	^new
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   188
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   189
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   190
!MetacelloVersionNumber methodsFor:'enumerating'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   191
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   192
do: aBlock 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   193
	"Refer to the comment in Collection|do:."
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   194
	1 to: self size do:
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   195
		[:index | aBlock value: (self at: index)]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   196
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   197
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   198
do: elementBlock separatedBy: separatorBlock
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   199
	"Evaluate the elementBlock for all elements in the receiver,
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   200
	and evaluate the separatorBlock between."
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   201
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   202
	| beforeFirst | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   203
	beforeFirst := true.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   204
	self do:
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   205
		[:each |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   206
		beforeFirst
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   207
			ifTrue: [beforeFirst := false]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   208
			ifFalse: [separatorBlock value].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   209
		elementBlock value: each]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   210
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   211
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   212
!MetacelloVersionNumber methodsFor:'operations'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   213
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   214
decrementMinorVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   215
	| int |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   216
	self size to: 1 by: -1 do: [ :index | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   217
		(int := self at: index) isString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   218
			ifFalse: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   219
				int > 0
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   220
					ifTrue: [ self at: index put: int - 1 ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   221
				^ self ] ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   222
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   223
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   224
incrementMinorVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   225
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   226
	| int |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   227
	self size to: 1 by: -1 do: [:index | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   228
		(int := self at: index) isString 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   229
			ifFalse: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   230
				self at: index put: int + 1.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   231
				^self ]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   232
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   233
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   234
!MetacelloVersionNumber methodsFor:'printing'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   235
16
25ac697dc747 - Updated from branch master
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   236
asString
25ac697dc747 - Updated from branch master
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   237
	"Answer a string that represents the receiver."
25ac697dc747 - Updated from branch master
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   238
25ac697dc747 - Updated from branch master
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   239
	^ self printString
25ac697dc747 - Updated from branch master
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   240
!
25ac697dc747 - Updated from branch master
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 14
diff changeset
   241
1
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   242
printOn: aStream
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   243
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   244
	| beforeFirst | 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   245
	beforeFirst := true.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   246
	self do:
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   247
		[:each |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   248
		beforeFirst
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   249
			ifTrue: [beforeFirst := false]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   250
			ifFalse: [
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   251
				each isString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   252
					ifTrue: [ aStream nextPut: $- ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   253
					ifFalse: [ aStream nextPut: $. ] ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   254
		aStream nextPutAll: each asString ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   255
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   256
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   257
!MetacelloVersionNumber methodsFor:'private'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   258
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   259
collapseZeros
14
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   260
	"the rule must be that zeros can be collapsed as long as the series of zeros ends in a string term"
1
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   261
14
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   262
	| collection newSize new j lastElementIsStringOrZero canCollapse |
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   263
	(self size = 0 or: [ self at: 1 ]) == 0
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   264
		ifTrue: [ ^ self ].
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   265
	collection := OrderedCollection new.
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   266
	lastElementIsStringOrZero := true.
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   267
	canCollapse := true.
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   268
	self size to: 1 by: -1 do: [ :i | 
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   269
		| element |
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   270
		element := self at: i.
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   271
		(canCollapse and: [ element == 0 ])
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   272
			ifTrue: [ 
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   273
				lastElementIsStringOrZero
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   274
					ifFalse: [ 
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   275
						canCollapse := false.
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   276
						collection addFirst: element.]]
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   277
			ifFalse: [ 
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   278
				collection addFirst: element.
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   279
				canCollapse := lastElementIsStringOrZero := element isString ] ].
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   280
	collection size = self size
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   281
		ifTrue: [ ^ self ].
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   282
	newSize := collection size.
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   283
	new := self species new: newSize.
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   284
	j := 0.
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   285
	collection
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   286
		do: [ :element | 
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   287
			new at: j + 1 put: element.
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   288
			j := j + 1 ].
f01fe37493e9 - MetacelloProjectSpecForLoad
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 11
diff changeset
   289
	^ new
1
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   290
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   291
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   292
compareEqualTo: aMetacelloVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   293
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   294
	| mySize |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   295
	aMetacelloVersionNumber species = self species ifFalse: [ ^false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   296
	mySize := self size.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   297
	mySize = aMetacelloVersionNumber size 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   298
		ifFalse: [ ^false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   299
	1 to: mySize do: [:i |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   300
		(self at: i) = (aMetacelloVersionNumber at: i) ifFalse: [ ^false ]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   301
	^true
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   302
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   303
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   304
compareLessThan: aMetacelloVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   305
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   306
	| mySize aSize commonSize count more |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   307
	mySize := self size.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   308
	aSize := aMetacelloVersionNumber size.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   309
	commonSize :=  mySize min: aSize.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   310
	count := 0.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   311
	more := true.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   312
	[ more and: [ count < commonSize ]] whileTrue: [
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   313
		(self at: count + 1) = (aMetacelloVersionNumber at: count + 1)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   314
			ifTrue: [ count := count + 1 ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   315
			ifFalse: [ more := false ]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   316
	count < commonSize
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   317
		ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   318
			^(self at: count + 1) 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   319
				metacelloVersionComponentLessThan: (aMetacelloVersionNumber at: count + 1) ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   320
	mySize < aSize
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   321
		ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   322
			mySize = 0 ifTrue: [ ^true ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   323
			"if the versions at commonSize are equal and the next version slot in aMetacelloVersionNumber 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   324
			 is a string, then it's considered that I'm > aMetacelloVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   325
			 (i.e., '2.9.9' is greater than '2.9.9-alpha.2')"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   326
			(self at: commonSize) = (aMetacelloVersionNumber at: commonSize)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   327
				ifFalse: [ ^true ]. 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   328
			^(aMetacelloVersionNumber at: commonSize+1) isString not]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   329
		ifFalse: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   330
			mySize = aSize ifTrue: [ ^false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   331
			aSize <= 0 ifTrue: [ ^false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   332
			"if the versions at commonSize are equal and the next version slot is a string, 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   333
			 then it's considered that I'm < aMetacelloVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   334
			 (i.e., '2.9.9-alpha.2' is less than '2.9.9')"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   335
			(self at: commonSize) = (aMetacelloVersionNumber at: commonSize)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   336
				ifFalse: [ ^false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   337
			 ^(self at: commonSize+1) isString]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   338
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   339
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   340
!MetacelloVersionNumber class methodsFor:'documentation'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   341
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   342
version_SVN
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   343
    ^ '$Id::                                                                                                                        $'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   344
! !