/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
1
# Copyright (C) 2004, 2005, 2006 Canonical Ltd.
1 by mbp at sourcefrog
import from baz patch-364
2
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
1740.2.5 by Aaron Bentley
Merge from bzr.dev
17
import time
18
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
19
from bzrlib.delta import compare_trees
20
from bzrlib.errors import BzrError
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
21
import bzrlib.errors as errors
1711.2.24 by John Arbash Meinel
Late bind to PatienceSequenceMatcher to allow plugin to override.
22
from bzrlib.patiencediff import unified_diff
23
import bzrlib.patiencediff
1773.4.1 by Martin Pool
Add pyflakes makefile target; fix many warnings
24
from bzrlib.symbol_versioning import (deprecated_function,
25
        zero_eight)
1558.15.2 by Aaron Bentley
Implemented binary file handling for diff
26
from bzrlib.textfile import check_text_lines
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
27
from bzrlib.trace import mutter
1 by mbp at sourcefrog
import from baz patch-364
28
1711.2.24 by John Arbash Meinel
Late bind to PatienceSequenceMatcher to allow plugin to override.
29
767 by Martin Pool
- files are only reported as modified if their name or parent has changed,
30
# TODO: Rather than building a changeset object, we should probably
31
# invoke callbacks on an object.  That object can either accumulate a
32
# list, write them out directly, etc etc.
33
1558.15.11 by Aaron Bentley
Apply merge review suggestions
34
def internal_diff(old_filename, oldlines, new_filename, newlines, to_file,
1711.2.30 by John Arbash Meinel
Fix bug in internal_diff handling of unicode paths
35
                  allow_binary=False, sequence_matcher=None,
36
                  path_encoding='utf8'):
475 by Martin Pool
- rewrite diff using compare_trees()
37
    # FIXME: difflib is wrong if there is no trailing newline.
38
    # The syntax used by patch seems to be "\ No newline at
39
    # end of file" following the last diff line from that
40
    # file.  This is not trivial to insert into the
41
    # unified_diff output and it might be better to just fix
42
    # or replace that function.
43
44
    # In the meantime we at least make sure the patch isn't
45
    # mangled.
46
47
48
    # Special workaround for Python2.3, where difflib fails if
49
    # both sequences are empty.
50
    if not oldlines and not newlines:
51
        return
1558.15.2 by Aaron Bentley
Implemented binary file handling for diff
52
    
1558.15.11 by Aaron Bentley
Apply merge review suggestions
53
    if allow_binary is False:
54
        check_text_lines(oldlines)
55
        check_text_lines(newlines)
475 by Martin Pool
- rewrite diff using compare_trees()
56
1185.81.8 by John Arbash Meinel
Updating unified_diff to take a factory, using the new diff algorithm in the code.
57
    if sequence_matcher is None:
1711.2.24 by John Arbash Meinel
Late bind to PatienceSequenceMatcher to allow plugin to override.
58
        sequence_matcher = bzrlib.patiencediff.PatienceSequenceMatcher
1185.81.8 by John Arbash Meinel
Updating unified_diff to take a factory, using the new diff algorithm in the code.
59
    ud = unified_diff(oldlines, newlines,
1740.2.5 by Aaron Bentley
Merge from bzr.dev
60
                      fromfile=old_filename.encode(path_encoding),
61
                      tofile=new_filename.encode(path_encoding),
1185.81.8 by John Arbash Meinel
Updating unified_diff to take a factory, using the new diff algorithm in the code.
62
                      sequencematcher=sequence_matcher)
475 by Martin Pool
- rewrite diff using compare_trees()
63
1092.1.50 by Robert Collins
make diff lsdiff/filterdiff friendly
64
    ud = list(ud)
475 by Martin Pool
- rewrite diff using compare_trees()
65
    # work-around for difflib being too smart for its own good
66
    # if /dev/null is "1,0", patch won't recognize it as /dev/null
67
    if not oldlines:
68
        ud[2] = ud[2].replace('-1,0', '-0,0')
69
    elif not newlines:
70
        ud[2] = ud[2].replace('+1,0', '+0,0')
1092.1.50 by Robert Collins
make diff lsdiff/filterdiff friendly
71
    # work around for difflib emitting random spaces after the label
72
    ud[0] = ud[0][:-2] + '\n'
73
    ud[1] = ud[1][:-2] + '\n'
475 by Martin Pool
- rewrite diff using compare_trees()
74
804 by Martin Pool
Patch from John:
75
    for line in ud:
76
        to_file.write(line)
974.1.5 by Aaron Bentley
Fixed handling of missing newlines in udiffs
77
        if not line.endswith('\n'):
78
            to_file.write("\n\\ No newline at end of file\n")
475 by Martin Pool
- rewrite diff using compare_trees()
79
    print >>to_file
80
81
1185.35.29 by Aaron Bentley
Support whitespace in diff filenames
82
def external_diff(old_filename, oldlines, new_filename, newlines, to_file,
571 by Martin Pool
- new --diff-options to pass options through to external
83
                  diff_opts):
568 by Martin Pool
- start adding support for showing diffs by calling out to
84
    """Display a diff by calling out to the external diff program."""
85
    import sys
86
    
87
    if to_file != sys.stdout:
88
        raise NotImplementedError("sorry, can't send external diff other than to stdout yet",
89
                                  to_file)
90
581 by Martin Pool
- make sure any bzr output is flushed before
91
    # make sure our own output is properly ordered before the diff
92
    to_file.flush()
93
568 by Martin Pool
- start adding support for showing diffs by calling out to
94
    from tempfile import NamedTemporaryFile
571 by Martin Pool
- new --diff-options to pass options through to external
95
    import os
568 by Martin Pool
- start adding support for showing diffs by calling out to
96
97
    oldtmpf = NamedTemporaryFile()
98
    newtmpf = NamedTemporaryFile()
99
100
    try:
101
        # TODO: perhaps a special case for comparing to or from the empty
102
        # sequence; can just use /dev/null on Unix
103
104
        # TODO: if either of the files being compared already exists as a
105
        # regular named file (e.g. in the working directory) then we can
106
        # compare directly to that, rather than copying it.
107
108
        oldtmpf.writelines(oldlines)
109
        newtmpf.writelines(newlines)
110
111
        oldtmpf.flush()
112
        newtmpf.flush()
113
571 by Martin Pool
- new --diff-options to pass options through to external
114
        if not diff_opts:
115
            diff_opts = []
116
        diffcmd = ['diff',
1740.2.5 by Aaron Bentley
Merge from bzr.dev
117
                   '--label', old_filename,
571 by Martin Pool
- new --diff-options to pass options through to external
118
                   oldtmpf.name,
1740.2.5 by Aaron Bentley
Merge from bzr.dev
119
                   '--label', new_filename,
571 by Martin Pool
- new --diff-options to pass options through to external
120
                   newtmpf.name]
121
122
        # diff only allows one style to be specified; they don't override.
123
        # note that some of these take optargs, and the optargs can be
124
        # directly appended to the options.
125
        # this is only an approximate parser; it doesn't properly understand
126
        # the grammar.
127
        for s in ['-c', '-u', '-C', '-U',
128
                  '-e', '--ed',
129
                  '-q', '--brief',
130
                  '--normal',
131
                  '-n', '--rcs',
132
                  '-y', '--side-by-side',
133
                  '-D', '--ifdef']:
134
            for j in diff_opts:
135
                if j.startswith(s):
136
                    break
137
            else:
138
                continue
139
            break
140
        else:
141
            diffcmd.append('-u')
142
                  
143
        if diff_opts:
144
            diffcmd.extend(diff_opts)
145
146
        rc = os.spawnvp(os.P_WAIT, 'diff', diffcmd)
147
        
148
        if rc != 0 and rc != 1:
149
            # returns 1 if files differ; that's OK
150
            if rc < 0:
151
                msg = 'signal %d' % (-rc)
152
            else:
153
                msg = 'exit code %d' % rc
154
                
155
            raise BzrError('external diff failed with %s; command: %r' % (rc, diffcmd))
568 by Martin Pool
- start adding support for showing diffs by calling out to
156
    finally:
157
        oldtmpf.close()                 # and delete
158
        newtmpf.close()
159
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
160
161
@deprecated_function(zero_eight)
1432 by Robert Collins
branch: namespace
162
def show_diff(b, from_spec, specific_files, external_diff_options=None,
1185.35.28 by Aaron Bentley
Support diff with two branches as input.
163
              revision2=None, output=None, b2=None):
619 by Martin Pool
doc
164
    """Shortcut for showing the diff to the working tree.
165
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
166
    Please use show_diff_trees instead.
167
619 by Martin Pool
doc
168
    b
169
        Branch.
170
171
    revision
1432 by Robert Collins
branch: namespace
172
        None for 'basis tree', or otherwise the old revision to compare against.
619 by Martin Pool
doc
173
    
174
    The more general form is show_diff_trees(), where the caller
175
    supplies any two trees.
176
    """
1092.1.47 by Robert Collins
make show_diff redirectable
177
    if output is None:
178
        import sys
179
        output = sys.stdout
475 by Martin Pool
- rewrite diff using compare_trees()
180
1432 by Robert Collins
branch: namespace
181
    if from_spec is None:
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
182
        old_tree = b.bzrdir.open_workingtree()
1185.35.28 by Aaron Bentley
Support diff with two branches as input.
183
        if b2 is None:
1534.4.35 by Robert Collins
Give branch its own basis tree and last_revision methods; deprecated branch.working_tree()
184
            old_tree = old_tree = old_tree.basis_tree()
329 by Martin Pool
- refactor command functions into command classes
185
    else:
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
186
        old_tree = b.repository.revision_tree(from_spec.in_history(b).rev_id)
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
187
1185.11.5 by John Arbash Meinel
Merged up-to-date against mainline, still broken.
188
    if revision2 is None:
1185.35.28 by Aaron Bentley
Support diff with two branches as input.
189
        if b2 is None:
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
190
            new_tree = b.bzrdir.open_workingtree()
1185.35.28 by Aaron Bentley
Support diff with two branches as input.
191
        else:
1508.1.19 by Robert Collins
Give format3 working trees their own last-revision marker.
192
            new_tree = b2.bzrdir.open_workingtree()
974.1.26 by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472
193
    else:
1185.67.2 by Aaron Bentley
Renamed Branch.storage to Branch.repository
194
        new_tree = b.repository.revision_tree(revision2.in_history(b).rev_id)
329 by Martin Pool
- refactor command functions into command classes
195
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
196
    return show_diff_trees(old_tree, new_tree, output, specific_files,
197
                           external_diff_options)
571 by Martin Pool
- new --diff-options to pass options through to external
198
199
1551.2.15 by Aaron Bentley
Rename cmd_show_diff to diff_cmd_helper
200
def diff_cmd_helper(tree, specific_files, external_diff_options, 
1684.1.6 by Martin Pool
(patch) --diff-prefix option (goffredo, alexander)
201
                    old_revision_spec=None, new_revision_spec=None,
202
                    old_label='a/', new_label='b/'):
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
203
    """Helper for cmd_diff.
204
205
   tree 
206
        A WorkingTree
207
208
    specific_files
209
        The specific files to compare, or None
210
211
    external_diff_options
212
        If non-None, run an external diff, and pass it these options
213
1551.2.14 by Aaron Bentley
Updated argument names, DRY fixes.
214
    old_revision_spec
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
215
        If None, use basis tree as old revision, otherwise use the tree for
216
        the specified revision. 
217
1551.2.14 by Aaron Bentley
Updated argument names, DRY fixes.
218
    new_revision_spec
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
219
        If None, use working tree as new revision, otherwise use the tree for
220
        the specified revision.
221
    
222
    The more general form is show_diff_trees(), where the caller
223
    supplies any two trees.
224
    """
225
    import sys
226
    output = sys.stdout
1551.2.14 by Aaron Bentley
Updated argument names, DRY fixes.
227
    def spec_tree(spec):
228
        revision_id = spec.in_store(tree.branch).rev_id
229
        return tree.branch.repository.revision_tree(revision_id)
230
    if old_revision_spec is None:
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
231
        old_tree = tree.basis_tree()
232
    else:
1551.2.14 by Aaron Bentley
Updated argument names, DRY fixes.
233
        old_tree = spec_tree(old_revision_spec)
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
234
1551.2.14 by Aaron Bentley
Updated argument names, DRY fixes.
235
    if new_revision_spec is None:
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
236
        new_tree = tree
237
    else:
1551.2.14 by Aaron Bentley
Updated argument names, DRY fixes.
238
        new_tree = spec_tree(new_revision_spec)
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
239
1551.2.14 by Aaron Bentley
Updated argument names, DRY fixes.
240
    return show_diff_trees(old_tree, new_tree, sys.stdout, specific_files,
1684.1.6 by Martin Pool
(patch) --diff-prefix option (goffredo, alexander)
241
                           external_diff_options,
242
                           old_label=old_label, new_label=new_label)
1551.2.13 by Aaron Bentley
Got diff working properly with checkouts
243
571 by Martin Pool
- new --diff-options to pass options through to external
244
245
def show_diff_trees(old_tree, new_tree, to_file, specific_files=None,
1684.1.6 by Martin Pool
(patch) --diff-prefix option (goffredo, alexander)
246
                    external_diff_options=None,
247
                    old_label='a/', new_label='b/'):
550 by Martin Pool
- Refactor diff code into one that works purely on
248
    """Show in text form the changes from one tree to another.
249
250
    to_files
251
        If set, include only changes to these files.
571 by Martin Pool
- new --diff-options to pass options through to external
252
253
    external_diff_options
254
        If set, use an external GNU diff and pass these options.
550 by Martin Pool
- Refactor diff code into one that works purely on
255
    """
1543.1.1 by Denys Duchier
lock operations for trees - use them for diff
256
    old_tree.lock_read()
257
    try:
258
        new_tree.lock_read()
259
        try:
260
            return _show_diff_trees(old_tree, new_tree, to_file,
1684.1.6 by Martin Pool
(patch) --diff-prefix option (goffredo, alexander)
261
                                    specific_files, external_diff_options,
262
                                    old_label=old_label, new_label=new_label)
1543.1.1 by Denys Duchier
lock operations for trees - use them for diff
263
        finally:
264
            new_tree.unlock()
265
    finally:
266
        old_tree.unlock()
267
268
269
def _show_diff_trees(old_tree, new_tree, to_file,
1684.1.6 by Martin Pool
(patch) --diff-prefix option (goffredo, alexander)
270
                     specific_files, external_diff_options, 
271
                     old_label='a/', new_label='b/' ):
329 by Martin Pool
- refactor command functions into command classes
272
1740.2.5 by Aaron Bentley
Merge from bzr.dev
273
    # GNU Patch uses the epoch date to detect files that are being added
274
    # or removed in a diff.
275
    EPOCH_DATE = '1970-01-01 00:00:00 +0000'
1706.1.2 by James Henstridge
Simplify logic a little
276
329 by Martin Pool
- refactor command functions into command classes
277
    # TODO: Generation of pseudo-diffs for added/deleted files could
278
    # be usefully made into a much faster special case.
279
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
280
    _raise_if_doubly_unversioned(specific_files, old_tree, new_tree)
281
571 by Martin Pool
- new --diff-options to pass options through to external
282
    if external_diff_options:
283
        assert isinstance(external_diff_options, basestring)
284
        opts = external_diff_options.split()
285
        def diff_file(olab, olines, nlab, nlines, to_file):
286
            external_diff(olab, olines, nlab, nlines, to_file, opts)
287
    else:
288
        diff_file = internal_diff
289
    
478 by Martin Pool
- put back support for running diff or status on
290
    delta = compare_trees(old_tree, new_tree, want_unchanged=False,
483 by Martin Pool
- change 'file_list' to more explanatory 'specific_files'
291
                          specific_files=specific_files)
475 by Martin Pool
- rewrite diff using compare_trees()
292
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
293
    has_changes = 0
475 by Martin Pool
- rewrite diff using compare_trees()
294
    for path, file_id, kind in delta.removed:
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
295
        has_changes = 1
1732.1.7 by John Arbash Meinel
Instead of iterating randomly in both trees, _compare_trees now iterates in order on both trees simultaneously.
296
        print >>to_file, '=== removed %s %r' % (kind, path.encode('utf8'))
1740.2.5 by Aaron Bentley
Merge from bzr.dev
297
        old_name = '%s%s\t%s' % (old_label, path,
298
                                 _patch_header_date(old_tree, file_id, path))
299
        new_name = '%s%s\t%s' % (new_label, path, EPOCH_DATE)
300
        old_tree.inventory[file_id].diff(diff_file, old_name, old_tree,
301
                                         new_name, None, None, to_file)
475 by Martin Pool
- rewrite diff using compare_trees()
302
    for path, file_id, kind in delta.added:
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
303
        has_changes = 1
1732.1.7 by John Arbash Meinel
Instead of iterating randomly in both trees, _compare_trees now iterates in order on both trees simultaneously.
304
        print >>to_file, '=== added %s %r' % (kind, path.encode('utf8'))
1740.2.5 by Aaron Bentley
Merge from bzr.dev
305
        old_name = '%s%s\t%s' % (old_label, path, EPOCH_DATE)
306
        new_name = '%s%s\t%s' % (new_label, path,
307
                                 _patch_header_date(new_tree, file_id, path))
308
        new_tree.inventory[file_id].diff(diff_file, new_name, new_tree,
309
                                         old_name, None, None, to_file, 
1399.1.4 by Robert Collins
move diff and symlink conditionals into inventory.py from diff.py
310
                                         reverse=True)
1398 by Robert Collins
integrate in Gustavos x-bit patch
311
    for (old_path, new_path, file_id, kind,
312
         text_modified, meta_modified) in delta.renamed:
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
313
        has_changes = 1
1398 by Robert Collins
integrate in Gustavos x-bit patch
314
        prop_str = get_prop_change(meta_modified)
315
        print >>to_file, '=== renamed %s %r => %r%s' % (
1711.2.28 by John Arbash Meinel
Fix up bzrlib.diff now that compare_trees is returning unicode paths.
316
                    kind, old_path.encode('utf8'),
317
                    new_path.encode('utf8'), prop_str)
1740.2.5 by Aaron Bentley
Merge from bzr.dev
318
        old_name = '%s%s\t%s' % (old_label, old_path,
319
                                 _patch_header_date(old_tree, file_id,
320
                                                    old_path))
321
        new_name = '%s%s\t%s' % (new_label, new_path,
322
                                 _patch_header_date(new_tree, file_id,
323
                                                    new_path))
324
        _maybe_diff_file_or_symlink(old_name, old_tree, file_id,
325
                                    new_name, new_tree,
1092.2.9 by Robert Collins
bugfix _maybe_diff, the test was not catching the error
326
                                    text_modified, kind, to_file, diff_file)
1398 by Robert Collins
integrate in Gustavos x-bit patch
327
    for path, file_id, kind, text_modified, meta_modified in delta.modified:
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
328
        has_changes = 1
1398 by Robert Collins
integrate in Gustavos x-bit patch
329
        prop_str = get_prop_change(meta_modified)
1732.1.7 by John Arbash Meinel
Instead of iterating randomly in both trees, _compare_trees now iterates in order on both trees simultaneously.
330
        print >>to_file, '=== modified %s %r%s' % (kind, path.encode('utf8'), prop_str)
1740.2.5 by Aaron Bentley
Merge from bzr.dev
331
        old_name = '%s%s\t%s' % (old_label, path,
332
                                 _patch_header_date(old_tree, file_id, path))
333
        new_name = '%s%s\t%s' % (new_label, path,
334
                                 _patch_header_date(new_tree, file_id, path))
1398 by Robert Collins
integrate in Gustavos x-bit patch
335
        if text_modified:
1740.2.5 by Aaron Bentley
Merge from bzr.dev
336
            _maybe_diff_file_or_symlink(old_name, old_tree, file_id,
337
                                        new_name, new_tree,
1398 by Robert Collins
integrate in Gustavos x-bit patch
338
                                        True, kind, to_file, diff_file)
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
339
1490 by Robert Collins
Implement a 'bzr push' command, with saved locations; update diff to return 1.
340
    return has_changes
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
341
342
1740.2.5 by Aaron Bentley
Merge from bzr.dev
343
def _patch_header_date(tree, file_id, path):
344
    """Returns a timestamp suitable for use in a patch header."""
345
    tm = time.gmtime(tree.get_file_mtime(file_id, path))
346
    return time.strftime('%Y-%m-%d %H:%M:%S +0000', tm)
347
348
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
349
def _raise_if_doubly_unversioned(specific_files, old_tree, new_tree):
350
    """Complain if paths are not versioned in either tree."""
1662.1.12 by Martin Pool
Translate unknown sftp errors to PathError, no NoSuchFile
351
    if not specific_files:
1658.1.10 by Martin Pool
diff on unversiond files should give an error (Malone #3619)
352
        return
1658.1.9 by Martin Pool
Give an error for bzr diff on an nonexistent file (Malone #3619)
353
    old_unversioned = old_tree.filter_unversioned_files(specific_files)
354
    new_unversioned = new_tree.filter_unversioned_files(specific_files)
355
    unversioned = old_unversioned.intersection(new_unversioned)
356
    if unversioned:
357
        raise errors.PathsNotVersionedError(sorted(unversioned))
1092.3.4 by Robert Collins
update symlink branch to integration
358
    
1092.2.6 by Robert Collins
symlink support updated to work
359
1662.1.9 by Martin Pool
Give a clear error for bzr status of an unversioned, nonexistent file. (Malone #3619)
360
def _raise_if_nonexistent(paths, old_tree, new_tree):
361
    """Complain if paths are not in either inventory or tree.
362
363
    It's OK with the files exist in either tree's inventory, or 
364
    if they exist in the tree but are not versioned.
365
    
366
    This can be used by operations such as bzr status that can accept
367
    unknown or ignored files.
368
    """
369
    mutter("check paths: %r", paths)
370
    if not paths:
371
        return
372
    s = old_tree.filter_unversioned_files(paths)
373
    s = new_tree.filter_unversioned_files(s)
374
    s = [path for path in s if not new_tree.has_filename(path)]
375
    if s:
376
        raise errors.PathsDoNotExist(sorted(s))
377
378
1398 by Robert Collins
integrate in Gustavos x-bit patch
379
def get_prop_change(meta_modified):
380
    if meta_modified:
381
        return " (properties changed)"
382
    else:
383
        return  ""
384
385
1740.2.5 by Aaron Bentley
Merge from bzr.dev
386
def _maybe_diff_file_or_symlink(old_path, old_tree, file_id,
387
                                new_path, new_tree, text_modified,
1092.2.9 by Robert Collins
bugfix _maybe_diff, the test was not catching the error
388
                                kind, to_file, diff_file):
1092.2.6 by Robert Collins
symlink support updated to work
389
    if text_modified:
1399.1.4 by Robert Collins
move diff and symlink conditionals into inventory.py from diff.py
390
        new_entry = new_tree.inventory[file_id]
391
        old_tree.inventory[file_id].diff(diff_file,
1740.2.5 by Aaron Bentley
Merge from bzr.dev
392
                                         old_path, old_tree,
393
                                         new_path, new_entry, 
1399.1.4 by Robert Collins
move diff and symlink conditionals into inventory.py from diff.py
394
                                         new_tree, to_file)