MCSubDirectoryRepository.st
author Jan Vrany <jan.vrany@labware.com>
Tue, 11 Jul 2023 12:13:27 +0100
branchjv
changeset 1173 e3dd2050492e
parent 1156 b6ca954ebfc9
permissions -rw-r--r--
Update class category to match package name if it does not This is needed because in Squeak / Pharo world package membership is defined by (class) category prefix. This is soo annoying...
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1121
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
     1
"
1156
b6ca954ebfc9 Use custom Smalltalk/X package loader(s)
Jan Vrany <jan.vrany@labware.com>
parents: 1121
diff changeset
     2
COPYRIGHT (c) 2020-2021 LabWare
1121
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
     3
"
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
"{ Package: 'stx:goodies/monticello' }"
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
1121
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
     6
"{ NameSpace: Smalltalk }"
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
     7
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
MCDirectoryRepository subclass:#MCSubDirectoryRepository
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
	instanceVariableNames:''
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
	classVariableNames:''
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
	poolDictionaries:''
688
d1a180a75dfe category change
Claus Gittinger <cg@exept.de>
parents: 273
diff changeset
    12
	category:'SCM-Monticello-Repositories'
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
MCSubDirectoryRepository comment:'A MCDirectoryRepository that looks in subdirectories too.'
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
1121
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
    18
!MCSubDirectoryRepository class methodsFor:'documentation'!
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
    19
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
    20
copyright
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
    21
"
1156
b6ca954ebfc9 Use custom Smalltalk/X package loader(s)
Jan Vrany <jan.vrany@labware.com>
parents: 1121
diff changeset
    22
COPYRIGHT (c) 2020-2021 LabWare
1121
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
    23
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
    24
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
    25
"
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
    26
! !
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
908
2bf7b953264c categories
Claus Gittinger <cg@exept.de>
parents: 688
diff changeset
    28
!MCSubDirectoryRepository class methodsFor:'queries'!
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
description
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
	^ 'directory with subdirectories'
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
!MCSubDirectoryRepository methodsFor:'as yet unclassified'!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
findFullNameForReading: aBaseName
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
	"Answer the latest version of aBaseName"
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
	| possible |
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    39
	possible := SortedCollection sortBlock: [ :a :b | b first modificationTime < a first modificationTime ].
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
	self allDirectories
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
		do: [:dir | dir entries
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
				do: [:ent | ent isDirectory
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
						ifFalse: [
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
							(ent name = aBaseName) ifTrue: [ possible add: {ent. dir fullNameFor: ent name}]]]].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
	^(possible at: 1 ifAbsent: [ ^nil ]) second
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    46
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
findFullNameForWriting: aBaseName
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
	| possible split dirScore fileScore prefix fpattern parts now |
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    51
	split := directory splitNameVersionExtensionFor: aBaseName.
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    52
	fpattern := split first, '*'.
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    53
	possible := SortedCollection sortBlock: [ :a :b |
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
		a first = b first
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
			ifTrue: [ a second = b second
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
					ifFalse: [ a second < b second ]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
					ifTrue: [ a third fullName size < b third fullName size ]]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
			ifFalse: [ a first > b first ] ].
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    59
	now := Time totalSeconds.
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    60
	prefix := directory pathParts size.
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
	self allDirectories do: [:dir |
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    62
		parts := dir pathParts allButFirst: prefix.
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    63
		dirScore := (parts select: [ :part | fpattern match: part ]) size.
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    64
		fileScore := (dir entries collect: [ :ent |
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
			(ent isDirectory not and: [ fpattern match: ent name ])
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
				ifFalse: [ SmallInteger maxVal ]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
				ifTrue: [ now - ent modificationTime ]]).	"minimum age"
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    68
		fileScore := fileScore isEmpty ifTrue: [ SmallInteger maxVal  ]
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
			ifFalse: [ fileScore min ].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
		possible add: { dirScore. fileScore. dir } ].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
	^ (possible first third) fullNameFor: aBaseName
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
readStreamForFileNamed: aString do: aBlock
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
	| file val |
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    76
	file := FileStream readOnlyFileNamed: (self findFullNameForReading: aString).
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
    77
	val := aBlock value: file.
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
	file close.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
	^ val
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
writeStreamForFileNamed: aString replace: aBoolean do: aBlock 
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
	| file |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
	file := aBoolean
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
				ifTrue: [FileStream
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
						forceNewFileNamed: (self findFullNameForReading: aString)]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
				ifFalse: [FileStream
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
						newFileNamed: (self findFullNameForWriting: aString)].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
	aBlock value: file.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
	file close
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
! !
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
!MCSubDirectoryRepository methodsFor:'enumeration'!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
allDirectories
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
	| remaining dir dirs |
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
	remaining := OrderedCollection new.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
	dirs := OrderedCollection new.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
	remaining addLast: directory.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
	[remaining isEmpty]
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
		whileFalse: [dir := remaining removeFirst.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
			dirs add: dir.
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
			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
						ifTrue: [remaining
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
								addLast: (dir directoryNamed: ent name)]]].
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
	^ dirs
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
allFileNames
1121
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
   111
        "sorting {entry. dirName. name}"
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
1121
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
   113
        | sorted |
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
   114
        sorted := SortedCollection sortBlock: [:a :b |
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
   115
                a first modificationTime >= b first modificationTime ].
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
   116
        self allDirectories
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
   117
                do: [:dir | dir directoryContentsAsFilenames
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
   118
                                do: [:ent | ent isDirectory
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
   119
                                                ifFalse: [sorted add: {ent. dir pathName. ent baseName}]]].
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
   120
        ^ sorted
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
   121
                collect: [:ea | ea third ]
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
   122
c5661215109c Tonel: various fixes here and there (part 2)
Jan Vrany <jan.vrany@labware.com>
parents: 908
diff changeset
   123
    "Modified: / 03-07-2020 / 20:30:06 / Jan Vrany <jan.vrany@labware.com>"
117
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
! !
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
!MCSubDirectoryRepository methodsFor:'user interface'!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
description
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
	^ directory pathName, '/*'
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
! !
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
!MCSubDirectoryRepository class methodsFor:'documentation'!
a47e3c42acc1 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
273
b66b046a8e10 initial checkin
Claus Gittinger <cg@exept.de>
parents: 190
diff changeset
   134
version
908
2bf7b953264c categories
Claus Gittinger <cg@exept.de>
parents: 688
diff changeset
   135
    ^ '$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
   136
!
b66b046a8e10 initial checkin
Claus Gittinger <cg@exept.de>
parents: 190
diff changeset
   137
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
   138
version_CVS
908
2bf7b953264c categories
Claus Gittinger <cg@exept.de>
parents: 688
diff changeset
   139
    ^ '$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
   140
!
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
   141
1156
b6ca954ebfc9 Use custom Smalltalk/X package loader(s)
Jan Vrany <jan.vrany@labware.com>
parents: 1121
diff changeset
   142
version_HG
b6ca954ebfc9 Use custom Smalltalk/X package loader(s)
Jan Vrany <jan.vrany@labware.com>
parents: 1121
diff changeset
   143
b6ca954ebfc9 Use custom Smalltalk/X package loader(s)
Jan Vrany <jan.vrany@labware.com>
parents: 1121
diff changeset
   144
    ^ '$Changeset: <not expanded> $'
b6ca954ebfc9 Use custom Smalltalk/X package loader(s)
Jan Vrany <jan.vrany@labware.com>
parents: 1121
diff changeset
   145
!
b6ca954ebfc9 Use custom Smalltalk/X package loader(s)
Jan Vrany <jan.vrany@labware.com>
parents: 1121
diff changeset
   146
190
8b0ddcf56d0e added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 117
diff changeset
   147
version_SVN
908
2bf7b953264c categories
Claus Gittinger <cg@exept.de>
parents: 688
diff changeset
   148
    ^ '$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
   149
! !
908
2bf7b953264c categories
Claus Gittinger <cg@exept.de>
parents: 688
diff changeset
   150