MCDependencySorter.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sat, 01 Nov 2014 01:21:08 +0100
changeset 936 c4564a0396b9
parent 619 12fc8c0ad5c8
child 1095 87f223484bc3
permissions -rw-r--r--
Fix in MCStXSnapshotPreWriteTransformation: do not fix extension cstegory if the prefix in OK. ...otherwise package category is lost when exporting previously imported .mcz. Thanks JK for spotting this.

"{ Package: 'stx:goodies/monticello' }"

Object subclass:#MCDependencySorter
	instanceVariableNames:'required provided orderedItems'
	classVariableNames:''
	poolDictionaries:''
	category:'SCM-Monticello-Loading'
!


!MCDependencySorter class methodsFor:'initialization'!

new
    ^self basicNew initialize
! !

!MCDependencySorter class methodsFor:'as yet unclassified'!

items: aCollection
	^ self new addAll: aCollection
!

sortItems: aCollection
	| sorter |
	sorter := self items: aCollection.
	sorter externalRequirements do: [:req  | sorter addProvision: req].
	^ sorter orderedItems.
! !

!MCDependencySorter methodsFor:'accessing'!

externalRequirements
	| unloaded providedByUnloaded |
	unloaded := self itemsWithMissingRequirements.
	providedByUnloaded := (unloaded gather: [:e | e provisions]) asSet.
	^ required keys reject: [:ea | providedByUnloaded includes: ea ]
!

itemsWithMissingRequirements
	| items |
	items := Set new.
	required do: [:ea | items addAll: ea].
	^ items

! !

!MCDependencySorter methodsFor:'building'!

add: anItem
	| requirements |
	requirements := self unresolvedRequirementsFor: anItem.
	requirements isEmpty
		ifTrue: [self addToOrder: anItem]
		ifFalse: [self addRequirements: requirements for: anItem]
!

addAll: aCollection
	aCollection asArray sort do: [:ea | self add: ea]
!

addExternalProvisions: aCollection
	(aCollection intersection: self externalRequirements)
		do: [:ea | self addProvision: ea]
! !

!MCDependencySorter methodsFor:'initialization'!

initialize
	super initialize.
	provided := Set new.
	required := Dictionary new.
	orderedItems := OrderedCollection new.
! !

!MCDependencySorter methodsFor:'private'!

addProvision: anObject
	| newlySatisfied |
	provided add: anObject.
	newlySatisfied := required removeKey: anObject ifAbsent: [#()].
	self addAll: newlySatisfied.
!

addRequirement: reqObject for: itemObject
	(self itemsRequiring: reqObject) add: itemObject
!

addRequirements: aCollection for: anObject
	aCollection do: [:ea | self addRequirement: ea for: anObject]
!

addToOrder: anItem
	orderedItems add: anItem.
	anItem provisions do: [:ea | self addProvision: ea].
!

itemsRequiring: anObject
	^ required at: anObject ifAbsentPut: [Set new]
!

unresolvedRequirementsFor: anItem
	^ anItem requirements difference: provided
! !

!MCDependencySorter methodsFor:'sorting'!

orderedItems
	^ orderedItems
! !

!MCDependencySorter class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCDependencySorter.st,v 1.4 2012-09-11 21:21:20 cg Exp $'
!

version_CVS
    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCDependencySorter.st,v 1.4 2012-09-11 21:21:20 cg Exp $'
!

version_SVN
    ^ '§Id: MCDependencySorter.st 7 2010-09-12 07:18:55Z vranyj1 §'
! !