Diff2.st
author Claus Gittinger <cg@exept.de>
Wed, 05 Jun 2019 14:16:59 +0200
changeset 18805 f6df57c6dbfb
parent 16949 3b46d0b33f15
child 17134 c4cce8b7a95d
permissions -rw-r--r--
#BUGFIX by cg class: AbstractFileBrowser changed: #currentFileNameHolder endless loop if file not present.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
 Copyright (c) 2007-2012 Tony Garnock-Jones
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
 This code is based on Squeak's DiffMerge package
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
 written by Tony Garnock-Jones. Original project's web site:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 http://www.squeaksource.com/DiffMerge
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 Permission is hereby granted, free of charge, to any person
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 obtaining a copy of this software and associated documentation
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
 files (the 'Software'), to deal in the Software without
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
 restriction, including without limitation the rights to use,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
 copy, modify, merge, publish, distribute, sublicense, and/or sell
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
 copies of the Software, and to permit persons to whom the
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
 Software is furnished to do so, subject to the following
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
 conditions:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
 The above copyright notice and this permission notice shall be
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
 included in all copies or substantial portions of the Software.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
 OTHER DEALINGS IN THE SOFTWARE.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
"{ Package: 'stx:libtool' }"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
16949
3b46d0b33f15 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 14903
diff changeset
    32
"{ NameSpace: Smalltalk }"
3b46d0b33f15 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 14903
diff changeset
    33
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
Object subclass:#Diff2
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
	instanceVariableNames:'file1 file2'
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
	classVariableNames:''
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
	poolDictionaries:''
14009
27022a1ba8f6 documentation
Claus Gittinger <cg@exept.de>
parents: 13885
diff changeset
    38
	category:'Collections-Sequenceable-Diff'
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
Object subclass:#Chunk
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
	instanceVariableNames:'offset length'
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
	classVariableNames:''
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
	poolDictionaries:''
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
	privateIn:Diff2
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
Diff2 subclass:#HuntMcilroy
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
	instanceVariableNames:'lcs'
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
	classVariableNames:''
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
	poolDictionaries:''
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
	privateIn:Diff2
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
Object subclass:#Candidate
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
	instanceVariableNames:'file1index file2index chain'
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
	classVariableNames:''
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
	poolDictionaries:''
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
	privateIn:Diff2::HuntMcilroy
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
Diff2 subclass:#MyersUkkonen
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
	instanceVariableNames:'lcs'
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
	classVariableNames:''
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
	poolDictionaries:''
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
	privateIn:Diff2
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
Object subclass:#Patch
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
	instanceVariableNames:'chunks snippets'
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
	classVariableNames:''
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
	poolDictionaries:''
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
	privateIn:Diff2
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
Diff2 comment:'Generic diff/comm utilities. Agnostic as to the longestCommonSubsequence algorithm used.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
Instance Variables
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
	file1:		<SequenceableCollection> One of the two files to compare.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
	file2:		<SequenceableCollection> The other of the files to compare.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
-- 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
Copyright (c) 2008 Tony Garnock-Jones <tonyg@lshift.net>
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
Copyright (c) 2008 LShift Ltd. <query@lshift.net>
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction,including without limitation the rights to use, copy, modify, merge,publish, distribute, sublicense, and/or sell copies of the Software,and to permit persons to whom the Software is furnished to do so,subject to the following conditions:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
'
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
!Diff2 class methodsFor:'documentation'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
copyright
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
 Copyright (c) 2007-2012 Tony Garnock-Jones
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
 This code is based on Squeak's DiffMerge package
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
 written by Tony Garnock-Jones. Original project's web site:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
 http://www.squeaksource.com/DiffMerge
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
 Permission is hereby granted, free of charge, to any person
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
 obtaining a copy of this software and associated documentation
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
 files (the 'Software'), to deal in the Software without
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
 restriction, including without limitation the rights to use,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
 copy, modify, merge, publish, distribute, sublicense, and/or sell
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
 copies of the Software, and to permit persons to whom the
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
 Software is furnished to do so, subject to the following
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
 conditions:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
 The above copyright notice and this permission notice shall be
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
 included in all copies or substantial portions of the Software.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
 OTHER DEALINGS IN THE SOFTWARE.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
documentation
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
"
16949
3b46d0b33f15 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 14903
diff changeset
   126
    Generic diff/comm utilities. 
3b46d0b33f15 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 14903
diff changeset
   127
    Agnostic as to the longestCommonSubsequence algorithm used.
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
14009
27022a1ba8f6 documentation
Claus Gittinger <cg@exept.de>
parents: 13885
diff changeset
   129
    Instance Variables
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
        file1:          <SequenceableCollection> One of the two files to compare.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
        file2:          <SequenceableCollection> The other of the files to compare.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
    [author:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
        Tony Garnock-Jones <tonyg@lshift.com>
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
    [instance variables:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
    [class variables:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    [see also:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
!Diff2 class methodsFor:'instance creation'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
new
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
    "I'm abstract, so instantiate some default here"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
    ^self == Diff2 ifTrue:[
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
        HuntMcilroy new
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
    ] ifFalse:[
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
        self basicNew initialize
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
    ]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
    "Created: / 16-03-2012 / 20:16:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
!Diff2 class methodsFor:'accessing'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   160
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
HuntMcilroy
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   162
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   163
    ^HuntMcilroy
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   164
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   165
    "Created: / 16-03-2012 / 18:54:30 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   166
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   167
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   168
MyersUkkonen
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   169
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   170
    ^MyersUkkonen
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   171
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   172
    "Created: / 16-03-2012 / 18:54:40 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   173
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   174
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   175
!Diff2 methodsFor:'accessing'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   176
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   177
file1
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   178
	^ file1
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   179
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   180
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   181
file1: anObject
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   182
	file1 := anObject.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   183
	self emptyCaches.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   184
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
file2
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
	^ file2
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
file2: anObject
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
	file2 := anObject.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
	self emptyCaches.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
!Diff2 methodsFor:'diffing'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
comm
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
	"Returns a collection of similarities and differences between the two files. Each entry in the resulting collection is either (#common -> {...}) or (#different -> ({...} -> {...}))."
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
	| result common p1 p2 |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
	result := OrderedCollection new.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
	p1 := 0.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
	p2 := 0.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
	common := OrderedCollection new.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
	self longestCommonSubsequence do: [:entry |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
		common := self maybeAddCommonBlock: common to: result
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
						p1: p1 p2: p2 limit1: entry key limit2: entry value.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
		common add: (self file1 at: entry key).
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
		p1 := entry key.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
		p2 := entry value.].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
	common := self maybeAddCommonBlock: common to: result
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
					p1: p1 p2: p2 limit1: file1 size + 1 limit2: file2 size + 1.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
	self addCommonBlock: common ifNonEmptyTo: result.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
	^ result asArray
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
diff
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
        "Returns a DiffPatch instance that can be used in future to transform file1 into file2."
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
        | p |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
        p := Diff2::Patch new.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
        p initChunks: self diffIndices file1: file1 file2: file2.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
        ^ p
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
    "Modified: / 16-03-2012 / 19:16:55 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
diffIndices
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
	"Returns a collection of (DiffChunk -> DiffChunk) associations mapping differing regions of file1 and file2 onto each other."
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
	| result p1 p2 |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
	result := OrderedCollection new.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
	p1 := 0.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
	p2 := 0.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
	self longestCommonSubsequence do: [:entry |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
		self maybeAddDiffChunkTo: result p1: p1 p2: p2 limit1: entry key limit2: entry value.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
		p1 := entry key.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
		p2 := entry value.].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
	self maybeAddDiffChunkTo: result p1: p1 p2: p2 limit1: file1 size + 1 limit2: file2 size + 1.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
	^ result asArray
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   238
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   239
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   240
longestCommonSubsequence
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   241
	"The longestCommonSubsequence (LCS) algorithm is at the heart of a diff/comm algorithm."
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   242
	self subclassResponsibility.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   243
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   244
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   245
!Diff2 methodsFor:'private'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   246
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   247
addCommonBlock: aSubCollection ifNonEmptyTo: aCollection
14903
f0d17117b5e9 class: Diff2
Claus Gittinger <cg@exept.de>
parents: 14840
diff changeset
   248
        aSubCollection isEmpty ifTrue:[
f0d17117b5e9 class: Diff2
Claus Gittinger <cg@exept.de>
parents: 14840
diff changeset
   249
            ^ aSubCollection
f0d17117b5e9 class: Diff2
Claus Gittinger <cg@exept.de>
parents: 14840
diff changeset
   250
        ] ifFalse: [
f0d17117b5e9 class: Diff2
Claus Gittinger <cg@exept.de>
parents: 14840
diff changeset
   251
            aCollection add: #common -> aSubCollection asArray. 
f0d17117b5e9 class: Diff2
Claus Gittinger <cg@exept.de>
parents: 14840
diff changeset
   252
            ^ OrderedCollection new.
f0d17117b5e9 class: Diff2
Claus Gittinger <cg@exept.de>
parents: 14840
diff changeset
   253
        ]
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   254
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   255
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   256
emptyCaches
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   257
	"Subclasses should implement this to clear any cached state they may have built up."
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   258
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   259
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   260
maybeAddCommonBlock: common to: result p1: p1 p2: p2 limit1: limit1 limit2: limit2
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   261
	"For internal use by comm."
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   262
	((p1 + 1 ~= limit1) or: [p2 + 1 ~= limit2])
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   263
			ifTrue: [| newCommon |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   264
					newCommon := self addCommonBlock: common ifNonEmptyTo: result.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   265
					result add: #different -> ((file1 copyFrom: p1 + 1 to: limit1 - 1) ->
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   266
											(file2 copyFrom: p2 + 1 to: limit2 - 1)).
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   267
					^ newCommon]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   268
			ifFalse: [^ common].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   269
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   270
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
maybeAddDiffChunkTo: result p1: p1 p2: p2 limit1: limit1 limit2: limit2
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
        "For internal use by diffIndices."
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
        ((p1 + 1 ~= limit1) or: [p2 + 1 ~= limit2])
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
                        ifTrue: [result add: ((Diff2::Chunk offset: p1 + 1 length: limit1 - p1 - 1) ->
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
                                                                (Diff2::Chunk offset: p2 + 1 length: limit2 - p2 - 1))].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
    "Modified: / 16-03-2012 / 19:13:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280
!Diff2::Chunk class methodsFor:'as yet unclassified'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   281
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   282
negativeSize: s
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   283
	"Returns a pseudo-chunk with *negative* length, useful as a kind of zero for destructiveMergeWith: operations intended to build up coverage over some set of chunks."
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   284
	^ self new offset: s + 1; length: s negated
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   285
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   286
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   287
offset: o length: l
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   288
	^ self new offset: o; length: l
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   289
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   290
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   291
!Diff2::Chunk class methodsFor:'documentation'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   292
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   293
copyright
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   294
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   295
 Copyright (c) 2007-2012 Tony Garnock-Jones
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   296
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   297
 This code is based on Squeak's DiffMerge package
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   298
 written by Tony Garnock-Jones. Original project's web site:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   299
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   300
 http://www.squeaksource.com/DiffMerge
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   301
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   302
 Permission is hereby granted, free of charge, to any person
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   303
 obtaining a copy of this software and associated documentation
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   304
 files (the 'Software'), to deal in the Software without
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   305
 restriction, including without limitation the rights to use,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   306
 copy, modify, merge, publish, distribute, sublicense, and/or sell
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   307
 copies of the Software, and to permit persons to whom the
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   308
 Software is furnished to do so, subject to the following
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   309
 conditions:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   310
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   311
 The above copyright notice and this permission notice shall be
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   312
 included in all copies or substantial portions of the Software.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   313
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   314
 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   315
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   316
 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   317
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   318
 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   319
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   320
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   321
 OTHER DEALINGS IN THE SOFTWARE.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   322
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   323
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   324
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   325
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   326
documentation
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   327
"
14009
27022a1ba8f6 documentation
Claus Gittinger <cg@exept.de>
parents: 13885
diff changeset
   328
    A DiffChunk represents a span of items within a collection (e.g. a collection of lines representing a text file).
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   329
14009
27022a1ba8f6 documentation
Claus Gittinger <cg@exept.de>
parents: 13885
diff changeset
   330
    Instance Variables
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   331
        length:                 <Integer> Count of lines within the chunk; 0 is permitted
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   332
        offset:                 <Integer> Index of first line within the chunk; 1-based
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   333
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   334
    [author:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   335
        Tony Garnock-Jones <tonyg@lshift.com>
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   336
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   337
    [instance variables:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   338
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   339
    [class variables:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   340
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   341
    [see also:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   342
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   343
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   344
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   345
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   346
!Diff2::Chunk methodsFor:'accessing'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   347
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   348
correctForSkewFrom: smallerChunk to: biggerChunk
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   349
	"Given a biggerChunk that definitely contains smallerChunk but might have an extra head or tail, updates the receiver to include such an extra head or tail."
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   350
	| headSize tailSize |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   351
	headSize := smallerChunk offset - biggerChunk offset.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   352
	tailSize := biggerChunk lastIndex - smallerChunk lastIndex.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   353
	offset := offset - headSize.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   354
	length := length + headSize + tailSize.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   355
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   356
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   357
destructiveMergeWith: aChunk
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   358
	| newLastIndex |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   359
	newLastIndex := self lastIndex max: aChunk lastIndex.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   360
	offset := offset min: aChunk offset.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   361
	length := newLastIndex - offset + 1.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   362
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   363
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   364
lastIndex
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   365
	"Returns the rightmost index contained in my range. (Offset is the leftmost index.) If my length is zero, will return an index lower than my offset."
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   366
	^ offset + length - 1
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   367
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   368
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   369
length
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   370
	^ length
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   371
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   372
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   373
length: anObject
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   374
	length := anObject
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   375
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   376
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   377
offset
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   378
	^ offset
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   379
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   380
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   381
offset: anObject
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   382
	offset := anObject
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   383
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   384
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   385
printOn: aStream
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   386
	aStream
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   387
		nextPut: $(;
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   388
		nextPutAll: self class name;
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   389
		nextPutAll: ' offset: ';
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   390
		nextPutAll: self offset asString;
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   391
		nextPutAll: ' length: ';
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   392
		nextPutAll: self length asString;
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   393
		nextPut: $).
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   394
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   395
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   396
!Diff2::Chunk methodsFor:'as yet unclassified'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   397
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   398
extractFrom: aCollection
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   399
	"Extracts a subcollection from aCollection corresponding to my offset and length."
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   400
	^ aCollection copyFrom: offset to: offset + length - 1.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   401
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   402
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   403
extractSafeFrom: aCollection
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   404
    "Extracts a subcollection from aCollection corresponding to my offset and length.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   405
     Returns nil if extraction fails (out of bounds)"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   406
    ^((offset <= aCollection size) and:[(offset + length - 1) <= aCollection size]) ifTrue:[
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   407
        aCollection copyFrom: offset to: offset + length - 1
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   408
    ] ifFalse:[
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   409
        nil
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   410
    ].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   411
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   412
    "Created: / 06-04-2012 / 12:37:28 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   413
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   414
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   415
!Diff2::Chunk methodsFor:'comparing'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   416
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   417
< aDiffChunk
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   418
	"Used to sort changed chunks during three-way merge; see Diff3"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   419
	^ self offset < aDiffChunk offset
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   420
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   421
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   422
= otherChunk
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   423
        ^ (otherChunk isKindOf: Diff2::Chunk) and:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   424
        [(self offset = otherChunk offset) and:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   425
        [(self length = otherChunk length)]]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   426
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   427
    "Modified: / 16-03-2012 / 19:13:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   428
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   429
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   430
!Diff2::HuntMcilroy class methodsFor:'documentation'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   431
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   432
copyright
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   433
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   434
 Copyright (c) 2007-2012 Tony Garnock-Jones
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   435
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   436
 This code is based on Squeak's DiffMerge package
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   437
 written by Tony Garnock-Jones. Original project's web site:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   438
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   439
 http://www.squeaksource.com/DiffMerge
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   440
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   441
 Permission is hereby granted, free of charge, to any person
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   442
 obtaining a copy of this software and associated documentation
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   443
 files (the 'Software'), to deal in the Software without
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   444
 restriction, including without limitation the rights to use,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   445
 copy, modify, merge, publish, distribute, sublicense, and/or sell
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   446
 copies of the Software, and to permit persons to whom the
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   447
 Software is furnished to do so, subject to the following
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   448
 conditions:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   449
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   450
 The above copyright notice and this permission notice shall be
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   451
 included in all copies or substantial portions of the Software.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   452
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   453
 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   454
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   455
 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   456
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   457
 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   458
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   459
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   460
 OTHER DEALINGS IN THE SOFTWARE.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   461
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   462
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   463
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   464
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   465
documentation
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   466
"
14009
27022a1ba8f6 documentation
Claus Gittinger <cg@exept.de>
parents: 13885
diff changeset
   467
    A HuntMcilroyDiff provides a longestCommonSubsequence algorithm following Hunt and McIlroy 1976 for use by the methods on GenericDiff.
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   468
14009
27022a1ba8f6 documentation
Claus Gittinger <cg@exept.de>
parents: 13885
diff changeset
   469
    J. W. Hunt and M. D. McIlroy, An algorithm for differential file comparison, Bell Telephone Laboratories CSTR #41 (1976).
27022a1ba8f6 documentation
Claus Gittinger <cg@exept.de>
parents: 13885
diff changeset
   470
    http://www.cs.dartmouth.edu/~doug/
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   471
14009
27022a1ba8f6 documentation
Claus Gittinger <cg@exept.de>
parents: 13885
diff changeset
   472
    Instance Variables
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   473
        lcs:            cached longest common subsequence
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   474
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   475
    [author:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   476
        Tony Garnock-Jones <tonyg@lshift.com>
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   477
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   478
    [instance variables:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   479
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   480
    [class variables:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   481
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   482
    [see also:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   483
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   484
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   485
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   486
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   487
!Diff2::HuntMcilroy methodsFor:'accessing'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   488
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   489
emptyCaches
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   490
	lcs := nil.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   491
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   492
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   493
!Diff2::HuntMcilroy methodsFor:'diffing'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   494
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   495
longestCommonSubsequence
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   496
        | equivalenceClasses candidates |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   497
        lcs ifNotNil: [ ^ lcs ].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   498
        equivalenceClasses := self computeEquivalenceClasses.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   499
        candidates := OrderedCollection with: (Candidate new 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   500
                        file1index: 0
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   501
                        file2index: 0
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   502
                        chain: nil).
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   503
        file1 withIndexDo: 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   504
                [ :line :file1index | 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   505
                self 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   506
                        mergeCandidates: candidates
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   507
                        file1index: file1index
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   508
                        file2indices: (equivalenceClasses 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   509
                                        at: line
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   510
                                        ifAbsent: #()) ].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   511
        lcs := self postprocessCandidateChain: candidates.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   512
        ^ lcs
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   513
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   514
    "Modified: / 16-03-2012 / 19:14:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   515
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   516
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   517
!Diff2::HuntMcilroy methodsFor:'private'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   518
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   519
computeEquivalenceClasses
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   520
	| result |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   521
	result := Dictionary new.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   522
	file2 withIndexDo: 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   523
		[ :line :index | 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   524
		(result 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   525
			at: line
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   526
			ifAbsentPut: [ OrderedCollection new ]) add: index ].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   527
	^ result
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   528
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   529
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   530
findCandidateFrom: candidates forLine: file2index startingAt: lowIndex
14840
6cc4674bfd18 class: Diff2
Claus Gittinger <cg@exept.de>
parents: 14009
diff changeset
   531
        "Find the index k in the given subrange of candidates where file2index falls strictly between the file2indexes of the kth and k+1th candidates. If no such k exists, return 0."
6cc4674bfd18 class: Diff2
Claus Gittinger <cg@exept.de>
parents: 14009
diff changeset
   532
        lowIndex to: candidates size do: [ :k |
6cc4674bfd18 class: Diff2
Claus Gittinger <cg@exept.de>
parents: 14009
diff changeset
   533
                (candidates at: k) file2index >= file2index ifTrue: [^ 0].
6cc4674bfd18 class: Diff2
Claus Gittinger <cg@exept.de>
parents: 14009
diff changeset
   534
                (k = candidates size or: [ (candidates at: k + 1) file2index > file2index ])
6cc4674bfd18 class: Diff2
Claus Gittinger <cg@exept.de>
parents: 14009
diff changeset
   535
                        ifTrue: [^ k] ].
6cc4674bfd18 class: Diff2
Claus Gittinger <cg@exept.de>
parents: 14009
diff changeset
   536
        ^ 0
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   537
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   538
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   539
mergeCandidates: candidates file1index: file1index file2indices: file2indices 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   540
        | r c s newCandidate |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   541
        r := 1.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   542
        c := candidates at: r.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   543
        file2indices do: 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   544
                [ :file2index | 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   545
                s := self findCandidateFrom: candidates forLine: file2index startingAt: r.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   546
                s > 0 ifTrue: 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   547
                        [ newCandidate := Candidate new   
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   548
                                file1index: file1index
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   549
                                file2index: file2index
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   550
                                chain: (candidates at: s).
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   551
                        self storeCandidate: c at: r in: candidates.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   552
                        c := newCandidate.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   553
                        r := s + 1.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   554
                        "optimise by leaving early if s was the end of the candidates list, since none of the subsequent file2indices will have a place to go"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   555
                        s = candidates size ifTrue: 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   556
                                [ self storeCandidate: c at: r in: candidates. ^ self ] ] ].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   557
        self storeCandidate: c at: r in: candidates.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   558
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   559
    "Modified (format): / 16-03-2012 / 19:08:50 / Jan Vrany <jan.vrany@fit.cvut.cz>"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   560
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   561
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   562
postprocessCandidateChain: candidates 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   563
	| result c |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   564
	result := OrderedCollection new.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   565
	c := candidates at: candidates size.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   566
	[ c chain notNil ] whileTrue: 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   567
		[ result add: c file1index -> c file2index.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   568
		c := c chain ].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   569
	^ result reversed.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   570
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   571
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   572
storeCandidate: c at: r in: candidates
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   573
	r > candidates size ifTrue: [candidates add: c] ifFalse: [candidates at: r put: c].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   574
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   575
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   576
!Diff2::HuntMcilroy::Candidate class methodsFor:'documentation'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   577
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   578
copyright
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   579
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   580
 Copyright (c) 2007-2012 Tony Garnock-Jones
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   581
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   582
 This code is based on Squeak's DiffMerge package
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   583
 written by Tony Garnock-Jones. Original project's web site:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   584
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   585
 http://www.squeaksource.com/DiffMerge
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   586
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   587
 Permission is hereby granted, free of charge, to any person
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   588
 obtaining a copy of this software and associated documentation
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   589
 files (the 'Software'), to deal in the Software without
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   590
 restriction, including without limitation the rights to use,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   591
 copy, modify, merge, publish, distribute, sublicense, and/or sell
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   592
 copies of the Software, and to permit persons to whom the
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   593
 Software is furnished to do so, subject to the following
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   594
 conditions:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   595
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   596
 The above copyright notice and this permission notice shall be
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   597
 included in all copies or substantial portions of the Software.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   598
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   599
 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   600
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   601
 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   602
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   603
 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   604
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   605
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   606
 OTHER DEALINGS IN THE SOFTWARE.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   607
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   608
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   609
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   610
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   611
documentation
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   612
"
14009
27022a1ba8f6 documentation
Claus Gittinger <cg@exept.de>
parents: 13885
diff changeset
   613
    HuntMcilroyDiffCandidate is used internally by HuntMcilroyDiff.
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   614
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   615
    [author:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   616
        Tony Garnock-Jones <tonyg@kcbbs.gen.nz>
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   617
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   618
    [instance variables:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   619
        chain:                  Link to next candidate in chain.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   620
        file1index:             Position in file1.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   621
        file2index:             Position in file2.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   622
    [class variables:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   623
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   624
    [see also:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   625
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   626
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   627
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   628
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   629
!Diff2::HuntMcilroy::Candidate methodsFor:'accessing'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   630
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   631
chain
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   632
	^ chain
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   633
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   634
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   635
file1index
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   636
	^ file1index
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   637
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   638
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   639
file2index
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   640
	^ file2index
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   641
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   642
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   643
!Diff2::HuntMcilroy::Candidate methodsFor:'as yet unclassified'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   644
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   645
file1index: f1 file2index: f2 chain: c
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   646
	file1index := f1.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   647
	file2index := f2.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   648
	chain := c.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   649
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   650
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   651
!Diff2::MyersUkkonen class methodsFor:'documentation'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   652
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   653
copyright
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   654
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   655
 Copyright (c) 2007-2012 Tony Garnock-Jones
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   656
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   657
 This code is based on Squeak's DiffMerge package
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   658
 written by Tony Garnock-Jones. Original project's web site:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   659
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   660
 http://www.squeaksource.com/DiffMerge
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   661
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   662
 Permission is hereby granted, free of charge, to any person
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   663
 obtaining a copy of this software and associated documentation
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   664
 files (the 'Software'), to deal in the Software without
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   665
 restriction, including without limitation the rights to use,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   666
 copy, modify, merge, publish, distribute, sublicense, and/or sell
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   667
 copies of the Software, and to permit persons to whom the
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   668
 Software is furnished to do so, subject to the following
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   669
 conditions:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   670
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   671
 The above copyright notice and this permission notice shall be
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   672
 included in all copies or substantial portions of the Software.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   673
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   674
 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   675
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   676
 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   677
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   678
 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   679
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   680
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   681
 OTHER DEALINGS IN THE SOFTWARE.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   682
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   683
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   684
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   685
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   686
documentation
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   687
"
14009
27022a1ba8f6 documentation
Claus Gittinger <cg@exept.de>
parents: 13885
diff changeset
   688
    I implement a modified version of Myers' greedy lcs algorithm described in http://xmailserver.org/diff2.pdf. 
27022a1ba8f6 documentation
Claus Gittinger <cg@exept.de>
parents: 13885
diff changeset
   689
    A similar version written in C can be found here http://research.janelia.org/myers/Papers/file.comparison.pdf. 
27022a1ba8f6 documentation
Claus Gittinger <cg@exept.de>
parents: 13885
diff changeset
   690
    Ukkonen's version can be found here http://www.cs.helsinki.fi/u/ukkonen/InfCont85.PDF.
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   691
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   692
    [author:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   693
        Tony Garnock-Jones <tonyg@lshift.com>
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   694
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   695
    [instance variables:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   696
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   697
    [class variables:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   698
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   699
    [see also:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   700
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   701
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   702
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   703
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   704
!Diff2::MyersUkkonen methodsFor:'accessing'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   705
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   706
emptyCaches
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   707
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   708
	lcs := nil
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   709
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   710
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   711
!Diff2::MyersUkkonen methodsFor:'diffing'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   712
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   713
longestCommonSubsequence
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   714
	
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   715
	^lcs ifNil: [ 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   716
		lcs := (Array streamContents: [ :stream |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   717
			| list |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   718
			list := self calculateLcs.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   719
			[ list == nil ] whileFalse: [
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   720
				stream nextPut: (list at: 1) -> (list at: 2).
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   721
				list := list at: 3 ] ]) reverse ]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   722
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   723
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   724
!Diff2::MyersUkkonen methodsFor:'private'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   725
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   726
calculateLcs
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   727
	"I find one of the longest common subsequences of my the arguments. I assume that none of my arguments are empty. I return nil or an Array which represents a list. The first two elements are the matching line numbers, the last is the next node in the list or nil if there are no more elements. The list containts the longest common subsequence. I'm a modified version of the greedy lcs algorithm from the 6th page of 'An O(ND) Difference Algorithm and Its Variations (1986)' by Eugene W. Myers"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   728
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   729
    | n m v lcss max |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   730
    n := file1 size.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   731
    m := file2 size.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   732
    max := m + n.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   733
    v := Array new: 2 * max + 1.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   734
    v at: max + 2 put: 0.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   735
    lcss := Array new: 2 * max + 1.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   736
    0 to: max do: [ :d |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   737
	d negated to: d by: 2 do: [ :k |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   738
	    | index chain x y |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   739
	    (k + d = 0 or: [ k ~= d and: [ (v at: max + k ) < (v at: max + k + 2) ] ])
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   740
				ifTrue: [ 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   741
					index := max + k + 2.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   742
					x := v at: index ]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   743
				ifFalse: [ 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   744
					index := max + k.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   745
					x := (v at: index) + 1 ].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   746
			chain := lcss at: index.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   747
			y := x - k.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   748
			[ x < n and: [ y < m and: [ (file1 at: x + 1) = (file2 at: y + 1) ] ] ] whileTrue: [
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   749
			    chain := Array with: (x := x + 1) with: (y := y + 1) with: chain.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   750
			].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   751
			(x >= n and: [ y >= m ]) ifTrue: [
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   752
				^chain ].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   753
			v at: max + k + 1 put: x.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   754
			lcss at: max + k + 1 put: chain ] ].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   755
	self error
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   756
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   757
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   758
!Diff2::Patch class methodsFor:'documentation'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   759
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   760
copyright
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   761
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   762
 Copyright (c) 2007-2012 Tony Garnock-Jones
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   763
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   764
 This code is based on Squeak's DiffMerge package
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   765
 written by Tony Garnock-Jones. Original project's web site:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   766
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   767
 http://www.squeaksource.com/DiffMerge
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   768
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   769
 Permission is hereby granted, free of charge, to any person
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   770
 obtaining a copy of this software and associated documentation
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   771
 files (the 'Software'), to deal in the Software without
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   772
 restriction, including without limitation the rights to use,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   773
 copy, modify, merge, publish, distribute, sublicense, and/or sell
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   774
 copies of the Software, and to permit persons to whom the
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   775
 Software is furnished to do so, subject to the following
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   776
 conditions:
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   777
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   778
 The above copyright notice and this permission notice shall be
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   779
 included in all copies or substantial portions of the Software.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   780
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   781
 THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   782
 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   783
 OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   784
 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   785
 HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   786
 WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   787
 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   788
 OTHER DEALINGS IN THE SOFTWARE.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   789
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   790
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   791
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   792
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   793
documentation
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   794
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   795
    A DiffPatch has a collection of DiffChunks, and a collection of corresponding 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   796
    SequenceableCollection snippets. It can be used to patch a file (= SequenceableCollection) 
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   797
    forwards or backwards.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   798
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   799
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   800
    [author:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   801
        Tony Garnock-Jones <tonyg@lshift.com>
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   802
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   803
    [instance variables:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   804
        chunks:         <SequenceableCollection of DiffChunk->DiffChunk>
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   805
        snippets:       <SequenceableCollection of SequenceableCollection->SequenceableCollection>
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   806
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   807
    [class variables:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   808
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   809
    [see also:]
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   810
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   811
"
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   812
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   813
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   814
!Diff2::Patch methodsFor:'accessing'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   815
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   816
applyTo: file
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   817
	"Applies this patch to the given collection. Makes no sanity checks on the contents of the collection - simply blindly applies the chunks and snippets to its argument."
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   818
	| result commonOffset |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   819
	result := OrderedCollection new.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   820
	commonOffset := 1.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   821
	chunks with: snippets do: [:chunk :snippet |
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   822
		result addAll: (file copyFrom: commonOffset to: chunk key offset - 1).
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   823
		result addAll: (snippet value).
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   824
		commonOffset := chunk key offset + chunk key length].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   825
	result addAll: (file copyFrom: commonOffset to: file size).
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   826
	^ result as: file species.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   827
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   828
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   829
!Diff2::Patch methodsFor:'as yet unclassified'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   830
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   831
initChunks: c file1: f1 file2: f2
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   832
	chunks := c.
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   833
	snippets := c collect: [:entry | (entry key extractFrom: f1) -> (entry value extractFrom: f2)].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   834
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   835
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   836
!Diff2::Patch methodsFor:'selecting'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   837
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   838
invert
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   839
	"Causes this patch to invert itself; if previously it represented the changes from file1 to file2, after being sent #invert, it will represent the changes from file2 to file1. After inversion, calling #applyTo: on file2 will yield file1, rather than the other way around."
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   840
	chunks do: [:entry | entry key: entry value value: entry key].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   841
	snippets do: [:entry | entry key: entry value value: entry key].
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   842
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   843
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   844
!Diff2 class methodsFor:'documentation'!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   846
version
16949
3b46d0b33f15 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 14903
diff changeset
   847
    ^ '$Header$'
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   848
!
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   849
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   850
version_CVS
16949
3b46d0b33f15 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 14903
diff changeset
   851
    ^ '$Header$'
13845
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   852
! !
5092330709c7 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   853