[comp.lang.smalltalk] Smalltalk recover goodie

pieter@prls.UUCP (Pieter van der Meulen) (04/12/90)

'The following source-code implements a modified ChangeListView recover
mechanism which allows you to specify how many snapshots you want to go back.
Despite its simplicity, it has been very useful to us over the years and
should have been made public domain software long ago.

Try: "ChangeListView recover"
Have fun, Pieter.
----------------------cut here--------------------------'!

!ChangeList methodsFor: 'private'!

find: aString lastMinus: anInteger in: aStream
	"Same as findLast:in: if anInteger would be zero.  This methods assumes
	that streaming forward is more efficient than streaming backward, and
	will therefore go faster with increasing jumpSize. However, if snapshots
	happen to follow each other within jumpSize characters in the changes
	file, it will include more snapshots than specified - P.S. van der Meulen"

	| firstChar endPosition position count index lastEnd lastMinus jumpSize |
	jumpSize _ 1000.
	lastMinus _ anInteger.
	lastEnd _ nil.
	firstChar _ aString first.
	aStream setToEnd.
	position _ aStream position.
	[endPosition _ position.
	lastEnd == nil and: [(position _ endPosition - jumpSize max: 0) < endPosition]]
		whileTrue:
			[aStream position: position.
			count _ endPosition - position.
			[count > 0]
				whileTrue:
					[count _ count - 1.
					aStream next = firstChar
						ifTrue:
							[index _ 2.
							[index <= aString size and: [(aString at: index) = aStream next]]
								whileTrue: [index _ index + 1].
							index > aString size
								ifTrue: [lastMinus > 0
											ifTrue: [lastMinus _ lastMinus - 1]
											ifFalse: [lastEnd _ aStream position]]
								ifFalse: [aStream position: endPosition - count]]]].
	^lastEnd! !

!ChangeList methodsFor: 'initialize-release'!

recover: anInteger file: aFileStream
	"Recover all the changes from a .changes file
	since the <last minus anInteger> snapshots.
	Written by Pieter S. van der Meulen."
	
	| position |
	position _ self find: '

''----SNAPSHOT----'
					lastMinus: anInteger
					in: aFileStream.
	position isNil
		ifTrue: [position _ 0].
	aFileStream position: position.
	aFileStream upTo: Character cr.
	self scanFile: aFileStream! !

!ChangeListView class methodsFor: 'instance creation'!

recoverLastMinus: anInteger
	"Open a view of the current changes file since the <last minus anInteger> snapshot."
	
	self openOn: (ChangeList new recover: anInteger file:
		((Smalltalk includesKey: #Filename)
			ifTrue: [(Filename named: (SourceFiles at: 2) name) readStream]	"Version 2.5"
			ifFalse: [SourceFiles at: 2]))									"Version 2.3"

	"ChangeListView recoverLastMinus: 1"!

recover
	"Open a view of the current changes file since the last snapshot, or more
	depending on the users request. Modified by Pieter S. van der Meulen."
	
	self recoverLastMinus:
		(FillInTheBlank
			request:
'From how many snapshots do you want to recover changes?
(Enter 0 for the current changes since the last snapshot.)'
			initialAnswer: '0') asNumber

	"ChangeListView recover"! !

'----------------------cut here--------------------------'!
-- 
---------------------------------------------
P.S. van der Meulen, MS 02        prls!pieter
PRLS, Signetics div. of NAPC      -----------
811 E.Arques Avenue, Sunnyvale, CA 94088-3409