~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/weave.py

  • Committer: Martin Pool
  • Date: 2005-08-18 07:51:58 UTC
  • Revision ID: mbp@sourcefrog.net-20050818075157-5f69075fa843d558
- add space to store revision-id in weave files

Show diffs side-by-side

added added

removed removed

Lines of Context:
51
51
 
52
52
 
53
53
 
54
 
 
55
54
# TODO: Perhaps have copy method for Weave instances?
56
55
 
57
56
# XXX: If we do weaves this way, will a merge still behave the same
63
62
# binaries, perhaps by naively splitting on \n or perhaps using
64
63
# something like a rolling checksum.
65
64
 
66
 
# TODO: Track version names as well as indexes. 
67
 
 
68
65
# TODO: End marker for each version so we can stop reading?
69
66
 
70
67
# TODO: Check that no insertion occurs inside a deletion that was
84
81
# have slight specializations for different ways its used: annotate,
85
82
# basis for add, get, etc.
86
83
 
 
84
# TODO: Perhaps the API should work only in names to hide the integer
 
85
# indexes from the user?
 
86
 
 
87
 
87
88
 
88
89
import sha
89
90
 
173
174
        each version; the parent's parents are implied.
174
175
 
175
176
    _sha1s
176
 
        List of hex SHA-1 of each version, or None if not recorded.
 
177
        List of hex SHA-1 of each version.
 
178
 
 
179
    _names
 
180
        List of symbolic names for each version.  Each should be unique.
 
181
 
 
182
    _name_map
 
183
        For each name, the version number.
177
184
    """
178
185
 
179
 
    __slots__ = ['_weave', '_parents', '_sha1s']
 
186
    __slots__ = ['_weave', '_parents', '_sha1s', '_names', '_name_map']
180
187
    
181
188
    def __init__(self):
182
189
        self._weave = []
183
190
        self._parents = []
184
191
        self._sha1s = []
 
192
        self._names = []
 
193
        self._name_map = {}
185
194
 
186
195
 
187
196
    def __eq__(self, other):
188
197
        if not isinstance(other, Weave):
189
198
            return False
190
199
        return self._parents == other._parents \
191
 
               and self._weave == other._weave
 
200
               and self._weave == other._weave \
 
201
               and self._sha1s == other._sha1s 
 
202
 
192
203
    
193
 
 
194
204
    def __ne__(self, other):
195
205
        return not self.__eq__(other)
196
206
 
 
207
 
 
208
    def lookup(self, name):
 
209
        try:
 
210
            return self._name_map[name]
 
211
        except KeyError:
 
212
            raise WeaveError("name %s not present in weave" % name)
 
213
 
197
214
        
198
 
    def add(self, parents, text):
 
215
    def add(self, name, parents, text):
199
216
        """Add a single text on top of the weave.
200
217
  
201
218
        Returns the index number of the newly added version.
202
219
 
 
220
        name
 
221
            Symbolic name for this version.
 
222
            (Typically the revision-id of the revision that added it.)
 
223
 
203
224
        parents
204
225
            List or set of direct parent version numbers.
205
226
            
206
227
        text
207
228
            Sequence of lines to be added in the new version."""
208
229
 
 
230
        assert isinstance(name, basestring)
 
231
        if name in self._name_map:
 
232
            raise WeaveError("name %r already present in weave" % name)
 
233
        
209
234
        self._check_versions(parents)
210
235
        ## self._check_lines(text)
211
236
        new_version = len(self._parents)
215
240
        sha1 = s.hexdigest()
216
241
        del s
217
242
 
218
 
        # if we abort after here the weave will be corrupt
219
 
        self._parents.append(frozenset(parents))
 
243
        # if we abort after here the (in-memory) weave will be corrupt because only
 
244
        # some fields are updated
 
245
        self._parents.append(parents[:])
220
246
        self._sha1s.append(sha1)
 
247
        self._names.append(name)
 
248
        self._name_map[name] = new_version
221
249
 
222
250
            
223
251
        if not parents:
683
711
 
684
712
def weave_toc(w):
685
713
    """Show the weave's table-of-contents"""
686
 
    print '%6s %40s %20s' % ('ver', 'sha1', 'parents')
687
 
    for i in (6, 40, 20):
 
714
    print '%6s %50s %10s %10s' % ('ver', 'name', 'sha1', 'parents')
 
715
    for i in (6, 50, 10, 10):
688
716
        print '-' * i,
689
717
    print
690
718
    for i in range(w.numversions()):
691
719
        sha1 = w._sha1s[i]
692
 
        print '%6d %40s %s' % (i, sha1, ' '.join(map(str, w._parents[i])))
 
720
        name = w._names[i]
 
721
        parent_str = ' '.join(map(str, w._parents[i]))
 
722
        print '%6d %-50.50s %10.10s %s' % (i, name, sha1, parent_str)
693
723
 
694
724
 
695
725