<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>