'From Pharo8.0.0 of 3 March 2019 [Build information: Pharo-8.0.0+build.113.sha.c3e75ed590752fef4db5122071bfcaeab87c126e (64 Bit)] on 5 March 2019 at 5:49:43.067581 pm'! !FileReference methodsFor: 'utilities' stamp: 'AlistairGrant 3/5/2019 17:45'! nextVersion "Assumes a file (or folder) name includes a version number encoded as '.' followed by digits preceding the file extension. Increment the version number and answer the new file name. If a version number is not found, return just the file" | parent basename nameWithoutExtension extension max index | self exists ifFalse: [ ^ self ]. parent := self parent. extension := self extension. basename := self basename. nameWithoutExtension := basename copyFrom: 1 to: (basename size - extension size - 1). "At this stage nameWithoutExtension may still include a version number. Remove it if necessary" index := nameWithoutExtension size. [ index > 0 and: [ (nameWithoutExtension at: index) isDigit ] ] whileTrue: [ index := index - 1 ]. ((index between: 1 and: nameWithoutExtension size - 1) and: [ (nameWithoutExtension at: index) = $. ]) ifTrue: [ nameWithoutExtension := nameWithoutExtension copyFrom: 1 to: index-1 ]. max := 0. parent children do: [ :child | | number | ((child basename beginsWith: nameWithoutExtension) and: [ child extension = extension ]) ifTrue: [ number := Number squeezeNumberOutOfString: (child basename last: (child basename size - nameWithoutExtension size - 1)) ifFail: [ 0 ]. max := max max: number ] ]. ^ parent / (nameWithoutExtension, '.', (max+1) asString) , self extension! ! !FileReferenceTest methodsFor: 'tests' stamp: 'AlistairGrant 3/5/2019 17:48'! testNextVersion | fs file versions | fs := FileSystem memory. file := fs / 'file.name'. versions := Array streamContents: [ :stream | 5 timesRepeat: [ file createFile. stream nextPut: file basename. file := file nextVersion. ] ]. self assert: versions equals: #('file.name' 'file.1.name' 'file.2.name' 'file.3.name' 'file.4.name'). fs := FileSystem memory. file := fs / 'file123.name.ext'. versions := Array streamContents: [ :stream | 5 timesRepeat: [ file createFile. stream nextPut: file basename. file := file nextVersion. ] ]. self assert: versions equals: #('file123.name.ext' 'file123.name.1.ext' 'file123.name.2.ext' 'file123.name.3.ext' 'file123.name.4.ext'). fs := FileSystem memory. file := fs / '123.ext'. versions := Array streamContents: [ :stream | 5 timesRepeat: [ file createFile. stream nextPut: file basename. file := file nextVersion. ] ]. self assert: versions equals: #('123.ext' '123.1.ext' '123.2.ext' '123.3.ext' '123.4.ext'). ! !