~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/bundle/serializer/v08.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-07-07 21:30:06 UTC
  • mfrom: (5333.1.2 better_pyqt_include)
  • Revision ID: pqm@pqm.ubuntu.com-20100707213006-lriphkkbzwwrl7ne
(jameinel) Use a better list of PyQt includes and excludes. (Gary van der
 Merwe)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006 Canonical Ltd
 
1
# Copyright (C) 2005, 2006, 2009 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
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
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
"""Serializer factory for reading and writing bundles.
18
18
"""
19
19
 
20
20
import os
21
21
 
22
 
from bzrlib import errors
 
22
from bzrlib import (
 
23
    errors,
 
24
    ui,
 
25
    )
23
26
from bzrlib.bundle.serializer import (BundleSerializer,
24
 
                                      BUNDLE_HEADER,
 
27
                                      _get_bundle_header,
25
28
                                     )
26
29
from bzrlib.bundle.serializer import binary_diff
27
30
from bzrlib.bundle.bundle_data import (RevisionInfo, BundleInfo, BundleTree)
28
31
from bzrlib.diff import internal_diff
29
32
from bzrlib.osutils import pathjoin
30
 
from bzrlib.progress import DummyProgress
31
33
from bzrlib.revision import NULL_REVISION
32
 
import bzrlib.ui
33
34
from bzrlib.testament import StrictTestament
34
35
from bzrlib.timestamp import (
35
36
    format_highres_date,
119
120
        source.lock_read()
120
121
        try:
121
122
            self._write_main_header()
122
 
            pb = DummyProgress()
 
123
            pb = ui.ui_factory.nested_progress_bar()
123
124
            try:
124
125
                self._write_revisions(pb)
125
126
            finally:
126
 
                pass
127
 
                #pb.finished()
 
127
                pb.finished()
128
128
        finally:
129
129
            source.unlock()
130
130
 
 
131
    def write_bundle(self, repository, target, base, fileobj):
 
132
        return self._write_bundle(repository, target, base, fileobj)
 
133
 
131
134
    def _write_main_header(self):
132
135
        """Write the header for the changes"""
133
136
        f = self.to_file
134
 
        f.write(BUNDLE_HEADER)
135
 
        f.write('0.8\n')
 
137
        f.write(_get_bundle_header('0.8'))
136
138
        f.write('#\n')
137
139
 
138
140
    def _write(self, key, value, indent=1, trailing_space_when_empty=False):
144
146
            If this parameter is True, and value is the empty string, we will
145
147
            write an extra space.
146
148
        """
147
 
        assert indent > 0, 'indentation must be greater than 0'
 
149
        if indent < 1:
 
150
            raise ValueError('indentation must be greater than 0')
148
151
        f = self.to_file
149
152
        f.write('#' + (' ' * indent))
150
153
        f.write(key.encode('utf-8'))
180
183
 
181
184
        i_max = len(self.revision_ids)
182
185
        for i, rev_id in enumerate(self.revision_ids):
183
 
            pb.update("Generating revsion data", i, i_max)
 
186
            pb.update("Generating revision data", i, i_max)
184
187
            rev = self.source.get_revision(rev_id)
185
188
            if rev_id == last_rev_id:
186
189
                rev_tree = last_rev_tree
203
206
            else:
204
207
                base_tree = self.source.revision_tree(base_id)
205
208
            force_binary = (i != 0)
206
 
            self._write_revision(rev, rev_tree, base_id, base_tree, 
 
209
            self._write_revision(rev, rev_tree, base_id, base_tree,
207
210
                                 explicit_base, force_binary)
208
211
 
209
212
            last_rev_id = base_id
210
213
            last_rev_tree = base_tree
211
214
 
212
215
    def _testament_sha1(self, revision_id):
213
 
        return StrictTestament.from_revision(self.source, 
 
216
        return StrictTestament.from_revision(self.source,
214
217
                                             revision_id).as_sha1()
215
218
 
216
 
    def _write_revision(self, rev, rev_tree, base_rev, base_tree, 
 
219
    def _write_revision(self, rev, rev_tree, base_rev, base_tree,
217
220
                        explicit_base, force_binary):
218
221
        """Write out the information for a revision."""
219
222
        def w(key, value):
238
241
            for name, value in sorted(rev.properties.items()):
239
242
                self._write(name, value, indent=3,
240
243
                            trailing_space_when_empty=True)
241
 
        
 
244
 
242
245
        # Add an extra blank space at the end
243
246
        self.to_file.write('\n')
244
247
 
251
254
        self.to_file.write(' // '.join(p_texts).encode('utf-8'))
252
255
        self.to_file.write('\n')
253
256
 
254
 
    def _write_delta(self, new_tree, old_tree, default_revision_id, 
 
257
    def _write_delta(self, new_tree, old_tree, default_revision_id,
255
258
                     force_binary):
256
259
        """Write out the changes between the trees."""
257
260
        DEVNULL = '/dev/null'
274
277
                old_lines = tree_lines(old_tree, require_text=True)
275
278
                new_lines = tree_lines(new_tree, require_text=True)
276
279
                action.write(self.to_file)
277
 
                internal_diff(old_path, old_lines, new_path, new_lines, 
 
280
                internal_diff(old_path, old_lines, new_path, new_lines,
278
281
                              self.to_file)
279
282
            except errors.BinaryFile:
280
283
                old_lines = tree_lines(old_tree, require_text=False)
281
284
                new_lines = tree_lines(new_tree, require_text=False)
282
285
                action.add_property('encoding', 'base64')
283
286
                action.write(self.to_file)
284
 
                binary_diff(old_path, old_lines, new_path, new_lines, 
 
287
                binary_diff(old_path, old_lines, new_path, new_lines,
285
288
                            self.to_file)
286
289
 
287
290
        def finish_action(action, file_id, kind, meta_modified, text_modified,
305
308
 
306
309
        for path, file_id, kind in delta.added:
307
310
            action = Action('added', [kind, path], [('file-id', file_id)])
308
 
            meta_modified = (kind=='file' and 
 
311
            meta_modified = (kind=='file' and
309
312
                             new_tree.is_executable(file_id))
310
313
            finish_action(action, file_id, kind, meta_modified, True,
311
314
                          DEVNULL, path)
329
332
                continue
330
333
            old_rev = getattr(old_tree.inventory[ie.file_id], 'revision', None)
331
334
            if new_rev != old_rev:
332
 
                action = Action('modified', [ie.kind, 
 
335
                action = Action('modified', [ie.kind,
333
336
                                             new_tree.id2path(ie.file_id)])
334
337
                action.add_utf8_property('last-changed', ie.revision)
335
338
                action.write(self.to_file)
347
350
        object.__init__(self)
348
351
        self.from_file = iter(from_file)
349
352
        self._next_line = None
350
 
        
 
353
 
351
354
        self.info = self._get_info()
352
355
        # We put the actual inventory ids in the footer, so that the patch
353
356
        # is easier to read for humans.
458
461
        else:
459
462
            # What do we do with a key we don't recognize
460
463
            raise errors.MalformedHeader('Unknown Key: "%s"' % key)
461
 
    
 
464
 
462
465
    def _read_many(self, indent):
463
466
        """If a line ends with no entry, that means that it should be
464
467
        followed with multiple lines of values.
501
504
            elif line.startswith('... '):
502
505
                action += line[len('... '):-1].decode('utf-8')
503
506
 
504
 
            if (self._next_line is not None and 
 
507
            if (self._next_line is not None and
505
508
                self._next_line.startswith('===')):
506
509
                return action, lines, True
507
510
            elif self._next_line is None or self._next_line.startswith('#'):
513
516
                lines.append(line)
514
517
 
515
518
        return action, lines, False
516
 
            
 
519
 
517
520
    def _read_patches(self):
518
521
        do_continue = True
519
522
        revision_actions = []
521
524
            action, lines, do_continue = self._read_one_patch()
522
525
            if action is not None:
523
526
                revision_actions.append((action, lines))
524
 
        assert self.info.revisions[-1].tree_actions is None
 
527
        if self.info.revisions[-1].tree_actions is not None:
 
528
            raise AssertionError()
525
529
        self.info.revisions[-1].tree_actions = revision_actions
526
530
 
527
531
    def _read_footer(self):