~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transform.py

(broken) merge aaron's workingtree format changes

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2006 Canonical Ltd
 
1
# Copyright (C) 2006, 2007 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
18
18
import errno
19
19
from stat import S_ISREG
20
20
 
21
 
from bzrlib import bzrdir, errors
22
21
from bzrlib.lazy_import import lazy_import
23
22
lazy_import(globals(), """
24
 
from bzrlib import delta
 
23
from bzrlib import (
 
24
    bzrdir,
 
25
    delta,
 
26
    errors,
 
27
    inventory
 
28
    )
25
29
""")
26
30
from bzrlib.errors import (DuplicateKey, MalformedTransform, NoSuchFile,
27
31
                           ReusingTransform, NotVersionedError, CantMoveRoot,
32
36
from bzrlib.progress import DummyProgress, ProgressPhase
33
37
from bzrlib.trace import mutter, warning
34
38
from bzrlib import tree
35
 
import bzrlib.ui 
 
39
import bzrlib.ui
36
40
import bzrlib.urlutils as urlutils
37
41
 
38
42
 
103
107
        self._new_contents = {}
104
108
        self._removed_contents = set()
105
109
        self._new_executability = {}
 
110
        self._new_reference_revision = {}
106
111
        self._new_id = {}
107
112
        self._non_present_ids = {}
108
113
        self._r_new_id = {}
353
358
        else:
354
359
            unique_add(self._new_executability, trans_id, executability)
355
360
 
 
361
    def set_tree_reference(self, revision_id, trans_id):
 
362
        """Set the reference associated with a directory"""
 
363
        unique_add(self._new_reference_revision, trans_id, revision_id)
 
364
 
356
365
    def version_file(self, file_id, trans_id):
357
366
        """Schedule a file to become versioned."""
358
367
        assert file_id is not None
781
790
                    file_id = self.tree_file_id(trans_id)
782
791
                    if file_id is not None:
783
792
                        limbo_inv[trans_id] = inv[file_id]
784
 
                        del inv[file_id]
 
793
                        inv.remove_recursive_id(file_id)
785
794
        finally:
786
795
            child_pb.finished()
787
796
 
818
827
                if trans_id in self._new_id:
819
828
                    if kind is None:
820
829
                        kind = file_kind(self._tree.abspath(path))
821
 
                    inv.add_path(path, kind, self._new_id[trans_id])
 
830
                    if trans_id in self._new_reference_revision:
 
831
                        entry = inventory.TreeReference(self._new_id[trans_id], 
 
832
                            self._new_name[trans_id], 
 
833
                            self.final_file_id(self._new_parent[trans_id]),
 
834
                            None, self._new_reference_revision[trans_id])
 
835
                        inv.add(entry)
 
836
                    else:
 
837
                        inv.add_path(path, kind, self._new_id[trans_id])
822
838
                elif trans_id in self._new_name or trans_id in\
823
839
                    self._new_parent:
824
840
                    entry = limbo_inv.get(trans_id)
1222
1238
        executable = tree.is_executable(entry.file_id)
1223
1239
        return tt.new_file(name, parent_id, contents, entry.file_id, 
1224
1240
                           executable)
1225
 
    elif kind == 'directory':
1226
 
        return tt.new_directory(name, parent_id, entry.file_id)
 
1241
    elif kind in ('directory', 'tree-reference'):
 
1242
        trans_id = tt.new_directory(name, parent_id, entry.file_id)
 
1243
        if kind == 'tree-reference':
 
1244
            tt.set_tree_reference(entry.reference_revision, trans_id)
 
1245
        return trans_id 
1227
1246
    elif kind == 'symlink':
1228
1247
        target = tree.get_symlink_target(entry.file_id)
1229
1248
        return tt.new_symlink(name, parent_id, target, entry.file_id)
 
1249
    else:
 
1250
        raise errors.BadFileKindError(name, kind)
1230
1251
 
1231
1252
def create_by_entry(tt, entry, tree, trans_id, lines=None, mode_id=None):
1232
1253
    """Create new file contents according to an inventory entry."""