1089
1091
file_id = self._text_parent(trans_id)
1090
1092
if file_id is None:
1092
return (self._tree.get_file_text(file_id),)
1094
return (self._tree.get_file_text(self._tree.id2path(file_id), file_id),)
1094
1096
def _get_parents_lines(self, trans_id):
1095
1097
"""Get lines for compression parents of this file."""
1096
1098
file_id = self._text_parent(trans_id)
1097
1099
if file_id is None:
1099
return (self._tree.get_file_lines(file_id),)
1101
return (self._tree.get_file_lines(self._tree.id2path(file_id), file_id),)
1101
1103
def serialize(self, serializer):
1102
1104
"""Serialize this TreeTransform.
2008
2011
except errors.NoSuchRevisionInTree:
2009
2012
yield self._get_repository().revision_tree(revision_id)
2011
def _get_file_revision(self, file_id, vf, tree_revision):
2012
parent_keys = [(file_id, t.get_file_revision(file_id)) for t in
2013
self._iter_parent_trees()]
2014
def _get_file_revision(self, path, file_id, vf, tree_revision):
2016
(file_id, t.get_file_revision(t.id2path(file_id), file_id))
2017
for t in self._iter_parent_trees()]
2014
2018
vf.add_lines((file_id, tree_revision), parent_keys,
2015
self.get_file_lines(file_id))
2019
self.get_file_lines(path, file_id))
2016
2020
repo = self._get_repository()
2017
2021
base_vf = repo.texts
2018
2022
if base_vf not in vf.fallback_versionedfiles:
2232
2238
for path, entry in entries:
2233
2239
yield path, 'V', entry.kind, entry.file_id, entry
2235
def kind(self, file_id):
2241
def kind(self, path, file_id=None):
2243
file_id = self.path2id(path)
2236
2244
trans_id = self._transform.trans_id_file_id(file_id)
2237
2245
return self._transform.final_kind(trans_id)
2239
def stored_kind(self, file_id):
2247
def stored_kind(self, path, file_id=None):
2249
file_id = self.path2id(path)
2240
2250
trans_id = self._transform.trans_id_file_id(file_id)
2242
2252
return self._transform._new_contents[trans_id]
2243
2253
except KeyError:
2244
return self._transform._tree.stored_kind(file_id)
2254
return self._transform._tree.stored_kind(path, file_id)
2246
def get_file_mtime(self, file_id, path=None):
2256
def get_file_mtime(self, path, file_id=None):
2247
2257
"""See Tree.get_file_mtime"""
2259
file_id = self.path2id(path)
2261
raise errors.NoSuchFile(path)
2248
2262
if not self._content_change(file_id):
2249
return self._transform._tree.get_file_mtime(file_id)
2263
return self._transform._tree.get_file_mtime(
2264
self._transform._tree.id2path(file_id), file_id)
2250
2265
return self._stat_limbo_file(file_id).st_mtime
2252
2267
def _file_size(self, entry, stat_value):
2253
return self.get_file_size(entry.file_id)
2268
path = self.id2path(entry.file_id)
2269
return self.get_file_size(path, entry.file_id)
2255
def get_file_size(self, file_id):
2271
def get_file_size(self, path, file_id=None):
2256
2272
"""See Tree.get_file_size"""
2274
file_id = self.path2id(path)
2257
2275
trans_id = self._transform.trans_id_file_id(file_id)
2258
2276
kind = self._transform.final_kind(trans_id)
2259
2277
if kind != 'file':
2261
2279
if trans_id in self._transform._new_contents:
2262
2280
return self._stat_limbo_file(trans_id=trans_id).st_size
2263
if self.kind(file_id) == 'file':
2264
return self._transform._tree.get_file_size(file_id)
2281
if self.kind(path, file_id) == 'file':
2282
return self._transform._tree.get_file_size(path, file_id)
2268
def get_file_verifier(self, file_id, path=None, stat_value=None):
2286
def get_file_verifier(self, path, file_id=None, stat_value=None):
2288
file_id = self.path2id(path)
2269
2289
trans_id = self._transform.trans_id_file_id(file_id)
2270
2290
kind = self._transform._new_contents.get(trans_id)
2271
2291
if kind is None:
2272
return self._transform._tree.get_file_verifier(file_id)
2292
return self._transform._tree.get_file_verifier(path, file_id)
2273
2293
if kind == 'file':
2274
fileobj = self.get_file(file_id)
2294
fileobj = self.get_file(path, file_id)
2276
2296
return ("SHA1", sha_file(fileobj))
2278
2298
fileobj.close()
2280
def get_file_sha1(self, file_id, path=None, stat_value=None):
2300
def get_file_sha1(self, path, file_id=None, stat_value=None):
2302
file_id = self.path2id(path)
2281
2303
trans_id = self._transform.trans_id_file_id(file_id)
2282
2304
kind = self._transform._new_contents.get(trans_id)
2283
2305
if kind is None:
2284
return self._transform._tree.get_file_sha1(file_id)
2306
return self._transform._tree.get_file_sha1(path, file_id)
2285
2307
if kind == 'file':
2286
fileobj = self.get_file(file_id)
2308
fileobj = self.get_file(path, file_id)
2288
2310
return sha_file(fileobj)
2290
2312
fileobj.close()
2292
def is_executable(self, file_id, path=None):
2314
def is_executable(self, path, file_id=None):
2316
file_id = self.path2id(path)
2293
2317
if file_id is None:
2295
2319
trans_id = self._transform.trans_id_file_id(file_id)
2365
2389
raise ValueError('want_unversioned is not supported')
2366
2390
return self._transform.iter_changes()
2368
def get_file(self, file_id, path=None):
2392
def get_file(self, path, file_id=None):
2369
2393
"""See Tree.get_file"""
2395
file_id = self.path2id(path)
2370
2396
if not self._content_change(file_id):
2371
return self._transform._tree.get_file(file_id, path)
2397
return self._transform._tree.get_file(path, file_id)
2372
2398
trans_id = self._transform.trans_id_file_id(file_id)
2373
2399
name = self._transform._limbo_name(trans_id)
2374
2400
return open(name, 'rb')
2376
def get_file_with_stat(self, file_id, path=None):
2377
return self.get_file(file_id, path), None
2402
def get_file_with_stat(self, path, file_id=None):
2403
return self.get_file(path, file_id), None
2379
def annotate_iter(self, file_id,
2405
def annotate_iter(self, path, file_id=None,
2380
2406
default_revision=_mod_revision.CURRENT_REVISION):
2408
file_id = self.path2id(path)
2381
2409
changes = self._iter_changes_cache.get(file_id)
2382
2410
if changes is None:
2404
2432
# It would be nice to be able to use the new Annotator based
2405
2433
# approach, as well.
2406
2434
return annotate.reannotate([old_annotation],
2407
self.get_file(file_id).readlines(),
2435
self.get_file(path, file_id).readlines(),
2408
2436
default_revision)
2410
def get_symlink_target(self, file_id, path=None):
2438
def get_symlink_target(self, path, file_id=None):
2411
2439
"""See Tree.get_symlink_target"""
2441
file_id = self.path2id(path)
2412
2442
if not self._content_change(file_id):
2413
return self._transform._tree.get_symlink_target(file_id)
2443
return self._transform._tree.get_symlink_target(path)
2414
2444
trans_id = self._transform.trans_id_file_id(file_id)
2415
2445
name = self._transform._limbo_name(trans_id)
2416
2446
return osutils.readlink(name)
2613
2645
trans_id = tt.create_path(entry.name, parent_id)
2614
2646
file_trans_id[file_id] = trans_id
2615
2647
tt.version_file(file_id, trans_id)
2616
executable = tree.is_executable(file_id, tree_path)
2648
executable = tree.is_executable(tree_path, file_id)
2618
2650
tt.set_executability(executable, trans_id)
2619
2651
trans_data = (trans_id, tree_path, entry.text_sha1)
2620
2652
deferred_contents.append((file_id, trans_data))
2622
file_trans_id[file_id] = new_by_entry(tt, entry, parent_id,
2654
file_trans_id[file_id] = new_by_entry(
2655
tree_path, tt, entry, parent_id, tree)
2625
2657
new_trans_id = file_trans_id[file_id]
2626
2658
old_parent = tt.trans_id_tree_path(tree_path)
2763
2796
return new_conflicts
2766
def new_by_entry(tt, entry, parent_id, tree):
2799
def new_by_entry(path, tt, entry, parent_id, tree):
2767
2800
"""Create a new file according to its inventory entry"""
2768
2801
name = entry.name
2769
2802
kind = entry.kind
2770
2803
if kind == 'file':
2771
contents = tree.get_file(entry.file_id).readlines()
2772
executable = tree.is_executable(entry.file_id)
2804
contents = tree.get_file(path, entry.file_id).readlines()
2805
executable = tree.is_executable(path, entry.file_id)
2773
2806
return tt.new_file(name, parent_id, contents, entry.file_id,
2775
2808
elif kind in ('directory', 'tree-reference'):
2778
2811
tt.set_tree_reference(entry.reference_revision, trans_id)
2779
2812
return trans_id
2780
2813
elif kind == 'symlink':
2781
target = tree.get_symlink_target(entry.file_id)
2814
target = tree.get_symlink_target(path, entry.file_id)
2782
2815
return tt.new_symlink(name, parent_id, target, entry.file_id)
2784
2817
raise errors.BadFileKindError(name, kind)
2787
def create_from_tree(tt, trans_id, tree, file_id, bytes=None,
2820
def create_from_tree(tt, trans_id, tree, path, file_id=None, bytes=None,
2788
2821
filter_tree_path=None):
2789
2822
"""Create new file contents according to tree contents.
2791
2824
:param filter_tree_path: the tree path to use to lookup
2792
2825
content filters to apply to the bytes output in the working tree.
2793
2826
This only applies if the working tree supports content filtering.
2795
kind = tree.kind(file_id)
2828
kind = tree.kind(path, file_id)
2796
2829
if kind == 'directory':
2797
2830
tt.create_directory(trans_id)
2798
2831
elif kind == "file":
2799
2832
if bytes is None:
2800
tree_file = tree.get_file(file_id)
2833
tree_file = tree.get_file(path, file_id)
2802
2835
bytes = tree_file.readlines()
2931
2967
if target_kind in ('directory', 'tree-reference'):
2932
2968
tt.create_directory(trans_id)
2933
2969
if target_kind == 'tree-reference':
2934
revision = target_tree.get_reference_revision(file_id,
2970
revision = target_tree.get_reference_revision(
2971
target_path, file_id)
2936
2972
tt.set_tree_reference(revision, trans_id)
2937
2973
elif target_kind == 'symlink':
2938
tt.create_symlink(target_tree.get_symlink_target(file_id),
2974
tt.create_symlink(target_tree.get_symlink_target(
2975
target_path, file_id), trans_id)
2940
2976
elif target_kind == 'file':
2941
2977
deferred_files.append((file_id, (trans_id, mode_id)))
2942
2978
if basis_tree is None:
2943
2979
basis_tree = working_tree.basis_tree()
2944
2980
basis_tree.lock_read()
2945
new_sha1 = target_tree.get_file_sha1(file_id)
2946
if (basis_tree.has_id(file_id) and
2947
new_sha1 == basis_tree.get_file_sha1(file_id)):
2981
new_sha1 = target_tree.get_file_sha1(target_path, file_id)
2983
basis_path = basis_tree.id2path(file_id)
2984
except errors.NoSuchId:
2986
if (basis_path is not None and
2987
new_sha1 == basis_tree.get_file_sha1(basis_path, file_id)):
2948
2988
if file_id in merge_modified:
2949
2989
del merge_modified[file_id]