1898
1898
path = self._tree_id_paths.get(trans_id)
1899
1899
if path is None:
1901
file_id = self._tree.path2id(path)
1903
return self._tree.kind(file_id)
1904
except errors.NoSuchFile:
1901
kind = self._tree.path_content_summary(path)[0]
1902
if kind == 'missing':
1907
1906
def _set_mode(self, trans_id, mode_id, typefunc):
1908
1907
"""Set the mode of new file contents.
1977
1976
vf.fallback_versionedfiles.append(base_vf)
1978
1977
return tree_revision
1980
def _stat_limbo_file(self, file_id):
1981
trans_id = self._transform.trans_id_file_id(file_id)
1979
def _stat_limbo_file(self, file_id=None, trans_id=None):
1980
if trans_id is None:
1981
trans_id = self._transform.trans_id_file_id(file_id)
1982
1982
name = self._transform._limbo_name(trans_id)
1983
1983
return os.lstat(name)
2200
2200
def get_file_size(self, file_id):
2201
2201
"""See Tree.get_file_size"""
2202
trans_id = self._transform.trans_id_file_id(file_id)
2203
kind = self._transform.final_kind(trans_id)
2206
if trans_id in self._transform._new_contents:
2207
return self._stat_limbo_file(trans_id=trans_id).st_size
2202
2208
if self.kind(file_id) == 'file':
2203
2209
return self._transform._tree.get_file_size(file_id)
2232
2238
except errors.NoSuchId:
2241
def has_filename(self, path):
2242
trans_id = self._path2trans_id(path)
2243
if trans_id in self._transform._new_contents:
2245
elif trans_id in self._transform._removed_contents:
2248
return self._transform._tree.has_filename(path)
2235
2250
def path_content_summary(self, path):
2236
2251
trans_id = self._path2trans_id(path)
2237
2252
tt = self._transform
2325
2340
self.get_file(file_id).readlines(),
2326
2341
default_revision)
2328
def get_symlink_target(self, file_id):
2343
def get_symlink_target(self, file_id, path=None):
2329
2344
"""See Tree.get_symlink_target"""
2330
2345
if not self._content_change(file_id):
2331
2346
return self._transform._tree.get_symlink_target(file_id)
2842
2857
backups, merge_modified, basis_tree=None):
2843
2858
if basis_tree is not None:
2844
2859
basis_tree.lock_read()
2845
change_list = target_tree.iter_changes(working_tree,
2860
# We ask the working_tree for its changes relative to the target, rather
2861
# than the target changes relative to the working tree. Because WT4 has an
2862
# optimizer to compare itself to a target, but no optimizer for the
2864
change_list = working_tree.iter_changes(target_tree,
2846
2865
specific_files=specific_files, pb=pb)
2847
2866
if target_tree.get_root_id() is None:
2848
2867
skip_root = True
2852
2871
deferred_files = []
2853
2872
for id_num, (file_id, path, changed_content, versioned, parent, name,
2854
2873
kind, executable) in enumerate(change_list):
2855
if skip_root and file_id[0] is not None and parent[0] is None:
2874
target_path, wt_path = path
2875
target_versioned, wt_versioned = versioned
2876
target_parent, wt_parent = parent
2877
target_name, wt_name = name
2878
target_kind, wt_kind = kind
2879
target_executable, wt_executable = executable
2880
if skip_root and wt_parent is None:
2857
2882
trans_id = tt.trans_id_file_id(file_id)
2859
2884
if changed_content:
2860
2885
keep_content = False
2861
if kind[0] == 'file' and (backups or kind[1] is None):
2886
if wt_kind == 'file' and (backups or target_kind is None):
2862
2887
wt_sha1 = working_tree.get_file_sha1(file_id)
2863
2888
if merge_modified.get(file_id) != wt_sha1:
2864
2889
# acquire the basis tree lazily to prevent the
2870
2895
if file_id in basis_tree:
2871
2896
if wt_sha1 != basis_tree.get_file_sha1(file_id):
2872
2897
keep_content = True
2873
elif kind[1] is None and not versioned[1]:
2898
elif target_kind is None and not target_versioned:
2874
2899
keep_content = True
2875
if kind[0] is not None:
2900
if wt_kind is not None:
2876
2901
if not keep_content:
2877
2902
tt.delete_contents(trans_id)
2878
elif kind[1] is not None:
2879
parent_trans_id = tt.trans_id_file_id(parent[0])
2903
elif target_kind is not None:
2904
parent_trans_id = tt.trans_id_file_id(wt_parent)
2880
2905
backup_name = tt._available_backup_name(
2881
name[0], parent_trans_id)
2906
wt_name, parent_trans_id)
2882
2907
tt.adjust_path(backup_name, parent_trans_id, trans_id)
2883
new_trans_id = tt.create_path(name[0], parent_trans_id)
2884
if versioned == (True, True):
2908
new_trans_id = tt.create_path(wt_name, parent_trans_id)
2909
if wt_versioned and target_versioned:
2885
2910
tt.unversion_file(trans_id)
2886
2911
tt.version_file(file_id, new_trans_id)
2887
2912
# New contents should have the same unix perms as old
2889
2914
mode_id = trans_id
2890
2915
trans_id = new_trans_id
2891
if kind[1] in ('directory', 'tree-reference'):
2916
if target_kind in ('directory', 'tree-reference'):
2892
2917
tt.create_directory(trans_id)
2893
if kind[1] == 'tree-reference':
2918
if target_kind == 'tree-reference':
2894
2919
revision = target_tree.get_reference_revision(file_id,
2896
2921
tt.set_tree_reference(revision, trans_id)
2897
elif kind[1] == 'symlink':
2922
elif target_kind == 'symlink':
2898
2923
tt.create_symlink(target_tree.get_symlink_target(file_id),
2900
elif kind[1] == 'file':
2925
elif target_kind == 'file':
2901
2926
deferred_files.append((file_id, (trans_id, mode_id)))
2902
2927
if basis_tree is None:
2903
2928
basis_tree = working_tree.basis_tree()
2911
2936
merge_modified[file_id] = new_sha1
2913
2938
# preserve the execute bit when backing up
2914
if keep_content and executable[0] == executable[1]:
2915
tt.set_executability(executable[1], trans_id)
2916
elif kind[1] is not None:
2917
raise AssertionError(kind[1])
2918
if versioned == (False, True):
2939
if keep_content and wt_executable == target_executable:
2940
tt.set_executability(target_executable, trans_id)
2941
elif target_kind is not None:
2942
raise AssertionError(target_kind)
2943
if not wt_versioned and target_versioned:
2919
2944
tt.version_file(file_id, trans_id)
2920
if versioned == (True, False):
2945
if wt_versioned and not target_versioned:
2921
2946
tt.unversion_file(trans_id)
2922
if (name[1] is not None and
2923
(name[0] != name[1] or parent[0] != parent[1])):
2924
if name[1] == '' and parent[1] is None:
2947
if (target_name is not None and
2948
(wt_name != target_name or wt_parent != target_parent)):
2949
if target_name == '' and target_parent is None:
2925
2950
parent_trans = ROOT_PARENT
2927
parent_trans = tt.trans_id_file_id(parent[1])
2928
if parent[0] is None and versioned[0]:
2929
tt.adjust_root_path(name[1], parent_trans)
2952
parent_trans = tt.trans_id_file_id(target_parent)
2953
if wt_parent is None and wt_versioned:
2954
tt.adjust_root_path(target_name, parent_trans)
2931
tt.adjust_path(name[1], parent_trans, trans_id)
2932
if executable[0] != executable[1] and kind[1] == "file":
2933
tt.set_executability(executable[1], trans_id)
2956
tt.adjust_path(target_name, parent_trans, trans_id)
2957
if wt_executable != target_executable and target_kind == "file":
2958
tt.set_executability(target_executable, trans_id)
2934
2959
if working_tree.supports_content_filtering():
2935
2960
for index, ((trans_id, mode_id), bytes) in enumerate(
2936
2961
target_tree.iter_files_bytes(deferred_files)):