<font face="Bitmap DejaVu Sans" size="9">Any fundamental objections before I would merge this into the Trunk? :-)<br>
</font><b><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
=============== Summary ===============</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
Change Set:        mcSlips<br>
Date:            16 January 2022<br>
Author:            Christoph Thiede<br>
<br>
This changeset integrates the slip detection mechanism, previously only known from the domain of changesets, into the Monticello system. When users save a new version, it will automatically notify them about any possible slips and let them decide whether to browse them first or proceed the saving. Users can also scan their patch for slips manually by invocating the item from the patch list menu. The value of the preference #checkForSlips is still honored for the automatic detection, and the description of that preference is updated to mention the new usage.<br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">=============== Postscript ===============</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><font color="#008080"><font face="Bitmap DejaVu Sans" size="9">"Postscript:"</font></font><font color="#000000"><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
(Preferences </font></font><font color="#000080"><font face="Bitmap DejaVu Sans" size="9">preferenceAt:</font></font><font color="#000000"><font face="Bitmap DejaVu Sans" size="9"> </font></font><font color="#000080"><font face="Bitmap DejaVu Sans" size="9">#checkForSlips</font></font><font color="#000000"><font face="Bitmap DejaVu Sans" size="9">) </font></font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">helpString:</font></font><font color="#000000"><font face="Bitmap DejaVu Sans" size="9"> </font></font><font color="#800080"><font face="Bitmap DejaVu Sans" size="9">'If true, then whenever you file out a change set or save a Monticello version, it is checked for ''slips'' and if any are found, you are so informed and given a chance to open a browser on them.'</font></font><font color="#000000"><font face="Bitmap DejaVu Sans" size="9">.</font></font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">=============== Diff ===============</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">CompiledMethod>>hasReportableSlip {testing} · ct 1/15/2022 22:32 (changed)</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font face="Bitmap DejaVu Sans" size="9">hasReportableSlip<br>
    "Answer whether the receiver contains anything that should be brought <br>
    to the attention of the author when filing out. Customize the lists here <br>
    to suit your preferences. If slips do not get reported in spite of your <br>
    best efforts here, make certain that the Preference 'checkForSlips' is set <br>
    to true."<br>
</font><s><font color="#0000FF"><font face="Bitmap DejaVu Sans" size="9">-     #(#doOnlyOnce: #halt #halt: #hottest #printDirectlyToDisplay #toRemove #personal #urgent  #haltOnce #haltOnce: #haltIf: )<br>
</font></font></s><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+     #(#doOnlyOnce: #halt #halt: #hottest #printDirectlyToDisplay #toRemove #personal #urgent  #haltOnce #haltOnce: #haltIf: #haltIfNil #haltOnCount: #halt:onCount: #break )<br>
</font></font><font face="Bitmap DejaVu Sans" size="9">        do: [:aLit | (self hasLiteral: aLit)<br>
                ifTrue: [^ true]].<br>
    #(#Transcript #AA #BB #CC #DD #EE )<br>
        do: [:aSymbol |<br>
            | assoc |<br>
            (assoc := Smalltalk globals<br>
                        associationAt: aSymbol<br>
                        ifAbsent: [])<br>
                ifNotNil: [(self hasLiteral: assoc)<br>
                        ifTrue: [^ true]]].<br>
    ^ false</font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">MCChangeSelector>>select {actions} · ct 1/15/2022 22:46 (changed)</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font face="Bitmap DejaVu Sans" size="9">select<br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+ <br>
+     (Preferences checkForSlips ==> [self lookForSlips]) ifFalse: [^ self].<br>
+     <br>
</font></font><font face="Bitmap DejaVu Sans" size="9">    self answer: (MCPatch operations: kept)</font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">MCDefinition>>hasReportableSlip {testing} · ct 1/15/2022 22:49</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+ hasReportableSlip<br>
+ <br>
+     ^ false</font></font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">MCMethodDefinition (changed)</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font face="Bitmap DejaVu Sans" size="9">MCDefinition subclass: #MCMethodDefinition<br>
</font><s><font color="#0000FF"><font face="Bitmap DejaVu Sans" size="9">-     instanceVariableNames: 'classIsMeta source category selector className timeStamp'<br>
</font></font></s><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+     instanceVariableNames: 'classIsMeta source category selector className timeStamp hasReportableSlip'<br>
</font></font><font face="Bitmap DejaVu Sans" size="9">    classVariableNames: ''<br>
    poolDictionaries: ''<br>
    category: 'Monticello-Modeling'<br>
<br>
MCMethodDefinition class <br>
    instanceVariableNames: 'definitions'<br>
<br>
""</font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">MCMethodDefinition class>>forMethodReference: {create} · ct 1/15/2022 22:53 (changed)</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font face="Bitmap DejaVu Sans" size="9">forMethodReference: aMethodReference<br>
    | definition |<br>
    definition := self cachedDefinitions at: aMethodReference compiledMethod ifAbsent: [].<br>
    (definition isNil<br>
        or: [definition selector ~= aMethodReference methodSymbol<br>
        or: [definition className ~= aMethodReference classSymbol<br>
        or: [definition classIsMeta ~= aMethodReference classIsMeta<br>
        or: [definition category ~= aMethodReference category]]]])<br>
            ifTrue: [definition := self <br>
                        className: aMethodReference classSymbol<br>
                        classIsMeta: aMethodReference classIsMeta<br>
                        selector: aMethodReference methodSymbol<br>
                        category: aMethodReference category<br>
                        timeStamp: aMethodReference timeStamp<br>
                        source: aMethodReference source.<br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+                     definition hasReportableSlip: aMethodReference compiledMethod hasReportableSlip.<br>
</font></font><font face="Bitmap DejaVu Sans" size="9">                    self cachedDefinitions at: aMethodReference compiledMethod put: definition].<br>
    ^ definition<br>
    </font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">MCMethodDefinition>>hasReportableSlip {accessing} · ct 1/15/2022 22:54</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+ hasReportableSlip<br>
+ <br>
+     ^ hasReportableSlip ifNil: [false]</font></font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">MCMethodDefinition>>hasReportableSlip: {accessing} · ct 1/15/2022 22:53</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+ hasReportableSlip: aBoolean<br>
+ <br>
+     hasReportableSlip := aBoolean.</font></font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">MCPatchBrowser>>checkForSlips {actions} · ct 1/15/2022 23:12</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+ checkForSlips<br>
+ <br>
+     ^ self checkForSlipsIn: self items</font></font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">MCPatchBrowser>>checkForSlipsIn: {actions} · ct 1/15/2022 23:07</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+ checkForSlipsIn: patchItems<br>
+ <br>
+     ^ patchItems select: [:ea | ea hasReportableSlip]</font></font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">MCPatchBrowser>>lookForSlips {actions} · ct 1/15/2022 23:11</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+ lookForSlips<br>
+     "Look for slips in all changes. If there are any, ask the user how to treat them. Answer true if the operation should go on, or false if it should be canceled."<br>
+ <br>
+     | slips |<br>
+     slips := self checkForSlips ifEmpty: [^ true].<br>
+     (Project uiManager<br>
+         chooseFromLabeledValues: (OrderedDictionary new<br>
+             at: 'Browse slips' translated put: [self systemNavigation<br>
+                 browseMessageList: (slips collect: [:ea | ea definition asMethodReference])<br>
+                 name: 'Possible slips in new version' translated];<br>
+             at: 'Ignore slips and continue' translated put: [^ true];<br>
+             at: 'Cancel' translated put: [^ false];<br>
+             yourself)<br>
+         title: ('This patch contains {1} halts, Transcript sends, or other possible slips.\\Save the new version anyway?' withCRs translated format: {slips size})) value.<br>
+     ^ false</font></font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">MCPatchBrowser>>methodListMenu: {menus} · ct 1/15/2022 23:01</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+ methodListMenu: aMenu<br>
+ <br>
+     super methodListMenu: aMenu.<br>
+     <br>
+     aMenu add: 'check for slips' translated help: 'Check all changes for possible slips such as forgotten breakpoints or logging statements.' translated action: #reportSlips.<br>
+     <br>
+     ^ aMenu</font></font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">MCPatchBrowser>>reportSlips {actions} · ct 1/15/2022 23:05</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+ reportSlips<br>
+     "Look for slips in all changes and report to the user what was found."<br>
+ <br>
+     | slips |<br>
+     slips := self checkForSlips ifEmpty: [^ self inform: 'There were no obvious slips in this patch' translated].<br>
+     self systemNavigation<br>
+         browseMessageList: (slips collect: [:ea | ea definition asMethodReference])<br>
+         name: 'Possible slips in new version' translated.</font></font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">MCPatchOperation>>hasReportableSlip {testing} · ct 1/15/2022 22:49</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+ hasReportableSlip<br>
+ <br>
+     ^ self targetDefinition<br>
+         ifNil: [false]<br>
+         ifNotNil: [:def | def hasReportableSlip]</font></font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">MCSaveVersionDialog>>accept {actions} · ct 1/15/2022 23:06 (changed)</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font face="Bitmap DejaVu Sans" size="9">accept<br>
    | logMessage logMessageWidget |<br>
    self updateItems.<br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+     <br>
+     (Preferences checkForSlips ==> [self lookForSlips]) ifFalse: [^ self].<br>
+     <br>
</font></font><font face="Bitmap DejaVu Sans" size="9">    logMessage := (logMessageWidget := self findTextMorph: #logMessage) text asString.<br>
    (logMessage isEmpty or: [logMessage beginsWith: 'empty log message'])<br>
        ifTrue:<br>
</font><s><font color="#0000FF"><font face="Bitmap DejaVu Sans" size="9">-             [(UIManager confirm: 'the log message is empty; are you sure you want to commit') ifFalse: [^ self]]<br>
</font></font></s><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+             [(self confirm: 'The log message is empty; are you sure you want to commit?' translated) ifFalse: [^ self]]<br>
</font></font><font face="Bitmap DejaVu Sans" size="9">        ifFalse: [logMessageWidget accept].<br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+     <br>
</font></font><font face="Bitmap DejaVu Sans" size="9">    self answer: {<br>
        (self findTextMorph: #versionName) text asString.<br>
        logMessage.<br>
        ignore }</font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">MCSaveVersionDialog>>checkForSlips {actions} · ct 1/15/2022 23:12</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+ checkForSlips<br>
+ <br>
+     ^ super checkForSlipsIn: (self items copyWithoutAll: self ignore)</font></font><font face="Bitmap DejaVu Sans" size="9"><br>
<br>
</font><b><font face="Bitmap DejaVu Sans" size="9">Preference>>helpString: {menu} · ct 1/16/2022 01:31</font></b><font face="Bitmap DejaVu Sans" size="9"><br>
</font><font color="#FF0000"><font face="Bitmap DejaVu Sans" size="9">+ helpString: aString<br>
+ <br>
+     helpString := aString</font></font><br>
<br>
<font color="#808080">---<br>
</font><font color="#808080"><i>Sent from </i></font><font color="#808080"><i><a href="https://github.com/hpi-swa-lab/squeak-inbox-talk"><u><font color="#808080">Squeak Inbox Talk</font></u></a></i></font><br>
["mcSlips.1.cs"]<br>
["mcSlips.png"]