MCSubDirectoryRepository.st
author Claus Gittinger <cg@exept.de>
Wed, 22 Nov 2006 14:22:58 +0100
changeset 117 a47e3c42acc1
child 190 8b0ddcf56d0e
permissions -rw-r--r--
initial checkin
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/monticello' }"
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
MCDirectoryRepository subclass:#MCSubDirectoryRepository
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:''
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	classVariableNames:''
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
	category:'Monticello-Repositories'
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
MCSubDirectoryRepository comment:'A MCDirectoryRepository that looks in subdirectories too.'
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
!MCSubDirectoryRepository class methodsFor:'user interface'!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
description
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
	^ 'directory with subdirectories'
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
! !
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
!MCSubDirectoryRepository methodsFor:'as yet unclassified'!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
findFullNameForReading: aBaseName
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
	"Answer the latest version of aBaseName"
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
	| possible |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
	possible _ SortedCollection sortBlock: [ :a :b | b first modificationTime < a first modificationTime ].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
	self allDirectories
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
		do: [:dir | dir entries
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
				do: [:ent | ent isDirectory
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
						ifFalse: [
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
							(ent name = aBaseName) ifTrue: [ possible add: {ent. dir fullNameFor: ent name}]]]].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
	^(possible at: 1 ifAbsent: [ ^nil ]) second
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
findFullNameForWriting: aBaseName
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
	| possible split dirScore fileScore prefix fpattern parts now |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
	split _ directory splitNameVersionExtensionFor: aBaseName.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
	fpattern _ split first, '*'.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
	possible _ SortedCollection sortBlock: [ :a :b |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
		a first = b first
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
			ifTrue: [ a second = b second
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
					ifFalse: [ a second < b second ]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
					ifTrue: [ a third fullName size < b third fullName size ]]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
			ifFalse: [ a first > b first ] ].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
	now _ Time totalSeconds.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
	prefix _ directory pathParts size.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
	self allDirectories do: [:dir |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
		parts _ dir pathParts allButFirst: prefix.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
		dirScore _ (parts select: [ :part | fpattern match: part ]) size.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
		fileScore _ (dir entries collect: [ :ent |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
			(ent isDirectory not and: [ fpattern match: ent name ])
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
				ifFalse: [ SmallInteger maxVal ]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
				ifTrue: [ now - ent modificationTime ]]).	"minimum age"
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
		fileScore _ fileScore isEmpty ifTrue: [ SmallInteger maxVal  ]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
			ifFalse: [ fileScore min ].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
		possible add: { dirScore. fileScore. dir } ].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
	^ (possible first third) fullNameFor: aBaseName
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
readStreamForFileNamed: aString do: aBlock
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
	| file val |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
	file _ FileStream readOnlyFileNamed: (self findFullNameForReading: aString).
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
	val _ aBlock value: file.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
	file close.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
	^ val
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
writeStreamForFileNamed: aString replace: aBoolean do: aBlock 
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
	| file |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
	file := aBoolean
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
				ifTrue: [FileStream
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
						forceNewFileNamed: (self findFullNameForReading: aString)]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
				ifFalse: [FileStream
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
						newFileNamed: (self findFullNameForWriting: aString)].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
	aBlock value: file.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
	file close
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
! !
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
!MCSubDirectoryRepository methodsFor:'enumeration'!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
allDirectories
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
	| remaining dir dirs |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
	remaining := OrderedCollection new.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
	dirs := OrderedCollection new.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
	remaining addLast: directory.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
	[remaining isEmpty]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
		whileFalse: [dir := remaining removeFirst.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
			dirs add: dir.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
			dir entries
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
				do: [:ent | ent isDirectory
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
						ifTrue: [remaining
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
								addLast: (dir directoryNamed: ent name)]]].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
	^ dirs
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
allFileNames
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
	"sorting {entry. dirName. name}"
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
	| sorted |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
	sorted := SortedCollection sortBlock: [:a :b |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
		a first modificationTime >= b first modificationTime ].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
	self allDirectories
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
		do: [:dir | dir entries
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
				do: [:ent | ent isDirectory
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
						ifFalse: [sorted add: {ent. dir fullName. ent name}]]].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
	^ sorted
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
		collect: [:ea | ea third ]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
! !
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
!MCSubDirectoryRepository methodsFor:'user interface'!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
description
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
	^ directory pathName, '/*'
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
! !
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
!MCSubDirectoryRepository class methodsFor:'documentation'!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
version
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCSubDirectoryRepository.st,v 1.1 2006-11-22 13:22:58 cg Exp $'
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
! !