8
8
from bzrlib.bundle import bundle_data, serializer
11
class ContainerWriter(pack.ContainerWriter):
13
def add_multiparent_record(self, names, mp_bytes):
14
self.add_bytes_record(names, mp_bytes)
15
def add_record(self, add_method, name, parents, text):
11
class ContainerWriter(object):
13
def __init__(self, write_func):
14
self._container = pack.ContainerWriter(write_func)
17
self._container.begin()
22
def add_multiparent_record(self, mp_bytes, parents, repo_kind,
23
revision_id, file_id):
24
self._add_record(mp_bytes, parents, repo_kind, revision_id, file_id)
26
def add_fulltext_record(self, bytes, parents, repo_kind, revision_id,
28
self._add_record(bytes, parents, repo_kind, revision_id, file_id)
31
def encode_parents(parents):
32
return ' '.join(parents) + '\n'
35
def encode_name(name_kind, revision_id, file_id=None):
36
assert name_kind in ('revision', 'file', 'inventory')
37
if name_kind in ('revision', 'inventory'):
38
assert file_id is None
40
assert file_id is not None
41
if file_id is not None:
42
file_tail = '/' + file_id
45
return name_kind + ':' + revision_id + file_tail
47
def _add_record(self, bytes, parents, repo_kind, revision_id, file_id):
48
name = self.encode_name(repo_kind, revision_id, file_id)
16
49
parents = self.encode_parents(parents)
18
add_method(text, [name])
50
bytes = parents + bytes
51
self._container.add_bytes_record(bytes, [name])
21
54
class BundleSerializerV10(serializer.BundleSerializer):
38
71
self.add_mp_records(container, 'inventory', None, inv_vf, revision_ids)
39
72
for revision_id in revision_ids:
40
73
parents = repository.revision_parents(revision_id)
41
container_name = self.encode_name('revision', revision_id)
42
74
revision_text = repository.get_revision_xml(revision_id)
43
self.add_record(container.add_bytes_record, container_name,
44
parents, revision_text)
75
container.add_fulltext_record(revision_text, parents,
76
'revision', revision_id, None)
46
78
fileobj.write(s.getvalue().encode('bz2').encode('base-64'))
49
def add_mp_records(self, container, name_kind, file_id, vf,
51
for file_revision_id in file_revision_ids:
52
parents = vf.get_parents(file_revision_id)
53
text = ''.join(vf.make_mpdiff(file_revision_id).to_patch())
54
container_name = self.encode_name(name_kind, file_revision_id,
56
self.add_record(container.add_multiparent_record,
57
container_name, parents, text)
59
def encode_parents(self, parents):
60
return ' '.join(parents) + '\n'
80
def add_mp_records(self, container, repo_kind, file_id, vf,
82
for revision_id in revision_ids:
83
parents = vf.get_parents(revision_id)
84
text = ''.join(vf.make_mpdiff(revision_id).to_patch())
85
container.add_multiparent_record(text, parents, repo_kind,
62
88
def decode_parents(self, parents_line):
63
89
parents = parents_line.rstrip('\n').split(' ')
73
def encode_name(name_kind, revision_id, file_id=None):
74
assert name_kind in ('revision', 'file', 'inventory')
75
if name_kind in ('revision', 'inventory'):
76
assert file_id is None
78
assert file_id is not None
79
if file_id is not None:
80
file_tail = '/' + file_id
83
return name_kind + ':' + revision_id + file_tail
86
99
def decode_name(name):
87
100
kind, revisionfile_id = name.split(':', 1)
88
101
revisionfile_id = revisionfile_id.split('/')
108
121
def install_revisions(self, repository):
109
122
repository.lock_write()
111
ri = RevisionInstaller(self._fileobj, self._serializer, repository)
124
ri = RevisionInstaller(self._get_container_reader(),
125
self._serializer, repository)
112
126
return ri.install()
114
128
repository.unlock()
130
def _get_container_reader(self):
131
self._fileobj.seek(0)
132
line = self._fileobj.readline()
134
self._fileobj.readline()
135
s = StringIO(self._fileobj.read().decode('base-64').decode('bz2'))
136
return pack.ContainerReader(s.read)
116
138
def _get_real_revisions(self):
117
139
from bzrlib import xml7
118
self._fileobj.seek(0)
119
140
if self.__real_revisions is None:
120
141
self.__real_revisions = []
121
line = self._fileobj.readline()
123
line = self._fileobj.readline()
124
container = pack.ContainerReader(self._fileobj.read)
142
container = self._get_container_reader()
125
143
for (name,), bytes in container.iter_records():
126
144
kind, revision_id, file_id = self._serializer.decode_name(name)
127
145
if kind == 'revision':
149
167
class RevisionInstaller(object):
151
def __init__(self, fileobj, serializer, repository):
153
line = fileobj.readline()
156
s = StringIO(fileobj.read().decode('base-64').decode('bz2'))
157
self._container = pack.ContainerReader(s.read)
169
def __init__(self, container, serializer, repository):
170
self._container = container
158
171
self._serializer = serializer
159
172
self._repository = repository