MCThreeWayMerger.st
author Claus Gittinger <cg@exept.de>
Tue, 08 May 2018 19:58:20 +0200
changeset 1043 aeecdb5610e4
parent 690 e6399c739a30
child 1095 87f223484bc3
permissions -rw-r--r--
#FEATURE by cg class: MCPostscriptDefinition added: #asChange
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
46
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:goodies/monticello' }"
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
MCMerger subclass:#MCThreeWayMerger
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:'index operations provisions redundantAdds'
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	classVariableNames:''
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
690
e6399c739a30 category change
Claus Gittinger <cg@exept.de>
parents: 363
diff changeset
     7
	category:'SCM-Monticello-Merging'
46
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
239
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    11
!MCThreeWayMerger class methodsFor:'initialization'!
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    12
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    13
new
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    14
    ^self basicNew initialize
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    15
! !
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    16
46
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
!MCThreeWayMerger class methodsFor:'as yet unclassified'!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
base: aSnapshot patch: aPatch
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	aPatch isEmpty ifTrue: [MCNoChangesException signal].
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
	^ self new
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
		addBaseSnapshot: aSnapshot;
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
		applyPatch: aPatch;
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
		yourself
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
		
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
base: aSnapshot target: targetSnapshot ancestor: ancestorSnapshot
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
	^ self base: aSnapshot patch: (targetSnapshot patchRelativeToBase: ancestorSnapshot)
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
! !
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
!MCThreeWayMerger methodsFor:'as yet unclassified'!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
addBaseSnapshot: aSnapshot
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
	aSnapshot definitions do:
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
		[:ea |
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
		index add: ea.
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
		provisions addAll: ea provisions]
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
addDefinition: aDefinition
239
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    42
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    43
        | op |
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    44
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    45
        index
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    46
                definitionLike: aDefinition
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    47
                ifPresent: [:other |
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    48
                        (op := (self removalForDefinition: aDefinition))
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    49
                                ifNotNil:
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    50
                                        [
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    51
                                        self addOperation: (MCModification of: other to: aDefinition).
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    52
                                        self removeOperation: op.
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    53
                                        ^ self].
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    54
                        other = aDefinition
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    55
                                ifFalse: [self addConflictWithOperation: (MCModification of: other to: aDefinition)]
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    56
                                ifTrue: [self redundantAdds add: aDefinition]]
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    57
                ifAbsent: [self addOperation: (MCAddition of: aDefinition)]
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    58
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    59
    "Modified: / 12-09-2010 / 17:39:12 / Jan Vrany <jan.vrany@fit.cvut.cz>"
46
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
addOperation: anOperation
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
	self operations add: anOperation
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
applyPatch: aPatch
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
	aPatch applyTo: self
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
applyTo: anObject
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
	super applyTo: anObject.
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
	self operations do: [:ea | ea applyTo: anObject]
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
baseSnapshot
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
	^ (MCSnapshot fromDefinitions: index definitions)
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
initialize
239
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    80
	super initialize.
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    81
	index := MCDefinitionIndex new.
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
    82
	provisions := Set new
46
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
modificationConflictForDefinition: aDefinition
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
	^ conflicts ifNotNil:
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
		[conflicts detect:
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
			[:ea | (ea definition isRevisionOf: aDefinition) and:
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
				[ea operation isModification]] ifNone: []]
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
modifyDefinition: baseDefinition to: targetDefinition
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
	index
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
		definitionLike: baseDefinition
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
		ifPresent: [:other | other = baseDefinition
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
								ifTrue: [self addOperation: (MCModification of:  baseDefinition to: targetDefinition)]
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
								ifFalse: [other = targetDefinition
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
											ifFalse: [self addConflictWithOperation:
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
														(MCModification of: other to: targetDefinition)]]]
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
		ifAbsent: [self addConflictWithOperation: (MCAddition of: targetDefinition)]
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
operations
239
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
   104
	^ operations ifNil: [operations := OrderedCollection new]
46
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
provisions
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
	^ provisions
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
redundantAdds
239
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
   112
	^ redundantAdds ifNil: [redundantAdds := Set new]
46
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
removalForDefinition: aDefinition
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
	^ operations ifNotNil:
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
		[operations
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
			detect: [:ea | (ea definition isRevisionOf: aDefinition) and: [ea isRemoval]]
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
			ifNone: []]
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
removeConflict: aConflict
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
	conflicts remove: aConflict
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
removeDefinition: aDefinition
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
	index
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
		definitionLike: aDefinition
239
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
   129
		ifPresent: [:other | | c | other = aDefinition
46
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
								ifTrue:
239
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
   131
									[(c := self modificationConflictForDefinition: aDefinition)
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
   132
										ifNotNil:
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
   133
											[
46
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
											self addOperation: c operation.
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
											self removeConflict: c.
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
											^ self]. 
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
									(self redundantAdds includes: aDefinition)
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
										ifFalse: [self addOperation: (MCRemoval of: aDefinition)]]
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
								ifFalse:
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
									[self addConflictWithOperation: (MCRemoval of: other)]]
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
		ifAbsent: []
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
removeOperation: anOperation
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
	operations remove: anOperation
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
! !
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
!MCThreeWayMerger class methodsFor:'documentation'!
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
version
690
e6399c739a30 category change
Claus Gittinger <cg@exept.de>
parents: 363
diff changeset
   151
    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCThreeWayMerger.st,v 1.4 2012-09-11 21:29:38 cg Exp $'
239
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
   152
!
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
   153
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
   154
version_CVS
690
e6399c739a30 category change
Claus Gittinger <cg@exept.de>
parents: 363
diff changeset
   155
    ^ '$Header: /cvs/stx/stx/goodies/monticello/MCThreeWayMerger.st,v 1.4 2012-09-11 21:29:38 cg Exp $'
239
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
   156
!
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
   157
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
   158
version_SVN
7248f55b9fc8 added: #version_CVS
Claus Gittinger <cg@exept.de>
parents: 46
diff changeset
   159
    ^ '§Id: MCThreeWayMerger.st 17 2010-10-13 12:07:52Z vranyj1 §'
46
11d05551155f initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
! !