~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/branch.py

MergeĀ fromĀ jam-storage.

Show diffs side-by-side

added added

removed removed

Lines of Context:
422
422
    # filesystem access, so that in a later step, we can extricate them to
423
423
    # a separarte ("storage") class.
424
424
    _inventory_weave = None
425
 
    # If set to False (by a plugin, etc) BzrBranch will not set the
426
 
    # mode on created files or directories
427
 
    _set_file_mode = True
428
 
    _set_dir_mode = True
429
425
    
430
426
    # Map some sort of prefix into a namespace
431
427
    # stuff like "revno:10", "revid:", etc.
472
468
        """
473
469
        assert isinstance(transport, Transport), \
474
470
            "%r is not a Transport" % transport
475
 
        self.control_files = LockableFiles(transport, bzrlib.BZRDIR, 'branch-lock')
 
471
        # TODO: jam 20060103 We create a clone of this transport at .bzr/
 
472
        #       and then we forget about it, should we keep a handle to it?
 
473
        self._base = transport.base
 
474
        self.control_files = LockableFiles(transport.clone(bzrlib.BZRDIR),
 
475
                                           'branch-lock')
476
476
        if init:
477
477
            self._make_control()
478
478
        self._check_format(relax_version_check)
479
 
        self._find_modes()
480
 
        self.repository = Repository(transport, self._branch_format,
481
 
                                     dir_mode=self._dir_mode,
482
 
                                     file_mode=self._file_mode)
 
479
        self.repository = Repository(transport, self._branch_format)
483
480
 
484
481
    def __str__(self):
485
482
        return '%s(%r)' % (self.__class__.__name__, self.base)
501
498
            self.cache_root = None
502
499
 
503
500
    def _get_base(self):
504
 
        if self.control_files._transport:
505
 
            return self.control_files._transport.base
506
 
        return None
 
501
        return self._base
507
502
 
508
503
    base = property(_get_base, doc="The URL for the root of this branch.")
509
504
 
534
529
        """See Branch.abspath."""
535
530
        return self.control_files._transport.abspath(name)
536
531
 
537
 
    def _find_modes(self, path=None):
538
 
        """Determine the appropriate modes for files and directories."""
539
 
        # RBC 20060103 FIXME where does this belong ?
540
 
        try:
541
 
            if path is None:
542
 
                path = ''
543
 
                #self.control_files._rel_controlfilename('')
544
 
            st = self.control_files._transport.stat(path)
545
 
        except errors.TransportNotPossible:
546
 
            self._dir_mode = 0755
547
 
            self._file_mode = 0644
548
 
        else:
549
 
            self._dir_mode = st.st_mode & 07777
550
 
            # Remove the sticky and execute bits for files
551
 
            self._file_mode = self._dir_mode & ~07111
552
 
        if not self._set_dir_mode:
553
 
            self._dir_mode = None
554
 
        if not self._set_file_mode:
555
 
            self._file_mode = None
556
 
 
557
532
    def _make_control(self):
558
533
        from bzrlib.inventory import Inventory
559
534
        from bzrlib.weavefile import write_weave_v5
570
545
        bzrlib.weavefile.write_weave_v5(Weave(), sio)
571
546
        empty_weave = sio.getvalue()
572
547
 
573
 
        # Since we don't have a .bzr directory, inherit the
574
 
        # mode from the root directory
575
 
        self._find_modes('.')
576
 
 
577
548
        dirs = ['', 'revision-store', 'weaves']
578
549
        files = [('README', 
579
550
            "This is a Bazaar-NG control directory.\n"
587
558
            ('inventory.weave', empty_weave),
588
559
            ('ancestry.weave', empty_weave)
589
560
        ]
590
 
        cfn = self.control_files._rel_controlfilename
591
 
        self.control_files._transport.mkdir_multi([cfn(d) for d in dirs],
592
 
                                                  mode=self._dir_mode)
 
561
        cfe = self.control_files._escape
 
562
        self.control_files._transport.mkdir_multi([cfe(d) for d in dirs],
 
563
                mode=self.control_files._dir_mode)
593
564
        self.control_files.lock_write()
594
565
        try:
595
566
            for file, content in files:
870
841
 
871
842
        return Branch.clone(self, to_location, revision, basis_branch, to_branch_type)
872
843
 
 
844
 
873
845
class ScratchBranch(BzrBranch):
874
846
    """Special test class: a branch that cleans up after itself.
875
847
 
877
849
    >>> isdir(b.base)
878
850
    True
879
851
    >>> bd = b.base
880
 
    >>> b.control_files._transport.__del__()
 
852
    >>> b._transport.__del__()
881
853
    >>> isdir(bd)
882
854
    False
883
855
    """
895
867
        else:
896
868
            super(ScratchBranch, self).__init__(transport)
897
869
 
 
870
        # BzrBranch creates a clone to .bzr and then forgets about the
 
871
        # original transport. A ScratchTransport() deletes itself and
 
872
        # everything underneath it when it goes away, so we need to
 
873
        # grab a local copy to prevent that from happening
 
874
        self._transport = transport
 
875
 
898
876
        for d in dirs:
899
 
            self.control_files._transport.mkdir(d)
 
877
            self._transport.mkdir(d)
900
878
            
901
879
        for f in files:
902
 
            self.control_files._transport.put(f, 'content of %s' % f)
 
880
            self._transport.put(f, 'content of %s' % f)
903
881
 
904
882
    def clone(self):
905
883
        """
906
884
        >>> orig = ScratchBranch(files=["file1", "file2"])
 
885
        >>> os.listdir(orig.base)
 
886
        [u'.bzr', u'file1', u'file2']
907
887
        >>> clone = orig.clone()
908
888
        >>> if os.name != 'nt':
909
889
        ...   os.path.samefile(orig.base, clone.base)
911
891
        ...   orig.base == clone.base
912
892
        ...
913
893
        False
914
 
        >>> os.path.isfile(pathjoin(clone.base, "file1"))
915
 
        True
 
894
        >>> os.listdir(clone.base)
 
895
        [u'.bzr', u'file1', u'file2']
916
896
        """
917
897
        from shutil import copytree
918
898
        from bzrlib.osutils import mkdtemp