~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/versionedfile.py

  • Committer: Robert Collins
  • Date: 2006-03-02 03:12:34 UTC
  • mto: (1594.2.4 integration)
  • mto: This revision was merged to the branch mainline in revision 1596.
  • Revision ID: robertc@robertcollins.net-20060302031234-cf6b75961f27c5df
InterVersionedFile implemented.

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
 
31
31
from bzrlib.inter import InterObject
32
32
from bzrlib.symbol_versioning import *
 
33
from bzrlib.transport.memory import MemoryTransport
 
34
from bzrlib.tsort import topo_sort
33
35
 
34
36
 
35
37
class VersionedFile(object):
85
87
        already present in file history."""
86
88
        raise NotImplementedError(self.clone_text)
87
89
 
 
90
    def create_empty(self, name, transport, mode=None):
 
91
        """Create a new versioned file of this exact type.
 
92
 
 
93
        :param name: the file name
 
94
        :param transport: the transport
 
95
        :param mode: optional file mode.
 
96
        """
 
97
        raise NotImplementedError(self.create_empty)
 
98
 
88
99
    def get_text(self, version_id):
89
100
        """Return version contents as a text string.
90
101
 
112
123
            version_ids = [version_ids]
113
124
        raise NotImplementedError(self.get_ancestry)
114
125
        
115
 
    def get_graph(self, version_id):
116
 
        """Return a graph.
117
 
 
118
 
        Must raise RevisionNotPresent if version is not present in
119
 
        file history."""
120
 
        raise NotImplementedError(self.get_graph)
 
126
    def get_graph(self):
 
127
        """Return a graph for the entire versioned file."""
 
128
        result = {}
 
129
        for version in self.versions():
 
130
            result[version] = self.get_parents(version)
 
131
        return result
121
132
 
122
133
    @deprecated_method(zero_eight)
123
134
    def parent_names(self, version):
155
166
 
156
167
        Must raise RevisionNotPresent if any of the specified versions
157
168
        are not present in the other files history."""
158
 
        raise NotImplementedError(self.join)
 
169
        return InterVersionedFile.get(other, self).join(pb, msg, version_ids)
159
170
 
160
171
    def walk(self, version_ids=None):
161
172
        """Walk the versioned file as a weave-like structure, for
289
300
    _optimisers = set()
290
301
    """The available optimised InterVersionedFile types."""
291
302
 
 
303
    def join(self, pb=None, msg=None, version_ids=None):
 
304
        """Integrate versions from self.source into self.target.
 
305
 
 
306
        If version_ids is None all versions from source should be
 
307
        incorporated into this versioned file.
 
308
 
 
309
        Must raise RevisionNotPresent if any of the specified versions
 
310
        are not present in the other files history.
 
311
        """
 
312
        # the default join: 
 
313
        # - make a temporary versioned file of type target
 
314
        # - insert the source content into it one at a time
 
315
        # - join them
 
316
        # Make a new target-format versioned file. 
 
317
        temp_source = self.target.create_empty("temp", MemoryTransport())
 
318
        graph = self.source.get_graph()
 
319
        order = topo_sort(graph.items())
 
320
        for version in order:
 
321
            temp_source.add_lines(version,
 
322
                                  self.source.get_parents(version),
 
323
                                  self.source.get_lines(version))
 
324
        
 
325
        # this should hit the native code path for target
 
326
        return self.target.join(temp_source, pb, msg, version_ids)
 
327
 
292
328
 
293
329
class InterVersionedFileTestProviderAdapter(object):
294
330
    """A tool to generate a suite testing multiple inter versioned-file classes.