/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/patiencediff.py

  • Committer: Jelmer Vernooij
  • Date: 2018-07-09 20:53:02 UTC
  • mto: This revision was merged to the branch mainline in revision 7033.
  • Revision ID: jelmer@jelmer.uk-20180709205302-bky59cnh25hjmpd2
Fix breezy.tests.test_diff.

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
""")
27
27
 
28
28
 
29
 
__all__ = ['PatienceSequenceMatcher', 'unified_diff', 'unified_diff_files']
 
29
__all__ = ['PatienceSequenceMatcher', 'unified_diff', 'unified_diff_bytes',
 
30
           'unified_diff_files']
30
31
 
31
32
 
32
33
# This is a version of unified_diff which only adds a factory parameter
102
103
                    yield '+' + line
103
104
 
104
105
 
 
106
def unified_diff_bytes(a, b, fromfile=b'', tofile=b'', fromfiledate=b'',
 
107
                       tofiledate=b'', n=3, lineterm=b'\n', sequencematcher=None):
 
108
    r"""
 
109
    Compare two sequences of lines; generate the delta as a unified diff.
 
110
 
 
111
    Unified diffs are a compact way of showing line changes and a few
 
112
    lines of context.  The number of context lines is set by 'n' which
 
113
    defaults to three.
 
114
 
 
115
    By default, the diff control lines (those with ---, +++, or @@) are
 
116
    created with a trailing newline.  This is helpful so that inputs
 
117
    created from file.readlines() result in diffs that are suitable for
 
118
    file.writelines() since both the inputs and outputs have trailing
 
119
    newlines.
 
120
 
 
121
    For inputs that do not have trailing newlines, set the lineterm
 
122
    argument to "" so that the output will be uniformly newline free.
 
123
 
 
124
    The unidiff format normally has a header for filenames and modification
 
125
    times.  Any or all of these may be specified using strings for
 
126
    'fromfile', 'tofile', 'fromfiledate', and 'tofiledate'.  The modification
 
127
    times are normally expressed in the format returned by time.ctime().
 
128
 
 
129
    Example:
 
130
 
 
131
    >>> for line in bytes_unified_diff(b'one two three four'.split(),
 
132
    ...             b'zero one tree four'.split(), b'Original', b'Current',
 
133
    ...             b'Sat Jan 26 23:30:50 1991', b'Fri Jun 06 10:20:52 2003',
 
134
    ...             lineterm=b''):
 
135
    ...     print line
 
136
    --- Original Sat Jan 26 23:30:50 1991
 
137
    +++ Current Fri Jun 06 10:20:52 2003
 
138
    @@ -1,4 +1,4 @@
 
139
    +zero
 
140
     one
 
141
    -two
 
142
    -three
 
143
    +tree
 
144
     four
 
145
    """
 
146
    if sequencematcher is None:
 
147
        sequencematcher = difflib.SequenceMatcher
 
148
 
 
149
    if fromfiledate:
 
150
        fromfiledate = b'\t' + byes(fromfiledate)
 
151
    if tofiledate:
 
152
        tofiledate = b'\t' + bytes(tofiledate)
 
153
 
 
154
    started = False
 
155
    for group in sequencematcher(None, a, b).get_grouped_opcodes(n):
 
156
        if not started:
 
157
            yield b'--- %s%s%s' % (fromfile, fromfiledate, lineterm)
 
158
            yield b'+++ %s%s%s' % (tofile, tofiledate, lineterm)
 
159
            started = True
 
160
        i1, i2, j1, j2 = group[0][1], group[-1][2], group[0][3], group[-1][4]
 
161
        yield b"@@ -%d,%d +%d,%d @@%s" % (i1+1, i2-i1, j1+1, j2-j1, lineterm)
 
162
        for tag, i1, i2, j1, j2 in group:
 
163
            if tag == 'equal':
 
164
                for line in a[i1:i2]:
 
165
                    yield b' ' + line
 
166
                continue
 
167
            if tag == 'replace' or tag == 'delete':
 
168
                for line in a[i1:i2]:
 
169
                    yield b'-' + line
 
170
            if tag == 'replace' or tag == 'insert':
 
171
                for line in b[j1:j2]:
 
172
                    yield b'+' + line
 
173
 
 
174
 
105
175
def unified_diff_files(a, b, sequencematcher=None):
106
176
    """Generate the diff for two files.
107
177
    """
123
193
        time_b = os.stat(b).st_mtime
124
194
 
125
195
    # TODO: Include fromfiledate and tofiledate
126
 
    return unified_diff(file_a.readlines(), file_b.readlines(),
 
196
    return unified_diff_bytes(file_a.readlines(), file_b.readlines(),
127
197
                        fromfile=a, tofile=b,
128
198
                        sequencematcher=sequencematcher)
129
199