MCPackageManager.st
changeset 78 41ddb69f54b2
child 591 366a52c2c015
equal deleted inserted replaced
77:e419c21327ab 78:41ddb69f54b2
       
     1 "{ Package: 'stx:goodies/monticello' }"
       
     2 
       
     3 Object subclass:#MCPackageManager
       
     4 	instanceVariableNames:'package modified'
       
     5 	classVariableNames:''
       
     6 	poolDictionaries:''
       
     7 	category:'Monticello-Versioning'
       
     8 !
       
     9 
       
    10 MCPackageManager class instanceVariableNames:'registry'
       
    11 
       
    12 "
       
    13  No other class instance variables are inherited by this class.
       
    14 "
       
    15 !
       
    16 
       
    17 
       
    18 !MCPackageManager class methodsFor:'as yet unclassified'!
       
    19 
       
    20 allManagers
       
    21 	^ self registry values
       
    22 !
       
    23 
       
    24 forPackage: aPackage
       
    25 	^ self registry at: aPackage ifAbsent:
       
    26 		[|mgr|
       
    27 		mgr _ self new initializeWithPackage: aPackage.
       
    28 		self registry at: aPackage put: mgr.
       
    29 		self changed: #allManagers.
       
    30 		mgr]
       
    31 !
       
    32 
       
    33 initialize
       
    34 	"Remove this later"
       
    35 	Smalltalk at: #SystemChangeNotifier ifPresent:[:cls|
       
    36 		(cls uniqueInstance) noMoreNotificationsFor: self.
       
    37 	].
       
    38 !
       
    39 
       
    40 registry
       
    41 	^ registry ifNil: [registry _ Dictionary new]
       
    42 ! !
       
    43 
       
    44 !MCPackageManager class methodsFor:'system changes'!
       
    45 
       
    46 classModified: anEvent
       
    47 	self managersForClass: anEvent item do:[:mgr| mgr modified: true].
       
    48 !
       
    49 
       
    50 classMoved: anEvent
       
    51 	self classModified: anEvent.
       
    52 	self managersForCategory: anEvent oldCategory do:[:mgr| mgr modified: true].
       
    53 !
       
    54 
       
    55 classRemoved: anEvent
       
    56 	self classModified: anEvent
       
    57 !
       
    58 
       
    59 managersForCategory: aSystemCategory do: aBlock
       
    60 	"Got to be careful here - we might get method categories where capitalization is problematic."
       
    61 	| cat foundOne index |
       
    62 	foundOne := false.
       
    63 	cat := aSystemCategory ifNil:[^nil]. "yes this happens; for example in eToy projects"
       
    64 	"first ask PackageInfos, their package name might not match the category"
       
    65 	self registry do: [:mgr | 
       
    66 		(mgr packageInfo includesSystemCategory: aSystemCategory)	ifTrue: [
       
    67 			aBlock value: mgr.
       
    68 			foundOne := true.
       
    69 		]
       
    70 	].
       
    71 	foundOne ifTrue: [^self].
       
    72 	["Loop over categories until we found a matching one"
       
    73 	self registry at: (MCPackage named: cat) ifPresent:[:mgr|
       
    74 		aBlock value: mgr.
       
    75 		foundOne := true.
       
    76 	].
       
    77 	index := cat lastIndexOf: $-.
       
    78 	index > 0]whileTrue:[
       
    79 		"Step up to next level package"
       
    80 		cat := cat copyFrom: 1 to: index-1.
       
    81 	].
       
    82 	foundOne ifFalse:[
       
    83 		"Create a new (but only top-level)"
       
    84 		aBlock value: (MCWorkingCopy forPackage: (MCPackage named: (aSystemCategory upTo: $-) capitalized)).
       
    85 	].
       
    86 !
       
    87 
       
    88 managersForClass: aClass category: methodCategory do: aBlock
       
    89 	(methodCategory isEmptyOrNil or:[methodCategory first ~= $*]) ifTrue:[
       
    90 		"Not an extension method"
       
    91 		^self managersForClass: aClass do: aBlock.
       
    92 	].
       
    93 	self managersForCategory: methodCategory allButFirst do: aBlock.
       
    94 !
       
    95 
       
    96 managersForClass: aClass do: aBlock
       
    97 
       
    98 	self registry do: [:mgr |
       
    99 		(mgr packageInfo includesClass: aClass)
       
   100 			ifTrue: [aBlock value: mgr]]
       
   101 !
       
   102 
       
   103 managersForClass: aClass selector: aSelector do: aBlock
       
   104 	^self managersForClass: aClass category: (aClass organization categoryOfElement: aSelector) do: aBlock
       
   105 !
       
   106 
       
   107 methodModified: anEvent
       
   108 	^self managersForClass: anEvent itemClass selector: anEvent itemSelector do:[:mgr| mgr modified: true].
       
   109 !
       
   110 
       
   111 methodMoved: anEvent
       
   112 	self managersForClass: anEvent itemClass category: anEvent oldCategory do:[:mgr| mgr modified: true].
       
   113 	self methodModified: anEvent.
       
   114 !
       
   115 
       
   116 methodRemoved: anEvent
       
   117 	self managersForClass: anEvent itemClass category: anEvent itemProtocol do:[:mgr| mgr modified: true].
       
   118 !
       
   119 
       
   120 registerForNotifications
       
   121 	Smalltalk at: #SystemChangeNotifier ifPresent:[:cls|
       
   122 	(cls uniqueInstance)
       
   123 		noMoreNotificationsFor: self;
       
   124 		notify: self ofSystemChangesOfItem: #class change: #Added using: #classModified:;
       
   125 		notify: self ofSystemChangesOfItem: #class change: #Modified using: #classModified:;
       
   126 		notify: self ofSystemChangesOfItem: #class change: #Renamed using: #classModified:;
       
   127 		notify: self ofSystemChangesOfItem: #class change: #Commented using: #classModified:;
       
   128 		notify: self ofSystemChangesOfItem: #class change: #Recategorized using: #classMoved:;
       
   129 		notify: self ofSystemChangesOfItem: #class change: #Removed using: #classRemoved:;
       
   130 		notify: self ofSystemChangesOfItem: #method change: #Added using: #methodModified:;
       
   131 		notify: self ofSystemChangesOfItem: #method change: #Modified using: #methodModified:;
       
   132 		notify: self ofSystemChangesOfItem: #method change: #Recategorized using: #methodMoved:;
       
   133 		notify: self ofSystemChangesOfItem: #method change: #Removed using: #methodRemoved:
       
   134 	].
       
   135 ! !
       
   136 
       
   137 !MCPackageManager methodsFor:'accessing'!
       
   138 
       
   139 modified
       
   140 	^ modified
       
   141 !
       
   142 
       
   143 modified: aBoolean
       
   144      modified = aBoolean ifTrue: [^ self].
       
   145 	modified _ aBoolean.
       
   146 	self changed: #modified.
       
   147 	
       
   148 	modified ifFalse:
       
   149 		[(((Smalltalk classNamed: 'SmalltalkImage') ifNotNilDo: [:si | si current]) ifNil: [Smalltalk])
       
   150 			logChange: '"', self packageName, '"'].
       
   151 !
       
   152 
       
   153 package
       
   154 	^ package
       
   155 !
       
   156 
       
   157 packageInfo
       
   158 	^ package packageInfo
       
   159 !
       
   160 
       
   161 packageName
       
   162 	^ package name
       
   163 !
       
   164 
       
   165 packageNameWithStar
       
   166 	^ modified
       
   167 		ifTrue: ['* ', self packageName]
       
   168 		ifFalse: [self packageName]
       
   169 ! !
       
   170 
       
   171 !MCPackageManager methodsFor:'initialize-release'!
       
   172 
       
   173 initialize
       
   174 	modified _ false.
       
   175 	self registerForNotifications.
       
   176 !
       
   177 
       
   178 initializeWithPackage: aPackage
       
   179 	package _ aPackage.
       
   180 	self initialize.
       
   181 ! !
       
   182 
       
   183 !MCPackageManager methodsFor:'operations'!
       
   184 
       
   185 unregister
       
   186 	self class registry removeKey: package.
       
   187 	self class changed: #allManagers
       
   188 ! !
       
   189 
       
   190 !MCPackageManager methodsFor:'system changes'!
       
   191 
       
   192 classModified: anEvent
       
   193 	"obsolete - remove this later"
       
   194 !
       
   195 
       
   196 classMoved: anEvent
       
   197 	"obsolete - remove this later"
       
   198 !
       
   199 
       
   200 classRemoved: anEvent
       
   201 	"obsolete - remove this later"
       
   202 !
       
   203 
       
   204 methodModified: anEvent
       
   205 	"obsolete - remove this later"
       
   206 !
       
   207 
       
   208 methodMoved: anEvent 
       
   209 	"obsolete - remove this later"
       
   210 !
       
   211 
       
   212 methodRemoved: anEvent
       
   213 	"obsolete - remove this later"
       
   214 !
       
   215 
       
   216 registerForNotifications
       
   217 	"obsolete - remove this later"
       
   218 !
       
   219 
       
   220 registerForNotificationsFrom: aNotifier
       
   221 	"obsolete - remove this later"
       
   222 !
       
   223 
       
   224 systemChange: anEvent
       
   225 	"obsolete - remove this later"
       
   226 !
       
   227 
       
   228 update: aSymbol
       
   229 	InMidstOfFileinNotification signal ifFalse: [
       
   230 	[((aSymbol = #recentMethodSubmissions)
       
   231 		and: [self packageInfo
       
   232 				includesMethodReference: Utilities recentMethodSubmissions last])
       
   233 					ifTrue: [self modified: true]]
       
   234 		on: Error do: []]
       
   235 ! !
       
   236 
       
   237 !MCPackageManager class methodsFor:'documentation'!
       
   238 
       
   239 version
       
   240     ^ '$Header: /cvs/stx/stx/goodies/monticello/MCPackageManager.st,v 1.1 2006-11-22 13:15:51 cg Exp $'
       
   241 ! !
       
   242 
       
   243 MCPackageManager initialize!