~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/branch.py

  • Committer: mbp at sourcefrog
  • Date: 2005-03-22 06:55:17 UTC
  • Revision ID: mbp@sourcefrog.net-20050322065517-994757f662afb161
- new find_branch_root function; based on suggestion from aaron
  but cleaned up a bit and should work on non-unix systems
- new find-branch-root command to exercise it
- Branch constructor does this by default

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#! /usr/bin/env python
2
 
# -*- coding: UTF-8 -*-
3
 
 
4
1
# This program is free software; you can redistribute it and/or modify
5
2
# it under the terms of the GNU General Public License as published by
6
3
# the Free Software Foundation; either version 2 of the License, or
41
38
 
42
39
 
43
40
 
 
41
def find_branch_root(f=None):
 
42
    """Find the branch root enclosing f, or pwd.
 
43
 
 
44
    It is not necessary that f exists.
 
45
 
 
46
    Basically we keep looking up until we find the control directory or
 
47
    run into the root."""
 
48
    if f is None:
 
49
        f = os.getcwd()
 
50
    elif hasattr(os.path, 'realpath'):
 
51
        f = os.path.realpath(f)
 
52
    else:
 
53
        f = os.path.abspath(f)
 
54
 
 
55
    orig_f = f
 
56
 
 
57
    last_f = f
 
58
    while True:
 
59
        if os.path.exists(os.path.join(f, bzrlib.BZRDIR)):
 
60
            return f
 
61
        head, tail = os.path.split(f)
 
62
        if head == f:
 
63
            # reached the root, whatever that may be
 
64
            bailout('%r is not in a branch' % orig_f)
 
65
        f = head
 
66
    
44
67
 
45
68
 
46
69
######################################################################
62
85
 
63
86
    :todo: mkdir() method.
64
87
    """
65
 
    def __init__(self, base, init=False):
 
88
    def __init__(self, base, init=False, find_root=True):
66
89
        """Create new branch object at a particular location.
67
90
 
68
91
        :param base: Base directory for the branch.
69
 
 
 
92
        
70
93
        :param init: If True, create new control files in a previously
71
94
             unversioned directory.  If False, the branch must already
72
95
             be versioned.
73
96
 
 
97
        :param find_root: If true and init is false, find the root of the
 
98
             existing branch containing base.
 
99
 
74
100
        In the test suite, creation of new trees is tested using the
75
101
        `ScratchBranch` class.
76
102
        """
77
 
        self.base = os.path.realpath(base)
78
103
        if init:
79
104
            self._make_control()
 
105
        elif find_root:
 
106
            self.base = find_branch_root(base)
80
107
        else:
 
108
            self.base = os.path.realpath(base)
81
109
            if not isdir(self.controlfilename('.')):
82
110
                bailout("not a bzr branch: %s" % quotefn(base),
83
111
                        ['use "bzr init" to initialize a new working tree',
84
112
                         'current bzr can only operate from top-of-tree'])
85
 
            self._check_format()
 
113
        self._check_format()
86
114
 
87
115
        self.text_store = ImmutableStore(self.controlfilename('text-store'))
88
116
        self.revision_store = ImmutableStore(self.controlfilename('revision-store'))