~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/delta.py

  • Committer: Robert Collins
  • Date: 2007-03-05 03:10:21 UTC
  • mto: (2255.11.4 dirstate)
  • mto: This revision was merged to the branch mainline in revision 2322.
  • Revision ID: robertc@robertcollins.net-20070305031021-ypbakvagbivyw5mu
Teach delta.report_changes about unversioned files, removing all inventory access during status --short.

Show diffs side-by-side

added added

removed removed

Lines of Context:
269
269
    """Report changes between two trees"""
270
270
 
271
271
    def __init__(self, output=None, suppress_root_add=True,
272
 
                 output_file=None):
 
272
                 output_file=None, unversioned_filter=None):
273
273
        """Constructor
274
274
 
275
275
        :param output: a function with the signature of trace.note, i.e.
278
278
            (i.e. when a tree has just been initted)
279
279
        :param output_file: If supplied, a file-like object to write to.
280
280
            Only one of output and output_file may be supplied.
 
281
        :param unversioned_filter: A filter function to be called on 
 
282
            unversioned files. This should return True to ignore a path.
 
283
            By default, no filtering takes place.
281
284
        """
282
285
        if output_file is not None:
283
286
            if output is not None:
294
297
                             'created': 'N',
295
298
                             'modified': 'M',
296
299
                             'deleted': 'D'}
297
 
        self.versioned_map = {'added': '+',
298
 
                              'unchanged': ' ',
299
 
                              'removed': '-'}
 
300
        self.versioned_map = {'added': '+', # versioned target
 
301
                              'unchanged': ' ', # versioned in both
 
302
                              'removed': '-', # versioned in source
 
303
                              'unversioned': '?', # versioned in neither
 
304
                              }
 
305
        self.unversioned_filter = unversioned_filter
300
306
 
301
307
    def report(self, file_id, paths, versioned, renamed, modified, exe_change,
302
308
               kind):
304
310
 
305
311
        :param file_id: The file_id of the file
306
312
        :param path: The old and new paths as generated by Tree._iter_changes.
307
 
        :param versioned: may be 'added', 'removed', or 'unchanged'
 
313
        :param versioned: may be 'added', 'removed', 'unchanged', or
 
314
            'unversioned.
308
315
        :param renamed: may be True or False
309
316
        :param modified: may be 'created', 'deleted', 'kind changed',
310
317
            'modified' or 'unchanged'.
314
321
        """
315
322
        if paths[1] == '' and versioned == 'added' and self.suppress_root_add:
316
323
            return
 
324
        if versioned == 'unversioned':
 
325
            # skip ignored unversioned files if needed.
 
326
            if self.unversioned_filter is not None:
 
327
                if self.unversioned_filter(paths[1]):
 
328
                    return
 
329
            # dont show a content change in the output.
 
330
            modified = 'unchanged'
317
331
        # we show both paths in the following situations:
318
332
        # the file versioning is unchanged AND
319
333
        # ( the path is different OR
363
377
        generated by Tree._iter_changes
364
378
    :param reporter: The ChangeReporter that will report the changes.
365
379
    """
 
380
    versioned_change_map = {
 
381
        (True, True)  : 'unchanged',
 
382
        (True, False) : 'removed',
 
383
        (False, True) : 'added',
 
384
        (False, False): 'unversioned',
 
385
        }
366
386
    for (file_id, path, content_change, versioned, parent_id, name, kind,
367
387
         executable) in change_iterator:
368
388
        exe_change = False
387
407
                modified = "unchanged"
388
408
            if kind[1] == "file":
389
409
                exe_change = (executable[0] != executable[1])
390
 
        if versioned[0] != versioned[1]:
391
 
            if versioned[0]:
392
 
                versioned_change = "removed"
393
 
            else:
394
 
                versioned_change = "added"
395
 
        else:
396
 
            versioned_change = "unchanged"
 
410
        versioned_change = versioned_change_map[versioned]
397
411
        reporter.report(file_id, path, versioned_change, renamed, modified,
398
412
                        exe_change, kind)