<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Mar 13, 2017 at 5:30 PM, Levente Uzonyi <span dir="ltr"><<a href="mailto:leves@caesar.elte.hu" target="_blank">leves@caesar.elte.hu</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I have updated Files-ul.168 to the Inbox with those methods reverted<br>
along with a third one.</blockquote><div><br></div><div>Thanks man!</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="HOEnZb"><font color="#888888"><br>
<br>
Levente</font></span><div class="HOEnZb"><div class="h5"><br>
<br>
On Tue, 14 Mar 2017, Levente Uzonyi wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Eliot,<br>
<br>
all of those new errors seem to be related to files, so I presume they are related to the changes of the Files package:<br>
<br>
"<br>
FileDirectory changes:<br>
<br>
- implemented #directoryContentsFor:do: in all subclasses of FileDirectory, where #directoryContentsFor: was implemented<br>
- introduced #entriesDo: based on the method above<br>
- rewrote methods sending #entries to use #entriesDo: instead<br>
- simplified DirectoryEntryDirectory >> #asFileDirectory<br>
- introduced #hasEntries<br>
- #directoryEntryForName: signals InvalidDirectoryError as suggested by a comment from 2007<br>
- other minor optimizations<br>
"<br>
<br>
I suspect that either the DirectoryEntryDirectory >> #asFileDirectory or FileDirectory >> #directoryEntryForName: is responsible for the errors, but it should be easy to find the cause by debugging any of those new errors.<br>
<br>
Levente<br>
<br>
On Mon, 13 Mar 2017, Eliot Miranda wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Levente,<br>
<br>
On Mon, Mar 13, 2017 at 4:44 PM, Levente Uzonyi <<a href="mailto:leves@caesar.elte.hu" target="_blank">leves@caesar.elte.hu</a>> wrote:<br>
Hi Eliot,<br>
<br>
I ran the tests 3 times and haven't seen any new test failures or errors.<br>
However there are some other changes in the pack unrelated to SortedCollection, which I couldn't test on platforms other than Linux, but may behave differently on other platforms (e.g. changes in<br>
Files).<br>
<br>
<br>
First of all let me apologise; my stats were wrong. I see<br>
4527 run, 4383 passes, 106 expected failures, 26 failures, 12 errors, 0 unexpected passes<br>
before whack-a-mole and<br>
4575 run, 4308 passes, 108 expected failures, 26 failures, 133 errors, 0 unexpected passes<br>
after. And this is on Mac OS X using the 64-bit VM and image. Here's the pre-whack-a-mole full report<br>
<br>
<br>
<br>
Can you send me the list of failures and errors you see?<br>
<br>
<br>
Pre whack-a-mole<br>
failures: {AllocationTest>>#testOutOfMem<wbr>orySignal . ClassVarScopeTest>>#testDefine<wbr>dClassMethodInGrandchild . ClassVarScopeTest>>#testDefine<wbr>dInstanceMethodInChild .<br>
ClassVarScopeTest>>#testDefine<wbr>dInstanceMethodInGrandchild . ClassVarScopeTest>>#testInheri<wbr>tedClassMethodInGrandchild . ClassVarScopeTest>>#testInheri<wbr>tedInstanceMethodInGrandchild .<br>
DateAndTimeLeapTest>>#testAsSe<wbr>conds . DecompilerTests>>#testDecompil<wbr>erInClassesENtoEZ . DecompilerTests>>#testDecompil<wbr>erInClassesPAtoPM . IslandVMTweaksTestCase>>#testF<wbr>orgivingPrims .<br>
MorphicUIManagerTest>>#testSho<wbr>wAllBinParts . MultiByteFileStreamTest>>#test<wbr>LineEndConversion . PackageDependencyTest>>#testEt<wbr>oys . PackageDependencyTest>>#testMo<wbr>rphic . PackageDependencyTest>>#testSo<wbr>und .<br>
PackageDependencyTest>>#testSy<wbr>stem . ReleaseTest>>#testClassesSyste<wbr>mCategory . ReleaseTest>>#testMethodsWithU<wbr>nboundGlobals . ReleaseTest>>#testNoObsoleteCl<wbr>asses . ReleaseTest>>#testUndeclared .<br>
SocketTest>>#testSocketReuse . SocketTest>>#testUDP . UnixProcessAccessorTestCase>>#<wbr>testRedirectStdOutTo . UnixProcessTestCase>>#testCatA<wbr>File . UnixProcessTestCase>>#testRunC<wbr>ommand .<br>
WebClientServerTest>>#testList<wbr>enOnInterface}<br>
<br>
errors: {BitmapStreamTests>>#testMatri<wbr>xTransform2x3WithImageSegment . BitmapStreamTests>>#testShortI<wbr>ntegerArrayWithImageSegment . BitmapStreamTests>>#testShortP<wbr>ointArrayWithImageSegment .<br>
BitmapStreamTests>>#testShortR<wbr>unArrayWithImageSegment . BitmapStreamTests>>#testWordAr<wbr>rayWithImageSegment . DecompilerTests>>#testDecompil<wbr>erInClassesSAtoSM . LangEnvBugs>>#testIsFontAvaila<wbr>ble .<br>
LangEnvBugs>>#testIsFontAvaila<wbr>ble . LocaleTest>>#testIsFontAvailab<wbr>le . SqueakSSLTest>>#testSSLSockets . SqueakSSLTest>>#testSocketAcce<wbr>pt . SqueakSSLTest>>#testSocketConn<wbr>ect}<br>
<br>
Post whack-a-mole<br>
failures: {AllocationTest>>#te<wbr>stOutOfMemorySignal . ClassVarScopeTest>>#testDefine<wbr>dInstanceMethodInChild . ClassVarScopeTest>>#testDefine<wbr>dInstanceMethodInGrandchild .<br>
ClassVarScopeTest>>#testInheri<wbr>tedClassMethodInGrandchild . ClassVarScopeTest>>#testInheri<wbr>tedInstanceMethodInGrandchild . DateAndTimeLeapTest>>#testAsSe<wbr>conds . DecompilerTests>>#testDecompil<wbr>erInClassesENtoEZ .<br>
DecompilerTests>>#testDecompil<wbr>erInClassesPAtoPM . DecompilerTests>>#testDecompil<wbr>erInClassesTAtoTM . MorphicUIManagerTest>>#testSho<wbr>wAllBinParts . MultiByteFileStreamTest>>#test<wbr>LineEndConversion .<br>
PackageDependencyTest>>#testEt<wbr>oys . PackageDependencyTest>>#testMo<wbr>rphic . PackageDependencyTest>>#testSU<wbr>nitGUI . PackageDependencyTest>>#testSo<wbr>und . PackageDependencyTest>>#testSy<wbr>stem .<br>
PackageDependencyTest>>#testTo<wbr>ols . ReleaseTest>>#testClassesSyste<wbr>mCategory . ReleaseTest>>#testMethodsWithU<wbr>nboundGlobals . ReleaseTest>>#testNoObsoleteCl<wbr>asses . ReleaseTest>>#testSuperSubclas<wbr>sReferences .<br>
ReleaseTest>>#testUndeclared . SocketTest>>#testSocketReuse . SocketTest>>#testUDP . UnixProcessTestCase>>#testCatA<wbr>File . WebClientServerTest>>#testList<wbr>enOnInterface}<br>
<br>
errors: {BitmapStreamTests>>#t<wbr>estMatrixTransform2x3WithImage<wbr>Segment . BitmapStreamTests>>#testShortI<wbr>ntegerArrayWithImageSegment . BitmapStreamTests>>#testShortP<wbr>ointArrayWithImageSegment .<br>
BitmapStreamTests>>#testShortR<wbr>unArrayWithImageSegment . BitmapStreamTests>>#testWordAr<wbr>rayWithImageSegment . BrowserTest>>#testFileOutMessa<wbr>geCategories . DecompilerTests>>#testDecompil<wbr>erInClassesSAtoSM .<br>
FileDirectoryTest>>#testAttemp<wbr>tExistenceCheckWhenFile . FileDirectoryTest>>#testDirect<wbr>oryExists . FileDirectoryTest>>#testDirect<wbr>oryExistsWhenLikeNamedFileExis<wbr>ts . FileDirectoryTest>>#testNonExi<wbr>stentDirectory<br>
. FileDirectoryTest>>#testOldFil<wbr>eOrNoneNamed . FileListTest>>#testServicesFor<wbr>FileEnding . FileStreamTest>>#testCachingNe<wbr>xtChunkPut . FileStreamTest>>#testCachingNe<wbr>xtChunkPut .<br>
FileStreamTest>>#testDetectFil<wbr>eDo . FileStreamTest>>#testFileTrunc<wbr>ation . FileStreamTest>>#testFileTrunc<wbr>ation . FileStreamTest>>#testNextChunk<wbr>OutOfBounds . FileStreamTest>>#testNextChunk<wbr>OutOfBounds .<br>
FileStreamTest>>#testNextLine . FileStreamTest>>#testPositionP<wbr>astEndIsAtEnd . FileStreamTest>>#testReadIntoS<wbr>tartingAtCount . LangEnvBugs>>#testIsFontAvaila<wbr>ble . LangEnvBugs>>#testIsFontAvaila<wbr>ble .<br>
LocaleTest>>#testIsFontAvailab<wbr>le . MCDictionaryRepositoryTest>>#t<wbr>estAddAndLoad . MCDictionaryRepositoryTest>>#t<wbr>estIncludesName . MCDictionaryRepositoryTest>>#t<wbr>estStoreAndLoad .<br>
MCDirectoryRepositoryTest>>#te<wbr>stAddAndLoad . MCDirectoryRepositoryTest>>#te<wbr>stIncludesName . MCDirectoryRepositoryTest>>#te<wbr>stStoreAndLoad . MCMczInstallerTest>>#testInsta<wbr>llFromFile .<br>
MCMczInstallerTest>>#testInsta<wbr>llFromFile . MCMczInstallerTest>>#testInsta<wbr>llFromStream . MCWorkingCopyTest>>#testAncest<wbr>orMerge . MCWorkingCopyTest>>#testBackpo<wbr>rt . MCWorkingCopyTest>>#testDouble<wbr>RepeatedMerge .<br>
MCWorkingCopyTest>>#testMergeI<wbr>ntoImageWithNoChanges . MCWorkingCopyTest>>#testMergeI<wbr>ntoUnmodifiedImage . MCWorkingCopyTest>>#testOptimi<wbr>zedLoad . MCWorkingCopyTest>>#testRedund<wbr>antMerge .<br>
MCWorkingCopyTest>>#testRepeat<wbr>edMerge . MCWorkingCopyTest>>#testSelect<wbr>iveBackport . MCWorkingCopyTest>>#testSimple<wbr>Merge . MCWorkingCopyTest>>#testSnapsh<wbr>otAndLoad . MultiByteFileStreamTest>>#test<wbr>AsciiBackChunk<br>
. MultiByteFileStreamTest>>#test<wbr>BinaryUpTo . MultiByteFileStreamTest>>#test<wbr>LineEnding . MultiByteFileStreamTest>>#test<wbr>LineEndingChunk . MultiByteFileStreamTest>>#test<wbr>LineEndingWithWideStrings .<br>
MultiByteFileStreamTest>>#test<wbr>NextLine . MultiByteFileStreamTest>>#test<wbr>NextPutAllStartingAt . MultiByteFileStreamTest>>#test<wbr>NonAsciiBackChunk . PNGReadWriterTest>>#test16Bit .<br>
PNGReadWriterTest>>#test16BitD<wbr>isplay . PNGReadWriterTest>>#test16BitR<wbr>eversed . PNGReadWriterTest>>#test1Bit . PNGReadWriterTest>>#test1BitDi<wbr>splay . PNGReadWriterTest>>#test1BitRe<wbr>versed .<br>
PNGReadWriterTest>>#test2Bit . PNGReadWriterTest>>#test2BitDi<wbr>splay . PNGReadWriterTest>>#test2BitRe<wbr>versed . PNGReadWriterTest>>#test32Bit . PNGReadWriterTest>>#test32BitD<wbr>isplay .<br>
PNGReadWriterTest>>#test32BitR<wbr>eversed . PNGReadWriterTest>>#test4Bit . PNGReadWriterTest>>#test4BitDi<wbr>splay . PNGReadWriterTest>>#test4BitRe<wbr>versed . PNGReadWriterTest>>#test8Bit .<br>
PNGReadWriterTest>>#test8BitDi<wbr>splay . PNGReadWriterTest>>#test8BitRe<wbr>versed . PNGReadWriterTest>>#testAlphaC<wbr>oding . PNGReadWriterTest>>#testBlack1<wbr>6 . PNGReadWriterTest>>#testBlack3<wbr>2 .<br>
PNGReadWriterTest>>#testBlack8 . PNGReadWriterTest>>#testBlue16 . PNGReadWriterTest>>#testBlue32 . PNGReadWriterTest>>#testBlue8 . PNGReadWriterTest>>#testGreen1<wbr>6 . PNGReadWriterTest>>#testGreen3<wbr>2 .<br>
PNGReadWriterTest>>#testGreen8 . PNGReadWriterTest>>#testRed16 . PNGReadWriterTest>>#testRed32 . PNGReadWriterTest>>#testRed8 . SqueakSSLTest>>#testSSLSockets . SqueakSSLTest>>#testSocketAcce<wbr>pt .<br>
SqueakSSLTest>>#testSocketConn<wbr>ect . SystemChangeFileTest>>#testCat<wbr>egoryAdded . SystemChangeFileTest>>#testCat<wbr>egoryAdded . SystemChangeFileTest>>#testCat<wbr>egoryAddedBefore .<br>
SystemChangeFileTest>>#testCat<wbr>egoryAddedBefore . SystemChangeFileTest>>#testCat<wbr>egoryRemoved . SystemChangeFileTest>>#testCat<wbr>egoryRemoved . SystemChangeFileTest>>#testCat<wbr>egoryRenamed .<br>
SystemChangeFileTest>>#testCat<wbr>egoryRenamed . SystemChangeFileTest>>#testCla<wbr>ssAdded . SystemChangeFileTest>>#testCla<wbr>ssAdded . SystemChangeFileTest>>#testCla<wbr>ssCommented .<br>
SystemChangeFileTest>>#testCla<wbr>ssCommented . SystemChangeFileTest>>#testCla<wbr>ssModified . SystemChangeFileTest>>#testCla<wbr>ssModified . SystemChangeFileTest>>#testCla<wbr>ssRecategorized .<br>
SystemChangeFileTest>>#testCla<wbr>ssRecategorized . SystemChangeFileTest>>#testCla<wbr>ssRemoved . SystemChangeFileTest>>#testCla<wbr>ssRemoved . SystemChangeFileTest>>#testCla<wbr>ssRenamed .<br>
SystemChangeFileTest>>#testCla<wbr>ssRenamed . SystemChangeFileTest>>#testExp<wbr>ressionDoIt . SystemChangeFileTest>>#testExp<wbr>ressionDoIt . SystemChangeFileTest>>#testMet<wbr>hodAdded .<br>
SystemChangeFileTest>>#testMet<wbr>hodAdded . SystemChangeFileTest>>#testMet<wbr>hodModified . SystemChangeFileTest>>#testMet<wbr>hodModified . SystemChangeFileTest>>#testMet<wbr>hodRecategorized .<br>
SystemChangeFileTest>>#testMet<wbr>hodRecategorized . SystemChangeFileTest>>#testMet<wbr>hodRemoved . SystemChangeFileTest>>#testMet<wbr>hodRemoved . SystemChangeFileTest>>#testPro<wbr>tocolAdded .<br>
SystemChangeFileTest>>#testPro<wbr>tocolAdded . SystemChangeFileTest>>#testPro<wbr>tocolDefault . SystemChangeFileTest>>#testPro<wbr>tocolDefault . SystemChangeFileTest>>#testPro<wbr>tocolRemoved .<br>
SystemChangeFileTest>>#testPro<wbr>tocolRemoved . SystemChangeFileTest>>#testPro<wbr>tocolRenamed . SystemChangeFileTest>>#testPro<wbr>tocolRenamed . TraitFileOutTest>>#testCondens<wbr>eChanges .<br>
TraitFileOutTest>>#testFileOut<wbr>Category . TraitFileOutTest>>#testFileOut<wbr>Trait . UnixProcessAccessorTestCase>>#<wbr>testDupTo . UnixProcessAccessorTestCase>>#<wbr>testRedirectStdOutTo .<br>
UnixProcessTestCase>>#testCatF<wbr>romFileToFiles . UnixProcessTestCase>>#testRunC<wbr>ommand}<br>
<br>
And all those duplications confuse me. And the sources seem to have been killed by running the tests.<br>
<br>
HTH<br>
<br>
<br>
<br>
<br>
Levente<br>
<br>
On Mon, 13 Mar 2017, Eliot Miranda wrote:<br>
<br>
Hi Levente,<br>
the SortedCollection whack-a-mole [ :-) :-) ] update appears to have caused a significant uptick in Squeak trunk test suite errors, from about 26 to over 80. Are you aware of<br>
this? Are you addressing<br>
the errors?<br>
<br>
I was a little bit inconvenienced by this because I was testing Slang changes to the VM and mistook these errors as evidence of bugs in my Slang changes. That's life and I'm happy to<br>
accept the situation. <br>
But I would like to see the errors come back down to around 26 or less :-)<br>
<br>
Cheers<br>
Eliot<br>
<br>
On Mon, Mar 13, 2017 at 8:00 AM, <<a href="mailto:commits@source.squeak.org" target="_blank">commits@source.squeak.org</a>> wrote:<br>
Levente Uzonyi uploaded a new version of System to project The Trunk:<br>
<a href="http://source.squeak.org/trunk/System-ul.932.mcz" rel="noreferrer" target="_blank">http://source.squeak.org/trunk<wbr>/System-ul.932.mcz</a><br>
<br>
==================== Summary ====================<br>
<br>
Name: System-ul.932<br>
Author: ul<br>
Time: 13 March 2017, 3:10:17.453603 pm<br>
UUID: 7a305614-9a4b-47f8-a68f-79fcf6<wbr>f90a80<br>
Ancestors: System-eem.931<br>
<br>
- SortedCollection Whack-a-mole<br>
- introduced #classVarNames and #classInstVarNames in PseudoClass, because they had senders<br>
- removed #startTimerInterruptWatcher from messages to keep lists<br>
<br>
=============== Diff against System-eem.931 ===============<br>
<br>
Item was changed:<br>
----- Method: ChangeSet class>>traitsOrder: (in category 'fileIn/Out') -----<br>
traitsOrder: aCollection<br>
"Answer an OrderedCollection. The traits<br>
are ordered so they can be filed in."<br>
<br>
+ ^aCollection sorted: [:t1 :t2 |<br>
- | traits |<br>
- traits := aCollection asSortedCollection: [:t1 :t2 |<br>
(t1 isBaseTrait and: [t1 classTrait == t2]) or: [<br>
(t2 traitComposition allTraits includes: t1) or: [<br>
+ (t1 traitComposition allTraits includes: t2) not]]]!<br>
- (t1 traitComposition allTraits includes: t2) not]]].<br>
- ^traits asArray!<br>
<br>
Item was changed:<br>
----- Method: ChangeSet>>changedMessageList (in category 'method changes') -----<br>
changedMessageList<br>
"Used by a message set browser to access the list view information."<br>
<br>
| messageList |<br>
messageList := OrderedCollection new.<br>
changeRecords associationsDo: [:clAssoc | | classNameInParts classNameInFull |<br>
classNameInFull := clAssoc key asString.<br>
classNameInParts := classNameInFull findTokens: ' '.<br>
<br>
(clAssoc value allChangeTypes includes: #comment) ifTrue:<br>
[messageList add:<br>
(MethodReference new<br>
setClassSymbol: classNameInParts first asSymbol<br>
classIsMeta: false<br>
methodSymbol: #Comment<br>
stringVersion: classNameInFull, ' Comment')].<br>
<br>
clAssoc value methodChangeTypes associationsDo: [:mAssoc |<br>
(#(remove addedThenRemoved) includes: mAssoc value) ifFalse:<br>
[messageList add:<br>
(MethodReference new<br>
setClassSymbol: classNameInParts first asSymbol<br>
classIsMeta: classNameInParts size > 1<br>
methodSymbol: mAssoc key<br>
stringVersion: classNameInFull, ' ' , mAssoc key)]]].<br>
+ ^ messageList sort!<br>
- ^ messageList asSortedArray!<br>
<br>
Item was changed:<br>
----- Method: ChangeSet>>checkForUncommented<wbr>Classes (in category 'fileIn/Out') -----<br>
checkForUncommentedClasses<br>
"Check to see if any classes involved in this change set do not have class comments. Open up a browser showing all such classes."<br>
<br>
| aList |<br>
aList := self changedClasses<br>
select:<br>
[:aClass | aClass theNonMetaClass organization classComment isEmptyOrNil]<br>
thenCollect:<br>
[:aClass | aClass theNonMetaClass name].<br>
<br>
aList size > 0<br>
ifFalse:<br>
[^ self inform: 'All classes involved in this change set have class comments']<br>
ifTrue:<br>
+ [ToolSet openClassListBrowser: aList asSet sorted title: 'Classes in Change Set ', self name, ': classes that lack class comments']!<br>
- [ToolSet openClassListBrowser: aList asSet asSortedArray title: 'Classes in Change Set ', self name, ': classes that lack class comments']!<br>
<br>
Item was changed:<br>
----- Method: ChangeSet>>fileOutOn: (in category 'fileIn/Out') -----<br>
fileOutOn: stream<br>
"Write out all the changes the receiver knows about"<br>
<br>
| classList traits classes traitList list |<br>
(self isEmpty and: [stream isKindOf: FileStream])<br>
ifTrue: [self inform: 'Warning: no changes to file out'].<br>
<br>
traits := self changedClasses reject: [:each | each isBehavior].<br>
classes := self changedClasses select: [:each | each isBehavior].<br>
traitList := self class traitsOrder: traits asOrderedCollection.<br>
classList := self class superclassOrder: classes asOrderedCollection.<br>
list := OrderedCollection new<br>
addAll: traitList;<br>
addAll: classList;<br>
yourself.<br>
<br>
"First put out rename, max classDef and comment changes."<br>
list do: [:aClass | self fileOutClassDefinition: aClass on: stream].<br>
<br>
"Then put out all the method changes"<br>
list do: [:aClass | self fileOutChangesFor: aClass on: stream].<br>
<br>
"Finally put out removals, final class defs and reorganization if any"<br>
list reverseDo: [:aClass | self fileOutPSFor: aClass on: stream].<br>
<br>
+ self classRemoves sort do:<br>
- self classRemoves asSortedCollection do:<br>
[:aClassName | stream nextChunkPut: 'Smalltalk removeClassNamed: #', aClassName; cr].!<br>
<br>
Item was changed:<br>
----- Method: InternalTranslator>>fileOutOn:<wbr>keys:withBOM: (in category 'fileIn/fileOut') -----<br>
fileOutOn: aStream keys: keys withBOM: bomFlag<br>
"self current fileOutOn: Transcript. Transcript endEntry"<br>
self fileOutHeaderOn: aStream withBOM: bomFlag.<br>
(keys<br>
+ ifNil: [generics keys sort])<br>
- ifNil: [generics keys asSortedCollection])<br>
do: [:key | self<br>
nextChunkPut: (generics associationAt: key)<br>
on: aStream].<br>
keys<br>
ifNil: [self untranslated<br>
do: [:each | self nextChunkPut: each -> '' on: aStream]].<br>
aStream nextPut: $!!;<br>
cr!<br>
<br>
Item was changed:<br>
----- Method: MczInstaller>>install (in category 'installation') -----<br>
install<br>
+<br>
- | sources |<br>
zip := ZipArchive new.<br>
zip readFrom: stream.<br>
self checkDependencies ifFalse: [^false].<br>
self recordVersionInfo.<br>
+ (zip membersMatching: 'snapshot/*')<br>
+ sort: [:a :b | a fileName < b fileName];<br>
+ do: [:src | self installMember: src].!<br>
- sources := (zip membersMatching: 'snapshot/*')<br>
- asSortedCollection: [:a :b | a fileName < b fileName].<br>
- sources do: [:src | self installMember: src].!<br>
<br>
Item was changed:<br>
----- Method: Preferences class>>giveHelpWithPreferences (in category 'support') -----<br>
giveHelpWithPreferences<br>
"Open up a workspace with explanatory info in it about Preferences"<br>
<br>
| aString |<br>
aString := String streamContents: [:aStream |<br>
aStream nextPutAll:<br>
<br>
'Many aspects of the system are governed by the settings of various "Preferences".<br>
<br>
Click on any of brown tabs at the top of the panel to see all the preferences in that category.<br>
Or type in to the box above the Search button, then hit Search, and all Preferences matching whatever you typed in will appear in the "search results" category. A preference<br>
is considered to<br>
match your search if either its name matches the characters *or* if anything in the balloon help provided for the preferences matches the search text.<br>
<br>
To find out more about any particular Preference, hold the mouse over it for a moment and balloon help will appear. Also, a complete list of all the Preferences, with<br>
documentation for each, is<br>
included below.<br>
<br>
Preferences whose names are in shown in bold in the Preferences Panel are designated as being allowed to vary from project to project; those whose name are not in bold are<br>
"global", which is to<br>
say, they apply equally whatever project you are in.<br>
<br>
Click on the name of any preference to get a menu which allows you to *change* whether the preference should vary from project to project or should be global, and also allows<br>
you to browse all<br>
the senders of the preference, and to discover all the categories under which the preference has been classified, and to be handed a button that you can drop wherever you please<br>
that will control<br>
the preference.<br>
<br>
If you like all your current Preferences settings, you may wish to hit the "Save Current Settings as my Personal Preferences" button. Once you have done that, you can at any<br>
point in the future<br>
hit "Restore my Personal Preferences" and all your saved settings will get restored immediately.<br>
<br>
Also, you can use "themes" to set multiple preferences all at once; click on the "change theme..." button in the Squeak flap or in the Preferences panel, or seek out the themes<br>
item in the<br>
Appearance menu.' translated.<br>
<br>
aStream cr; cr; nextPutAll: '-----------------------------<wbr>------------------------------<wbr>------';<br>
cr; cr; nextPutAll: 'Alphabetical listing of all Preferences' translated; cr; cr.<br>
+ (Preferences allPreferences sort: [:a :b | a name < b name]) do:<br>
- (Preferences allPreferences asSortedCollection: [:a :b | a name < b name]) do:<br>
[:pref | | aHelpString |<br>
aStream nextPutAll: pref name; cr.<br>
aHelpString := pref helpString translated.<br>
(aHelpString beginsWith: pref name) ifTrue:<br>
[aHelpString := aHelpString copyFrom: (pref name size ) to: aHelpString size].<br>
aHelpString := (aHelpString copyReplaceAll: String cr with: ' ') copyWithout: Character tab.<br>
aStream nextPutAll: aHelpString capitalized.<br>
(aHelpString isEmpty or: [aHelpString last == $.]) ifFalse: [aStream nextPut: $.].<br>
aStream cr; cr]].<br>
<br>
UIManager default edit: aString label: 'About Preferences' translated<br>
<br>
"Preferences giveHelpWithPreferences"!<br>
<br>
Item was changed:<br>
----- Method: Project class>>allNames (in category 'utilities') -----<br>
allNames<br>
+<br>
+ ^(self allProjects collect: [:p | p name]) sort: [:n1 :n2 | n1 caseInsensitiveLessOrEqual: n2]!<br>
- ^ (self allProjects collect: [:p | p name]) asSortedCollection: [:n1 :n2 | n1 asLowercase < n2 asLowercase]!<br>
<br>
Item was changed:<br>
----- Method: Project class>>allNamesAndProjects (in category 'utilities') -----<br>
allNamesAndProjects<br>
+<br>
+ ^(self allProjects<br>
+ sorted: [ :p1 :p2 | p1 name caseInsensitiveLessOrEqual: p2 name ])<br>
+ replace: [ :aProject | Array with: aProject name with: aProject ]!<br>
- ^ (self allProjects asSortedCollection: [:p1 :p2 | p1 name asLowercase < p2 name asLowercase]) collect:<br>
- [:aProject | Array with: aProject name with: aProject]!<br>
<br>
Item was changed:<br>
----- Method: Project class>>sweep: (in category 'squeaklet on server') -----<br>
sweep: aServerDirectory<br>
| repository list parts ind entry projectName versions |<br>
"On the server, move all but the three most recent versions of each Squeaklet to a folder called 'older'"<br>
"Project sweep: ((ServerDirectory serverNamed: 'DaniOnJumbo') clone<br>
directory: '/vol0/people/dani/Squeaklets/<wbr>2.7')"<br>
<br>
"Ensure the 'older' directory"<br>
(aServerDirectory includesKey: 'older')<br>
ifFalse: [aServerDirectory createDirectory: 'older'].<br>
repository := aServerDirectory clone directory: aServerDirectory directory, '/older'.<br>
<br>
"Collect each name, and decide on versions"<br>
list := aServerDirectory fileNames.<br>
list isString ifTrue: [^ self inform: 'server is unavailable' translated].<br>
+ list sort.<br>
- list := list asSortedCollection asOrderedCollection.<br>
parts := list collect: [:en | Project parseProjectFileName: en].<br>
parts := parts select: [:en | en third = 'pr'].<br>
ind := 1.<br>
[entry := list at: ind.<br>
projectName := entry first asLowercase.<br>
versions := OrderedCollection new. versions add: entry.<br>
[(ind := ind + 1) > list size<br>
ifFalse: [(parts at: ind) first asLowercase = projectName<br>
ifTrue: [versions add: (parts at: ind). true]<br>
ifFalse: [false]]<br>
ifTrue: [false]] whileTrue.<br>
aServerDirectory moveYoungest: 3 in: versions to: repository.<br>
ind > list size] whileFalse.<br>
!<br>
<br>
Item was added:<br>
+ ----- Method: PseudoClass>>classInstVarNames (in category 'accessing') -----<br>
+ classInstVarNames<br>
+<br>
+ self realClass ifNotNil: [ :realClass | ^realClass instVarNames ].<br>
+ ^#()!<br>
<br>
Item was added:<br>
+ ----- Method: PseudoClass>>classVarNames (in category 'accessing') -----<br>
+ classVarNames<br>
+<br>
+ self realClass ifNotNil: [ :realClass | ^realClass classVarNames ].<br>
+ ^#()!<br>
<br>
Item was changed:<br>
----- Method: SmalltalkImage>>presumedSentMe<wbr>ssages (in category 'shrinking') -----<br>
presumedSentMessages | sent |<br>
"Smalltalk presumedSentMessages"<br>
<br>
"The following should be preserved for doIts, etc"<br>
sent := IdentitySet new.<br>
#(compactSymbolTable rebuildAllProjects<br>
browseAllSelect: lastRemoval<br>
scrollBarValue: vScrollBarValue: scrollBarMenuButtonPressed:<br>
withSelectionFrom: to: removeClassNamed:<br>
dragon: hilberts: mandala: web test3 factorial tinyBenchmarks benchFib<br>
newDepth: restoreAfter: zapAllMethods obsoleteClasses<br>
removeAllUnSentMessages abandonSources removeUnreferencedKeys<br>
reclaimDependents zapOrganization condenseChanges browseObsoleteReferences<br>
subclass:instanceVariableNames<wbr>:classVariableNames:poolDictio<wbr>naries:category:<br>
methodsFor:stamp: methodsFor:stamp:prior: instanceVariableNames:<br>
+ unusedClasses) do:<br>
- startTimerInterruptWatcher unusedClasses) do:<br>
[:sel | sent add: sel].<br>
"The following may be sent by perform: in dispatchOnChar..."<br>
Smalltalk at: #ParagraphEditor ifPresent: [:paragraphEditor |<br>
(paragraphEditor classPool at: #CmdActions) asSet do:<br>
[:sel | sent add: sel].<br>
(paragraphEditor classPool at: #ShiftCmdActions) asSet do:<br>
[:sel | sent add: sel]].<br>
^ sent!<br>
<br>
Item was changed:<br>
----- Method: SmalltalkImage>>removeAllUnSen<wbr>tMessages (in category 'shrinking') -----<br>
removeAllUnSentMessages<br>
"Smalltalk removeAllUnSentMessages"<br>
"[Smalltalk unusedClasses do: [:c | (Smalltalk at: c) removeFromSystem].<br>
Smalltalk removeAllUnSentMessages > 0] whileTrue."<br>
"Remove all implementations of unsent messages."<br>
| sels n |<br>
sels := self systemNavigation allUnSentMessages.<br>
"The following should be preserved for doIts, etc"<br>
"needed even after #majorShrink is pulled"<br>
+ #(#compactSymbolTable #rebuildAllProjects #browseAllSelect: #lastRemoval #scrollBarValue: vScrollBarValue: #scrollBarMenuButtonPressed: #withSelectionFrom: #to:<br>
#removeClassNamed:<br>
#dragon: #hilberts: #mandala: #web #test3 #factorial #tinyBenchmarks #benchFib #newDepth: #restoreAfter: #zapAllMethods #obsoleteClasses #removeAllUnSentMessages #abandonSources<br>
#removeUnreferencedKeys #reclaimDependents #zapOrganization #condenseChanges #browseObsoleteReferences<br>
#subclass:instanceVariableName<wbr>s:classVariableNames:poolDicti<wbr>onaries:category:<br>
#methodsFor:stamp: #methodsFor:stamp:prior: #instanceVariableNames: #unusedClasses )<br>
- #(#compactSymbolTable #rebuildAllProjects #browseAllSelect: #lastRemoval #scrollBarValue: vScrollBarValue: #scrollBarMenuButtonPressed: #withSelectionFrom: #to:<br>
#removeClassNamed:<br>
#dragon: #hilberts: #mandala: #web #test3 #factorial #tinyBenchmarks #benchFib #newDepth: #restoreAfter: #zapAllMethods #obsoleteClasses #removeAllUnSentMessages #abandonSources<br>
#removeUnreferencedKeys #reclaimDependents #zapOrganization #condenseChanges #browseObsoleteReferences<br>
#subclass:instanceVariableName<wbr>s:classVariableNames:poolDicti<wbr>onaries:category:<br>
#methodsFor:stamp: #methodsFor:stamp:prior: #instanceVariableNames: #startTimerInterruptWatcher #unusedClasses )<br>
do: [:sel | sels<br>
remove: sel<br>
ifAbsent: []].<br>
"The following may be sent by perform: in dispatchOnChar..."<br>
(Smalltalk at: #ParagraphEditor) ifNotNilDo: [:paragraphEditor |<br>
(paragraphEditor classPool at: #CmdActions) asSet<br>
do: [:sel | sels<br>
remove: sel<br>
ifAbsent: []].<br>
(paragraphEditor classPool at: #ShiftCmdActions) asSet<br>
do: [:sel | sels<br>
remove: sel<br>
ifAbsent: []]].<br>
sels size = 0<br>
ifTrue: [^ 0].<br>
n := 0.<br>
self systemNavigation<br>
allBehaviorsDo: [:x | n := n + 1].<br>
'Removing ' , sels size printString , ' messages . . .'<br>
displayProgressFrom: 0<br>
to: n<br>
during: [:bar |<br>
n := 0.<br>
self systemNavigation<br>
allBehaviorsDo: [:class |<br>
bar value: (n := n + 1).<br>
sels<br>
do: [:sel | class basicRemoveSelector: sel]]].<br>
^ sels size!<br>
<br>
Item was changed:<br>
----- Method: SpaceTally>>compareTallyIn:to: (in category 'fileOut') -----<br>
compareTallyIn: beforeFileName to: afterFileName<br>
"SpaceTally new compareTallyIn: 'tally' to: 'tally2'"<br>
<br>
| answer s beforeDict a afterDict allKeys |<br>
beforeDict := Dictionary new.<br>
s := FileDirectory default fileNamed: beforeFileName.<br>
[s atEnd] whileFalse: [<br>
a := Array readFrom: s nextLine.<br>
beforeDict at: a first put: a allButFirst.<br>
].<br>
s close.<br>
afterDict := Dictionary new.<br>
s := FileDirectory default fileNamed: afterFileName.<br>
[s atEnd] whileFalse: [<br>
a := Array readFrom: s nextLine.<br>
afterDict at: a first put: a allButFirst.<br>
].<br>
s close.<br>
answer := WriteStream on: String new.<br>
+ allKeys := (Set new addAll: beforeDict keys; addAll: afterDict keys; yourself) sorted.<br>
- allKeys := (Set new addAll: beforeDict keys; addAll: afterDict keys; yourself) asSortedCollection.<br>
allKeys do: [ :each |<br>
| before after diff |<br>
before := beforeDict at: each ifAbsent: [#(0 0 0)].<br>
after := afterDict at: each ifAbsent: [#(0 0 0)].<br>
diff := before with: after collect: [ :vBefore :vAfter | vAfter - vBefore].<br>
diff = #(0 0 0) ifFalse: [<br>
answer nextPutAll: each,' ',diff printString; cr.<br>
].<br>
].<br>
StringHolder new contents: answer contents; openLabel: 'space diffs'.<br>
<br>
<br>
<br>
!<br>
<br>
Item was changed:<br>
----- Method: SystemNavigation>>allMethodsIn<wbr>Category: (in category 'browse') -----<br>
allMethodsInCategory: category<br>
| aCollection |<br>
+ aCollection := OrderedCollection new.<br>
- aCollection := SortedCollection new.<br>
Cursor wait showWhile:<br>
[self allBehaviorsDo:<br>
[:x | (x allMethodsInCategory: category) do:<br>
[:sel | aCollection add: x name , ' ' , sel]]].<br>
+ ^aCollection sort.<br>
- ^aCollection.<br>
!<br>
<br>
Item was changed:<br>
----- Method: SystemNavigation>>allSelectors<wbr>WithAnyImplementorsIn: (in category 'query') -----<br>
allSelectorsWithAnyImplementor<wbr>sIn: selectorList<br>
"Answer the subset of the given list which represent method selectors<br>
which have at least one implementor in the system."<br>
| good |<br>
+ good := Set new.<br>
- good := OrderedCollection new.<br>
self allBehaviorsDo: [:class | selectorList<br>
do: [:aSelector | (class includesSelector: aSelector)<br>
ifTrue: [good add: aSelector]]].<br>
+ ^good sorted<br>
+<br>
+ "<br>
- ^ good asSet asSortedArray"<br>
SystemNavigation new selectorsWithAnyImplementorsIn<wbr>: #( contents<br>
contents: nuts)<br>
"!<br>
<br>
Item was changed:<br>
----- Method: SystemNavigation>>browseAllImp<wbr>lementorsOf:localToPackage: (in category 'browse') -----<br>
browseAllImplementorsOf: selector localToPackage: packageNameOrInfo<br>
"Create and schedule a message browser on each method in the given package<br>
that implements the message whose selector is the argument, selector. For example,<br>
SystemNavigation new browseAllImplementorsOf: #at:put: localToPackage: 'Collections'."<br>
<br>
self browseMessageList: (self<br>
allImplementorsOf: selector<br>
+ localToPackage: packageNameOrInfo)<br>
- localToPackage: packageNameOrInfo) asSortedCollection<br>
name: 'Implementors of ' , selector,<br>
' local to package ', (self packageInfoFor: packageNameOrInfo) name!<br>
<br>
Item was changed:<br>
----- Method: SystemNavigation>>browseAllSel<wbr>ect:localTo: (in category 'browse') -----<br>
browseAllSelect: aBlock localTo: aClass<br>
"Create and schedule a message browser on each method in or below the given class<br>
that, when used as the block argument to aBlock gives a true result. For example,<br>
SystemNavigation default browseAllSelect: [:m | m numLiterals > 10] localTo: Morph."<br>
aClass ifNil: [^self inform: 'no class selected'].<br>
^self<br>
+ browseMessageList: (self allMethodsSelect: aBlock localTo: aClass) sorted<br>
- browseMessageList: (self allMethodsSelect: aBlock localTo: aClass) asSortedCollection<br>
name: 'selected messages local to ', aClass name!<br>
<br>
Item was changed:<br>
----- Method: SystemNavigation>>browseClassC<wbr>ommentsWithString: (in category 'browse') -----<br>
browseClassCommentsWithString: aString<br>
"Smalltalk browseClassCommentsWithString: 'my instances' "<br>
"Launch a message list browser on all class comments containing aString as a substring."<br>
<br>
| caseSensitive suffix list |<br>
<br>
suffix := (caseSensitive := Sensor shiftPressed)<br>
ifTrue: [' (case-sensitive)']<br>
ifFalse: [' (use shift for case-sensitive)'].<br>
list := Set new.<br>
Cursor wait showWhile: [<br>
Smalltalk allClassesDo: [:class |<br>
(class organization classComment asString findString: aString<br>
startingAt: 1 caseSensitive: caseSensitive) > 0 ifTrue: [<br>
list add: (<br>
MethodReference<br>
class: class<br>
selector: #Comment<br>
)<br>
]<br>
]<br>
].<br>
^ self<br>
+ browseMessageList: list sorted<br>
- browseMessageList: list asSortedCollection<br>
name: 'Class comments containing ' , aString printString , suffix<br>
autoSelect: aString!<br>
<br>
Item was changed:<br>
----- Method: SystemNavigation>>browseClasse<wbr>sWithNamesContaining:<wbr>caseSensitive: (in category 'browse') -----<br>
browseClassesWithNamesContaini<wbr>ng: aString caseSensitive: caseSensitive<br>
"Smalltalk browseClassesWithNamesContaini<wbr>ng: 'eMorph' caseSensitive: true "<br>
"Launch a class-list list browser on all classes whose names containg aString as a substring."<br>
<br>
| suffix aList |<br>
suffix := caseSensitive<br>
ifTrue: [' (case-sensitive)']<br>
ifFalse: [' (use shift for case-sensitive)'].<br>
aList := OrderedCollection new.<br>
Cursor wait<br>
showWhile: [Smalltalk<br>
allClassesDo: [:class | (class name includesSubstring: aString caseSensitive: caseSensitive)<br>
ifTrue: [aList add: class name]]].<br>
aList size > 0<br>
+ ifTrue: [ToolSet openClassListBrowser: aList asSet sorted title: 'Classes whose names contain ' , aString , suffix]!<br>
- ifTrue: [ToolSet openClassListBrowser: aList asSet asSortedArray title: 'Classes whose names contain ' , aString , suffix]!<br>
<br>
Item was changed:<br>
----- Method: SystemNavigation>>showMenuOf:w<wbr>ithFirstItem:ifChosenDo:withCa<wbr>ption: (in category 'ui') -----<br>
showMenuOf: selectorCollection withFirstItem: firstItem ifChosenDo: choiceBlock withCaption: aCaption<br>
"Show a sorted menu of the given selectors, preceded by firstItem, and all abbreviated to 40 characters. Use aCaption as the menu title, if it is not nil. Evaluate<br>
choiceBlock if a<br>
message is chosen."<br>
<br>
| index menuLabels sortedList |<br>
+ sortedList := selectorCollection sorted.<br>
- sortedList := selectorCollection asSortedCollection.<br>
menuLabels := Array streamContents:<br>
[:strm | strm nextPut: (firstItem contractTo: 40).<br>
sortedList do: [:sel | strm nextPut: (sel contractTo: 40)]].<br>
index := UIManager default chooseFrom: menuLabels lines: #(1).<br>
index = 1 ifTrue: [choiceBlock value: firstItem].<br>
index > 1 ifTrue: [choiceBlock value: (sortedList at: index - 1)]!<br>
<br>
Item was changed:<br>
----- Method: SystemVersion>>highestUpdate (in category 'accessing') -----<br>
highestUpdate<br>
+<br>
+ ^highestUpdate ifNil: [<br>
+ highestUpdate := self updates isEmpty<br>
+ ifTrue: [ 0 ]<br>
+ ifFalse: [ self updates max ] ]!<br>
- | sortedUpdates |<br>
- highestUpdate ifNil: [<br>
- sortedUpdates := self updates asSortedCollection.<br>
- highestUpdate := (sortedUpdates isEmpty<br>
- ifTrue: [0]<br>
- ifFalse: [sortedUpdates last])].<br>
- ^highestUpdate!<br>
<br>
Item was changed:<br>
----- Method: TranslatedReceiverFinder class>>browseNonLiteralReceive<wbr>rs (in category 'utilities') -----<br>
browseNonLiteralReceivers<br>
"TranslatedReceiverFinder browseNonLiteralReceivers"<br>
SystemNavigation default<br>
+ browseMessageList: self new nonLiteralReceivers<br>
- browseMessageList: self new nonLiteralReceivers asSortedCollection<br>
name: 'Non literal receivers of #translated'<br>
autoSelect: 'translated'!<br>
<br>
<br>
<br>
<br>
<br>
--<br>
_,,,^..^,,,_<br>
best, Eliot<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
--<br>
_,,,^..^,,,_<br>
best, Eliot<br>
<br>
</blockquote>
</blockquote>
</div></div><br><br>
<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><span style="font-size:small;border-collapse:separate"><div>_,,,^..^,,,_<br></div><div>best, Eliot</div></span></div></div></div>
</div></div>