MetacelloVersionNumber.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Wed, 05 Sep 2012 16:34:21 +0000
changeset 6 2cd0e1bd3518
parent 2 7b5f1be6a996
permissions -rw-r--r--
- MetacelloAbstractVersionConstructor changed: #project - MetacelloVersionNumber changed: #collapseZeros - MetacelloProjectReferenceSpec added: #versionString - MetacelloSpecTestCase variable renamed in: #projectWith: - extensions ...
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
9e312de5f694 - Initial commit
jv
parents:
diff changeset
     1
"{ Package: 'stx:goodies/metacello' }"
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
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   236
asString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   237
	"Answer a string that represents the receiver."
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   238
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   239
	^ self printString
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   240
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   241
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
6
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
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
6
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   262
        | collection newSize new j lastElementIsStringOrZero canCollapse |
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   263
        (self size = 0 or: [ (self at: 1) == 0])
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   264
                ifTrue: [ ^ self ].
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   265
        collection := OrderedCollection new.
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   266
        lastElementIsStringOrZero := true.
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   267
        canCollapse := true.
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   268
        self size to: 1 by: -1 do: [ :i | 
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   269
                | element |
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   270
                element := self at: i.
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   271
                (canCollapse and: [ element == 0 ])
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   272
                        ifTrue: [ 
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   273
                                lastElementIsStringOrZero
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   274
                                        ifFalse: [ 
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   275
                                                canCollapse := false.
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   276
                                                collection addFirst: element.]]
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   277
                        ifFalse: [ 
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   278
                                collection addFirst: element.
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   279
                                canCollapse := lastElementIsStringOrZero := element isString ] ].
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   280
        collection size = self size
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   281
                ifTrue: [ ^ self ].
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   282
        newSize := collection size.
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   283
        new := self species new: newSize.
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   284
        j := 0.
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   285
        collection
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   286
                do: [ :element | 
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   287
                        new at: j + 1 put: element.
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   288
                        j := j + 1 ].
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   289
        ^ new
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   290
2cd0e1bd3518 - MetacelloAbstractVersionConstructor
Jan Vrany <jan.vrany@fit.cvut.cz>
parents: 2
diff changeset
   291
    "Modified: / 05-09-2012 / 17:20:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
1
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   292
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   293
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   294
compareEqualTo: aMetacelloVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   295
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   296
	| mySize |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   297
	aMetacelloVersionNumber species = self species ifFalse: [ ^false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   298
	mySize := self size.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   299
	mySize = aMetacelloVersionNumber size 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   300
		ifFalse: [ ^false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   301
	1 to: mySize do: [:i |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   302
		(self at: i) = (aMetacelloVersionNumber at: i) ifFalse: [ ^false ]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   303
	^true
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   304
!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   305
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   306
compareLessThan: aMetacelloVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   307
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   308
	| mySize aSize commonSize count more |
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   309
	mySize := self size.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   310
	aSize := aMetacelloVersionNumber size.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   311
	commonSize :=  mySize min: aSize.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   312
	count := 0.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   313
	more := true.
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   314
	[ more and: [ count < commonSize ]] whileTrue: [
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   315
		(self at: count + 1) = (aMetacelloVersionNumber at: count + 1)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   316
			ifTrue: [ count := count + 1 ]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   317
			ifFalse: [ more := false ]].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   318
	count < commonSize
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   319
		ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   320
			^(self at: count + 1) 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   321
				metacelloVersionComponentLessThan: (aMetacelloVersionNumber at: count + 1) ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   322
	mySize < aSize
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   323
		ifTrue: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   324
			mySize = 0 ifTrue: [ ^true ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   325
			"if the versions at commonSize are equal and the next version slot in aMetacelloVersionNumber 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   326
			 is a string, then it's considered that I'm > aMetacelloVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   327
			 (i.e., '2.9.9' is greater than '2.9.9-alpha.2')"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   328
			(self at: commonSize) = (aMetacelloVersionNumber at: commonSize)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   329
				ifFalse: [ ^true ]. 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   330
			^(aMetacelloVersionNumber at: commonSize+1) isString not]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   331
		ifFalse: [ 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   332
			mySize = aSize ifTrue: [ ^false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   333
			aSize <= 0 ifTrue: [ ^false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   334
			"if the versions at commonSize are equal and the next version slot is a string, 
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   335
			 then it's considered that I'm < aMetacelloVersionNumber
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   336
			 (i.e., '2.9.9-alpha.2' is less than '2.9.9')"
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   337
			(self at: commonSize) = (aMetacelloVersionNumber at: commonSize)
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   338
				ifFalse: [ ^false ].
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   339
			 ^(self at: commonSize+1) isString]
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   340
! !
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   341
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   342
!MetacelloVersionNumber class methodsFor:'documentation'!
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   343
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   344
version_SVN
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   345
    ^ '$Id::                                                                                                                        $'
9e312de5f694 - Initial commit
jv
parents:
diff changeset
   346
! !