1914
1914
paths = FinalPaths(self)
1915
1915
for trans_id, observed in viewitems(self._observed_sha1s):
1916
1916
path = paths.get_path(trans_id)
1917
# We could get the file_id, but dirstate prefers to use the path
1918
# anyway, and it is 'cheaper' to determine.
1919
# file_id = self._new_id[trans_id]
1920
self._tree._observed_sha1(None, path, observed)
1917
self._tree._observed_sha1(path, observed)
1923
1920
class TransformPreview(DiskTreeTransform):
2011
2008
def _get_file_revision(self, path, file_id, vf, tree_revision):
2012
2009
parent_keys = [
2013
(file_id, t.get_file_revision(t.id2path(file_id), file_id))
2010
(file_id, t.get_file_revision(t.id2path(file_id)))
2014
2011
for t in self._iter_parent_trees()]
2015
2012
vf.add_lines((file_id, tree_revision), parent_keys,
2016
self.get_file_lines(path, file_id))
2013
self.get_file_lines(path))
2017
2014
repo = self._get_repository()
2018
2015
base_vf = repo.texts
2019
2016
if base_vf not in vf.fallback_versionedfiles:
2037
2034
executable = False
2039
2036
file_id = self._transform.final_file_id(self._path2trans_id(path))
2040
executable = self.is_executable(path, file_id)
2037
executable = self.is_executable(path)
2041
2038
return kind, executable, None
2043
2040
def is_locked(self):
2177
2174
ordered_ids.append((trans_id, parent_file_id))
2178
2175
return ordered_ids
2180
def iter_child_entries(self, path, file_id=None):
2177
def iter_child_entries(self, path):
2181
2178
trans_id = self._path2trans_id(path)
2182
2179
if trans_id is None:
2183
2180
raise errors.NoSuchFile(path)
2236
2233
for path, entry in entries:
2237
2234
yield path, 'V', entry.kind, entry.file_id, entry
2239
def kind(self, path, file_id=None):
2236
def kind(self, path):
2240
2237
trans_id = self._path2trans_id(path)
2241
2238
if trans_id is None:
2242
2239
raise errors.NoSuchFile(path)
2243
2240
return self._transform.final_kind(trans_id)
2245
def stored_kind(self, path, file_id=None):
2242
def stored_kind(self, path):
2246
2243
trans_id = self._path2trans_id(path)
2247
2244
if trans_id is None:
2248
2245
raise errors.NoSuchFile(path)
2250
2247
return self._transform._new_contents[trans_id]
2251
2248
except KeyError:
2252
return self._transform._tree.stored_kind(path, file_id)
2249
return self._transform._tree.stored_kind(path)
2254
def get_file_mtime(self, path, file_id=None):
2251
def get_file_mtime(self, path):
2255
2252
"""See Tree.get_file_mtime"""
2257
file_id = self.path2id(path)
2253
file_id = self.path2id(path)
2258
2254
if file_id is None:
2259
2255
raise errors.NoSuchFile(path)
2260
2256
if not self._content_change(file_id):
2261
2257
return self._transform._tree.get_file_mtime(
2262
self._transform._tree.id2path(file_id), file_id)
2258
self._transform._tree.id2path(file_id))
2263
2259
trans_id = self._path2trans_id(path)
2264
2260
return self._stat_limbo_file(trans_id).st_mtime
2266
def get_file_size(self, path, file_id=None):
2262
def get_file_size(self, path):
2267
2263
"""See Tree.get_file_size"""
2268
2264
trans_id = self._path2trans_id(path)
2269
2265
if trans_id is None:
2274
2270
if trans_id in self._transform._new_contents:
2275
2271
return self._stat_limbo_file(trans_id).st_size
2276
if self.kind(path, file_id) == 'file':
2277
return self._transform._tree.get_file_size(path, file_id)
2272
if self.kind(path) == 'file':
2273
return self._transform._tree.get_file_size(path)
2281
def get_file_verifier(self, path, file_id=None, stat_value=None):
2277
def get_file_verifier(self, path, stat_value=None):
2282
2278
trans_id = self._path2trans_id(path)
2283
2279
if trans_id is None:
2284
2280
raise errors.NoSuchFile(path)
2285
2281
kind = self._transform._new_contents.get(trans_id)
2286
2282
if kind is None:
2287
return self._transform._tree.get_file_verifier(path, file_id)
2283
return self._transform._tree.get_file_verifier(path)
2288
2284
if kind == 'file':
2289
with self.get_file(path, file_id) as fileobj:
2285
with self.get_file(path) as fileobj:
2290
2286
return ("SHA1", sha_file(fileobj))
2292
def get_file_sha1(self, path, file_id=None, stat_value=None):
2288
def get_file_sha1(self, path, stat_value=None):
2293
2289
trans_id = self._path2trans_id(path)
2294
2290
if trans_id is None:
2295
2291
raise errors.NoSuchFile(path)
2296
2292
kind = self._transform._new_contents.get(trans_id)
2297
2293
if kind is None:
2298
return self._transform._tree.get_file_sha1(path, file_id)
2294
return self._transform._tree.get_file_sha1(path)
2299
2295
if kind == 'file':
2300
with self.get_file(path, file_id) as fileobj:
2296
with self.get_file(path) as fileobj:
2301
2297
return sha_file(fileobj)
2303
def is_executable(self, path, file_id=None):
2299
def is_executable(self, path):
2304
2300
trans_id = self._path2trans_id(path)
2305
2301
if trans_id is None:
2308
2304
return self._transform._new_executability[trans_id]
2309
2305
except KeyError:
2311
return self._transform._tree.is_executable(path, file_id)
2307
return self._transform._tree.is_executable(path)
2312
2308
except OSError as e:
2313
2309
if e.errno == errno.ENOENT:
2378
2374
raise ValueError('want_unversioned is not supported')
2379
2375
return self._transform.iter_changes()
2381
def get_file(self, path, file_id=None):
2377
def get_file(self, path):
2382
2378
"""See Tree.get_file"""
2384
file_id = self.path2id(path)
2379
file_id = self.path2id(path)
2385
2380
if not self._content_change(file_id):
2386
return self._transform._tree.get_file(path, file_id)
2381
return self._transform._tree.get_file(path)
2387
2382
trans_id = self._path2trans_id(path)
2388
2383
name = self._transform._limbo_name(trans_id)
2389
2384
return open(name, 'rb')
2391
def get_file_with_stat(self, path, file_id=None):
2392
return self.get_file(path, file_id), None
2386
def get_file_with_stat(self, path):
2387
return self.get_file(path), None
2394
def annotate_iter(self, path, file_id=None,
2389
def annotate_iter(self, path,
2395
2390
default_revision=_mod_revision.CURRENT_REVISION):
2397
file_id = self.path2id(path)
2391
file_id = self.path2id(path)
2398
2392
changes = self._iter_changes_cache.get(file_id)
2399
2393
if changes is None:
2406
2400
get_old = (kind[0] == 'file' and versioned[0])
2408
2402
old_annotation = self._transform._tree.annotate_iter(
2409
path, file_id=file_id, default_revision=default_revision)
2403
path, default_revision=default_revision)
2411
2405
old_annotation = []
2412
2406
if changes is None:
2421
2415
# It would be nice to be able to use the new Annotator based
2422
2416
# approach, as well.
2423
2417
return annotate.reannotate([old_annotation],
2424
self.get_file(path, file_id).readlines(),
2418
self.get_file(path).readlines(),
2425
2419
default_revision)
2427
def get_symlink_target(self, path, file_id=None):
2421
def get_symlink_target(self, path):
2428
2422
"""See Tree.get_symlink_target"""
2430
file_id = self.path2id(path)
2423
file_id = self.path2id(path)
2431
2424
if not self._content_change(file_id):
2432
2425
return self._transform._tree.get_symlink_target(path)
2433
2426
trans_id = self._path2trans_id(path)
2454
2447
kind = 'unknown'
2455
2448
versioned_kind = self._transform._tree.stored_kind(
2456
self._transform._tree.id2path(file_id),
2449
self._transform._tree.id2path(file_id))
2458
2450
if versioned_kind == 'directory':
2459
2451
subdirs.append(child_id)
2460
2452
children.append((path_from_root, basename, kind, None,
2632
2624
trans_id = tt.create_path(entry.name, parent_id)
2633
2625
file_trans_id[file_id] = trans_id
2634
2626
tt.version_file(file_id, trans_id)
2635
executable = tree.is_executable(tree_path, file_id)
2627
executable = tree.is_executable(tree_path)
2637
2629
tt.set_executability(executable, trans_id)
2638
2630
trans_data = (trans_id, file_id, tree_path, entry.text_sha1)
2734
2726
if entry.kind == "file":
2735
2727
with open(target_path, 'rb') as f1, \
2736
tree.get_file(tree_path, file_id) as f2:
2728
tree.get_file(tree_path) as f2:
2737
2729
if osutils.compare_files(f1, f2):
2739
2731
elif entry.kind == "symlink":
2740
if tree.get_symlink_target(tree_path, file_id) == os.readlink(target_path):
2732
if tree.get_symlink_target(tree_path) == os.readlink(target_path):
2777
2769
name = entry.name
2778
2770
kind = entry.kind
2779
2771
if kind == 'file':
2780
with tree.get_file(path, entry.file_id) as f:
2781
executable = tree.is_executable(path, entry.file_id)
2772
with tree.get_file(path) as f:
2773
executable = tree.is_executable(path)
2782
2774
return tt.new_file(
2783
2775
name, parent_id, osutils.file_iterator(f), entry.file_id,
2788
2780
tt.set_tree_reference(entry.reference_revision, trans_id)
2789
2781
return trans_id
2790
2782
elif kind == 'symlink':
2791
target = tree.get_symlink_target(path, entry.file_id)
2783
target = tree.get_symlink_target(path)
2792
2784
return tt.new_symlink(name, parent_id, target, entry.file_id)
2794
2786
raise errors.BadFileKindError(name, kind)
2802
2794
content filters to apply to the bytes output in the working tree.
2803
2795
This only applies if the working tree supports content filtering.
2805
kind = tree.kind(path, file_id)
2797
kind = tree.kind(path)
2806
2798
if kind == 'directory':
2807
2799
tt.create_directory(trans_id)
2808
2800
elif kind == "file":
2809
2801
if chunks is None:
2810
f = tree.get_file(path, file_id)
2802
f = tree.get_file(path)
2811
2803
chunks = osutils.file_iterator(f)
2822
2814
if f is not None:
2824
2816
elif kind == "symlink":
2825
tt.create_symlink(tree.get_symlink_target(path, file_id), trans_id)
2817
tt.create_symlink(tree.get_symlink_target(path), trans_id)
2827
2819
raise AssertionError('Unknown kind %r' % kind)
2904
2896
if changed_content:
2905
2897
keep_content = False
2906
2898
if wt_kind == 'file' and (backups or target_kind is None):
2907
wt_sha1 = working_tree.get_file_sha1(wt_path, file_id)
2899
wt_sha1 = working_tree.get_file_sha1(wt_path)
2908
2900
if merge_modified.get(file_id) != wt_sha1:
2909
2901
# acquire the basis tree lazily to prevent the
2910
2902
# expense of accessing it when it's not needed ?
2939
2931
tt.create_directory(trans_id)
2940
2932
if target_kind == 'tree-reference':
2941
2933
revision = target_tree.get_reference_revision(
2942
target_path, file_id)
2943
2935
tt.set_tree_reference(revision, trans_id)
2944
2936
elif target_kind == 'symlink':
2945
2937
tt.create_symlink(target_tree.get_symlink_target(
2946
target_path, file_id), trans_id)
2938
target_path), trans_id)
2947
2939
elif target_kind == 'file':
2948
2940
deferred_files.append((target_path, (trans_id, mode_id, file_id)))
2949
2941
if basis_tree is None:
2950
2942
basis_tree = working_tree.basis_tree()
2951
2943
basis_tree.lock_read()
2952
new_sha1 = target_tree.get_file_sha1(target_path, file_id)
2944
new_sha1 = target_tree.get_file_sha1(target_path)
2953
2945
basis_path = find_previous_path(target_tree, basis_tree, target_path)
2954
2946
if (basis_path is not None and
2955
new_sha1 == basis_tree.get_file_sha1(basis_path, file_id)):
2947
new_sha1 == basis_tree.get_file_sha1(basis_path)):
2956
2948
if file_id in merge_modified:
2957
2949
del merge_modified[file_id]