/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/weavefile.py

  • Committer: Michael Ellerman
  • Date: 2006-03-09 00:24:48 UTC
  • mto: (1610.1.8 bzr.mbp.integration)
  • mto: This revision was merged to the branch mainline in revision 1616.
  • Revision ID: michael@ellerman.id.au-20060309002448-70cce15e3d605130
Make the "ignore line" in the commit message editor the "right" width, so
that if you make your message that wide it won't wrap in bzr log output.
Just as a visual aid.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2005 Canonical Ltd
 
2
 
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License as published by
 
5
# the Free Software Foundation; either version 2 of the License, or
 
6
# (at your option) any later version.
 
7
 
 
8
# This program is distributed in the hope that it will be useful,
 
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
# GNU General Public License for more details.
 
12
 
 
13
# You should have received a copy of the GNU General Public License
 
14
# along with this program; if not, write to the Free Software
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
16
 
 
17
# Author: Martin Pool <mbp@canonical.com>
 
18
 
 
19
 
 
20
 
 
21
 
 
22
"""Store and retrieve weaves in files.
 
23
 
 
24
There is one format marker followed by a blank line, followed by a
 
25
series of version headers, followed by the weave itself.
 
26
 
 
27
Each version marker has
 
28
 
 
29
 'i'   parent version indexes
 
30
 '1'   SHA-1 of text
 
31
 'n'   name
 
32
 
 
33
The inclusions do not need to list versions included by a parent.
 
34
 
 
35
The weave is bracketed by 'w' and 'W' lines, and includes the '{}[]'
 
36
processing instructions.  Lines of text are prefixed by '.' if the
 
37
line contains a newline, or ',' if not.
 
38
"""
 
39
 
 
40
# TODO: When extracting a single version it'd be enough to just pass
 
41
# an iterator returning the weave lines...  We don't really need to
 
42
# deserialize it into memory.
 
43
 
 
44
FORMAT_1 = '# bzr weave file v5\n'
 
45
 
 
46
 
 
47
def write_weave(weave, f, format=None):
 
48
    if format == None or format == 1:
 
49
        return write_weave_v5(weave, f)
 
50
    else:
 
51
        raise ValueError("unknown weave format %r" % format)
 
52
 
 
53
 
 
54
def write_weave_v5(weave, f):
 
55
    """Write weave to file f."""
 
56
    print >>f, FORMAT_1,
 
57
 
 
58
    for version, included in enumerate(weave._parents):
 
59
        if included:
 
60
            # mininc = weave.minimal_parents(version)
 
61
            mininc = included
 
62
            print >>f, 'i',
 
63
            for i in mininc:
 
64
                print >>f, i,
 
65
            print >>f
 
66
        else:
 
67
            print >>f, 'i'
 
68
        print >>f, '1', weave._sha1s[version]
 
69
        print >>f, 'n', weave._names[version]
 
70
        print >>f
 
71
 
 
72
    print >>f, 'w'
 
73
 
 
74
    for l in weave._weave:
 
75
        if isinstance(l, tuple):
 
76
            assert l[0] in '{}[]'
 
77
            if l[0] == '}':
 
78
                print >>f, '}'
 
79
            else:
 
80
                print >>f, '%s %d' % l
 
81
        else: # text line
 
82
            if not l:
 
83
                print >>f, ', '
 
84
            elif l[-1] == '\n':
 
85
                assert l.find('\n', 0, -1) == -1
 
86
                print >>f, '.', l,
 
87
            else:
 
88
                assert l.find('\n') == -1
 
89
                print >>f, ',', l
 
90
 
 
91
    print >>f, 'W'
 
92
 
 
93
 
 
94
 
 
95
def read_weave(f,prelude=False):
 
96
    return read_weave_v5(f,prelude=prelude)
 
97
 
 
98
 
 
99
def read_weave_v5(f,prelude=False):
 
100
    from weave import Weave, WeaveFormatError
 
101
    w = Weave(getattr(f, 'name', None))
 
102
 
 
103
    l = f.readline()
 
104
    if l != FORMAT_1:
 
105
        raise WeaveFormatError('invalid weave file header: %r' % l)
 
106
 
 
107
    ver = 0
 
108
    while True:
 
109
        l = f.readline()
 
110
        if l[0] == 'i':
 
111
            if len(l) > 2:
 
112
                w._parents.append(map(int, l[2:].split(' ')))
 
113
            else:
 
114
                w._parents.append([])
 
115
 
 
116
            l = f.readline()[:-1]
 
117
            assert l.startswith('1 ')
 
118
            w._sha1s.append(l[2:])
 
119
                
 
120
            l = f.readline()
 
121
            assert l.startswith('n ')
 
122
            name = l[2:-1]
 
123
            assert name not in w._name_map
 
124
            w._names.append(name)
 
125
            w._name_map[name] = ver
 
126
                
 
127
            l = f.readline()
 
128
            assert l == '\n'
 
129
 
 
130
            ver += 1
 
131
        elif l == 'w\n':
 
132
            break
 
133
        else:
 
134
            raise WeaveFormatError('unexpected line %r' % l)
 
135
 
 
136
    if prelude:
 
137
        return w
 
138
 
 
139
    while True:
 
140
        l = f.readline()
 
141
        if l == 'W\n':
 
142
            break
 
143
        elif l.startswith('. '):
 
144
            w._weave.append(l[2:])  # include newline
 
145
        elif l.startswith(', '):
 
146
            w._weave.append(l[2:-1])        # exclude newline
 
147
        elif l == '}\n':
 
148
            w._weave.append(('}', None))
 
149
        else:
 
150
            assert l[0] in '{[]', l
 
151
            assert l[1] == ' ', l
 
152
            w._weave.append((intern(l[0]), int(l[2:])))
 
153
 
 
154
    return w
 
155