~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/diff.py

  • Committer: Martin Pool
  • Date: 2005-05-09 03:03:55 UTC
  • Revision ID: mbp@sourcefrog.net-20050509030355-ad6ab558d1362959
- Don't give an error if the trace file can't be opened

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
from sets import Set
19
19
 
20
20
from trace import mutter
21
 
 
 
21
from errors import BzrError
22
22
 
23
23
 
24
24
def diff_trees(old_tree, new_tree):
141
141
 
142
142
 
143
143
def show_diff(b, revision, file_list):
144
 
    import difflib, sys
 
144
    import difflib, sys, types
145
145
    
146
146
    if revision == None:
147
147
        old_tree = b.basis_tree()
245
245
                       fromfile=old_label + old_name + idlabel,
246
246
                       tofile=new_label + new_name)
247
247
        else:
248
 
            bailout("can't represent state %s {%s}" % (file_state, fid))
249
 
 
250
 
 
 
248
            raise BzrError("can't represent state %s {%s}" % (file_state, fid))
 
249
 
 
250
 
 
251
 
 
252
class TreeDelta:
 
253
    """Describes changes from one tree to another.
 
254
 
 
255
    Contains four lists:
 
256
 
 
257
    added
 
258
        (path, id)
 
259
    removed
 
260
        (path, id)
 
261
    renamed
 
262
        (oldpath, newpath, id)
 
263
    modified
 
264
        (path, id)
 
265
 
 
266
    A path may occur in more than one list if it was e.g. deleted
 
267
    under an old id and renamed into place in a new id.
 
268
 
 
269
    Files are listed in either modified or renamed, not both.  In
 
270
    other words, renamed files may also be modified.
 
271
    """
 
272
    def __init__(self):
 
273
        self.added = []
 
274
        self.removed = []
 
275
        self.renamed = []
 
276
        self.modified = []
 
277
 
 
278
 
 
279
def compare_inventories(old_inv, new_inv):
 
280
    """Return a TreeDelta object describing changes between inventories.
 
281
 
 
282
    This only describes changes in the shape of the tree, not the
 
283
    actual texts.
 
284
 
 
285
    This is an alternative to diff_trees() and should probably
 
286
    eventually replace it.
 
287
    """
 
288
    old_ids = old_inv.id_set()
 
289
    new_ids = new_inv.id_set()
 
290
    delta = TreeDelta()
 
291
 
 
292
    delta.removed = [(old_inv.id2path(fid), fid) for fid in (old_ids - new_ids)]
 
293
    delta.removed.sort()
 
294
 
 
295
    delta.added = [(new_inv.id2path(fid), fid) for fid in (new_ids - old_ids)]
 
296
    delta.added.sort()
 
297
 
 
298
    for fid in old_ids & new_ids:
 
299
        old_ie = old_inv[fid]
 
300
        new_ie = new_inv[fid]
 
301
        old_path = old_inv.id2path(fid)
 
302
        new_path = new_inv.id2path(fid)
 
303
 
 
304
        if old_path != new_path:
 
305
            delta.renamed.append((old_path, new_path, fid))
 
306
        elif old_ie.text_sha1 != new_ie.text_sha1:
 
307
            delta.modified.append((new_path, fid))
 
308
 
 
309
    delta.modified.sort()
 
310
    delta.renamed.sort()    
 
311
 
 
312
    return delta