Thanks Nicolas. I would appreciate any effort in this directory since I also have a 10gb package-cache and yes, I know it is slow.
If you can provive a slice :)
:)
indeed. Imagine my 10 GB package cache.
Stef
On May 10, 2012, at 12:18 AM, Nicolas Cellier wrote:
> The efficiency of FileList>>listForPattern: is something which should
> deserve a bit more care.
>
> It tries to sort the files, for example by name, but wants to display
> directory first
> � � � ^ [ :x :y | |xIsDir|
> � � � � � � � � � � � ((xIsDir := x isDirectory) = y isDirectory)
> � � � � � � � � � � � � � � � ifTrue: [ � x basename <= y basename �]
> � � � � � � � � � � � � � � � ifFalse: [
> � � � � � � � � � � � � � � � � � � � "directories always precede files"
> � � � � � � � � � � � � � � � � � � � xIsDir ]]
>
> Alas, this isDirectory test cost you an arm:
>
> FileReference>>isDirectory
> � � � ^ filesystem isDirectory: path
>
> FileSystem>>isDirectory: aResolvable
> � � � "Resolve the argument, and answer true if the result refers
> � � � to a directory, false if it refers to a file or doesn't exist."
>
> � � � ^ store isDirectory: (self resolve: aResolvable)
>
> FileSystemStore>>isDirectory: aPath
> � � � aPath isRoot ifTrue: [ ^ true ].
> � � � self
> � � � � � � � nodeAt: aPath
> � � � � � � � ifPresent: [ :entry | ^ self basicIsDirectory: entry ]
> � � � � � � � ifAbsent: [ ^ false ].
>
> DiskStore>>nodeAt: aPath ifPresent: presentBlock ifAbsent: absentBlock
> � � � | name|
> � � � aPath isRoot ifTrue: [ ^ presentBlock value: self rootNode ].
> � � � "| encodedPath encodedBasename entry |
> � � � encodedPath := Primitives encode: (self stringFromPath: aPath parent).
> � � � encodedBasename := Primitives encode: aPath basename.
> � � � entry := Primitives lookupDirectory: encodedPath filename: encodedBasename.
> � � � ^ entry == #badDirectoryPath
> � � � � � � � ifTrue: absentBlock
> � � � � � � � ifFalse: [
> � � � � � � � � � � � entry at: 1 put: aPath basename.
> � � � � � � � � � � � presentBlock value: entry ]."
> � � � name := aPath basename.
> � � � self
> � � � � � � � directoryAt: aPath parent
> � � � � � � � ifAbsent: absentBlock
> � � � � � � � nodesDo:
> � � � � � � � � � � � [ :entry |
> � � � � � � � � � � � (self filename: (entry at: 1) matches: name)
> � � � � � � � � � � � � � � � ifTrue: [ ^ presentBlock value: entry ] ].
> � � � ^ absentBlock value
>
> Arghh, it scans the whole parent directory again!
> If sort is O(n log n), then we transform it into O(2 n^2 log n).
>
> Try to browse your package-cache if you're not a chicken.
> Seriously, it's unusable...
>
> Nicolas
>