~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/branch.py

  • Committer: Robert Collins
  • Date: 2005-10-07 01:01:07 UTC
  • mfrom: (1185.13.2)
  • Revision ID: robertc@robertcollins.net-20051007010107-fe48434051a15b92
mergeĀ fromĀ upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
 
24
24
 
25
25
import bzrlib
 
26
from bzrlib.inventory import InventoryEntry
 
27
import bzrlib.inventory as inventory
26
28
from bzrlib.trace import mutter, note
27
29
from bzrlib.osutils import (isdir, quotefn, compact_date, rand_bytes, 
28
30
                            rename, splitpath, sha_file, appendpath, 
32
34
                           DivergedBranches, LockError, UnlistableStore,
33
35
                           UnlistableBranch, NoSuchFile)
34
36
from bzrlib.textui import show_status
35
 
from bzrlib.revision import Revision, validate_revision_id, is_ancestor
 
37
from bzrlib.revision import Revision
36
38
from bzrlib.delta import compare_trees
37
39
from bzrlib.tree import EmptyTree, RevisionTree
38
40
from bzrlib.inventory import Inventory
132
134
    def open(base):
133
135
        """Open an existing branch, rooted at 'base' (url)"""
134
136
        t = get_transport(base)
 
137
        mutter("trying to open %r with transport %r", base, t)
135
138
        return _Branch(t)
136
139
 
137
140
    @staticmethod
154
157
        """Subclasses that care about caching should override this, and set
155
158
        up cached stores located under cache_root.
156
159
        """
 
160
        self.cache_root = cache_root
157
161
 
158
162
 
159
163
class _Branch(Branch):
235
239
        self._check_format(relax_version_check)
236
240
 
237
241
        def get_store(name, compressed=True):
 
242
            # FIXME: This approach of assuming stores are all entirely compressed
 
243
            # or entirely uncompressed is tidy, but breaks upgrade from 
 
244
            # some existing branches where there's a mixture; we probably 
 
245
            # still want the option to look for both.
238
246
            relpath = self._rel_controlfilename(name)
239
247
            if compressed:
240
248
                store = CompressedTextStore(self._transport.clone(relpath))
241
249
            else:
242
250
                store = TextStore(self._transport.clone(relpath))
243
 
            if self._transport.should_cache():
244
 
                from meta_store import CachedStore
245
 
                cache_path = os.path.join(self.cache_root, name)
246
 
                os.mkdir(cache_path)
247
 
                store = CachedStore(store, cache_path)
 
251
            #if self._transport.should_cache():
 
252
            #    cache_path = os.path.join(self.cache_root, name)
 
253
            #    os.mkdir(cache_path)
 
254
            #    store = bzrlib.store.CachedStore(store, cache_path)
248
255
            return store
249
256
        def get_weave(name):
250
257
            relpath = self._rel_controlfilename(name)
459
466
            fmt = self.controlfile('branch-format', 'r').read()
460
467
        except NoSuchFile:
461
468
            raise NotBranchError(self.base)
462
 
 
 
469
        mutter("got branch format %r", fmt)
463
470
        if fmt == BZR_BRANCH_FORMAT_5:
464
471
            self._branch_format = 5
465
472
        elif fmt == BZR_BRANCH_FORMAT_4:
578
585
                    # maybe something better?
579
586
                    raise BzrError('cannot add: not a regular file, symlink or directory: %s' % quotefn(f))
580
587
 
581
 
                if kind not in ('file', 'directory', 'symlink'):
582
 
                    raise BzrError('cannot add: not a regular file, symlink or directory: %s' % quotefn(f))
 
588
                if not InventoryEntry.versionable_kind(kind):
 
589
                    raise BzrError('cannot add: not a versionable file ('
 
590
                                   'i.e. regular file, symlink or directory): %s' % quotefn(f))
583
591
 
584
592
                if file_id is None:
585
593
                    file_id = gen_file_id(f)
658
666
            name = os.path.basename(path)
659
667
            if name == "":
660
668
                continue
661
 
            inv.add(InventoryEntry(file_id, name, kind, parent))
 
669
            # fixme, there should be a factory function inv,add_?? 
 
670
            if kind == 'directory':
 
671
                inv.add(inventory.InventoryDirectory(file_id, name, parent))
 
672
            elif kind == 'file':
 
673
                inv.add(inventory.InventoryFile(file_id, name, parent))
 
674
            elif kind == 'symlink':
 
675
                inv.add(inventory.InventoryLink(file_id, name, parent))
 
676
            else:
 
677
                raise BzrError("unknown kind %r" % kind)
662
678
        self._write_inventory(inv)
663
679
 
664
680
    def unknowns(self):
765
781
        # But for now, just hash the contents.
766
782
        return bzrlib.osutils.sha_file(self.get_revision_xml_file(revision_id))
767
783
 
768
 
    def _get_ancestry_weave(self):
769
 
        return self.control_weaves.get_weave('ancestry')
770
 
 
771
784
    def get_ancestry(self, revision_id):
772
785
        """Return a list of revision-ids integrated by a revision.
 
786
        
 
787
        This currently returns a list, but the ordering is not guaranteed:
 
788
        treat it as a set.
773
789
        """
774
 
        # strip newlines
775
790
        if revision_id is None:
776
791
            return [None]
777
 
        w = self._get_ancestry_weave()
778
 
        return [None] + [l[:-1] for l in w.get_iter(w.lookup(revision_id))]
 
792
        w = self.control_weaves.get_weave('inventory')
 
793
        return [None] + map(w.idx_to_name,
 
794
                            w.inclusions([w.lookup(revision_id)]))
779
795
 
780
796
    def get_inventory_weave(self):
781
797
        return self.control_weaves.get_weave('inventory')
989
1005
        """Return a `Tree` for the working copy."""
990
1006
        from bzrlib.workingtree import WorkingTree
991
1007
        # TODO: In the future, WorkingTree should utilize Transport
 
1008
        # RobertCollins 20051003 - I don't think it should - working trees are
 
1009
        # much more complex to keep consistent than our careful .bzr subset.
 
1010
        # instead, we should say that working trees are local only, and optimise
 
1011
        # for that.
992
1012
        return WorkingTree(self._transport.base, self.read_working_inventory())
993
1013
 
994
1014
 
1181
1201
    def add_pending_merge(self, *revision_ids):
1182
1202
        # TODO: Perhaps should check at this point that the
1183
1203
        # history of the revision is actually present?
1184
 
        for rev_id in revision_ids:
1185
 
            validate_revision_id(rev_id)
1186
 
 
1187
1204
        p = self.pending_merges()
1188
1205
        updated = False
1189
1206
        for rev_id in revision_ids: