~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree.py

  • Committer: Robert Collins
  • Date: 2005-10-17 23:35:18 UTC
  • mfrom: (1442.1.65)
  • Revision ID: robertc@robertcollins.net-20051017233518-6746654be564edde
Merge in more GPG work, and more Branch-api-shrinkage.

* Branch.remove has been moved to WorkingTree, which has also gained
  lock_read, lock_write and unlock methods for convenience. (Robert
  Collins)

* Two decorators, needs_read_lock and needs_write_lock have been added
  to the branch module. Use these to cause a function to run in a
  read or write lock respectively. (Robert Collins)

* Branch.open_containing now returns a tuple (Branch, relative-path),
  which allows direct access to the common case of 'get me this file
  from its branch'. (Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
24
24
import stat
25
25
import fnmatch
26
26
 
27
 
from bzrlib.branch import Branch
 
27
from bzrlib.branch import Branch, needs_read_lock, needs_write_lock, quotefn
28
28
import bzrlib.tree
29
29
from bzrlib.osutils import appendpath, file_kind, isdir, splitpath, relpath
30
30
from bzrlib.errors import BzrCheckError
94
94
    It is possible for a `WorkingTree` to have a filename which is
95
95
    not listed in the Inventory and vice versa.
96
96
    """
 
97
 
97
98
    def __init__(self, basedir, branch=None):
98
99
        """Construct a WorkingTree for basedir.
99
100
 
398
399
    def kind(self, file_id):
399
400
        return file_kind(self.id2abspath(file_id))
400
401
 
 
402
    def lock_read(self):
 
403
        """See Branch.lock_read, and WorkingTree.unlock."""
 
404
        return self.branch.lock_read()
 
405
 
 
406
    def lock_write(self):
 
407
        """See Branch.lock_write, and WorkingTree.unlock."""
 
408
        return self.branch.lock_write()
 
409
 
 
410
    @needs_write_lock
 
411
    def remove(self, files, verbose=False):
 
412
        """Remove nominated files from the working inventory..
 
413
 
 
414
        This does not remove their text.  This does not run on XXX on what? RBC
 
415
 
 
416
        TODO: Refuse to remove modified files unless --force is given?
 
417
 
 
418
        TODO: Do something useful with directories.
 
419
 
 
420
        TODO: Should this remove the text or not?  Tough call; not
 
421
        removing may be useful and the user can just use use rm, and
 
422
        is the opposite of add.  Removing it is consistent with most
 
423
        other tools.  Maybe an option.
 
424
        """
 
425
        ## TODO: Normalize names
 
426
        ## TODO: Remove nested loops; better scalability
 
427
        if isinstance(files, basestring):
 
428
            files = [files]
 
429
 
 
430
        inv = self.inventory
 
431
 
 
432
        # do this before any modifications
 
433
        for f in files:
 
434
            fid = inv.path2id(f)
 
435
            if not fid:
 
436
                raise BzrError("cannot remove unversioned file %s" % quotefn(f))
 
437
            mutter("remove inventory entry %s {%s}" % (quotefn(f), fid))
 
438
            if verbose:
 
439
                # having remove it, it must be either ignored or unknown
 
440
                if self.is_ignored(f):
 
441
                    new_status = 'I'
 
442
                else:
 
443
                    new_status = '?'
 
444
                show_status(new_status, inv[fid].kind, quotefn(f))
 
445
            del inv[fid]
 
446
 
 
447
        self.branch._write_inventory(inv)
 
448
 
 
449
    def unlock(self):
 
450
        """See Branch.unlock.
 
451
        
 
452
        WorkingTree locking just uses the Branch locking facilities.
 
453
        This is current because all working trees have an embedded branch
 
454
        within them. IF in the future, we were to make branch data shareable
 
455
        between multiple working trees, i.e. via shared storage, then we 
 
456
        would probably want to lock both the local tree, and the branch.
 
457
        """
 
458
        return self.branch.unlock()
 
459
 
 
460
 
401
461
CONFLICT_SUFFIXES = ('.THIS', '.BASE', '.OTHER')
402
462
def get_conflicted_stem(path):
403
463
    for suffix in CONFLICT_SUFFIXES: