~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to read_changeset.py

  • Committer: John Arbash Meinel
  • Date: 2005-07-14 00:52:22 UTC
  • mto: (0.5.85) (1185.82.1 bzr-w-changeset)
  • mto: This revision was merged to the branch mainline in revision 1738.
  • Revision ID: john@arbash-meinel.com-20050714005222-36fd6b3ce894d7de
Tests pass. Now ChangesetTree has it's own inventory.

Show diffs side-by-side

added added

removed removed

Lines of Context:
290
290
                    ' Unable validate %d hashes' % len(missing))
291
291
        mutter('Verified %d sha hashes for the changeset.' % count)
292
292
 
293
 
    def _create_inventory(self, tree):
294
 
        """Build up the inventory entry for the ChangesetTree.
295
 
 
296
 
        TODO: This sort of thing should probably end up part of
297
 
        ChangesetTree, but since it doesn't handle meta-information
298
 
        yet, we need to do it here. (We need the ChangesetInfo,
299
 
        specifically the text_ids)
300
 
        """
301
 
        from os.path import dirname, basename
302
 
        from bzrlib.inventory import Inventory, InventoryEntry, ROOT_ID
303
 
 
304
 
        # TODO: deal with trees having a unique ROOT_ID
305
 
        root_id = ROOT_ID
306
 
        inv = Inventory()
307
 
        for file_id in tree:
308
 
            if file_id == root_id:
309
 
                continue
310
 
            path = tree.id2path(file_id)
311
 
            parent_path = dirname(path)
312
 
            if path == '':
313
 
                parent_id = root_id
314
 
            else:
315
 
                parent_id = tree.path2id(parent_path)
316
 
 
317
 
            if self.info.text_ids.has_key(file_id):
318
 
                text_id = self.info.text_ids[file_id]
319
 
            else:
320
 
                # If we don't have the text_id in the local map
321
 
                # that means the file didn't exist in the changeset
322
 
                # so we just use the old text_id.
323
 
                text_id = tree.base_tree.inventory[file_id].text_id
324
 
            name = basename(path)
325
 
            kind = tree.get_kind(file_id)
326
 
            ie = InventoryEntry(file_id, name, kind, parent_id, text_id=text_id)
327
 
            ie.text_size, ie.text_sha1 = tree.get_size_and_sha1(file_id)
328
 
            if (ie.text_size is None) and (kind != 'directory'):
329
 
                raise BzrError('Got a text_size of None for file_id %r' % file_id)
330
 
            inv.add(ie)
331
 
        return inv
332
 
 
333
293
    def _validate_inventory(self, inv):
334
294
        """At this point we should have generated the ChangesetTree,
335
295
        so build up an inventory, and make sure the hashes match.
348
308
        # Target revision is the last entry in the real_revisions list
349
309
        rev = self.info.real_revisions[-1]
350
310
        if sha1 != rev.inventory_sha1:
 
311
            open(',,bogus-inv', 'wb').write(sio.getvalue())
351
312
            raise BzrError('Inventory sha hash mismatch.')
352
313
 
353
314
        
354
 
    def get_info_tree_inv(self, branch):
 
315
    def get_changeset(self, branch):
355
316
        """Return the meta information, and a Changeset tree which can
356
317
        be used to populate the local stores and working tree, respectively.
357
318
        """
362
323
        inv = tree.inventory
363
324
        self._validate_inventory(inv)
364
325
 
365
 
        return self.info, tree, inv
 
326
        return self.info, tree
366
327
 
367
328
    def _next(self):
368
329
        """yield the next line, but secretly
489
450
        if self._next_line is None or self._next_line[:1] == '#':
490
451
            return None, [], False
491
452
 
492
 
        line = self._next().next()
493
 
        if line[:3] != '***':
494
 
            raise MalformedPatches('The first line of all patches'
495
 
                ' should be a bzr meta line "***"'
496
 
                ': %r' % line)
497
 
        action = line[4:-1]
498
 
 
499
 
        if self._next_line is None or self._next_line[:1] == '#':
500
 
            return action, [], False
 
453
        first = True
501
454
        lines = []
502
455
        for line in self._next():
503
 
            lines.append(line)
504
 
 
 
456
            if first:
 
457
                if line[:3] != '***':
 
458
                    raise MalformedPatches('The first line of all patches'
 
459
                        ' should be a bzr meta line "***"'
 
460
                        ': %r' % line)
 
461
                action = line[4:-1]
505
462
            if self._next_line is not None and self._next_line[:3] == '***':
506
463
                return action, lines, True
507
464
            elif self._next_line is None or self._next_line[:1] == '#':
508
465
                return action, lines, False
 
466
 
 
467
            if first:
 
468
                first = False
 
469
            else:
 
470
                lines.append(line)
 
471
 
509
472
        return action, lines, False
510
473
            
511
474
    def _read_patches(self):
619
582
                        ': %r' % extra)
620
583
            file_id = decode(info[1][8:])
621
584
 
622
 
            if len(info) > 2:
623
 
                text_id = get_text_id(info[2], file_id, kind)
624
 
            else:
625
 
                text_id = get_text_id(None, file_id, kind)
626
585
            tree.note_id(file_id, path, kind)
 
586
            if kind == 'directory':
 
587
                return
 
588
            if len(info) > 2:
 
589
                text_id = get_text_id(info[2], file_id, kind)
 
590
            else:
 
591
                text_id = get_text_id(None, file_id, kind)
627
592
            tree.note_patch(path, ''.join(lines))
628
593
 
629
594
        def modified(kind, extra, lines):
677
642
                   won't know about until after the changeset is parsed.)
678
643
    """
679
644
    cr = ChangesetReader(from_file)
680
 
    return cr.get_info_tree_inv(branch)
 
645
    return cr.get_changeset(branch)
681
646
 
682
647
class ChangesetTree(Tree):
683
648
    def __init__(self, base_tree):
886
851
            inv = Inventory()
887
852
 
888
853
        def add_entry(file_id):
889
 
            if file_id in inv:
890
 
                return
891
854
            path = self.id2path(file_id)
892
855
            if path is None:
893
856
                return
894
857
            parent_path = dirname(path)
895
 
            if path == '':
 
858
            if parent_path == '':
896
859
                parent_id = root_id
897
860
            else:
898
861
                parent_id = self.path2id(parent_path)
899
862
 
900
 
            if parent_id not in inv:
901
 
                add_entry(parent_id)
902
 
 
903
 
            text_id = self.get_text_id(file_id)
904
 
 
905
 
            name = basename(path)
906
863
            kind = self.get_kind(file_id)
 
864
            if kind == 'directory':
 
865
                text_id = None
 
866
            else:
 
867
                text_id = self.get_text_id(file_id)
 
868
 
 
869
            name = basename(path)
907
870
            ie = InventoryEntry(file_id, name, kind, parent_id, text_id=text_id)
908
 
            ie.text_size, ie.text_sha1 = self.get_size_and_sha1(file_id)
 
871
            if kind == 'directory':
 
872
                ie.text_size, ie.text_sha1 = None, None
 
873
            else:
 
874
                ie.text_size, ie.text_sha1 = self.get_size_and_sha1(file_id)
909
875
            if (ie.text_size is None) and (kind != 'directory'):
910
876
                raise BzrError('Got a text_size of None for file_id %r' % file_id)
911
877
            inv.add(ie)
913
879
        for path, ie in base_inv.iter_entries():
914
880
            add_entry(ie.file_id)
915
881
        for file_id in self._new_id_r.iterkeys():
 
882
            if file_id in inv:
 
883
                continue
 
884
            path = self.id2path(file_id)
 
885
            parent_path = dirname(path)
 
886
            if parent_path != '':
 
887
                parent_id = self.path2id(parent_path)
 
888
                if parent_id not in inv:
 
889
                    add_entry(parent_id)
 
890
 
916
891
            add_entry(file_id)
917
892
 
918
893
        return inv