/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/workingtree.py

  • Committer: Martin Pool
  • Date: 2007-03-01 04:26:55 UTC
  • mfrom: (2305 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2309.
  • Revision ID: mbp@sourcefrog.net-20070301042655-ib2mllvaozai23c6
merge trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
452
452
        return osutils.lexists(self.abspath(filename))
453
453
 
454
454
    def get_file(self, file_id):
 
455
        file_id = osutils.safe_file_id(file_id)
455
456
        return self.get_file_byname(self.id2path(file_id))
456
457
 
457
458
    def get_file_text(self, file_id):
 
459
        file_id = osutils.safe_file_id(file_id)
458
460
        return self.get_file(file_id).read()
459
461
 
460
462
    def get_file_byname(self, filename):
470
472
        incorrectly attributed to CURRENT_REVISION (but after committing, the
471
473
        attribution will be correct).
472
474
        """
 
475
        file_id = osutils.safe_file_id(file_id)
473
476
        basis = self.basis_tree()
474
477
        changes = self._iter_changes(basis, True, [file_id]).next()
475
478
        changed_content, kind = changes[2], changes[6]
519
522
        
520
523
    def _get_store_filename(self, file_id):
521
524
        ## XXX: badly named; this is not in the store at all
 
525
        file_id = osutils.safe_file_id(file_id)
522
526
        return self.abspath(self.id2path(file_id))
523
527
 
524
528
    @needs_read_lock
557
561
            tree.set_parent_ids([revision_id])
558
562
 
559
563
    def id2abspath(self, file_id):
 
564
        file_id = osutils.safe_file_id(file_id)
560
565
        return self.abspath(self.id2path(file_id))
561
566
 
562
567
    def has_id(self, file_id):
563
568
        # files that have been deleted are excluded
 
569
        file_id = osutils.safe_file_id(file_id)
564
570
        inv = self._inventory
565
571
        if not inv.has_id(file_id):
566
572
            return False
568
574
        return osutils.lexists(self.abspath(path))
569
575
 
570
576
    def has_or_had_id(self, file_id):
 
577
        file_id = osutils.safe_file_id(file_id)
571
578
        if file_id == self.inventory.root.file_id:
572
579
            return True
573
580
        return self.inventory.has_id(file_id)
575
582
    __contains__ = has_id
576
583
 
577
584
    def get_file_size(self, file_id):
 
585
        file_id = osutils.safe_file_id(file_id)
578
586
        return os.path.getsize(self.id2abspath(file_id))
579
587
 
580
588
    @needs_read_lock
581
589
    def get_file_sha1(self, file_id, path=None, stat_value=None):
 
590
        file_id = osutils.safe_file_id(file_id)
582
591
        if not path:
583
592
            path = self._inventory.id2path(file_id)
584
593
        return self._hashcache.get_sha1(path, stat_value)
585
594
 
586
595
    def get_file_mtime(self, file_id, path=None):
 
596
        file_id = osutils.safe_file_id(file_id)
587
597
        if not path:
588
598
            path = self._inventory.id2path(file_id)
589
599
        return os.lstat(self.abspath(path)).st_mtime
590
600
 
591
601
    if not supports_executable():
592
602
        def is_executable(self, file_id, path=None):
 
603
            file_id = osutils.safe_file_id(file_id)
593
604
            return self._inventory[file_id].executable
594
605
    else:
595
606
        def is_executable(self, file_id, path=None):
596
607
            if not path:
 
608
                file_id = osutils.safe_file_id(file_id)
597
609
                path = self._inventory.id2path(file_id)
598
610
            mode = os.lstat(self.abspath(path)).st_mode
599
611
            return bool(stat.S_ISREG(mode) and stat.S_IEXEC & mode)
611
623
            if file_id is None:
612
624
                inv.add_path(f, kind=kind)
613
625
            else:
 
626
                file_id = osutils.safe_file_id(file_id)
614
627
                inv.add_path(f, kind=kind, file_id=file_id)
615
628
        self._write_inventory(inv)
616
629
 
705
718
 
706
719
    def _set_merges_from_parent_ids(self, parent_ids):
707
720
        merges = parent_ids[1:]
708
 
        self._control_files.put_utf8('pending-merges', '\n'.join(merges))
 
721
        self._control_files.put_bytes('pending-merges', '\n'.join(merges))
709
722
 
710
723
    @needs_tree_write_lock
711
724
    def set_parent_ids(self, revision_ids, allow_leftmost_as_ghost=False):
768
781
    def set_merge_modified(self, modified_hashes):
769
782
        def iter_stanzas():
770
783
            for file_id, hash in modified_hashes.iteritems():
771
 
                yield Stanza(file_id=file_id, hash=hash)
 
784
                yield Stanza(file_id=file_id.decode('utf8'), hash=hash)
772
785
        self._put_rio('merge-hashes', iter_stanzas(), MERGE_MODIFIED_HEADER_1)
773
786
 
774
 
    @needs_tree_write_lock
775
787
    def _put_rio(self, filename, stanzas, header):
 
788
        self._must_be_locked()
776
789
        my_file = rio_file(stanzas, header)
777
790
        self._control_files.put(filename, my_file)
778
791
 
823
836
 
824
837
    @needs_read_lock
825
838
    def merge_modified(self):
 
839
        """Return a dictionary of files modified by a merge.
 
840
 
 
841
        The list is initialized by WorkingTree.set_merge_modified, which is 
 
842
        typically called after we make some automatic updates to the tree
 
843
        because of a merge.
 
844
 
 
845
        This returns a map of file_id->sha1, containing only files which are
 
846
        still in the working inventory and have that text hash.
 
847
        """
826
848
        try:
827
849
            hashfile = self._control_files.get('merge-hashes')
828
850
        except errors.NoSuchFile:
837
859
            file_id = s.get("file_id")
838
860
            if file_id not in self.inventory:
839
861
                continue
840
 
            hash = s.get("hash")
841
 
            if hash == self.get_file_sha1(file_id):
842
 
                merge_hashes[file_id] = hash
 
862
            text_hash = s.get("hash")
 
863
            if text_hash == self.get_file_sha1(file_id):
 
864
                merge_hashes[file_id] = text_hash
843
865
        return merge_hashes
844
866
 
845
867
    @needs_write_lock
1286
1308
        :raises: NoSuchId if any fileid is not currently versioned.
1287
1309
        """
1288
1310
        for file_id in file_ids:
 
1311
            file_id = osutils.safe_file_id(file_id)
1289
1312
            if self._inventory.has_id(file_id):
1290
1313
                self._inventory.remove_recursive_id(file_id)
1291
1314
            else:
1368
1391
    @needs_write_lock
1369
1392
    def put_file_bytes_non_atomic(self, file_id, bytes):
1370
1393
        """See MutableTree.put_file_bytes_non_atomic."""
 
1394
        file_id = osutils.safe_file_id(file_id)
1371
1395
        stream = file(self.id2abspath(file_id), 'wb')
1372
1396
        try:
1373
1397
            stream.write(bytes)
1500
1524
    def is_locked(self):
1501
1525
        return self._control_files.is_locked()
1502
1526
 
 
1527
    def _must_be_locked(self):
 
1528
        if not self.is_locked():
 
1529
            raise errors.ObjectNotLocked(self)
 
1530
 
1503
1531
    def lock_read(self):
1504
1532
        """See Branch.lock_read, and WorkingTree.unlock."""
1505
1533
        self.branch.lock_read()
1711
1739
                DeprecationWarning,
1712
1740
                stacklevel=3)
1713
1741
            file_id = ROOT_ID
 
1742
        else:
 
1743
            file_id = osutils.safe_file_id(file_id)
1714
1744
        inv = self._inventory
1715
1745
        orig_root_id = inv.root.file_id
1716
1746
        # TODO: it might be nice to exit early if there was nothing
1975
2005
                pass
1976
2006
            return False
1977
2007
        else:
1978
 
            self._control_files.put_utf8('last-revision', revision_id)
 
2008
            self._control_files.put_bytes('last-revision', revision_id)
1979
2009
            return True
1980
2010
 
1981
2011
    @needs_tree_write_lock
2133
2163
        sio.seek(0)
2134
2164
        control_files.put('inventory', sio)
2135
2165
 
2136
 
        control_files.put_utf8('pending-merges', '')
 
2166
        control_files.put_bytes('pending-merges', '')
2137
2167
        
2138
2168
 
2139
2169
    def initialize(self, a_bzrdir, revision_id=None):