~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/repository.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2006-07-10 02:16:27 UTC
  • mfrom: (1843.1.2 transport-errors)
  • Revision ID: pqm@pqm.ubuntu.com-20060710021627-47d5e48ecc36ece7
(jam) Give a better error when paramiko is not present (#47821, #52204)

Show diffs side-by-side

added added

removed removed

Lines of Context:
21
21
import time
22
22
from unittest import TestSuite
23
23
 
24
 
import bzrlib.bzrdir as bzrdir
 
24
from bzrlib import bzrdir, check, delta, gpg, errors, xml5, ui, transactions, osutils
25
25
from bzrlib.decorators import needs_read_lock, needs_write_lock
26
 
import bzrlib.errors as errors
27
26
from bzrlib.errors import InvalidRevisionId
28
 
import bzrlib.gpg as gpg
29
27
from bzrlib.graph import Graph
30
28
from bzrlib.inter import InterObject
31
29
from bzrlib.inventory import Inventory
37
35
from bzrlib.revision import NULL_REVISION, Revision
38
36
from bzrlib.store.versioned import VersionedFileStore, WeaveStore
39
37
from bzrlib.store.text import TextStore
40
 
from bzrlib.symbol_versioning import *
 
38
from bzrlib.symbol_versioning import (deprecated_method,
 
39
        zero_nine, 
 
40
        )
41
41
from bzrlib.trace import mutter, note
42
 
from bzrlib.tree import RevisionTree
 
42
from bzrlib.tree import RevisionTree, EmptyTree
43
43
from bzrlib.tsort import topo_sort
44
44
from bzrlib.testament import Testament
45
45
from bzrlib.tree import EmptyTree
46
 
import bzrlib.ui
47
46
from bzrlib.weave import WeaveFile
48
 
import bzrlib.xml5
49
47
 
50
48
 
51
49
class Repository(object):
72
70
        assert inv.revision_id is None or inv.revision_id == revid, \
73
71
            "Mismatch between inventory revision" \
74
72
            " id and insertion revid (%r, %r)" % (inv.revision_id, revid)
75
 
        inv_text = bzrlib.xml5.serializer_v5.write_inventory_to_string(inv)
76
 
        inv_sha1 = bzrlib.osutils.sha_string(inv_text)
 
73
        inv_text = xml5.serializer_v5.write_inventory_to_string(inv)
 
74
        inv_sha1 = osutils.sha_string(inv_text)
77
75
        inv_vf = self.control_weaves.get_weave('inventory',
78
76
                                               self.get_transaction())
79
 
        self._inventory_add_lines(inv_vf, revid, parents, bzrlib.osutils.split_lines(inv_text))
 
77
        self._inventory_add_lines(inv_vf, revid, parents, osutils.split_lines(inv_text))
80
78
        return inv_sha1
81
79
 
82
80
    def _inventory_add_lines(self, inv_vf, revid, parents, lines):
119
117
        """Return all the possible revisions that we could find."""
120
118
        return self.get_inventory_weave().versions()
121
119
 
122
 
    @deprecated_method(zero_nine)
123
120
    def all_revision_ids(self):
124
121
        """Returns a list of all the revision ids in the repository. 
125
122
 
226
223
        For instance, if the repository is at URL/.bzr/repository,
227
224
        Repository.open(URL) -> a Repository instance.
228
225
        """
229
 
        control = bzrlib.bzrdir.BzrDir.open(base)
 
226
        control = bzrdir.BzrDir.open(base)
230
227
        return control.open_repository()
231
228
 
232
229
    def copy_content_into(self, destination, revision_id=None, basis=None):
277
274
            result = a_bzrdir.create_repository()
278
275
        # FIXME RBC 20060209 split out the repository type to avoid this check ?
279
276
        elif isinstance(a_bzrdir._format,
280
 
                      (bzrlib.bzrdir.BzrDirFormat4,
281
 
                       bzrlib.bzrdir.BzrDirFormat5,
282
 
                       bzrlib.bzrdir.BzrDirFormat6)):
 
277
                      (bzrdir.BzrDirFormat4,
 
278
                       bzrdir.BzrDirFormat5,
 
279
                       bzrdir.BzrDirFormat6)):
283
280
            result = a_bzrdir.open_repository()
284
281
        else:
285
282
            result = self._format.initialize(a_bzrdir, shared=self.is_shared())
334
331
        self._check_revision_parents(r, inv)
335
332
        return r
336
333
 
 
334
    @needs_read_lock
 
335
    def get_deltas_for_revisions(self, revisions):
 
336
        """Produce a generator of revision deltas.
 
337
        
 
338
        Note that the input is a sequence of REVISIONS, not revision_ids.
 
339
        Trees will be held in memory until the generator exits.
 
340
        Each delta is relative to the revision's lefthand predecessor.
 
341
        """
 
342
        required_trees = set()
 
343
        for revision in revisions:
 
344
            required_trees.add(revision.revision_id)
 
345
            required_trees.update(revision.parent_ids[:1])
 
346
        trees = dict((t.get_revision_id(), t) for 
 
347
                     t in self.revision_trees(required_trees))
 
348
        for revision in revisions:
 
349
            if not revision.parent_ids:
 
350
                old_tree = EmptyTree()
 
351
            else:
 
352
                old_tree = trees[revision.parent_ids[0]]
 
353
            yield delta.compare_trees(old_tree, trees[revision.revision_id])
 
354
 
 
355
    @needs_read_lock
 
356
    def get_revision_delta(self, revision_id):
 
357
        """Return the delta for one revision.
 
358
 
 
359
        The delta is relative to the left-hand predecessor of the
 
360
        revision.
 
361
        """
 
362
        r = self.get_revision(revision_id)
 
363
        return list(self.get_deltas_for_revisions([r]))[0]
 
364
 
337
365
    def _check_revision_parents(self, revision, inventory):
338
366
        """Private to Repository and Fetch.
339
367
        
416
444
        :param revision_id: The expected revision id of the inventory.
417
445
        :param xml: A serialised inventory.
418
446
        """
419
 
        return bzrlib.xml5.serializer_v5.read_inventory_from_string(xml)
 
447
        return xml5.serializer_v5.read_inventory_from_string(xml)
420
448
 
421
449
    @needs_read_lock
422
450
    def get_inventory_xml(self, revision_id):
426
454
            iw = self.get_inventory_weave()
427
455
            return iw.get_text(revision_id)
428
456
        except IndexError:
429
 
            raise bzrlib.errors.HistoryMissing(self, 'inventory', revision_id)
 
457
            raise errors.HistoryMissing(self, 'inventory', revision_id)
430
458
 
431
459
    @needs_read_lock
432
460
    def get_inventory_sha1(self, revision_id):
438
466
    def get_revision_graph(self, revision_id=None):
439
467
        """Return a dictionary containing the revision graph.
440
468
        
 
469
        :param revision_id: The revision_id to get a graph from. If None, then
 
470
        the entire revision graph is returned. This is a deprecated mode of
 
471
        operation and will be removed in the future.
441
472
        :return: a dictionary of revision_id->revision_parents_list.
442
473
        """
 
474
        # special case NULL_REVISION
 
475
        if revision_id == NULL_REVISION:
 
476
            return {}
443
477
        weave = self.get_inventory_weave()
444
478
        all_revisions = self._eliminate_revisions_not_present(weave.versions())
445
479
        entire_graph = dict([(node, weave.get_parents(node)) for 
473
507
            required = set([])
474
508
        else:
475
509
            pending = set(revision_ids)
476
 
            required = set(revision_ids)
 
510
            # special case NULL_REVISION
 
511
            if NULL_REVISION in pending:
 
512
                pending.remove(NULL_REVISION)
 
513
            required = set(pending)
477
514
        done = set([])
478
515
        while len(pending):
479
516
            revision_id = pending.pop()
539
576
            return RevisionTree(self, inv, revision_id)
540
577
 
541
578
    @needs_read_lock
 
579
    def revision_trees(self, revision_ids):
 
580
        """Return Tree for a revision on this branch.
 
581
 
 
582
        `revision_id` may not be None or 'null:'"""
 
583
        assert None not in revision_ids
 
584
        assert NULL_REVISION not in revision_ids
 
585
        texts = self.get_inventory_weave().get_texts(revision_ids)
 
586
        for text, revision_id in zip(texts, revision_ids):
 
587
            inv = self.deserialise_inventory(revision_id, text)
 
588
            yield RevisionTree(self, inv, revision_id)
 
589
 
 
590
    @needs_read_lock
542
591
    def get_ancestry(self, revision_id):
543
592
        """Return a list of revision-ids integrated by a revision.
544
593
 
628
677
        return self._check(revision_ids)
629
678
 
630
679
    def _check(self, revision_ids):
631
 
        result = bzrlib.check.Check(self)
 
680
        result = check.Check(self)
632
681
        result.check()
633
682
        return result
634
683
 
833
882
    @needs_read_lock
834
883
    def get_revision_graph(self, revision_id=None):
835
884
        """Return a dictionary containing the revision graph.
836
 
        
 
885
 
 
886
        :param revision_id: The revision_id to get a graph from. If None, then
 
887
        the entire revision graph is returned. This is a deprecated mode of
 
888
        operation and will be removed in the future.
837
889
        :return: a dictionary of revision_id->revision_parents_list.
838
890
        """
 
891
        # special case NULL_REVISION
 
892
        if revision_id == NULL_REVISION:
 
893
            return {}
839
894
        weave = self._get_revision_vf()
840
895
        entire_graph = weave.get_graph()
841
896
        if revision_id is None:
869
924
            required = set([])
870
925
        else:
871
926
            pending = set(revision_ids)
872
 
            required = set(revision_ids)
 
927
            # special case NULL_REVISION
 
928
            if NULL_REVISION in pending:
 
929
                pending.remove(NULL_REVISION)
 
930
            required = set(pending)
873
931
        done = set([])
874
932
        while len(pending):
875
933
            revision_id = pending.pop()
905
963
        reconciler.reconcile()
906
964
        return reconciler
907
965
    
908
 
    def revision_parents(self, revid):
909
 
        return self._get_revision_vf().get_parents(rev_id)
 
966
    def revision_parents(self, revision_id):
 
967
        return self._get_revision_vf().get_parents(revision_id)
 
968
 
910
969
 
911
970
class RepositoryFormat(object):
912
971
    """A repository format.
948
1007
        except errors.NoSuchFile:
949
1008
            raise errors.NoRepositoryPresent(a_bzrdir)
950
1009
        except KeyError:
951
 
            raise errors.UnknownFormatError(format_string)
 
1010
            raise errors.UnknownFormatError(format=format_string)
952
1011
 
953
1012
    def _get_control_store(self, repo_transport, control_files):
954
1013
        """Return the control store for this repository."""
1075
1134
        
1076
1135
        # Create an empty weave
1077
1136
        sio = StringIO()
1078
 
        bzrlib.weavefile.write_weave_v5(Weave(), sio)
 
1137
        write_weave_v5(Weave(), sio)
1079
1138
        empty_weave = sio.getvalue()
1080
1139
 
1081
1140
        mutter('creating repository in %s.', a_bzrdir.transport.base)
1141
1200
 
1142
1201
    def __init__(self):
1143
1202
        super(RepositoryFormat4, self).__init__()
1144
 
        self._matchingbzrdir = bzrlib.bzrdir.BzrDirFormat4()
 
1203
        self._matchingbzrdir = bzrdir.BzrDirFormat4()
1145
1204
 
1146
1205
    def get_format_description(self):
1147
1206
        """See RepositoryFormat.get_format_description()."""
1190
1249
 
1191
1250
    def __init__(self):
1192
1251
        super(RepositoryFormat5, self).__init__()
1193
 
        self._matchingbzrdir = bzrlib.bzrdir.BzrDirFormat5()
 
1252
        self._matchingbzrdir = bzrdir.BzrDirFormat5()
1194
1253
 
1195
1254
    def get_format_description(self):
1196
1255
        """See RepositoryFormat.get_format_description()."""
1220
1279
 
1221
1280
    def __init__(self):
1222
1281
        super(RepositoryFormat6, self).__init__()
1223
 
        self._matchingbzrdir = bzrlib.bzrdir.BzrDirFormat6()
 
1282
        self._matchingbzrdir = bzrdir.BzrDirFormat6()
1224
1283
 
1225
1284
    def get_format_description(self):
1226
1285
        """See RepositoryFormat.get_format_description()."""
1244
1303
 
1245
1304
    def __init__(self):
1246
1305
        super(MetaDirRepositoryFormat, self).__init__()
1247
 
        self._matchingbzrdir = bzrlib.bzrdir.BzrDirMetaFormat1()
 
1306
        self._matchingbzrdir = bzrdir.BzrDirMetaFormat1()
1248
1307
 
1249
1308
    def _create_control_files(self, a_bzrdir):
1250
1309
        """Create the required files and the initial control_files object."""
1325
1384
 
1326
1385
        # Create an empty weave
1327
1386
        sio = StringIO()
1328
 
        bzrlib.weavefile.write_weave_v5(Weave(), sio)
 
1387
        write_weave_v5(Weave(), sio)
1329
1388
        empty_weave = sio.getvalue()
1330
1389
 
1331
1390
        mutter('creating repository in %s.', a_bzrdir.transport.base)
1436
1495
        repo_transport = a_bzrdir.get_repository_transport(None)
1437
1496
        control_files = LockableFiles(repo_transport, 'lock', LockDir)
1438
1497
        control_store = self._get_control_store(repo_transport, control_files)
1439
 
        transaction = bzrlib.transactions.WriteTransaction()
 
1498
        transaction = transactions.WriteTransaction()
1440
1499
        # trigger a write of the inventory store.
1441
1500
        control_store.get_weave_or_empty('inventory', transaction)
1442
1501
        _revision_store = self._get_revision_store(repo_transport, control_files)
1645
1704
                pass
1646
1705
            # FIXME do not peek!
1647
1706
            if self.source.control_files._transport.listable():
1648
 
                pb = bzrlib.ui.ui_factory.nested_progress_bar()
 
1707
                pb = ui.ui_factory.nested_progress_bar()
1649
1708
                try:
1650
1709
                    self.target.weave_store.copy_all_ids(
1651
1710
                        self.source.weave_store,
2074
2133
            # TODO: Rather than invoking sha_strings here, _add_text_to_weave
2075
2134
            # should return the SHA1 and size
2076
2135
            self._add_text_to_weave(file_id, new_lines, file_parents.keys())
2077
 
            return bzrlib.osutils.sha_strings(new_lines), \
 
2136
            return osutils.sha_strings(new_lines), \
2078
2137
                sum(map(len, new_lines))
2079
2138
 
2080
2139
    def modified_link(self, file_id, file_parents, link_target):