VersionDiffBrowser.st
changeset 17827 cc7a2ad961f7
parent 17802 3fefef20b087
child 17875 c345e9001548
--- a/VersionDiffBrowser.st	Thu Nov 30 14:53:24 2017 +0100
+++ b/VersionDiffBrowser.st	Thu Nov 30 17:52:54 2017 +0100
@@ -25,10 +25,11 @@
 		includeExtensionsHolder canIncludeExtensionsHolder
 		includeCategoryChangesHolder includeVersionMethodsHolder
 		isMultipleVersionBrowser versionInfoList versionList
-		selectedVersionHolder symbolicVersionList
+		versionEntriesList selectedVersionHolder symbolicVersionList
 		selectedSymbolicVersionHolder symbolicToVersionMapping
 		filteredClasses filteredMethods filteredSelectors
-		classPatternFilters selectorPatternFilters'
+		classPatternFilters selectorPatternFilters
+		selectedVersionIndexHolder'
 	classVariableNames:'RememberedFilters'
 	poolDictionaries:''
 	category:'Interface-Browsers'
@@ -313,10 +314,12 @@
     ^ 
     #(FullSpec
        name: windowSpecForMultipleVersions
+       uuid: '55cb9d62-d4fd-11e7-af82-c42c033b4871'
        window: 
       (WindowSpec
          label: 'Version DiffBrowser'
          name: 'Version DiffBrowser'
+         uuid: '2b3f2546-d4fd-11e7-af82-c42c033b4871'
          min: (Point 10 10)
          bounds: (Rectangle 0 0 865 504)
          menu: mainMenu
@@ -327,26 +330,30 @@
           (VariableVerticalPanelSpec
              name: 'VariableVerticalPanel1'
              layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 -25 1.0)
+             uuid: '2b3f297e-d4fd-11e7-af82-c42c033b4871'
              component: 
             (SpecCollection
                collection: (
                 (ViewSpec
                    name: 'Box1'
+                   uuid: '2b3f2c08-d4fd-11e7-af82-c42c033b4871'
                    component: 
                   (SpecCollection
                      collection: (
                       (SequenceViewSpec
                          name: 'VersionList'
                          layout: (LayoutFrame 0 0 0 0 0 0.5 0 1)
-                         model: selectedVersionHolder
+                         uuid: '2b3f2d20-d4fd-11e7-af82-c42c033b4871'
+                         model: selectedVersionIndexHolder
                          hasHorizontalScrollBar: true
                          hasVerticalScrollBar: true
-                         useIndex: false
-                         sequenceList: versionList
+                         useIndex: true
+                         sequenceList: versionEntriesList
                        )
                       (SequenceViewSpec
                          name: 'List1'
                          layout: (LayoutFrame 0 0.5 0 0 0 1 0 1)
+                         uuid: '2b3f3086-d4fd-11e7-af82-c42c033b4871'
                          model: selectedSymbolicVersionHolder
                          hasHorizontalScrollBar: true
                          hasVerticalScrollBar: true
@@ -359,6 +366,7 @@
                  )
                 (HorizontalPanelViewSpec
                    name: 'TopHorizontalPanel'
+                   uuid: '2b3f3234-d4fd-11e7-af82-c42c033b4871'
                    horizontalLayout: fit
                    verticalLayout: fit
                    horizontalSpace: 3
@@ -368,6 +376,7 @@
                      collection: (
                       (ViewSpec
                          name: 'BoxA'
+                         uuid: '2b3f3464-d4fd-11e7-af82-c42c033b4871'
                          level: 0
                          visibilityChannel: boxAVisible
                          component: 
@@ -377,12 +386,14 @@
                                label: 'Only in A'
                                name: 'OnlyInALabel'
                                layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 20 0)
+                               uuid: '2b3f3568-d4fd-11e7-af82-c42c033b4871'
                                translateLabel: true
                                labelChannel: onlyInALabelHolder
                              )
                             (SequenceViewSpec
                                name: 'ListA'
                                layout: (LayoutFrame 0 0.0 20 0.0 0 1.0 -3 1.0)
+                               uuid: '2b3f37c0-d4fd-11e7-af82-c42c033b4871'
                                model: methodsOnlyInASelection
                                menu: menuAHolder
                                hasHorizontalScrollBar: true
@@ -400,6 +411,7 @@
                        )
                       (ViewSpec
                          name: 'BoxM'
+                         uuid: '2b3f39a0-d4fd-11e7-af82-c42c033b4871'
                          visibilityChannel: boxMVisible
                          component: 
                         (SpecCollection
@@ -408,12 +420,14 @@
                                label: 'Changed'
                                name: 'ChangedLabel'
                                layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 20 0)
+                               uuid: '2b3f3a86-d4fd-11e7-af82-c42c033b4871'
                                translateLabel: true
                                labelChannel: changedLabelHolder
                              )
                             (SequenceViewSpec
                                name: 'ListM'
                                layout: (LayoutFrame 0 0.0 20 0.0 0 1.0 -3 1.0)
+                               uuid: '2b3f3b94-d4fd-11e7-af82-c42c033b4871'
                                model: methodsChangedSelection
                                menu: menuMHolder
                                hasHorizontalScrollBar: true
@@ -431,6 +445,7 @@
                        )
                       (ViewSpec
                          name: 'BoxB'
+                         uuid: '2b3f3d1a-d4fd-11e7-af82-c42c033b4871'
                          visibilityChannel: boxBVisible
                          component: 
                         (SpecCollection
@@ -439,12 +454,14 @@
                                label: 'Only in B'
                                name: 'OnlyInBLabel'
                                layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 20 0)
+                               uuid: '2b3f3dec-d4fd-11e7-af82-c42c033b4871'
                                translateLabel: true
                                labelChannel: onlyInBLabelHolder
                              )
                             (SequenceViewSpec
                                name: 'ListB'
                                layout: (LayoutFrame 0 0.0 20 0.0 0 1.0 -3 1.0)
+                               uuid: '2b3f3f04-d4fd-11e7-af82-c42c033b4871'
                                model: methodsOnlyInBSelection
                                menu: menuBHolder
                                hasHorizontalScrollBar: true
@@ -466,12 +483,14 @@
                  )
                 (ViewSpec
                    name: 'DiffBox'
+                   uuid: '2b3f408a-d4fd-11e7-af82-c42c033b4871'
                    component: 
                   (SpecCollection
                      collection: (
                       (ViewSpec
                          name: 'diffTextViewBox'
                          layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+                         uuid: '2b3f415c-d4fd-11e7-af82-c42c033b4871'
                          initiallyInvisible: true
                          component: 
                         (SpecCollection
@@ -480,6 +499,7 @@
                                label: 'A'
                                name: 'DiffTextLabelA'
                                layout: (LayoutFrame 0 0 0 0 0 0.5 20 0)
+                               uuid: '2b3f426a-d4fd-11e7-af82-c42c033b4871'
                                translateLabel: true
                                labelChannel: diffTextLabelA
                              )
@@ -487,12 +507,14 @@
                                label: 'B'
                                name: 'DiffTextLabelB'
                                layout: (LayoutFrame 0 0.5 0 0 0 1 20 0)
+                               uuid: '2b3f43d2-d4fd-11e7-af82-c42c033b4871'
                                translateLabel: true
                                labelChannel: diffTextLabelB
                              )
                             (ArbitraryComponentSpec
                                name: 'diffTextView'
                                layout: (LayoutFrame 0 0.0 20 0.0 0 1.0 0 1.0)
+                               uuid: '2b3f4508-d4fd-11e7-af82-c42c033b4871'
                                hasBorder: false
                                component: diffTextView
                              )
@@ -503,6 +525,7 @@
                       (CodeViewSpec
                          name: 'singleTextView'
                          layout: (LayoutFrame 0 0.0 0 0.0 0 1.0 0 1.0)
+                         uuid: '2b3f4738-d4fd-11e7-af82-c42c033b4871'
                          model: methodText
                          hasHorizontalScrollBar: true
                          hasVerticalScrollBar: true
@@ -517,11 +540,12 @@
                 )
               
              )
-             handles: (Any 0.217118997912317 0.666666666666667 1.0)
+             handles: (Any 0.22 0.67000000000000004 1.0)
            )
           (LabelSpec
              name: 'InfoLabel'
              layout: (LayoutFrame 0 0 -25 1 0 1 0 1)
+             uuid: '2b3f4a44-d4fd-11e7-af82-c42c033b4871'
              level: -1
              translateLabel: true
              labelChannel: infoHolder
@@ -531,8 +555,6 @@
         
        )
      )
-
-    "Modified: / 05-02-2017 / 10:08:18 / cg"
 ! !
 
 !VersionDiffBrowser class methodsFor:'menu specs'!
@@ -1818,6 +1840,16 @@
     ^ selectedVersionHolder
 !
 
+selectedVersionIndexHolder
+    selectedVersionIndexHolder isNil ifTrue:[
+        selectedVersionIndexHolder := nil asValue.
+        selectedVersionIndexHolder onChangeSend:#selectedVersionIndexHolderChanged to:self.
+    ].
+    ^ selectedVersionIndexHolder
+
+    "Created: / 29-11-2017 / 13:02:49 / cg"
+!
+
 symbolicVersionList
     symbolicVersionList isNil ifTrue:[
          symbolicVersionList := List new.
@@ -1825,6 +1857,15 @@
     ^ symbolicVersionList
 !
 
+versionEntriesList
+    versionEntriesList isNil ifTrue:[
+         versionEntriesList := List new.
+    ].
+    ^ versionEntriesList
+
+    "Created: / 29-11-2017 / 13:06:14 / cg"
+!
+
 versionList
     versionList isNil ifTrue:[
          versionList := List new.
@@ -1964,28 +2005,70 @@
         changeA := (methodsChangedFiltered at:sel) first.
         changeB := (methodsChangedFiltered at:sel) second.
         self withReadCursorDo:[
+            |info|
+            
             "/ see if the semantics have changed (or only prettyPrinted)
             RBParser notNil ifTrue:[
                 (classChangeSet notNil
                 and:[ classChangeSet classBeingCompared notNil ]) ifTrue:[
                     parseError := false.
-                    treeA := RBParser parseMethod:changeA source onError: [:str :pos | parseError := true].
-                    treeB := RBParser parseMethod:changeB source onError: [:str :pos | parseError := true].
-                    parseError ifFalse:[
-                        (treeA "semanticallyEqualTo:" equalTo:treeB withMapping:(Dictionary  new)) ifTrue:[
-                            self infoHolder value:'Methods only differ in formatting / comments.'.
-                        ] ifFalse:[
+                    changeA isMethodChange ifTrue:[
+                        treeA := RBParser parseMethod:(changeA source) onError: [:str :pos | parseError := true].
+                        treeB := RBParser parseMethod:(changeB source) onError: [:str :pos | parseError := true].
+                        parseError ifFalse:[
+                            (treeA equalTo:treeB withMapping:(Dictionary new)) ifTrue:[
+                                info := 'Methods only differ in formatting / comments.'.
+                            ] ifFalse:[
+                                (treeA semanticallyEqualTo:treeB withMapping:(Dictionary  new)) ifTrue:[
+                                    info := 'Methods seem to do the same.'.
+                                ] ifFalse:[
+                                    info := 'Methods are different.'.
+                                ]
+                            ]
+                        ] ifTrue:[
+                            self infoHolder value:'ParseError while comparing - please check the code'.
+                        ].    
+                    ] ifFalse:[
+                        changeA isClassDefinitionChange ifTrue:[
+                            treeA := RBParser parseExpression:(changeA source) onError: [:str :pos | parseError := true].
+                            treeB := RBParser parseExpression:(changeB source) onError: [:str :pos | parseError := true].
                             (treeA semanticallyEqualTo:treeB withMapping:(Dictionary  new)) ifTrue:[
-                                self infoHolder value:'Methods seem to do the same.'.
+                                info := 'Class definitions seem to do the same.'.
                             ] ifFalse:[
-                                self infoHolder value:'Methods are different.'.
-                            ]
-                        ]
-                    ] ifTrue:[
-                        self infoHolder value:'ParseError while comparing - please check the code'.
+                                info := 'Class definitions are different.'.
+                            ].    
+                            treeA receiver = treeB receiver ifFalse:[
+                                info := 'Superclass changed.'.
+                            ] ifTrue:[
+                                treeA arg1 = treeB arg1 ifFalse:[
+                                    info := 'Name changed.'.
+                                ] ifTrue:[
+                                    treeA arg2 = treeB arg2 ifFalse:[
+                                        info := 'Instvars changed.'.
+                                    ] ifTrue:[
+                                        treeA arg3 = treeB arg3 ifFalse:[
+                                            info := 'Classvars changed.'.
+                                        ] ifTrue:[
+                                            (treeA arg:4) = (treeB arg:4) ifFalse:[
+                                                info := 'Pooldict changed.'.
+                                            ] ifTrue:[
+                                                (treeA arg:5) = (treeB arg:5) ifFalse:[
+                                                    info := 'Category changed.'.
+                                                ].
+                                            ].
+                                        ].
+                                    ].
+                                ].
+                            ].
+                        ] ifFalse:[
+                            self halt.
+                        ].    
                     ].    
                 ].
             ].
+            info notNil ifTrue:[
+                self infoHolder value:info
+            ].    
             self diffTextView
                 text1:(changeA prettyPrintedSource) 
                 text2:(changeB prettyPrintedSource)        
@@ -1997,7 +2080,7 @@
     ]
 
     "Modified: / 03-09-1999 / 15:01:30 / ps"
-    "Modified: / 28-11-2017 / 14:21:41 / cg"
+    "Modified: / 29-11-2017 / 12:56:28 / cg"
 !
 
 methodsOnlyInASelectionChanged
@@ -2118,6 +2201,12 @@
     "Modified: / 06-02-2017 / 02:32:24 / cg"
 !
 
+selectedVersionIndexHolderChanged
+    self selectedVersionHolder value:(versionList at:self selectedVersionIndexHolder value)
+
+    "Created: / 29-11-2017 / 13:04:12 / cg"
+!
+
 update:something with:parameter from:changedObject
     ((changedObject == includeExtensionsHolder)
     or:[ changedObject == includeCategoryChangesHolder
@@ -2423,7 +2512,7 @@
      This is only used when comparing multiple versions."
 
     |cls sourceCodeManager numShown newNumShown numOverallRevisions
-     partialLog newestRev revisions symbolicNames
+     partialLog newestRev revisions revisionEntries symbolicNames
      stableRevision releasedRevision tagList logMessages|
 
     cls := classHolder value.
@@ -2480,7 +2569,16 @@
 "/                               ].
 "/
 "/    revisions := revisions collect:[:eachItem | eachItem at:#revision].
-    revisions := versionInfoList collect:[:each | each at:#revision].
+    revisions := OrderedCollection new.
+    revisionEntries := OrderedCollection new.
+    versionInfoList do:[:eachVersionInfo |
+        revisions add:eachVersionInfo revision.
+        revisionEntries add:(
+                    '%1 (by %2 at %3)' 
+                        bindWith:(eachVersionInfo revision)
+                        with:(eachVersionInfo user)
+                        with:(eachVersionInfo date)).
+    ].
 
     revisions size < numOverallRevisions ifTrue:[
         revisions add:'...'
@@ -2488,8 +2586,9 @@
     symbolicToVersionMapping := symbolicNames.
     self symbolicVersionList contents:tagList.
     self versionList contents:revisions.
-
-    "Modified (comment): / 05-02-2017 / 10:32:08 / cg"
+    self versionEntriesList contents:revisionEntries.
+
+    "Modified: / 29-11-2017 / 13:06:21 / cg"
 ! !
 
 !VersionDiffBrowser methodsFor:'initialization & release'!