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