/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/transform.py

  • Committer: Martin Pool
  • Date: 2007-04-01 06:19:16 UTC
  • mfrom: (2323.5.20 0.15-integration)
  • mto: This revision was merged to the branch mainline in revision 2390.
  • Revision ID: mbp@sourcefrog.net-20070401061916-plpgsxdf8g7gll9o
Merge 0.15 final release back to trunk, including: recommend upgrades of old workingtrees, handle multiple http redirections, some dirstate fixes, 

Show diffs side-by-side

added added

removed removed

Lines of Context:
738
738
        conflicts = self.find_conflicts()
739
739
        if len(conflicts) != 0:
740
740
            raise MalformedTransform(conflicts=conflicts)
 
741
        limbo_inv = {}
741
742
        inv = self._tree.inventory
742
 
        inventory_delta = []
743
743
        child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
744
744
        try:
745
745
            child_pb.update('Apply phase', 0, 2)
746
 
            self._apply_removals(inv, inventory_delta)
 
746
            self._apply_removals(inv, limbo_inv)
747
747
            child_pb.update('Apply phase', 1, 2)
748
 
            modified_paths = self._apply_insertions(inv, inventory_delta)
 
748
            modified_paths = self._apply_insertions(inv, limbo_inv)
749
749
        finally:
750
750
            child_pb.finished()
751
 
        self._tree.apply_inventory_delta(inventory_delta)
 
751
        self._tree._write_inventory(inv)
752
752
        self.__done = True
753
753
        self.finalize()
754
754
        return _TransformResults(modified_paths)
757
757
        """Generate the limbo name of a file"""
758
758
        return pathjoin(self._limbodir, trans_id)
759
759
 
760
 
    def _apply_removals(self, inv, inventory_delta):
 
760
    def _apply_removals(self, inv, limbo_inv):
761
761
        """Perform tree operations that remove directory/inventory names.
762
762
        
763
763
        That is, delete files that are to be deleted, and put any files that
786
786
                        file_id = self._tree.inventory.root.file_id
787
787
                    else:
788
788
                        file_id = self.tree_file_id(trans_id)
789
 
                    assert file_id is not None
790
 
                    inventory_delta.append((path, None, file_id, None))
 
789
                    del inv[file_id]
 
790
                elif trans_id in self._new_name or trans_id in self._new_parent:
 
791
                    file_id = self.tree_file_id(trans_id)
 
792
                    if file_id is not None:
 
793
                        limbo_inv[trans_id] = inv[file_id]
 
794
                        inv.remove_recursive_id(file_id)
791
795
        finally:
792
796
            child_pb.finished()
793
797
 
794
 
    def _apply_insertions(self, inv, inventory_delta):
 
798
    def _apply_insertions(self, inv, limbo_inv):
795
799
        """Perform tree operations that insert directory/inventory names.
796
800
        
797
801
        That is, create any files that need to be created, and restore from
803
807
        child_pb = bzrlib.ui.ui_factory.nested_progress_bar()
804
808
        try:
805
809
            for num, (path, trans_id) in enumerate(new_paths):
806
 
                new_entry = None
807
810
                child_pb.update('adding file', num, len(new_paths))
808
811
                try:
809
812
                    kind = self._new_contents[trans_id]
826
829
                    if kind is None:
827
830
                        kind = file_kind(self._tree.abspath(path))
828
831
                    if trans_id in self._new_reference_revision:
829
 
                        new_entry = inventory.TreeReference(
830
 
                            self._new_id[trans_id],
 
832
                        entry = inventory.TreeReference(self._new_id[trans_id], 
831
833
                            self._new_name[trans_id], 
832
834
                            self.final_file_id(self._new_parent[trans_id]),
833
835
                            None, self._new_reference_revision[trans_id])
 
836
                        inv.add(entry)
834
837
                    else:
835
 
                        new_entry = inventory.make_entry(kind,
836
 
                            self.final_name(trans_id),
837
 
                            self.final_file_id(self.final_parent(trans_id)),
838
 
                            self._new_id[trans_id])
839
 
                else:
840
 
                    if trans_id in self._new_name or trans_id in\
841
 
                        self._new_parent or\
842
 
                        trans_id in self._new_executability:
843
 
                        file_id = self.final_file_id(trans_id)
844
 
                        if file_id is not None:
845
 
                            entry = inv[file_id]
846
 
                            new_entry = entry.copy()
847
 
 
848
 
                    if trans_id in self._new_name or trans_id in\
849
 
                        self._new_parent:
850
 
                            if new_entry is not None:
851
 
                                new_entry.name = self.final_name(trans_id)
852
 
                                parent = self.final_parent(trans_id)
853
 
                                parent_id = self.final_file_id(parent)
854
 
                                new_entry.parent_id = parent_id
855
 
 
 
838
                        inv.add_path(path, kind, self._new_id[trans_id])
 
839
                elif trans_id in self._new_name or trans_id in\
 
840
                    self._new_parent:
 
841
                    entry = limbo_inv.get(trans_id)
 
842
                    if entry is not None:
 
843
                        entry.name = self.final_name(trans_id)
 
844
                        parent_path = os.path.dirname(path)
 
845
                        entry.parent_id = \
 
846
                            self._tree.inventory.path2id(parent_path)
 
847
                        inv.add(entry)
 
848
 
 
849
                # requires files and inventory entries to be in place
856
850
                if trans_id in self._new_executability:
857
 
                    self._set_executability(path, new_entry, trans_id)
858
 
                if new_entry is not None:
859
 
                    if new_entry.file_id in inv:
860
 
                        old_path = inv.id2path(new_entry.file_id)
861
 
                    else:
862
 
                        old_path = None
863
 
                    inventory_delta.append((old_path, path,
864
 
                                            new_entry.file_id,
865
 
                                            new_entry))
 
851
                    self._set_executability(path, inv, trans_id)
866
852
        finally:
867
853
            child_pb.finished()
868
854
        return modified_paths
869
855
 
870
 
    def _set_executability(self, path, entry, trans_id):
 
856
    def _set_executability(self, path, inv, trans_id):
871
857
        """Set the executability of versioned files """
 
858
        file_id = inv.path2id(path)
872
859
        new_executability = self._new_executability[trans_id]
873
 
        entry.executable = new_executability
 
860
        inv[file_id].executable = new_executability
874
861
        if supports_executable():
875
862
            abspath = self._tree.abspath(path)
876
863
            current_mode = os.stat(abspath).st_mode