MCSubDirectoryRepository.st
author Claus Gittinger <cg@exept.de>
Mon, 14 May 2018 02:21:18 +0200
changeset 1048 582b3a028cbc
parent 908 2bf7b953264c
child 1121 c5661215109c
permissions -rw-r--r--
#FEATURE by cg class: MCMethodDefinition changed: #postloadOver:
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:''
688
d1a180a75dfe category change
Claus Gittinger <cg@exept.de>
parents: 273
diff changeset
     7
	category:'SCM-Monticello-Repositories'
117
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
908
2bf7b953264c categories
Claus Gittinger <cg@exept.de>
parents: 688
diff changeset
    14
!MCSubDirectoryRepository class methodsFor:'queries'!
117
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 |
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    25
	possible := SortedCollection sortBlock: [ :a :b | b first modificationTime < a first modificationTime ].
117
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
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    32
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
findFullNameForWriting: aBaseName
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
	| possible split dirScore fileScore prefix fpattern parts now |
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    37
	split := directory splitNameVersionExtensionFor: aBaseName.
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    38
	fpattern := split first, '*'.
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    39
	possible := SortedCollection sortBlock: [ :a :b |
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
		a first = b first
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
			ifTrue: [ a second = b second
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
					ifFalse: [ a second < b second ]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
					ifTrue: [ a third fullName size < b third fullName size ]]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
			ifFalse: [ a first > b first ] ].
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    45
	now := Time totalSeconds.
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    46
	prefix := directory pathParts size.
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
	self allDirectories do: [:dir |
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    48
		parts := dir pathParts allButFirst: prefix.
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    49
		dirScore := (parts select: [ :part | fpattern match: part ]) size.
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    50
		fileScore := (dir entries collect: [ :ent |
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
			(ent isDirectory not and: [ fpattern match: ent name ])
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
				ifFalse: [ SmallInteger maxVal ]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
				ifTrue: [ now - ent modificationTime ]]).	"minimum age"
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    54
		fileScore := fileScore isEmpty ifTrue: [ SmallInteger maxVal  ]
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
			ifFalse: [ fileScore min ].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
		possible add: { dirScore. fileScore. dir } ].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
	^ (possible first third) fullNameFor: aBaseName
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
readStreamForFileNamed: aString do: aBlock
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
	| file val |
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    62
	file := FileStream readOnlyFileNamed: (self findFullNameForReading: aString).
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    63
	val := aBlock value: file.
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
	file close.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
	^ val
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
writeStreamForFileNamed: aString replace: aBoolean do: aBlock 
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
	| file |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
	file := aBoolean
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
				ifTrue: [FileStream
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
						forceNewFileNamed: (self findFullNameForReading: aString)]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
				ifFalse: [FileStream
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
						newFileNamed: (self findFullNameForWriting: aString)].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
	aBlock value: file.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
	file close
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
! !
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
!MCSubDirectoryRepository methodsFor:'enumeration'!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
allDirectories
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
	| remaining dir dirs |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
	remaining := OrderedCollection new.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
	dirs := OrderedCollection new.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
	remaining addLast: directory.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
	[remaining isEmpty]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
		whileFalse: [dir := remaining removeFirst.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
			dirs add: dir.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
			dir entries
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
				do: [:ent | ent isDirectory
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
						ifTrue: [remaining
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
								addLast: (dir directoryNamed: ent name)]]].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
	^ dirs
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
allFileNames
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
	"sorting {entry. dirName. name}"
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
	| sorted |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
	sorted := SortedCollection sortBlock: [:a :b |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
		a first modificationTime >= b first modificationTime ].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
	self allDirectories
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
		do: [:dir | dir entries
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
				do: [:ent | ent isDirectory
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
						ifFalse: [sorted add: {ent. dir fullName. ent name}]]].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
	^ sorted
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
		collect: [:ea | ea third ]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
! !
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
!MCSubDirectoryRepository methodsFor:'user interface'!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
description
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
	^ directory pathName, '/*'
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
! !
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
!MCSubDirectoryRepository class methodsFor:'documentation'!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
273
b66b046a8e10 initial checkin
Claus Gittinger <cg@exept.de>
parents: 190
diff changeset
   118
version
908
2bf7b953264c categories
Claus Gittinger <cg@exept.de>
parents: 688
diff changeset
   119
    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCSubDirectoryRepository.st,v 1.5 2014-02-12 14:53:39 cg Exp $'
273
b66b046a8e10 initial checkin
Claus Gittinger <cg@exept.de>
parents: 190
diff changeset
   120
!
b66b046a8e10 initial checkin
Claus Gittinger <cg@exept.de>
parents: 190
diff changeset
   121
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
   122
version_CVS
908
2bf7b953264c categories
Claus Gittinger <cg@exept.de>
parents: 688
diff changeset
   123
    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCSubDirectoryRepository.st,v 1.5 2014-02-12 14:53:39 cg Exp $'
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
   124
!
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
   125
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
   126
version_SVN
908
2bf7b953264c categories
Claus Gittinger <cg@exept.de>
parents: 688
diff changeset
   127
    ^ '$Id: MCSubDirectoryRepository.st,v 1.5 2014-02-12 14:53:39 cg Exp $'
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
! !
908
2bf7b953264c categories
Claus Gittinger <cg@exept.de>
parents: 688
diff changeset
   129