~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/branch.py

  • Committer: Jelmer Vernooij
  • Date: 2006-06-13 13:24:40 UTC
  • mfrom: (1767 +trunk)
  • mto: (1769.1.1 integration)
  • mto: This revision was merged to the branch mainline in revision 1770.
  • Revision ID: jelmer@samba.org-20060613132440-24e222a86f948f60
[merge] bzr.dev

Show diffs side-by-side

added added

removed removed

Lines of Context:
47
47
                            safe_unicode,
48
48
                            rmtree,
49
49
                            )
50
 
from bzrlib.textui import show_status
51
 
from bzrlib.trace import mutter, note
52
 
from bzrlib.tree import EmptyTree, RevisionTree
53
50
from bzrlib.repository import Repository
54
51
from bzrlib.revision import (
55
52
                             is_ancestor,
58
55
                             )
59
56
from bzrlib.store import copy_all
60
57
from bzrlib.symbol_versioning import *
 
58
from bzrlib.textui import show_status
 
59
from bzrlib.trace import mutter, note
61
60
import bzrlib.transactions as transactions
62
61
from bzrlib.transport import Transport, get_transport
63
62
from bzrlib.tree import EmptyTree, RevisionTree
64
63
import bzrlib.ui
 
64
import bzrlib.urlutils as urlutils
65
65
import bzrlib.xml5
66
66
 
67
67
 
249
249
        branch.
250
250
        """
251
251
        return None
 
252
    
 
253
    def get_commit_builder(self, parents, config=None, timestamp=None, 
 
254
                           timezone=None, committer=None, revprops=None, 
 
255
                           revision_id=None):
 
256
        """Obtain a CommitBuilder for this branch.
 
257
        
 
258
        :param parents: Revision ids of the parents of the new revision.
 
259
        :param config: Optional configuration to use.
 
260
        :param timestamp: Optional timestamp recorded for commit.
 
261
        :param timezone: Optional timezone for timestamp.
 
262
        :param committer: Optional committer to set for commit.
 
263
        :param revprops: Optional dictionary of revision properties.
 
264
        :param revision_id: Optional revision id.
 
265
        """
 
266
 
 
267
        if config is None:
 
268
            config = bzrlib.config.BranchConfig(self)
 
269
        
 
270
        return self.repository.get_commit_builder(self, parents, config, 
 
271
            timestamp, timezone, committer, revprops, revision_id)
252
272
 
253
273
    def get_master_branch(self):
254
274
        """Return the branch we are bound to.
457
477
        revision_id: if not None, the revision history in the new branch will
458
478
                     be truncated to end with revision_id.
459
479
        """
460
 
        # for API compatability, until 0.8 releases we provide the old api:
 
480
        # for API compatibility, until 0.8 releases we provide the old api:
461
481
        # def clone(self, to_location, revision=None, basis_branch=None, to_branch_format=None):
462
482
        # after 0.8 releases, the *args and **kwargs should be changed:
463
483
        # def clone(self, to_bzrdir, revision_id=None):
465
485
            kwargs.get('revision', None) or
466
486
            kwargs.get('basis_branch', None) or
467
487
            (len(args) and isinstance(args[0], basestring))):
468
 
            # backwards compatability api:
 
488
            # backwards compatibility api:
469
489
            warn("Branch.clone() has been deprecated for BzrDir.clone() from"
470
490
                 " bzrlib 0.8.", DeprecationWarning, stacklevel=3)
471
491
            # get basis_branch
537
557
        if parent:
538
558
            destination.set_parent(parent)
539
559
 
 
560
    @needs_read_lock
 
561
    def check(self):
 
562
        """Check consistency of the branch.
 
563
 
 
564
        In particular this checks that revisions given in the revision-history
 
565
        do actually match up in the revision graph, and that they're all 
 
566
        present in the repository.
 
567
 
 
568
        :return: A BranchCheckResult.
 
569
        """
 
570
        mainline_parent_id = None
 
571
        for revision_id in self.revision_history():
 
572
            try:
 
573
                revision = self.repository.get_revision(revision_id)
 
574
            except errors.NoSuchRevision, e:
 
575
                raise BzrCheckError("mainline revision {%s} not in repository"
 
576
                        % revision_id)
 
577
            # In general the first entry on the revision history has no parents.
 
578
            # But it's not illegal for it to have parents listed; this can happen
 
579
            # in imports from Arch when the parents weren't reachable.
 
580
            if mainline_parent_id is not None:
 
581
                if mainline_parent_id not in revision.parent_ids:
 
582
                    raise BzrCheckError("previous revision {%s} not listed among "
 
583
                                        "parents of {%s}"
 
584
                                        % (mainline_parent_id, revision_id))
 
585
            mainline_parent_id = revision_id
 
586
        return BranchCheckResult(self)
 
587
 
540
588
 
541
589
class BranchFormat(object):
542
590
    """An encapsulation of the initialization and open routines for a format.
589
637
 
590
638
    def initialize(self, a_bzrdir):
591
639
        """Create a branch of this format in a_bzrdir."""
592
 
        raise NotImplementedError(self.initialized)
 
640
        raise NotImplementedError(self.initialize)
593
641
 
594
642
    def is_supported(self):
595
643
        """Is this format supported?
1133
1181
        """See Branch.get_parent."""
1134
1182
        import errno
1135
1183
        _locs = ['parent', 'pull', 'x-pull']
 
1184
        assert self.base[-1] == '/'
1136
1185
        for l in _locs:
1137
1186
            try:
1138
 
                return self.control_files.get_utf8(l).read().strip('\n')
 
1187
                return urlutils.join(self.base[:-1], 
 
1188
                            self.control_files.get(l).read().strip('\n'))
1139
1189
            except NoSuchFile:
1140
1190
                pass
1141
1191
        return None
1162
1212
        if url is None:
1163
1213
            self.control_files._transport.delete('parent')
1164
1214
        else:
1165
 
            self.control_files.put_utf8('parent', url + '\n')
 
1215
            if isinstance(url, unicode):
 
1216
                try: 
 
1217
                    url = url.encode('ascii')
 
1218
                except UnicodeEncodeError:
 
1219
                    raise bzrlib.errors.InvalidURL(url,
 
1220
                        "Urls must be 7-bit ascii, "
 
1221
                        "use bzrlib.urlutils.escape")
 
1222
                    
 
1223
            url = urlutils.relative_url(self.base, url)
 
1224
            self.control_files.put('parent', url + '\n')
1166
1225
 
1167
1226
    def tree_config(self):
1168
1227
        return TreeConfig(self)
1210
1269
 
1211
1270
        This could memoise the branch, but if thats done
1212
1271
        it must be revalidated on each new lock.
1213
 
        So for now we just dont memoise it.
 
1272
        So for now we just don't memoise it.
1214
1273
        # RBC 20060304 review this decision.
1215
1274
        """
1216
1275
        bound_loc = self.get_bound_location()
1262
1321
        # There may be a different check you could do here
1263
1322
        # rather than actually trying to install revisions remotely.
1264
1323
        # TODO: capture an exception which indicates the remote branch
1265
 
        #       is not writeable. 
 
1324
        #       is not writable. 
1266
1325
        #       If it is up-to-date, this probably should not be a failure
1267
1326
        
1268
1327
        # lock other for write so the revision-history syncing cannot race
1334
1393
        return result
1335
1394
 
1336
1395
 
 
1396
class BranchCheckResult(object):
 
1397
    """Results of checking branch consistency.
 
1398
 
 
1399
    :see: Branch.check
 
1400
    """
 
1401
 
 
1402
    def __init__(self, branch):
 
1403
        self.branch = branch
 
1404
 
 
1405
    def report_results(self, verbose):
 
1406
        """Report the check results via trace.note.
 
1407
        
 
1408
        :param verbose: Requests more detailed display of what was checked,
 
1409
            if any.
 
1410
        """
 
1411
        note('checked branch %s format %s',
 
1412
             self.branch.base,
 
1413
             self.branch._format)
 
1414
 
 
1415
 
1337
1416
######################################################################
1338
1417
# predicates
1339
1418