--- 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 $'
! !