~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/versionedfile.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-04-27 01:14:33 UTC
  • mfrom: (1686.1.1 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20060427011433-95634ee1da8a2049
Merge in faster joins from weave to knit.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
# along with this program; if not, write to the Free Software
18
18
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19
19
 
20
 
# Remaing to do is to figure out if get_graph should return a simple
21
 
# map, or a graph object of some kind.
22
 
 
23
 
 
24
20
"""Versioned text file storage api."""
25
21
 
26
22
 
286
282
        """
287
283
        raise NotImplementedError(self.get_ancestry_with_ghosts)
288
284
        
289
 
    def get_graph(self):
290
 
        """Return a graph for the entire versioned file.
 
285
    def get_graph(self, version_ids=None):
 
286
        """Return a graph from the versioned file. 
291
287
        
292
288
        Ghosts are not listed or referenced in the graph.
 
289
        :param version_ids: Versions to select.
 
290
                            None means retreive all versions.
293
291
        """
294
292
        result = {}
295
 
        for version in self.versions():
296
 
            result[version] = self.get_parents(version)
 
293
        if version_ids is None:
 
294
            for version in self.versions():
 
295
                result[version] = self.get_parents(version)
 
296
        else:
 
297
            pending = set(version_ids)
 
298
            while pending:
 
299
                version = pending.pop()
 
300
                if version in result:
 
301
                    continue
 
302
                parents = self.get_parents(version)
 
303
                for parent in parents:
 
304
                    if parent in result:
 
305
                        continue
 
306
                    pending.add(parent)
 
307
                result[version] = parents
297
308
        return result
298
309
 
299
310
    def get_graph_with_ghosts(self):
550
561
            # Make a new target-format versioned file. 
551
562
            temp_source = self.target.create_empty("temp", MemoryTransport())
552
563
            target = temp_source
553
 
        graph = self.source.get_graph()
 
564
        version_ids = self._get_source_version_ids(version_ids, ignore_missing)
 
565
        graph = self.source.get_graph(version_ids)
554
566
        order = topo_sort(graph.items())
555
567
        pb = ui.ui_factory.nested_progress_bar()
556
568
        parent_texts = {}
595
607
        finally:
596
608
            pb.finished()
597
609
 
 
610
    def _get_source_version_ids(self, version_ids, ignore_missing):
 
611
        """Determine the version ids to be used from self.source.
 
612
 
 
613
        :param version_ids: The caller-supplied version ids to check. (None 
 
614
                            for all). If None is in version_ids, it is stripped.
 
615
        :param ignore_missing: if True, remove missing ids from the version 
 
616
                               list. If False, raise RevisionNotPresent on
 
617
                               a missing version id.
 
618
        :return: A set of version ids.
 
619
        """
 
620
        if version_ids is None:
 
621
            # None cannot be in source.versions
 
622
            return set(self.source.versions())
 
623
        else:
 
624
            if ignore_missing:
 
625
                return set(self.source.versions()).intersection(set(version_ids))
 
626
            else:
 
627
                new_version_ids = set()
 
628
                for version in version_ids:
 
629
                    if version is None:
 
630
                        continue
 
631
                    if not self.source.has_version(version):
 
632
                        raise errors.RevisionNotPresent(version, str(self.source))
 
633
                    else:
 
634
                        new_version_ids.add(version)
 
635
                return new_version_ids
 
636
 
598
637
 
599
638
class InterVersionedFileTestProviderAdapter(object):
600
639
    """A tool to generate a suite testing multiple inter versioned-file classes.
634
673
        from bzrlib.weave import WeaveFile
635
674
        from bzrlib.knit import KnitVersionedFile
636
675
        result = []
637
 
        # test the fallback InterVersionedFile from weave to annotated knits
 
676
        # test the fallback InterVersionedFile from annotated knits to weave
638
677
        result.append((InterVersionedFile, 
639
 
                       WeaveFile,
640
 
                       KnitVersionedFile))
 
678
                       KnitVersionedFile,
 
679
                       WeaveFile))
641
680
        for optimiser in InterVersionedFile._optimisers:
642
681
            result.append((optimiser,
643
 
                           optimiser._matching_file_factory,
644
 
                           optimiser._matching_file_factory
 
682
                           optimiser._matching_file_from_factory,
 
683
                           optimiser._matching_file_to_factory
645
684
                           ))
646
685
        # if there are specific combinations we want to use, we can add them 
647
686
        # here.