ChangeSet.st
changeset 1865 89d9aef483b2
parent 1842 6ca4e98df305
child 1867 dad9e13fba4c
--- a/ChangeSet.st	Thu Oct 12 21:32:13 2006 +0200
+++ b/ChangeSet.st	Thu Oct 12 21:34:14 2006 +0200
@@ -88,12 +88,22 @@
     aClass fileOutOn:s.
     s reset.
     changeSet := self fromStream:s.
+
+    changeSet do:[:eachChange |
+        eachChange isMethodChange ifTrue:[
+            eachChange package:(eachChange changeMethod package)
+        ] ifFalse:[
+            eachChange isClassChange ifTrue:[
+                eachChange package:(eachChange changeClass package)
+            ].
+        ].
+    ].
+
     ^ changeSet
 
 "/    |source changeSet chunk sawExcla lastTimeStamp s change nameSpace|
 
 "/    changeSet := self new.
-"/    nameSpace := Smalltalk.
 "/
 "/    "/ first, a classDefinition change ...
 "/    changeSet addClassDefinitionChangeFor:aClass.
@@ -118,12 +128,60 @@
 "/
 "/    ^ changeSet
 
+
     "
      ChangeSet forExistingClass:ChangeSet
+
+     Rectangle hasExtensions
+     ChangeSet forExistingClass:Rectangle
     "
 
-    "Created: / 16.2.1998 / 12:19:34 / cg"
-    "Modified: / 14.12.1999 / 15:23:16 / cg"
+    "Created: / 16-02-1998 / 12:19:34 / cg"
+    "Modified: / 12-10-2006 / 18:22:49 / cg"
+!
+
+forExistingClass:aClass withExtensions:withExtensions extensionsOnly:extensionsOnly
+    "build a changeSet for some given full, the base-class or the extensions only.
+     That does of course not give deltas, but instead reflects the current
+     state of the given class.
+     It is useful in conjunction with the other utility methods,
+     for example, when building patchLists, diffSets etc."
+
+    |changeSet classPackage|
+
+    changeSet := self forExistingClass:aClass.
+    classPackage := aClass package.
+
+    extensionsOnly ifTrue:[
+        ^ changeSet 
+            select:[:change |
+                change isMethodChange
+                and:[ change package ~= classPackage ]
+            ].
+    ].
+    withExtensions ifFalse:[
+        ^ changeSet 
+            reject:[:change |
+                change isMethodChange 
+                and:[ change package ~= classPackage ]
+            ].
+    ].
+
+    ^ changeSet
+
+    "
+     ChangeSet forExistingClass:ChangeSet
+
+     Rectangle hasExtensions
+     Rectangle extensions
+
+     ChangeSet forExistingClass:Rectangle withExtensions:true extensionsOnly:false
+     ChangeSet forExistingClass:Rectangle withExtensions:false extensionsOnly:false
+     ChangeSet forExistingClass:Rectangle withExtensions:false extensionsOnly:true
+    "
+
+    "Created: / 12-10-2006 / 18:13:02 / cg"
+    "Modified: / 12-10-2006 / 20:36:16 / cg"
 !
 
 forExistingMethods:aCollectionOfMethods
@@ -606,10 +664,15 @@
     |newChange|
 
     newChange := ClassDefinitionChange class:aClass source:(aClass definition).
+    newChange package:aClass package.
     self rememberChangedClass:aClass.
     self addChange:newChange
 
-    "Modified: / 14.11.2001 / 13:35:37 / cg"
+    "
+     (ChangeSet new addClassDefinitionChangeFor:ChangeSet) inspect
+    "
+
+    "Modified: / 12-10-2006 / 18:17:02 / cg"
 !
 
 addClassRemoveChange:oldClass 
@@ -711,10 +774,11 @@
                         selector:aMethod selector
                         source:aMethod source
                         category:aMethod category.
+    newChange package:(aMethod package).
     self rememberChangedClass:aClass.
     self addChange:newChange
 
-    "Modified: / 14.11.2001 / 13:35:52 / cg"
+    "Modified: / 12-10-2006 / 18:15:28 / cg"
 !
 
 addMethodPackageChange:aMethod package:newPackage in:aClass
@@ -992,6 +1056,19 @@
     ]
 !
 
+condenseChanges:changesToRemove
+    "remove the given changes - a helper for the rest of the condense protocol"
+
+    changesToRemove notEmpty ifTrue:[
+        changedClasses := changeSelectors := nil.
+        self removeAll:changesToRemove.
+        self changed.
+        Smalltalk changed:#currentChangeSet with:self.
+    ].
+
+    "Created: / 12-10-2006 / 16:51:11 / cg"
+!
+
 condenseChangesForClass:aClass 
     "remove all changes for aClass
      (i.e. leave changes for other classes)."
@@ -1026,10 +1103,10 @@
 
     |changesToRemove className metaClassName chgCls|
 
-    changesToRemove := OrderedCollection new.
     className := aClass theNonMetaclass name.
     metaClassName := aClass theMetaclass name.
-    self do:[:aChange | 
+
+    changesToRemove := self select:[:aChange | 
         |chgClassName chgClass removeThis mClass mthd|
 
         removeThis := false.
@@ -1080,18 +1157,12 @@
                 ]
             ].
         ].
-        removeThis ifTrue:[
-            changesToRemove add:aChange
-        ]
-    ].
-    changesToRemove notEmpty ifTrue:[
-        changedClasses := changeSelectors := nil.
-        self removeAll:changesToRemove.
-        self changed.
-        Smalltalk changed:#currentChangeSet with:self.
+        removeThis
     ].
 
-    "Modified: / 10-08-2006 / 17:22:13 / cg"
+    self condenseChanges:changesToRemove
+
+    "Modified: / 12-10-2006 / 16:51:38 / cg"
 !
 
 condenseChangesForExtensionsInPackage:aPackageSymbol
@@ -1103,7 +1174,7 @@
 
     changesToRemove := OrderedCollection new.
 
-    self do:[:aChange | 
+    changesToRemove := self select:[:aChange | 
         |removeThis mClass mthd|
 
         (aChange isMethodChange or:[aChange isMethodRemoveChange]) ifTrue:[
@@ -1121,21 +1192,50 @@
                     ]
                 ]
             ].
-            removeThis ifTrue:[
-                changesToRemove add:aChange
-            ]
         ].
+        removeThis
     ].
 
-    changesToRemove notEmpty ifTrue:[
-        changedClasses := changeSelectors := nil.
-        self removeAll:changesToRemove.
-        self changed.
-        Smalltalk changed:#currentChangeSet with:self.
+    self condenseChanges:changesToRemove
+
+    "Created: / 05-11-2001 / 14:21:17 / cg"
+    "Modified: / 12-10-2006 / 16:51:32 / cg"
+!
+
+condenseChangesForPackage:aPackageSymbol
+    "remove all changes for aPackageSymbol
+     This is invoked when a project is checked into the repository."
+
+    |changesToRemove|
+
+    changesToRemove := self select:[:aChange | 
+        |removeThis mClass mthd|
+
+        removeThis := false.
+        (aChange isMethodChange or:[aChange isMethodRemoveChange]) ifTrue:[
+            mClass := aChange changeClass.
+            mClass notNil ifTrue:[
+                mthd := mClass compiledMethodAt:(aChange selector).
+                mthd isNil ifTrue:[
+                    aChange isMethodRemoveChange ifTrue:[
+                        removeThis := (mClass package = aPackageSymbol)
+                    ].
+                ] ifFalse:[
+                    removeThis := (mthd package = aPackageSymbol)
+                ]
+            ].
+        ] ifFalse:[
+            (aChange isClassChange) ifTrue:[
+                removeThis := (aChange changeClass package = aPackageSymbol)     
+            ].
+        ].
+        removeThis
     ].
 
+    self condenseChanges:changesToRemove
+
     "Created: / 05-11-2001 / 14:21:17 / cg"
-    "Modified: / 10-08-2006 / 17:22:46 / cg"
+    "Modified: / 12-10-2006 / 16:51:27 / cg"
 !
 
 diffSetsAgainst:anotherChangeSet
@@ -2086,5 +2186,5 @@
 !ChangeSet class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic3/ChangeSet.st,v 1.138 2006-10-09 12:08:05 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic3/ChangeSet.st,v 1.139 2006-10-12 19:34:14 cg Exp $'
 ! !