~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree.py

Provide a open_containing for WorkingTree.

Show diffs side-by-side

added added

removed removed

Lines of Context:
53
53
                            isdir,
54
54
                            pumpfile,
55
55
                            splitpath,
 
56
                            realpath,
56
57
                            relpath)
57
 
from bzrlib.errors import BzrCheckError, DivergedBranches, NotVersionedError
 
58
from bzrlib.errors import (BzrCheckError,
 
59
                           DivergedBranches,
 
60
                           NotBranchError,
 
61
                           NotVersionedError)
58
62
from bzrlib.trace import mutter
59
63
import bzrlib.xml5
60
64
 
159
163
            mutter("write hc")
160
164
            hc.write()
161
165
 
 
166
    @staticmethod
 
167
    def open_containing(path=None):
 
168
        """Open an existing working tree which has its root about path.
 
169
        
 
170
        This probes for a working tree at path and searches upwards from there.
 
171
 
 
172
        Basically we keep looking up until we find the control directory or
 
173
        run into /.  If there isn't one, raises NotBranchError.
 
174
        TODO: give this a new exception.
 
175
        If there is one, it is returned, along with the unused portion of path.
 
176
        """
 
177
        if path is None:
 
178
            path = os.getcwdu()
 
179
        path = realpath(path)
 
180
        tail = ''
 
181
        while True:
 
182
            try:
 
183
                return WorkingTree(path), tail
 
184
            except NotBranchError:
 
185
                pass
 
186
            if tail:
 
187
                tail = os.path.join(os.path.basename(path), tail)
 
188
            else:
 
189
                tail = os.path.basename(path)
 
190
            path = os.path.dirname(path)
 
191
            # FIXME: top in windows is indicated how ???
 
192
            if path == os.path.sep:
 
193
                # reached the root, whatever that may be
 
194
                raise NotBranchError(path=path)
 
195
 
162
196
    def __iter__(self):
163
197
        """Iterate through file_ids for this tree.
164
198
 
170
204
            if bzrlib.osutils.lexists(self.abspath(path)):
171
205
                yield ie.file_id
172
206
 
173
 
 
174
207
    def __repr__(self):
175
208
        return "<%s of %s>" % (self.__class__.__name__,
176
209
                               getattr(self, 'basedir', None))
177
210
 
178
 
 
179
 
 
180
211
    def abspath(self, filename):
181
212
        return os.path.join(self.basedir, filename)
182
213
 
199
230
        return inv.root.file_id
200
231
        
201
232
    def _get_store_filename(self, file_id):
202
 
        ## XXX: badly named; this isn't in the store at all
 
233
        ## XXX: badly named; this is not in the store at all
203
234
        return self.abspath(self.id2path(file_id))
204
235
 
205
236
    @needs_write_lock
211
242
    def id2abspath(self, file_id):
212
243
        return self.abspath(self.id2path(file_id))
213
244
 
214
 
                
215
245
    def has_id(self, file_id):
216
246
        # files that have been deleted are excluded
217
247
        inv = self._inventory
226
256
        return self.inventory.has_id(file_id)
227
257
 
228
258
    __contains__ = has_id
229
 
    
230
259
 
231
260
    def get_file_size(self, file_id):
232
261
        return os.path.getsize(self.id2abspath(file_id))
235
264
        path = self._inventory.id2path(file_id)
236
265
        return self._hashcache.get_sha1(path)
237
266
 
238
 
 
239
267
    def is_executable(self, file_id):
240
268
        if os.name == "nt":
241
269
            return self._inventory[file_id].executable