diff -r cfc8c51359dd -r 9dde9e3ac35c Tools__TextMergeInfo.st --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Tools__TextMergeInfo.st Wed Feb 05 19:57:16 2014 +0100 @@ -0,0 +1,467 @@ +" + COPYRIGHT (c) 2006 by eXept Software AG + All Rights Reserved + + This software is furnished under a license and may be used + only in accordance with the terms of that license and with the + inclusion of the above copyright notice. This software may not + be provided or otherwise made available to, or used by, any + other person. No title to or ownership of the software is + hereby transferred. +" +"{ Package: 'stx:libtool' }" + +"{ NameSpace: Tools }" + +Object subclass:#TextMergeInfo + instanceVariableNames:'list listInfos' + classVariableNames:'' + poolDictionaries:'' + category:'Interface-Diff' +! + +Object subclass:#LineInfo + instanceVariableNames:'line resolution conflict offset' + classVariableNames:'' + poolDictionaries:'' + privateIn:TextMergeInfo +! + +!TextMergeInfo class methodsFor:'documentation'! + +copyright +" + COPYRIGHT (c) 2006 by eXept Software AG + All Rights Reserved + + This software is furnished under a license and may be used + only in accordance with the terms of that license and with the + inclusion of the above copyright notice. This software may not + be provided or otherwise made available to, or used by, any + other person. No title to or ownership of the software is + hereby transferred. +" +! ! + +!TextMergeInfo methodsFor:'* uncategorized *'! + +conflictLineText + + ^ '' asText allBold colorizeAllWith: Color red. + + "Created: / 03-04-2012 / 23:26:04 / Jan Vrany " +! + +noSourceLineText + + ^'' asText colorizeAllWith: Color red. + + "Created: / 03-04-2012 / 23:26:05 / Jan Vrany " +! ! + +!TextMergeInfo methodsFor:'accessing'! + +list + ^ list +! + +listInfos + ^ listInfos +! + +text + ^String streamContents:[:s| + list withIndexDo:[:ln :i| + | info | + + info := listInfos at: i ifAbsent:[nil]. + (info isNil or:[info offset ~~ -1]) ifTrue:[ + ln notNil ifTrue:[ + s nextPutLine: (list at: i) + ]. + ] + ]. + ]. + + "Created: / 19-03-2012 / 14:58:42 / Jan Vrany " +! ! + +!TextMergeInfo methodsFor:'initialization'! + +text1: text1 text2: text2 text3: text3 + + | t1c t2c t3c diff3 diffs merges resolution lnr i | + + list := StringCollection new. + listInfos := OrderedCollection new. + + t1c := (text1 ? #()) asStringCollection. + t2c := (text2 ? #()) asStringCollection. + t3c := (text3 ? #()) asStringCollection. + + + diff3 := Diff3 new + file0: t1c; "/Base version + file1: t2c; "/A + file2: t3c. "/B\ + diffs := diff3 diffIndices. + merges := diff3 mergeIndicesDiscardEmpty: false. + + lnr := 1. + i := 1. + [ i <= merges size ] whileTrue:[ + | diff merge lines | + + diff := diffs at: i. + merge := merges at: i. + diff isChunk ifTrue:[ + lines := merge extractFromDiff: diff3. + 1 to: diff length do:[:j| + list add: (lines at: j). + listInfos add: (LineInfo line: lnr resolution: #NoConflict conflict: diff offset: j ). + lnr := lnr + 1. + ]. + ]. + diff isConflict ifTrue:[ + 1 to: diff length do:[:j| + merge isConflict ifTrue:[ + list add: self conflictLineText. + listInfos add: (LineInfo line: lnr resolution: #Conflict conflict: diff offset: j). + ] ifFalse:[ + lines := merge extractFromDiff: diff3. + resolution := merge extractResolution. + j <= lines size ifTrue:[ + list add: (lines at: j). + listInfos add: (LineInfo line: lnr resolution: resolution conflict: diff offset: j). + ] ifFalse:[ + list add: self noSourceLineText. + listInfos add: (LineInfo line: lnr resolution: resolution conflict: diff offset: -1). + ]. + ]. + lnr := lnr + 1. + ]. + ]. + i := i + 1. + ]. + "Sanity check:" + i < diffs size ifTrue:[ + i + 1 to: diffs size do:[:j| + self assert: (diffs at:j) length == 0. + ] + ]. + + self changed: #value + + "Created: / 19-03-2012 / 12:10:55 / Jan Vrany " +! ! + +!TextMergeInfo methodsFor:'merging'! + +mergeUsing: text + + list := (text ? #()) asStringCollection. + listInfos := + (1 to: list size) collect:[:lineNr| + (LineInfo line: lineNr resolution: #Merged ) + ]. + self changed:#resolution + + "Created: / 30-11-2012 / 14:12:29 / Jan Vrany " +! + +mergeUsingA: textA + + list := (textA ? #()) asStringCollection. + listInfos := + (1 to: list size) collect:[:lineNr| + (LineInfo line: lineNr resolution: #MergedUsingA ) + ]. + self changed:#resolution + + "Created: / 21-03-2012 / 12:03:42 / Jan Vrany " +! + +mergeUsingA: textA interval: interval + "Given textA and section interval, merges the section + using textA." + + | listA offset | + listA := (textA ? '') asStringCollection. + offset := 0. + interval do:[:lineNr| + | info chunk line | + info := listInfos at: lineNr. + chunk := info conflict left. + offset < chunk length ifTrue:[ + line := listA at: chunk offset + offset. + info offset: offset + 1. + ] ifFalse:[ + line := self noSourceLineText. + info offset: -1 + ]. + list at: lineNr put: line. + info resolution: #MergedUsingA. + offset := offset + 1. + ]. + + self changed:#resolution + + "Created: / 04-04-2012 / 00:51:09 / Jan Vrany " +! + +mergeUsingB: textB + + list := (textB ? #()) asStringCollection. + listInfos := + (1 to: list size) collect:[:lineNr| + (LineInfo line: lineNr resolution: #MergedUsingB ) + ]. + self changed:#resulution + + "Created: / 21-03-2012 / 12:04:17 / Jan Vrany " +! + +mergeUsingB: textA interval: interval + "Given textA and section interval, merges the section + using textA." + + | listA offset | + listA := (textA ? #()) asStringCollection. + offset := 0. + interval do:[:lineNr| + | info chunk line | + info := listInfos at: lineNr. + chunk := info conflict right. + offset < chunk length ifTrue:[ + line := listA at: chunk offset + offset. + info offset: offset + 1. + ] ifFalse:[ + line := self noSourceLineText. + info offset: -1 + ]. + list at: lineNr put: line. + info resolution: #MergedUsingB. + offset := offset + 1. + ]. + + self changed:#resolution + + "Created: / 04-04-2012 / 01:01:18 / Jan Vrany " +! + +mergeUsingBase: textBase + + list := (textBase ? #()) asStringCollection. + listInfos := + (1 to: list size) collect:[:lineNr| + (LineInfo line: lineNr resolution: #MergedUsingBase ) + ]. + self changed:#resulution + + "Created: / 21-03-2012 / 12:07:58 / Jan Vrany " +! + +mergeUsingBase: textA interval: interval + "Given textA and section interval, merges the section + using textA." + + | listA offset | + listA := textA asStringCollection. + offset := 0. + interval do:[:lineNr| + | info chunk line | + info := listInfos at: lineNr. + chunk := info conflict original. + offset < chunk length ifTrue:[ + line := listA at: chunk offset + offset. + info offset: offset + 1. + ] ifFalse:[ + line := self noSourceLineText. + info offset: -1 + ]. + list at: lineNr put: line. + info resolution: #MergedUsingBase. + offset := offset + 1. + ]. + + self changed:#resolution + + "Created: / 04-04-2012 / 01:01:31 / Jan Vrany " +! ! + +!TextMergeInfo methodsFor:'testing'! + +isMerged + + ^listInfos allSatisfy:[:info|info isMergedOrNoConflict]. + + "Created: / 19-03-2012 / 15:09:38 / Jan Vrany " +! ! + +!TextMergeInfo::LineInfo class methodsFor:'accessing'! + +line:lineArg resolution:resolutionArg + ^self new line:lineArg resolution:resolutionArg conflict:nil offset: nil + + "Created: / 19-03-2012 / 15:04:15 / Jan Vrany " +! + +line:lineArg resolution:resolutionArg conflict:conflictArg + + ^self new line:lineArg resolution:resolutionArg conflict:conflictArg + + "Modified: / 19-03-2012 / 15:07:19 / Jan Vrany " +! + +line:lineArg resolution:resolutionArg conflict:conflictArg offset: offsetArg + + ^self new line:lineArg resolution:resolutionArg conflict:conflictArg offset: offsetArg + + "Modified: / 19-03-2012 / 15:07:19 / Jan Vrany " + "Created: / 20-03-2012 / 20:42:21 / Jan Vrany " +! ! + +!TextMergeInfo::LineInfo methodsFor:'accessing'! + +color + + | color | + + self isMerged ifTrue:[ + self isMergedUsingA ifTrue:[ + color := Tools::TextDiff3Tool colorA + ] ifFalse:[self isMergedUsingB ifTrue:[ + color := Tools::TextDiff3Tool colorB + ] ifFalse:[self isMergedUsingBase ifTrue:[ + color := Tools::TextDiff3Tool colorBase + ] ifFalse:[ + color := Tools::TextDiff3Tool colorMerged + ]]]. + offset == -1 ifTrue:[ + color := color lighter. + ]. + ] ifFalse:[ + self isConflict ifTrue:[ + color := Tools::TextDiff3Tool colorConflict + ]. + ]. + + ^color + + "Created: / 19-03-2012 / 15:05:51 / Jan Vrany " +! + +conflict + ^ conflict +! + +line + ^ line +! + +line:lineArg resolution:resolutionArg + self line:lineArg resolution:resolutionArg conflict:nil offset: nil + + "Created: / 19-03-2012 / 15:04:15 / Jan Vrany " +! + +line:lineArg resolution:resolutionArg conflict:conflictArg offset: offsetArg + line := lineArg. + resolution := resolutionArg. + conflict := conflictArg. + offset := offsetArg + + "Created: / 20-03-2012 / 20:41:44 / Jan Vrany " +! + +offset + ^ offset +! + +offset:something + offset := something. +! + +resolution + ^ resolution +! + +resolution:something + resolution := something. +! ! + +!TextMergeInfo::LineInfo methodsFor:'printing & storing'! + +printOn:aStream + "append a printed representation if the receiver to the argument, aStream" + + self class nameWithoutPrefix printOn:aStream. + aStream space. + aStream nextPutAll:'line: '. + line printOn:aStream. + aStream space. + aStream nextPutAll:'resolution: '. + resolution printOn:aStream. + + "Modified: / 19-03-2012 / 12:30:56 / Jan Vrany " + "Created: / 19-03-2012 / 15:05:37 / Jan Vrany " +! ! + +!TextMergeInfo::LineInfo methodsFor:'testing'! + +isConflict + + ^resolution == #Conflict + + "Created: / 19-03-2012 / 15:06:16 / Jan Vrany " +! + +isMerged + + ^ + resolution == #Merged + or:[self isMergedUsingA + or:[self isMergedUsingB + or:[self isMergedUsingBase]]] + + "Created: / 19-03-2012 / 15:06:08 / Jan Vrany " +! + +isMergedOrNoConflict + + ^resolution == #NoConflict or:[self isMerged] + + "Created: / 06-04-2012 / 10:40:36 / Jan Vrany " +! + +isMergedUsingA + + ^resolution == #MergedUsingA + + "Created: / 20-03-2012 / 14:21:30 / Jan Vrany " +! + +isMergedUsingB + + ^resolution == #MergedUsingB + + "Created: / 20-03-2012 / 14:21:33 / Jan Vrany " +! + +isMergedUsingBase + + ^resolution == #MergedUsingBase + + "Created: / 20-03-2012 / 14:21:37 / Jan Vrany " +! ! + +!TextMergeInfo class methodsFor:'documentation'! + +version + ^ '$Header: /cvs/stx/stx/libtool/Tools__TextMergeInfo.st,v 1.1 2014-02-05 18:57:16 cg Exp $' +! + +version_CVS + ^ '$Header: /cvs/stx/stx/libtool/Tools__TextMergeInfo.st,v 1.1 2014-02-05 18:57:16 cg Exp $' +! ! +