~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/workingtree.py

  • Committer: Robert Collins
  • Date: 2005-11-06 00:12:04 UTC
  • mfrom: (1457.1.16)
  • Revision ID: robertc@robertcollins.net-20051106001204-b8c6d5169308d7e6
All pending merges operations from Branch are now on WorkingTree.
(Robert Collins)

Show diffs side-by-side

added added

removed removed

Lines of Context:
48
48
 
49
49
from bzrlib.branch import Branch, needs_read_lock, needs_write_lock, quotefn
50
50
import bzrlib.tree
51
 
from bzrlib.osutils import appendpath, file_kind, isdir, splitpath, relpath
 
51
from bzrlib.osutils import (appendpath,
 
52
                            file_kind,
 
53
                            isdir,
 
54
                            pumpfile,
 
55
                            splitpath,
 
56
                            relpath)
52
57
from bzrlib.errors import BzrCheckError, DivergedBranches, NotVersionedError
53
58
from bzrlib.trace import mutter
54
59
import bzrlib.xml5
234
239
            mode = os.lstat(self.abspath(path)).st_mode
235
240
            return bool(stat.S_ISREG(mode) and stat.S_IEXEC&mode)
236
241
 
 
242
    @needs_write_lock
 
243
    def add_pending_merge(self, *revision_ids):
 
244
        # TODO: Perhaps should check at this point that the
 
245
        # history of the revision is actually present?
 
246
        p = self.pending_merges()
 
247
        updated = False
 
248
        for rev_id in revision_ids:
 
249
            if rev_id in p:
 
250
                continue
 
251
            p.append(rev_id)
 
252
            updated = True
 
253
        if updated:
 
254
            self.set_pending_merges(p)
 
255
 
 
256
    def pending_merges(self):
 
257
        """Return a list of pending merges.
 
258
 
 
259
        These are revisions that have been merged into the working
 
260
        directory but not yet committed.
 
261
        """
 
262
        cfn = self.branch._rel_controlfilename('pending-merges')
 
263
        if not self.branch._transport.has(cfn):
 
264
            return []
 
265
        p = []
 
266
        for l in self.branch.controlfile('pending-merges', 'r').readlines():
 
267
            p.append(l.rstrip('\n'))
 
268
        return p
 
269
 
 
270
    @needs_write_lock
 
271
    def set_pending_merges(self, rev_list):
 
272
        self.branch.put_controlfile('pending-merges', '\n'.join(rev_list))
 
273
 
237
274
    def get_symlink_target(self, file_id):
238
275
        return os.readlink(self.id2abspath(file_id))
239
276
 
503
540
                show_status(new_status, inv[fid].kind, quotefn(f))
504
541
            del inv[fid]
505
542
 
506
 
        self.branch._write_inventory(inv)
 
543
        self._write_inventory(inv)
507
544
 
508
545
    @needs_write_lock
509
546
    def revert(self, filenames, old_tree=None, backups=True):
510
 
        """Restore selected files to the versions from a previous tree.
511
 
 
512
 
        backups
513
 
            If true (default) backups are made of files before
514
 
            they're renamed.
515
 
        """
516
 
        from bzrlib.atomicfile import AtomicFile
517
 
        from bzrlib.osutils import backup_file
518
 
        
519
 
        inv = self.read_working_inventory()
 
547
        from bzrlib.merge import merge_inner
520
548
        if old_tree is None:
521
549
            old_tree = self.branch.basis_tree()
522
 
        old_inv = old_tree.inventory
523
 
 
524
 
        nids = []
525
 
        for fn in filenames:
526
 
            file_id = inv.path2id(fn)
527
 
            if not file_id:
528
 
                raise NotVersionedError(path=fn)
529
 
            if not old_inv.has_id(file_id):
530
 
                raise BzrError("file not present in old tree", fn, file_id)
531
 
            nids.append((fn, file_id))
532
 
            
533
 
        # TODO: Rename back if it was previously at a different location
534
 
 
535
 
        # TODO: If given a directory, restore the entire contents from
536
 
        # the previous version.
537
 
 
538
 
        # TODO: Make a backup to a temporary file.
539
 
 
540
 
        # TODO: If the file previously didn't exist, delete it?
541
 
        for fn, file_id in nids:
542
 
            backup_file(fn)
543
 
            
544
 
            f = AtomicFile(fn, 'wb')
545
 
            try:
546
 
                f.write(old_tree.get_file(file_id).read())
547
 
                f.commit()
548
 
            finally:
549
 
                f.close()
 
550
        merge_inner(self.branch, old_tree,
 
551
                    self, ignore_zero=True,
 
552
                    backup_files=backups, 
 
553
                    interesting_files=filenames)
 
554
        if not len(filenames):
 
555
            self.set_pending_merges([])
550
556
 
551
557
    @needs_write_lock
552
558
    def set_inventory(self, new_inventory_list):
569
575
                inv.add(InventoryLink(file_id, name, parent))
570
576
            else:
571
577
                raise BzrError("unknown kind %r" % kind)
572
 
        self.branch._write_inventory(inv)
 
578
        self._write_inventory(inv)
 
579
 
 
580
    @needs_write_lock
 
581
    def set_root_id(self, file_id):
 
582
        """Set the root id for this tree."""
 
583
        inv = self.read_working_inventory()
 
584
        orig_root_id = inv.root.file_id
 
585
        del inv._byid[inv.root.file_id]
 
586
        inv.root.file_id = file_id
 
587
        inv._byid[inv.root.file_id] = inv.root
 
588
        for fid in inv:
 
589
            entry = inv[fid]
 
590
            if entry.parent_id in (None, orig_root_id):
 
591
                entry.parent_id = inv.root.file_id
 
592
        self._write_inventory(inv)
573
593
 
574
594
    def unlock(self):
575
595
        """See Branch.unlock.
582
602
        """
583
603
        return self.branch.unlock()
584
604
 
 
605
    @needs_write_lock
 
606
    def _write_inventory(self, inv):
 
607
        """Write inventory as the current inventory."""
 
608
        from cStringIO import StringIO
 
609
        from bzrlib.atomicfile import AtomicFile
 
610
        sio = StringIO()
 
611
        bzrlib.xml5.serializer_v5.write_inventory(inv, sio)
 
612
        sio.seek(0)
 
613
        f = AtomicFile(self.branch.controlfilename('inventory'))
 
614
        try:
 
615
            pumpfile(sio, f)
 
616
            f.commit()
 
617
        finally:
 
618
            f.close()
 
619
        mutter('wrote working inventory')
 
620
            
585
621
 
586
622
CONFLICT_SUFFIXES = ('.THIS', '.BASE', '.OTHER')
587
623
def get_conflicted_stem(path):