~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/repository.py

Merge from bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
420
420
        # implementation could give us bad output from readlines() so this is
421
421
        # not a guarantee of safety. What would be better is always checking
422
422
        # the content during test suite execution. RBC 20070912
423
 
        try:
424
 
            return versionedfile.add_lines_with_ghosts(
425
 
                self._new_revision_id, parents, new_lines,
426
 
                nostore_sha=nostore_sha, random_id=self.random_revid,
427
 
                check_content=False)[0:2]
428
 
        finally:
429
 
            versionedfile.clear_cache()
 
423
        return versionedfile.add_lines_with_ghosts(
 
424
            self._new_revision_id, parents, new_lines,
 
425
            nostore_sha=nostore_sha, random_id=self.random_revid,
 
426
            check_content=False)[0:2]
430
427
 
431
428
 
432
429
class RootCommitBuilder(CommitBuilder):
551
548
                                                     self.get_inventory_weave())
552
549
            else:
553
550
                # yes, this is not suitable for adding with ghosts.
554
 
                self.add_inventory(revision_id, inv, rev.parent_ids)
 
551
                rev.inventory_sha1 = self.add_inventory(revision_id, inv, 
 
552
                                                        rev.parent_ids)
555
553
        self._revision_store.add_revision(rev, self.get_transaction())
556
554
 
557
555
    def _add_revision_text(self, revision_id, text):
1280
1278
                setdefault(file_id, set()).add(revision_id)
1281
1279
        return result
1282
1280
 
1283
 
    def fileids_altered_by_revision_ids(self, revision_ids):
 
1281
    def fileids_altered_by_revision_ids(self, revision_ids, _inv_weave=None):
1284
1282
        """Find the file ids and versions affected by revisions.
1285
1283
 
1286
1284
        :param revisions: an iterable containing revision ids.
 
1285
        :param _inv_weave: The inventory weave from this repository or None.
 
1286
            If None, the inventory weave will be opened automatically.
1287
1287
        :return: a dictionary mapping altered file-ids to an iterable of
1288
1288
        revision_ids. Each altered file-ids has the exact revision_ids that
1289
1289
        altered it listed explicitly.
1290
1290
        """
1291
1291
        selected_revision_ids = set(revision_ids)
1292
 
        w = self.get_inventory_weave()
 
1292
        w = _inv_weave or self.get_inventory_weave()
1293
1293
        pb = ui.ui_factory.nested_progress_bar()
1294
1294
        try:
1295
1295
            return self._find_file_ids_from_xml_inventory_lines(
1338
1338
        """
1339
1339
        # All revisions, to find inventory parents.
1340
1340
        if ancestors is None:
1341
 
            # self.get_revision_graph_with_ghosts().get_ancestors() wasn't
1342
 
            # returning any ghosts anyway.
1343
 
            ancestors = self.get_revision_graph()
 
1341
            graph = self.get_graph()
 
1342
            ancestors = graph.get_parent_map(self.all_revision_ids())
1344
1343
        if text_key_references is None:
1345
1344
            text_key_references = self.find_text_key_references()
1346
1345
        pb = ui.ui_factory.nested_progress_bar()
1450
1449
        # processed?
1451
1450
        self.lock_read()
1452
1451
        inv_w = self.get_inventory_weave()
1453
 
        inv_w.enable_cache()
1454
1452
 
1455
1453
        # file ids that changed
1456
 
        file_ids = self.fileids_altered_by_revision_ids(revision_ids)
 
1454
        file_ids = self.fileids_altered_by_revision_ids(revision_ids, inv_w)
1457
1455
        count = 0
1458
1456
        num_file_ids = len(file_ids)
1459
1457
        for file_id, altered_versions in file_ids.iteritems():
1467
1465
 
1468
1466
        # inventory
1469
1467
        yield ("inventory", None, revision_ids)
1470
 
        inv_w.clear_cache()
1471
1468
 
1472
1469
        # signatures
1473
1470
        revisions_with_signatures = set()
1552
1549
        return self.get_revision(revision_id).inventory_sha1
1553
1550
 
1554
1551
    @needs_read_lock
 
1552
    @deprecated_method(symbol_versioning.one_four)
1555
1553
    def get_revision_graph(self, revision_id=None):
1556
1554
        """Return a dictionary containing the revision graph.
1557
1555
 
2037
2035
        return not self.control_files._transport.has('no-working-trees')
2038
2036
 
2039
2037
 
 
2038
class MetaDirVersionedFileRepository(MetaDirRepository):
 
2039
    """Repositories in a meta-dir, that work via versioned file objects."""
 
2040
 
 
2041
    def __init__(self, _format, a_bzrdir, control_files, _revision_store, control_store, text_store):
 
2042
        super(MetaDirVersionedFileRepository, self).__init__(_format, a_bzrdir,
 
2043
            control_files, _revision_store, control_store, text_store)
 
2044
        _revision_store.get_scope = self.get_transaction
 
2045
        control_store.get_scope = self.get_transaction
 
2046
        text_store.get_scope = self.get_transaction
 
2047
 
 
2048
 
2040
2049
class RepositoryFormatRegistry(registry.Registry):
2041
2050
    """Registry of RepositoryFormats."""
2042
2051
 
2549
2558
        # weave specific optimised path:
2550
2559
        try:
2551
2560
            self.target.set_make_working_trees(self.source.make_working_trees())
2552
 
        except NotImplementedError:
 
2561
        except (errors.RepositoryUpgradeRequired, NotImplemented):
2553
2562
            pass
2554
2563
        # FIXME do not peek!
2555
2564
        if self.source.control_files._transport.listable():
3139
3148
                if correct_parents != knit_parents:
3140
3149
                    wrong_parents[revision_id] = (knit_parents, correct_parents)
3141
3150
        return wrong_parents, unused_versions
 
3151
 
 
3152
 
 
3153
def _old_get_graph(repository, revision_id):
 
3154
    """DO NOT USE. That is all. I'm serious."""
 
3155
    graph = repository.get_graph()
 
3156
    revision_graph = dict(((key, value) for key, value in
 
3157
        graph.iter_ancestry([revision_id]) if value is not None))
 
3158
    return _strip_NULL_ghosts(revision_graph)
 
3159
 
 
3160
 
 
3161
def _strip_NULL_ghosts(revision_graph):
 
3162
    """Also don't use this. more compatibility code for unmigrated clients."""
 
3163
    # Filter ghosts, and null:
 
3164
    if _mod_revision.NULL_REVISION in revision_graph:
 
3165
        del revision_graph[_mod_revision.NULL_REVISION]
 
3166
    for key, parents in revision_graph.items():
 
3167
        revision_graph[key] = tuple(parent for parent in parents if parent
 
3168
            in revision_graph)
 
3169
    return revision_graph