--- a/MCPackageLoader.st Sat Aug 20 13:43:44 2011 +0200
+++ b/MCPackageLoader.st Sat Aug 20 13:43:52 2011 +0200
@@ -1,14 +1,20 @@
"{ Package: 'stx:goodies/monticello' }"
Object subclass:#MCPackageLoader
- instanceVariableNames:'requirements unloadableDefinitions obsoletions additions removals
- errorDefinitions provisions'
+ instanceVariableNames:'requirements unloadableDefinitions overrideDefinitions
+ obsoletions additions removals errorDefinitions provisions'
classVariableNames:''
poolDictionaries:''
category:'Monticello-Loading'
!
+!MCPackageLoader class methodsFor:'initialization'!
+
+new
+ ^self basicNew initialize
+! !
+
!MCPackageLoader class methodsFor:'as yet unclassified'!
installSnapshot: aSnapshot
@@ -17,10 +23,6 @@
load
!
-new
- ^ self basicNew initialize
-!
-
unloadPackage: aPackage
self new
unloadPackage: aPackage;
@@ -33,6 +35,16 @@
load
! !
+!MCPackageLoader methodsFor:'accessing'!
+
+overrideDefinitions
+ ^ overrideDefinitions
+!
+
+unloadableDefinitions
+ ^ unloadableDefinitions
+! !
+
!MCPackageLoader methodsFor:'patch ops'!
addDefinition: aDefinition
@@ -51,26 +63,57 @@
!MCPackageLoader methodsFor:'private'!
analyze
- | sorter |
- sorter _ self sorterForItems: additions.
- additions _ sorter orderedItems.
- requirements _ sorter externalRequirements.
- unloadableDefinitions _ sorter itemsWithMissingRequirements asSortedCollection.
-
- sorter _ self sorterForItems: removals.
- removals _ sorter orderedItems reversed.
+ | sorter |
+ sorter := self sorterForItems: additions.
+ additions := sorter orderedItems.
+ requirements := sorter externalRequirements.
+ unloadableDefinitions := sorter itemsWithMissingRequirements asSortedCollection.
+
+ overrideDefinitions := additions select:[:e|e isOverrideDefinition].
+ additions := additions reject: [:e|e isOverrideDefinition].
+
+ sorter := self sorterForItems: removals.
+ removals := sorter orderedItems reversed.
+
+ "Modified: / 08-11-2010 / 17:34:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
basicLoad
- errorDefinitions _ OrderedCollection new.
- [[additions do: [:ea | self tryToLoad: ea] displayingProgress: 'Loading...'.
- removals do: [:ea | ea unload] displayingProgress: 'Cleaning up...'.
- self shouldWarnAboutErrors ifTrue: [self warnAboutErrors].
- errorDefinitions do: [:ea | ea loadOver: (self obsoletionFor: ea)] displayingProgress: 'Reloading...'.
- additions do: [:ea | ea postloadOver: (self obsoletionFor: ea)] displayingProgress: 'Initializing...']
- on: InMidstOfFileinNotification
- do: [:n | n resume: true]]
- ensure: [self flushChangesFile]
+ | allowEmptyStatements allowSqueakExtensions |
+
+ allowEmptyStatements := ParserFlags allowEmptyStatements.
+ allowSqueakExtensions := ParserFlags allowSqueakExtensions.
+ ParserFlags allowEmptyStatements: true.
+ ParserFlags allowSqueakExtensions: true.
+
+ errorDefinitions := OrderedCollection new.
+ self warnAboutUnloadables.
+
+
+ [[
+ | oldErrorDefinitions |
+ additions do: [:ea | self tryToLoad: ea] displayingProgress: 'Loading...'.
+ removals do: [:ea | ea unload] displayingProgress: 'Cleaning up...'.
+ self shouldWarnAboutErrors ifTrue: [self warnAboutErrors].
+ oldErrorDefinitions := errorDefinitions.
+ errorDefinitions := OrderedCollection new.
+ oldErrorDefinitions do: [:ea | self tryToLoad: ea] displayingProgress: 'Reloading...'.
+ additions do: [:ea | ea postloadOver: (self obsoletionFor: ea)] displayingProgress: 'Initializing...'.
+
+ self warnAboutOverrides.
+ self warnAboutErrors.
+
+ ]
+
+ on: InMidstOfFileinNotification
+ do: [:n | n resume: true]]
+ ensure:
+ [self flushChangesFile.
+ ParserFlags allowEmptyStatements: allowEmptyStatements.
+ ParserFlags allowSqueakExtensions: allowSqueakExtensions.
+ ]
+
+ "Modified: / 08-11-2010 / 23:49:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
dependencyWarning
@@ -90,15 +133,35 @@
!
flushChangesFile
- "The changes file is second in the SourceFiles array"
+ "The changes file is second in the SourceFiles array"
+
+ "(SourceFiles at: 2) flush"
+
+ "Modified: / 11-09-2010 / 18:32:03 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+ifInteractive: aBlock
+
+ ^self ifInteractive: aBlock else:[]
- (SourceFiles at: 2) flush
+ "Created: / 06-03-2011 / 20:32:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+ifInteractive: interactiveBlock else: noninteractiveBlock
+
+ MCInteractiveLoadingQuery query
+ ifTrue:[interactiveBlock value]
+ ifFalse:[noninteractiveBlock value].
+
+ "Created: / 06-03-2011 / 20:31:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
initialize
- additions _ OrderedCollection new.
- removals _ OrderedCollection new.
- obsoletions _ Dictionary new.
+ super initialize.
+ additions := OrderedCollection new.
+ removals := OrderedCollection new.
+ obsoletions := Dictionary new.
+
!
obsoletionFor: aDefinition
@@ -114,7 +177,7 @@
!
provisions
- ^ provisions ifNil: [provisions _ Set withAll: Smalltalk keys]
+ ^ provisions ifNil: [provisions := Set withAll: Smalltalk keys]
!
shouldWarnAboutErrors
@@ -123,7 +186,7 @@
sorterForItems: aCollection
| sorter |
- sorter _ MCDependencySorter items: aCollection.
+ sorter := MCDependencySorter items: aCollection.
sorter addExternalProvisions: self provisions.
^ sorter
!
@@ -132,19 +195,30 @@
[aDefinition loadOver: (self obsoletionFor: aDefinition)] on: Error do: [errorDefinitions add: aDefinition].
!
+tryToLoadAll: definitions label: label
+
+ definitions do:[:e|self tryToLoad: e] displayingProgress: label.
+
+ "Created: / 09-11-2010 / 17:17:41 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
useChangeSetNamed: baseName during: aBlock
- "Use the named change set, or create one with the given name."
- | changeHolder oldChanges newChanges |
- changeHolder _ (ChangeSet respondsTo: #newChanges:)
- ifTrue: [ChangeSet]
- ifFalse: [Smalltalk].
- oldChanges _ (ChangeSet respondsTo: #current)
- ifTrue: [ChangeSet current]
- ifFalse: [Smalltalk changes].
+ "Use the named change set, or create one with the given name."
+ | changeHolder oldChanges newChanges |
+ changeHolder := (ChangeSet respondsTo: #newChanges:)
+ ifTrue: [ChangeSet]
+ ifFalse: [Smalltalk].
+ oldChanges := (ChangeSet respondsTo: #current)
+ ifTrue: [ChangeSet current]
+ ifFalse: [Smalltalk changes].
- newChanges _ (ChangeSorter changeSetNamed: baseName) ifNil: [ ChangeSet new name: baseName ].
- changeHolder newChanges: newChanges.
- [aBlock value] ensure: [changeHolder newChanges: oldChanges].
+ "/JV @ 2010-09-11: Don't cate about changes
+ "/newChanges := (ChangeSorter changeSetNamed: baseName) ifNil: [ ChangeSet new name: baseName ].
+ "/changeHolder newChanges: newChanges.
+ "/[aBlock value] ensure: [changeHolder newChanges: oldChanges].
+ Class withoutUpdatingChangesDo: aBlock
+
+ "Modified: / 08-11-2010 / 20:01:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
useNewChangeSetDuring: aBlock
@@ -155,20 +229,76 @@
^self useChangeSetNamed: (ChangeSet uniqueNameLike: baseName) during: aBlock
!
-warnAboutDependencies
- self notify: self dependencyWarning
+warnAboutDependencies
+ "
+
+
+ self notify: self dependencyWarning
+ "
+
+ "Modified: / 13-10-2010 / 15:44:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!
warnAboutErrors
- self notify: self errorDefinitionWarning.
+
+ | changes |
+
+ errorDefinitions isNilOrEmptyCollection ifTrue:[^self].
+ changes := ChangeSet withAll:(errorDefinitions select:[:e|e notNil] thenCollect:[:e|e asChange]).
+
+ changes := Tools::ChangeSetBrowser
+ openOn: changes
+ label:'Error definitions'.
+
+ "Created: / 08-11-2010 / 20:19:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 06-03-2011 / 20:39:05 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+warnAboutOverrides
+
+ | changes |
+
+ overrideDefinitions isNilOrEmptyCollection ifTrue:[^self].
+ self ifInteractive:[
+ changes := ChangeSet withAll:(overrideDefinitions collect:[:e|e asChange]).
+ changes := Tools::ChangeSetBrowser
+ confirmChanges: changes
+ label:'Overridden definitions. Load anyway?'.
+ self tryToLoadAll: (changes collect:[:e|e mcDefinition]) label: 'Loading overrides...'.
+ ] else:[
+ self tryToLoadAll: overrideDefinitions label: 'Loading overrides...'.
+ ]
+
+ "Created: / 08-11-2010 / 20:19:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 06-03-2011 / 20:33:25 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+warnAboutUnloadables
+
+ | changes |
+
+ unloadableDefinitions isNilOrEmptyCollection ifTrue:[^self].
+ self ifInteractive:[
+ changes := ChangeSet withAll:(unloadableDefinitions collect:[:e|e asChange]).
+ changes := Tools::ChangeSetBrowser
+ confirmChanges: changes
+ label:'Unsatisfied dependencies. Load anyway?'.
+ self tryToLoadAll: (changes collect:[:e|e mcDefinition]) label: 'Loading unloadables...'.
+ ] else:[
+ self tryToLoadAll: unloadableDefinitions label: 'Loading unloadables...'.
+ ]
+
+ "Created: / 08-11-2010 / 20:19:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+ "Modified: / 06-03-2011 / 20:36:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!MCPackageLoader methodsFor:'public'!
installSnapshot: aSnapshot
| patch |
- patch _ aSnapshot patchRelativeToBase: MCSnapshot empty.
+ patch := aSnapshot patchRelativeToBase: MCSnapshot empty.
patch applyTo: self.
+
!
load
@@ -194,15 +324,26 @@
!
updatePackage: aPackage withSnapshot: aSnapshot
- | patch packageSnap |
- packageSnap _ aPackage snapshot.
- patch _ aSnapshot patchRelativeToBase: packageSnap.
- patch applyTo: self.
- packageSnap definitions do: [:ea | self provisions addAll: ea provisions]
+ | patch packageSnap |
+ MCStXPackageQuery answer: aPackage name do:
+ [packageSnap := aPackage snapshot.
+ patch := aSnapshot patchRelativeToBase: packageSnap.
+ patch applyTo: self.
+ packageSnap definitions do: [:ea | self provisions addAll: ea provisions]]
+
+ "Modified: / 14-09-2010 / 22:09:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
! !
!MCPackageLoader class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/goodies/monticello/MCPackageLoader.st,v 1.1 2006-11-22 13:12:56 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/goodies/monticello/MCPackageLoader.st,v 1.2 2011-08-20 11:43:52 cg Exp $'
+!
+
+version_CVS
+ ^ '$Header: /cvs/stx/stx/goodies/monticello/MCPackageLoader.st,v 1.2 2011-08-20 11:43:52 cg Exp $'
+!
+
+version_SVN
+ ^ '§Id: MCPackageLoader.st 27 2011-03-07 03:48:48Z vranyj1 §'
! !