Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'issue_92' into gemstone2.4
- Loading branch information
Showing
37 changed files
with
313 additions
and
61 deletions.
There are no files selected for viewing
50 changes: 50 additions & 0 deletions
50
...nticelloFileTree-Core.package/MCFileTreeStCypressWriter.class/instance/fileNameMapFor..st
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
private | ||
fileNameMapFor: aMethodDefinitionCollection | ||
"https://github.com/dalehenrich/filetree/issues/92" | ||
|
||
"answer a dictionary that maps each definition selector to a filename that is guaranteed unique on case insensitive file systems. | ||
Segregate instance and class side methods. Key is true for class method map, false for instance method map" | ||
|
||
| map filenameMetaMap | | ||
map := Dictionary new. | ||
aMethodDefinitionCollection | ||
do: [ :mDef | | ||
| sel col metaKey methMap | | ||
"sort into bins by lowercase selector. " | ||
metaKey := mDef classIsMeta. | ||
methMap := map | ||
at: metaKey | ||
ifAbsent: [ map at: metaKey put: Dictionary new ]. | ||
sel := mDef selector asLowercase. | ||
col := methMap | ||
at: sel | ||
ifAbsent: [ methMap at: sel put: OrderedCollection new ]. | ||
col add: mDef ]. | ||
filenameMetaMap := Dictionary new. | ||
map | ||
keysAndValuesDo: [ :metaKey :methMap | | ||
| filenameMap | | ||
filenameMap := filenameMetaMap | ||
at: metaKey | ||
ifAbsent: [ filenameMetaMap at: metaKey put: Dictionary new ]. | ||
methMap values | ||
do: [ :col | | ||
| selector filename sortedCol | | ||
col size = 1 | ||
ifTrue: [ | ||
| def | | ||
"no need to distinguish filename" | ||
def := col at: 1. | ||
filenameMap | ||
at: def selector | ||
put: (self fileNameForSelector: def selector) ] | ||
ifFalse: [ | ||
"tack on postfix to guarantee file names are uniique on case insensitive file systems" | ||
sortedCol := col sorted: [ :a :b | a name <= b name ]. | ||
1 to: sortedCol size do: [ :index | | ||
| def filename | | ||
def := sortedCol at: index. | ||
filename := self fileNameForSelector: def selector. | ||
filename := filename , '..' , index printString. | ||
filenameMap at: def selector put: filename ] ] ] ]. | ||
^ filenameMetaMap |
133 changes: 83 additions & 50 deletions
133
...icelloFileTree-Core.package/MCFileTreeStCypressWriter.class/instance/writeDefinitions..st
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,53 +1,86 @@ | ||
initialize-release | ||
writeDefinitions: aCollection | ||
| classDirExtension extensionClasses extensionMethodDefinitions extensionMethodMap | | ||
self writeBasicDefinitions: aCollection. | ||
extensionClasses := OrderedCollection new. | ||
extensionMethodDefinitions := OrderedCollection new. | ||
self methodDefinitions | ||
keysAndValuesDo: [ :className :extensionMethods | | ||
self classDefinitions | ||
at: className | ||
ifAbsent: [ | ||
extensionClasses add: className. | ||
extensionMethodDefinitions addAll: extensionMethods ] ]. | ||
extensionClasses do: [ :className | self methodDefinitions removeKey: className ]. | ||
classDirExtension := '.class'. | ||
self classDefinitions | ||
keysAndValuesDo: [ :className :definition | | ||
| classPath instanceMethodPath classMethodPath | | ||
classPath := definition className , classDirExtension , self fileUtils pathNameDelimiter asString. | ||
self writeClassDefinition: definition to: classPath. | ||
instanceMethodPath := classPath , 'instance' , self fileUtils pathNameDelimiter asString. | ||
classMethodPath := classPath , 'class' , self fileUtils pathNameDelimiter asString. | ||
(self methodDefinitions at: className ifAbsent: [ #() ]) | ||
do: [ :methodDefinition | | ||
methodDefinition classIsMeta | ||
ifTrue: [ self writeMethodDefinition: methodDefinition to: classMethodPath ] | ||
ifFalse: [ self writeMethodDefinition: methodDefinition to: instanceMethodPath ] ] ]. | ||
classDirExtension := '.extension'. | ||
extensionMethodMap := Dictionary new. | ||
extensionMethodDefinitions | ||
| classDirExtension extensionClasses extensionMethodDefinitions extensionMethodMap | | ||
self writeBasicDefinitions: aCollection. | ||
extensionClasses := OrderedCollection new. | ||
extensionMethodDefinitions := OrderedCollection new. | ||
self methodDefinitions | ||
keysAndValuesDo: [ :className :extensionMethods | | ||
self classDefinitions | ||
at: className | ||
ifAbsent: [ | ||
extensionClasses add: className. | ||
extensionMethodDefinitions addAll: extensionMethods ] ]. | ||
extensionClasses | ||
do: [ :className | self methodDefinitions removeKey: className ]. | ||
classDirExtension := '.class'. | ||
self classDefinitions | ||
keysAndValuesDo: [ :className :definition | | ||
| classPath instanceMethodPath classMethodPath filenameMetaMap theMethodDefinitions | | ||
classPath := definition className , classDirExtension | ||
, self fileUtils pathNameDelimiter asString. | ||
self writeClassDefinition: definition to: classPath. | ||
instanceMethodPath := classPath , 'instance' | ||
, self fileUtils pathNameDelimiter asString. | ||
classMethodPath := classPath , 'class' | ||
, self fileUtils pathNameDelimiter asString. | ||
theMethodDefinitions := self methodDefinitions | ||
at: className | ||
ifAbsent: [ #() ]. | ||
filenameMetaMap := self fileNameMapFor: theMethodDefinitions. | ||
theMethodDefinitions | ||
do: [ :methodDefinition | | ||
| classPath methodPath | | ||
(extensionMethodMap | ||
at: methodDefinition className | ||
ifAbsent: [ extensionMethodMap at: methodDefinition className put: OrderedCollection new ]) | ||
add: methodDefinition. | ||
classPath := methodDefinition className , classDirExtension , self fileUtils pathNameDelimiter asString. | ||
self writeExtensionClassDefinition: methodDefinition to: classPath. | ||
methodPath := classPath | ||
, | ||
(methodDefinition classIsMeta | ||
ifTrue: [ 'class' ] | ||
ifFalse: [ 'instance' ]) , self fileUtils pathNameDelimiter asString. | ||
self writeMethodDefinition: methodDefinition to: methodPath ]. | ||
extensionMethodMap | ||
keysAndValuesDo: [ :className :classMethodDefinitions | | ||
| classPath | | ||
classPath := className , classDirExtension , self fileUtils pathNameDelimiter asString. | ||
self | ||
writeInDirectoryName: classPath | ||
fileName: 'methodProperties' | ||
extension: self propertyFileExtension | ||
visit: [ self writeMethodProperties: classMethodDefinitions ] ] | ||
| filename | | ||
filename := (filenameMetaMap at: methodDefinition classIsMeta) | ||
at: methodDefinition selector. | ||
methodDefinition classIsMeta | ||
ifTrue: [ | ||
self | ||
writeMethodDefinition: methodDefinition | ||
to: classMethodPath | ||
filename: filename ] | ||
ifFalse: [ | ||
self | ||
writeMethodDefinition: methodDefinition | ||
to: instanceMethodPath | ||
filename: filename ] ] ]. | ||
classDirExtension := '.extension'. | ||
extensionMethodMap := Dictionary new. | ||
extensionMethodDefinitions | ||
do: [ :methodDefinition | | ||
| classPath methodPath | | ||
(extensionMethodMap | ||
at: methodDefinition className | ||
ifAbsent: [ extensionMethodMap at: methodDefinition className put: OrderedCollection new ]) | ||
add: methodDefinition. | ||
classPath := methodDefinition className , classDirExtension | ||
, self fileUtils pathNameDelimiter asString. | ||
self writeExtensionClassDefinition: methodDefinition to: classPath ]. | ||
extensionMethodMap | ||
keysAndValuesDo: [ :className :classMethodDefinitions | | ||
| classPath filenameMetaMap | | ||
filenameMetaMap := self fileNameMapFor: classMethodDefinitions. | ||
classMethodDefinitions | ||
do: [ :methodDefinition | | ||
| filename methodPath | | ||
filename := (filenameMetaMap at: methodDefinition classIsMeta) | ||
at: methodDefinition selector. | ||
classPath := methodDefinition className , classDirExtension | ||
, self fileUtils pathNameDelimiter asString. | ||
methodPath := classPath | ||
, | ||
(methodDefinition classIsMeta | ||
ifTrue: [ 'class' ] | ||
ifFalse: [ 'instance' ]) | ||
, self fileUtils pathNameDelimiter asString. | ||
self | ||
writeMethodDefinition: methodDefinition | ||
to: methodPath | ||
filename: filename ]. | ||
classPath := className , classDirExtension | ||
, self fileUtils pathNameDelimiter asString. | ||
self | ||
writeInDirectoryName: classPath | ||
fileName: 'methodProperties' | ||
extension: self propertyFileExtension | ||
visit: [ self writeMethodProperties: classMethodDefinitions ] ] |
8 changes: 1 addition & 7 deletions
8
...leTree-Core.package/MCFileTreeStCypressWriter.class/instance/writeMethodDefinition.to..st
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,3 @@ | ||
writing | ||
writeMethodDefinition: methodDefinition to: methodPath | ||
| filename | | ||
filename := self fileNameForSelector: methodDefinition selector. | ||
self | ||
writeInDirectoryName: methodPath | ||
fileName: filename | ||
extension: '.st' | ||
visit: [ self writeMethodDefinition: methodDefinition ] | ||
self shouldNotImplement |
7 changes: 7 additions & 0 deletions
7
...re.package/MCFileTreeStCypressWriter.class/instance/writeMethodDefinition.to.filename..st
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
writing | ||
writeMethodDefinition: methodDefinition to: methodPath filename: filename | ||
self | ||
writeInDirectoryName: methodPath | ||
fileName: filename | ||
extension: '.st' | ||
visit: [ self writeMethodDefinition: methodDefinition ] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 1 addition & 1 deletion
2
repository/MonticelloFileTree-Core.package/monticello.meta/version
Large diffs are not rendered by default.
Oops, something went wrong.
Empty file.
3 changes: 3 additions & 0 deletions
3
...icelloFileTree-Tests.package/MCFileTreeIssue92Test.class/instance/tearDownPackagesList.st
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
running | ||
tearDownPackagesList | ||
^ #('Issue92') |
11 changes: 11 additions & 0 deletions
11
repository/MonticelloFileTree-Tests.package/MCFileTreeIssue92Test.class/instance/testLoad.st
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
tests | ||
testLoad | ||
| packageName | | ||
packageName := 'Issue92'. | ||
{packageName} do: [ :pn | self deny: (self hasPackage: pn) ]. | ||
Gofer new | ||
disablePackageCache; | ||
repository: (self getTestRepository: 'issue69'); | ||
package: packageName; | ||
load. | ||
self validateSelectors |
32 changes: 32 additions & 0 deletions
32
...y/MonticelloFileTree-Tests.package/MCFileTreeIssue92Test.class/instance/testWriteNRead.st
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
tests | ||
testWriteNRead | ||
| packageName versionInfo version | | ||
packageName := 'Issue92'. | ||
{packageName} do: [ :pn | self deny: (self hasPackage: pn) ]. | ||
Gofer new | ||
disablePackageCache; | ||
repository: (self getTestRepository: 'issue69'); | ||
package: packageName; | ||
load. | ||
self validateSelectors. | ||
{packageName} | ||
do: [ :pn | | ||
versionInfo := (MCWorkingCopy allManagers detect: [ :wc | wc packageName = pn ]) | ||
ancestors first. | ||
version := (self getTestRepository: 'issue69') | ||
versionWithInfo: versionInfo. | ||
(self getTestRepository: 'empty') storeVersion: version ]. | ||
Gofer new | ||
package: packageName; | ||
unload. | ||
{packageName} do: [ :pn | self deny: (self hasPackage: pn) ]. | ||
self | ||
shouldnt: [ | ||
Gofer new | ||
disablePackageCache; | ||
repository: (self getTestRepository: 'empty'); | ||
package: packageName; | ||
load ] | ||
raise: Error. | ||
{packageName} do: [ :pn | self assert: (self hasPackage: pn) ]. | ||
self validateSelectors |
19 changes: 19 additions & 0 deletions
19
...onticelloFileTree-Tests.package/MCFileTreeIssue92Test.class/instance/validateSelectors.st
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
tests | ||
validateSelectors | ||
| cls selectors expectedSelectors objectClassSelectors objectSelectors | | ||
#('Issue92') do: [ :pn | self assert: (self hasPackage: pn) ]. | ||
expectedSelectors := #(#'IssueNumber92:AndArg2:' #'issueNumber92:andArg2:' #'issuenumber92:andarg2:'). | ||
cls := Smalltalk classNamed: #'CCC'. | ||
2 | ||
timesRepeat: [ | ||
selectors := cls selectors. | ||
self assert: selectors size == expectedSelectors size. | ||
expectedSelectors | ||
do: [ :selector | self assert: (selectors includes: selector) ]. | ||
cls := cls class ]. | ||
objectSelectors := Object selectors. | ||
objectClassSelectors := Object class selectors. | ||
expectedSelectors | ||
do: [ :selector | | ||
self assert: (objectSelectors includes: selector). | ||
self assert: (objectClassSelectors includes: selector) ] |
8 changes: 8 additions & 0 deletions
8
...sitory/MonticelloFileTree-Tests.package/MCFileTreeIssue92Test.class/methodProperties.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
{ | ||
"class" : { | ||
}, | ||
"instance" : { | ||
"tearDownPackagesList" : "dkh 07/18/2013 20:45", | ||
"testLoad" : "dkh 07/18/2013 20:46", | ||
"testWriteNRead" : "dkh 07/18/2013 20:47", | ||
"validateSelectors" : "dkh 07/18/2013 21:05" } } |
14 changes: 14 additions & 0 deletions
14
repository/MonticelloFileTree-Tests.package/MCFileTreeIssue92Test.class/properties.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
{ | ||
"category" : "MonticelloFileTree-Tests", | ||
"classinstvars" : [ | ||
], | ||
"classvars" : [ | ||
], | ||
"commentStamp" : "", | ||
"instvars" : [ | ||
], | ||
"name" : "MCFileTreeIssue92Test", | ||
"pools" : [ | ||
], | ||
"super" : "MCFileTreeGenericLoaderTest", | ||
"type" : "normal" } |
Oops, something went wrong.