'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').
! !

