~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transform.py

  • Committer: John Arbash Meinel
  • Date: 2010-08-02 17:16:12 UTC
  • mto: This revision was merged to the branch mainline in revision 5369.
  • Revision ID: john@arbash-meinel.com-20100802171612-rdh5ods70w2bl3j7
We also have to re-implement it for _simple_set_pyx.pyx

Show diffs side-by-side

added added

removed removed

Lines of Context:
1657
1657
                      or trans_id in self._new_parent):
1658
1658
                    try:
1659
1659
                        mover.rename(full_path, self._limbo_name(trans_id))
1660
 
                    except OSError, e:
 
1660
                    except errors.TransformRenameFailed, e:
1661
1661
                        if e.errno != errno.ENOENT:
1662
1662
                            raise
1663
1663
                    else:
1688
1688
                if trans_id in self._needs_rename:
1689
1689
                    try:
1690
1690
                        mover.rename(self._limbo_name(trans_id), full_path)
1691
 
                    except OSError, e:
 
1691
                    except errors.TransformRenameFailed, e:
1692
1692
                        # We may be renaming a dangling inventory id
1693
1693
                        if e.errno != errno.ENOENT:
1694
1694
                            raise
1792
1792
        parent_keys = [(file_id, self._file_revision(t, file_id)) for t in
1793
1793
                       self._iter_parent_trees()]
1794
1794
        vf.add_lines((file_id, tree_revision), parent_keys,
1795
 
                     self.get_file(file_id).readlines())
 
1795
                     self.get_file_lines(file_id))
1796
1796
        repo = self._get_repository()
1797
1797
        base_vf = repo.texts
1798
1798
        if base_vf not in vf.fallback_versionedfiles:
2291
2291
    for num, _unused in enumerate(wt.all_file_ids()):
2292
2292
        if num > 0:  # more than just a root
2293
2293
            raise errors.WorkingTreeAlreadyPopulated(base=wt.basedir)
2294
 
    existing_files = set()
2295
 
    for dir, files in wt.walkdirs():
2296
 
        existing_files.update(f[0] for f in files)
2297
2294
    file_trans_id = {}
2298
2295
    top_pb = bzrlib.ui.ui_factory.nested_progress_bar()
2299
2296
    pp = ProgressPhase("Build phase", 2, top_pb)
2323
2320
                precomputed_delta = []
2324
2321
            else:
2325
2322
                precomputed_delta = None
 
2323
            # Check if tree inventory has content. If so, we populate
 
2324
            # existing_files with the directory content. If there are no
 
2325
            # entries we skip populating existing_files as its not used.
 
2326
            # This improves performance and unncessary work on large
 
2327
            # directory trees. (#501307)
 
2328
            if total > 0:
 
2329
                existing_files = set()
 
2330
                for dir, files in wt.walkdirs():
 
2331
                    existing_files.update(f[0] for f in files)
2326
2332
            for num, (tree_path, entry) in \
2327
2333
                enumerate(tree.inventory.iter_entries_by_dir()):
2328
2334
                pb.update("Building tree", num - len(deferred_contents), total)
2460
2466
    if entry.kind == "directory":
2461
2467
        return True
2462
2468
    if entry.kind == "file":
2463
 
        if tree.get_file(file_id).read() == file(target_path, 'rb').read():
2464
 
            return True
 
2469
        f = file(target_path, 'rb')
 
2470
        try:
 
2471
            if tree.get_file_text(file_id) == f.read():
 
2472
                return True
 
2473
        finally:
 
2474
            f.close()
2465
2475
    elif entry.kind == "symlink":
2466
2476
        if tree.get_symlink_target(file_id) == os.readlink(target_path):
2467
2477
            return True
2519
2529
        raise errors.BadFileKindError(name, kind)
2520
2530
 
2521
2531
 
2522
 
@deprecated_function(deprecated_in((1, 9, 0)))
2523
 
def create_by_entry(tt, entry, tree, trans_id, lines=None, mode_id=None):
2524
 
    """Create new file contents according to an inventory entry.
2525
 
 
2526
 
    DEPRECATED.  Use create_from_tree instead.
2527
 
    """
2528
 
    if entry.kind == "file":
2529
 
        if lines is None:
2530
 
            lines = tree.get_file(entry.file_id).readlines()
2531
 
        tt.create_file(lines, trans_id, mode_id=mode_id)
2532
 
    elif entry.kind == "symlink":
2533
 
        tt.create_symlink(tree.get_symlink_target(entry.file_id), trans_id)
2534
 
    elif entry.kind == "directory":
2535
 
        tt.create_directory(trans_id)
2536
 
 
2537
 
 
2538
2532
def create_from_tree(tt, trans_id, tree, file_id, bytes=None,
2539
2533
    filter_tree_path=None):
2540
2534
    """Create new file contents according to tree contents.
2926
2920
        """Rename a file from one path to another."""
2927
2921
        try:
2928
2922
            osutils.rename(from_, to)
2929
 
        except OSError, e:
 
2923
        except (IOError, OSError), e:
2930
2924
            if e.errno in (errno.EEXIST, errno.ENOTEMPTY):
2931
2925
                raise errors.FileExists(to, str(e))
2932
 
            raise
 
2926
            # normal OSError doesn't include filenames so it's hard to see where
 
2927
            # the problem is, see https://bugs.launchpad.net/bzr/+bug/491763
 
2928
            raise errors.TransformRenameFailed(from_, to, str(e), e.errno)
2933
2929
        self.past_renames.append((from_, to))
2934
2930
 
2935
2931
    def pre_delete(self, from_, to):
2945
2941
    def rollback(self):
2946
2942
        """Reverse all renames that have been performed"""
2947
2943
        for from_, to in reversed(self.past_renames):
2948
 
            osutils.rename(to, from_)
 
2944
            try:
 
2945
                osutils.rename(to, from_)
 
2946
            except (OSError, IOError), e:
 
2947
                raise errors.TransformRenameFailed(to, from_, str(e), e.errno)                
2949
2948
        # after rollback, don't reuse _FileMover
2950
2949
        past_renames = None
2951
2950
        pending_deletions = None