~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/diff.py

  • Committer: Martin Pool
  • Date: 2005-05-11 08:01:27 UTC
  • Revision ID: mbp@sourcefrog.net-20050511080127-4829697fc2ac64f1
- put back support for running diff or status on 
  only selected files.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# along with this program; if not, write to the Free Software
16
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
17
 
18
 
from sets import Set
 
18
from sets import Set, ImmutableSet
19
19
 
20
20
from trace import mutter
21
21
from errors import BzrError
70
70
def show_diff(b, revision, file_list):
71
71
    import sys
72
72
 
73
 
    if file_list:
74
 
        raise NotImplementedError('diff on restricted files broken at the moment')
75
 
    
76
73
    if revision == None:
77
74
        old_tree = b.basis_tree()
78
75
    else:
92
89
    # TODO: Generation of pseudo-diffs for added/deleted files could
93
90
    # be usefully made into a much faster special case.
94
91
 
95
 
    delta = compare_trees(old_tree, new_tree, want_unchanged=False)
 
92
    delta = compare_trees(old_tree, new_tree, want_unchanged=False,
 
93
                          file_list=file_list)
96
94
 
97
95
    for path, file_id, kind in delta.removed:
98
96
        print '*** removed %s %r' % (kind, path)
201
199
 
202
200
 
203
201
 
204
 
def compare_trees(old_tree, new_tree, want_unchanged):
 
202
def compare_trees(old_tree, new_tree, want_unchanged, file_list=None):
 
203
    """Describe changes from one tree to another.
 
204
 
 
205
    Returns a TreeDelta with details of added, modified, renamed, and
 
206
    deleted entries.
 
207
 
 
208
    The root entry is specifically exempt.
 
209
 
 
210
    This only considers versioned files.
 
211
 
 
212
    want_unchanged
 
213
        If true, also list files unchanged from one version to the next.
 
214
 
 
215
    file_list
 
216
        If true, only check for changes to specified files.        
 
217
    """
205
218
    old_inv = old_tree.inventory
206
219
    new_inv = new_tree.inventory
207
220
    delta = TreeDelta()
208
221
    mutter('start compare_trees')
 
222
 
 
223
    if file_list:
 
224
        file_list = ImmutableSet(file_list)
 
225
 
209
226
    for file_id in old_tree:
210
227
        if file_id in new_tree:
211
228
            kind = old_inv.get_file_kind(file_id)
220
237
            old_path = old_inv.id2path(file_id)
221
238
            new_path = new_inv.id2path(file_id)
222
239
 
 
240
            if file_list:
 
241
                if (old_path not in file_list
 
242
                    and new_path not in file_list):
 
243
                    continue
 
244
 
223
245
            if kind == 'file':
224
246
                old_sha1 = old_tree.get_file_sha1(file_id)
225
247
                new_sha1 = new_tree.get_file_sha1(file_id)
247
269
    for file_id in new_inv:
248
270
        if file_id in old_inv:
249
271
            continue
 
272
        new_path = new_inv.id2path(file_id)
 
273
        if file_list:
 
274
            if new_path not in file_list:
 
275
                continue
250
276
        kind = new_inv.get_file_kind(file_id)
251
 
        delta.added.append((new_inv.id2path(file_id), file_id, kind))
 
277
        delta.added.append((new_path, file_id, kind))
252
278
            
253
279
    delta.removed.sort()
254
280
    delta.added.sort()