~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/repository.py

  • Committer: Aaron Bentley
  • Date: 2008-04-24 04:58:42 UTC
  • mfrom: (3377 +trunk)
  • mto: This revision was merged to the branch mainline in revision 3380.
  • Revision ID: aaron@aaronbentley.com-20080424045842-0cajl9v6s4u52kaw
Merge 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):
595
592
        Returns a set of the present revisions.
596
593
        """
597
594
        result = []
598
 
        for id in revision_ids:
599
 
            if self.has_revision(id):
600
 
               result.append(id)
601
 
        return result
 
595
        graph = self.get_graph()
 
596
        parent_map = graph.get_parent_map(revision_ids)
 
597
        # The old API returned a list, should this actually be a set?
 
598
        return parent_map.keys()
602
599
 
603
600
    @staticmethod
604
601
    def create(a_bzrdir):
1281
1278
                setdefault(file_id, set()).add(revision_id)
1282
1279
        return result
1283
1280
 
1284
 
    def fileids_altered_by_revision_ids(self, revision_ids):
 
1281
    def fileids_altered_by_revision_ids(self, revision_ids, _inv_weave=None):
1285
1282
        """Find the file ids and versions affected by revisions.
1286
1283
 
1287
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.
1288
1287
        :return: a dictionary mapping altered file-ids to an iterable of
1289
1288
        revision_ids. Each altered file-ids has the exact revision_ids that
1290
1289
        altered it listed explicitly.
1291
1290
        """
1292
1291
        selected_revision_ids = set(revision_ids)
1293
 
        w = self.get_inventory_weave()
 
1292
        w = _inv_weave or self.get_inventory_weave()
1294
1293
        pb = ui.ui_factory.nested_progress_bar()
1295
1294
        try:
1296
1295
            return self._find_file_ids_from_xml_inventory_lines(
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()
2038
2035
        return not self.control_files._transport.has('no-working-trees')
2039
2036
 
2040
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
 
2041
2049
class RepositoryFormatRegistry(registry.Registry):
2042
2050
    """Registry of RepositoryFormats."""
2043
2051
 
2377
2385
        :return: A set of revision ids.
2378
2386
        """
2379
2387
        graph = self.source.get_graph()
 
2388
        target_graph = self.target.get_graph()
2380
2389
        missing_revs = set()
2381
2390
        # ensure we don't pay silly lookup costs.
2382
2391
        revision_ids = frozenset(revision_ids)
2391
2400
                absent_ids = set(revision_ids.intersection(ghosts))
2392
2401
                # If all absent_ids are present in target, no error is needed.
2393
2402
                absent_ids.difference_update(
2394
 
                    self.target.has_revisions(absent_ids))
 
2403
                    set(target_graph.get_parent_map(absent_ids)))
2395
2404
                if absent_ids:
2396
2405
                    raise errors.NoSuchRevision(self.source, absent_ids.pop())
2397
2406
            # we don't care about other ghosts as we can't fetch them and
2398
2407
            # haven't been asked to.
2399
2408
            next_revs = set(next_revs)
2400
2409
            # we always have NULL_REVISION present.
2401
 
            have_revs = self.target.has_revisions(next_revs).union(null_set)
 
2410
            have_revs = set(target_graph.get_parent_map(next_revs)).union(null_set)
2402
2411
            missing_revs.update(next_revs - have_revs)
2403
2412
            searcher.stop_searching_any(have_revs)
2404
2413
        return searcher.get_result()
2550
2559
        # weave specific optimised path:
2551
2560
        try:
2552
2561
            self.target.set_make_working_trees(self.source.make_working_trees())
2553
 
        except NotImplementedError:
 
2562
        except (errors.RepositoryUpgradeRequired, NotImplemented):
2554
2563
            pass
2555
2564
        # FIXME do not peek!
2556
2565
        if self.source.control_files._transport.listable():