/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/revisiontree.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-07-20 08:56:45 UTC
  • mfrom: (4526.9.23 apply-inventory-delta)
  • Revision ID: pqm@pqm.ubuntu.com-20090720085645-54mtgybxua0yx6hw
(robertc) Add checks for inventory deltas which try to ensure that
        deltas that are not an exact fit are not applied. (Robert
        Collins, bug 397705, bug 367633)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006-2010 Canonical Ltd
 
1
# Copyright (C) 2005, 2007 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
20
20
 
21
21
from bzrlib import (
22
22
    errors,
 
23
    osutils,
23
24
    revision,
 
25
    symbol_versioning,
24
26
    tree,
25
27
    )
26
28
 
101
103
 
102
104
    def get_file_mtime(self, file_id, path=None):
103
105
        ie = self._inventory[file_id]
104
 
        try:
105
 
            revision = self._repository.get_revision(ie.revision)
106
 
        except errors.NoSuchRevision:
107
 
            raise errors.FileTimestampUnavailable(self.id2path(file_id))
 
106
        revision = self._repository.get_revision(ie.revision)
108
107
        return revision.timestamp
109
108
 
110
109
    def is_executable(self, file_id, path=None):
243
242
        lookup_trees = [self.source]
244
243
        if extra_trees:
245
244
             lookup_trees.extend(extra_trees)
246
 
        # The ids of items we need to examine to insure delta consistency.
247
 
        precise_file_ids = set()
248
 
        discarded_changes = {}
249
245
        if specific_files == []:
250
246
            specific_file_ids = []
251
247
        else:
252
248
            specific_file_ids = self.target.paths2ids(specific_files,
253
249
                lookup_trees, require_versioned=require_versioned)
 
250
 
254
251
        # FIXME: It should be possible to delegate include_unchanged handling
255
252
        # to CHKInventory.iter_changes and do a better job there -- vila
256
253
        # 20090304
257
 
        changed_file_ids = set()
 
254
        if include_unchanged:
 
255
            changed_file_ids = []
258
256
        for result in self.target.inventory.iter_changes(self.source.inventory):
259
 
            if specific_file_ids is not None:
260
 
                file_id = result[0]
261
 
                if file_id not in specific_file_ids:
262
 
                    # A change from the whole tree that we don't want to show yet.
263
 
                    # We may find that we need to show it for delta consistency, so
264
 
                    # stash it.
265
 
                    discarded_changes[result[0]] = result
266
 
                    continue
267
 
                new_parent_id = result[4][1]
268
 
                precise_file_ids.add(new_parent_id)
 
257
            if (specific_file_ids is not None
 
258
                and not result[0] in specific_file_ids):
 
259
                # CHKMap.iter_changes is clean and fast. Better filter out
 
260
                # the specific files *after* it did its job.
 
261
                continue
269
262
            yield result
270
 
            changed_file_ids.add(result[0])
271
 
        if specific_file_ids is not None:
272
 
            for result in self._handle_precise_ids(precise_file_ids,
273
 
                changed_file_ids, discarded_changes=discarded_changes):
274
 
                yield result
 
263
            if include_unchanged:
 
264
                # Keep track of yielded results (cheaper than building the
 
265
                # whole inventory).
 
266
                changed_file_ids.append(result[0])
275
267
        if include_unchanged:
276
268
            # CHKMap avoid being O(tree), so we go to O(tree) only if
277
269
            # required to.