~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/weavefile.py

  • Committer: Martin Pool
  • Date: 2005-07-11 05:46:55 UTC
  • Revision ID: mbp@sourcefrog.net-20050711054655-47ea25e1f75a8813
- ignore tmp dir

Show diffs side-by-side

added added

removed removed

Lines of Context:
26
26
There is one format marker followed by a blank line, followed by a
27
27
series of version headers, followed by the weave itself.
28
28
 
29
 
Each version marker has 'v' and the version, then 'i' and the included
30
 
previous versions.
 
29
Each version marker has 'i' and the included previous versions, then
 
30
'1' and the SHA-1 of the text, if known.  The inclusions do not need
 
31
to list versions included by a parent.
31
32
 
32
33
The weave is bracketed by 'w' and 'W' lines, and includes the '{}[]'
33
34
processing instructions.  Lines of text are prefixed by '.' if the
37
38
# TODO: When extracting a single version it'd be enough to just pass
38
39
# an iterator returning the weave lines...
39
40
 
40
 
FORMAT_1 = '# bzr weave file v1\n'
41
 
 
 
41
FORMAT_1 = '# bzr weave file v3\n'
42
42
 
43
43
 
44
44
def write_weave(weave, f, format=None):
53
53
    print >>f, FORMAT_1,
54
54
 
55
55
    for version, included in enumerate(weave._v):
56
 
        print >>f, 'v', version
57
56
        if included:
58
 
            included = list(included)
59
 
            included.sort()
60
 
            assert included[0] >= 0
61
 
            assert included[-1] < version
 
57
            # mininc = weave.minimal_parents(version)
 
58
            mininc = included
62
59
            print >>f, 'i',
63
 
            for i in included:
 
60
            for i in mininc:
64
61
                print >>f, i,
65
62
            print >>f
66
63
        else:
67
64
            print >>f, 'i'
 
65
        print >>f, '1', weave._sha1s[version]
68
66
        print >>f
69
67
 
70
68
    print >>f, 'w'
100
98
    if l != FORMAT_1:
101
99
        raise WeaveFormatError('invalid weave file header: %r' % l)
102
100
 
103
 
    v_cnt = 0
 
101
    ver = 0
104
102
    while True:
105
103
        l = f.readline()
106
 
        if l.startswith('v '):
107
 
            ver = int(l[2:])
108
 
            if ver != v_cnt:
109
 
                raise WeaveFormatError('version %d!=%d out of order'
110
 
                                       % (ver, v_cnt))
111
 
            v_cnt += 1
112
 
            
113
 
            l = f.readline()[:-1]
114
 
            if l[0] != 'i':
115
 
                raise WeaveFormatError('unexpected line %r' % l)
 
104
        if l[0] == 'i':
 
105
            ver += 1
 
106
 
116
107
            if len(l) > 2:
117
108
                included = map(int, l[2:].split(' '))
118
109
                w._addversion(included)
119
110
            else:
120
111
                w._addversion(None)
121
 
            assert f.readline() == '\n'
 
112
 
 
113
            l = f.readline()[:-1]
 
114
            assert l.startswith('1 ')
 
115
            w._sha1s.append(l[2:])
 
116
                
 
117
            l = f.readline()
 
118
            assert l == '\n'
122
119
        elif l == 'w\n':
123
120
            break
124
121
        else:
129
126
        if l == 'W\n':
130
127
            break
131
128
        elif l.startswith('. '):
132
 
            w._l.append(l[2:])           # include newline
 
129
            w._l.append(intern(l[2:]))  # include newline
133
130
        elif l.startswith(', '):
134
131
            w._l.append(l[2:-1])        # exclude newline
135
132
        else:
136
133
            assert l[0] in '{}[]', l
137
134
            assert l[1] == ' ', l
138
 
            w._l.append((l[0], int(l[2:])))
 
135
            w._l.append((intern(l[0]), int(l[2:])))
139
136
 
140
137
    return w
141
138