1915
1915
paths = FinalPaths(self)
1916
1916
for trans_id, observed in viewitems(self._observed_sha1s):
1917
1917
path = paths.get_path(trans_id)
1918
# We could get the file_id, but dirstate prefers to use the path
1919
# anyway, and it is 'cheaper' to determine.
1920
# file_id = self._new_id[trans_id]
1921
self._tree._observed_sha1(None, path, observed)
1918
self._tree._observed_sha1(path, observed)
1924
1921
class TransformPreview(DiskTreeTransform):
2012
2009
def _get_file_revision(self, path, file_id, vf, tree_revision):
2013
2010
parent_keys = [
2014
(file_id, t.get_file_revision(t.id2path(file_id), file_id))
2015
for t in self._iter_parent_trees()]
2011
(file_id, t.get_file_revision(t.id2path(file_id)))
2012
for t in self._iter_parent_trees()]
2016
2013
vf.add_lines((file_id, tree_revision), parent_keys,
2017
self.get_file_lines(path, file_id))
2014
self.get_file_lines(path))
2018
2015
repo = self._get_repository()
2019
2016
base_vf = repo.texts
2020
2017
if base_vf not in vf.fallback_versionedfiles:
2038
2035
executable = False
2040
2037
file_id = self._transform.final_file_id(self._path2trans_id(path))
2041
executable = self.is_executable(path, file_id)
2038
executable = self.is_executable(path)
2042
2039
return kind, executable, None
2044
2041
def is_locked(self):
2178
2175
ordered_ids.append((trans_id, parent_file_id))
2179
2176
return ordered_ids
2181
def iter_child_entries(self, path, file_id=None):
2178
def iter_child_entries(self, path):
2182
2179
trans_id = self._path2trans_id(path)
2183
2180
if trans_id is None:
2184
2181
raise errors.NoSuchFile(path)
2237
2234
for path, entry in entries:
2238
2235
yield path, 'V', entry.kind, entry.file_id, entry
2240
def kind(self, path, file_id=None):
2237
def kind(self, path):
2241
2238
trans_id = self._path2trans_id(path)
2242
2239
if trans_id is None:
2243
2240
raise errors.NoSuchFile(path)
2244
2241
return self._transform.final_kind(trans_id)
2246
def stored_kind(self, path, file_id=None):
2243
def stored_kind(self, path):
2247
2244
trans_id = self._path2trans_id(path)
2248
2245
if trans_id is None:
2249
2246
raise errors.NoSuchFile(path)
2251
2248
return self._transform._new_contents[trans_id]
2252
2249
except KeyError:
2253
return self._transform._tree.stored_kind(path, file_id)
2250
return self._transform._tree.stored_kind(path)
2255
def get_file_mtime(self, path, file_id=None):
2252
def get_file_mtime(self, path):
2256
2253
"""See Tree.get_file_mtime"""
2258
file_id = self.path2id(path)
2254
file_id = self.path2id(path)
2259
2255
if file_id is None:
2260
2256
raise errors.NoSuchFile(path)
2261
2257
if not self._content_change(file_id):
2262
2258
return self._transform._tree.get_file_mtime(
2263
self._transform._tree.id2path(file_id), file_id)
2259
self._transform._tree.id2path(file_id))
2264
2260
trans_id = self._path2trans_id(path)
2265
2261
return self._stat_limbo_file(trans_id).st_mtime
2267
def get_file_size(self, path, file_id=None):
2263
def get_file_size(self, path):
2268
2264
"""See Tree.get_file_size"""
2269
2265
trans_id = self._path2trans_id(path)
2270
2266
if trans_id is None:
2275
2271
if trans_id in self._transform._new_contents:
2276
2272
return self._stat_limbo_file(trans_id).st_size
2277
if self.kind(path, file_id) == 'file':
2278
return self._transform._tree.get_file_size(path, file_id)
2273
if self.kind(path) == 'file':
2274
return self._transform._tree.get_file_size(path)
2282
def get_file_verifier(self, path, file_id=None, stat_value=None):
2278
def get_file_verifier(self, path, stat_value=None):
2283
2279
trans_id = self._path2trans_id(path)
2284
2280
if trans_id is None:
2285
2281
raise errors.NoSuchFile(path)
2286
2282
kind = self._transform._new_contents.get(trans_id)
2287
2283
if kind is None:
2288
return self._transform._tree.get_file_verifier(path, file_id)
2284
return self._transform._tree.get_file_verifier(path)
2289
2285
if kind == 'file':
2290
with self.get_file(path, file_id) as fileobj:
2286
with self.get_file(path) as fileobj:
2291
2287
return ("SHA1", sha_file(fileobj))
2293
def get_file_sha1(self, path, file_id=None, stat_value=None):
2289
def get_file_sha1(self, path, stat_value=None):
2294
2290
trans_id = self._path2trans_id(path)
2295
2291
if trans_id is None:
2296
2292
raise errors.NoSuchFile(path)
2297
2293
kind = self._transform._new_contents.get(trans_id)
2298
2294
if kind is None:
2299
return self._transform._tree.get_file_sha1(path, file_id)
2295
return self._transform._tree.get_file_sha1(path)
2300
2296
if kind == 'file':
2301
with self.get_file(path, file_id) as fileobj:
2297
with self.get_file(path) as fileobj:
2302
2298
return sha_file(fileobj)
2304
def is_executable(self, path, file_id=None):
2300
def is_executable(self, path):
2305
2301
trans_id = self._path2trans_id(path)
2306
2302
if trans_id is None:
2309
2305
return self._transform._new_executability[trans_id]
2310
2306
except KeyError:
2312
return self._transform._tree.is_executable(path, file_id)
2308
return self._transform._tree.is_executable(path)
2313
2309
except OSError as e:
2314
2310
if e.errno == errno.ENOENT:
2379
2375
raise ValueError('want_unversioned is not supported')
2380
2376
return self._transform.iter_changes()
2382
def get_file(self, path, file_id=None):
2378
def get_file(self, path):
2383
2379
"""See Tree.get_file"""
2385
file_id = self.path2id(path)
2380
file_id = self.path2id(path)
2386
2381
if not self._content_change(file_id):
2387
return self._transform._tree.get_file(path, file_id)
2382
return self._transform._tree.get_file(path)
2388
2383
trans_id = self._path2trans_id(path)
2389
2384
name = self._transform._limbo_name(trans_id)
2390
2385
return open(name, 'rb')
2392
def get_file_with_stat(self, path, file_id=None):
2393
return self.get_file(path, file_id), None
2387
def get_file_with_stat(self, path):
2388
return self.get_file(path), None
2395
def annotate_iter(self, path, file_id=None,
2390
def annotate_iter(self, path,
2396
2391
default_revision=_mod_revision.CURRENT_REVISION):
2398
file_id = self.path2id(path)
2392
file_id = self.path2id(path)
2399
2393
changes = self._iter_changes_cache.get(file_id)
2400
2394
if changes is None:
2407
2401
get_old = (kind[0] == 'file' and versioned[0])
2409
2403
old_annotation = self._transform._tree.annotate_iter(
2410
path, file_id=file_id, default_revision=default_revision)
2404
path, default_revision=default_revision)
2412
2406
old_annotation = []
2413
2407
if changes is None:
2422
2416
# It would be nice to be able to use the new Annotator based
2423
2417
# approach, as well.
2424
2418
return annotate.reannotate([old_annotation],
2425
self.get_file(path, file_id).readlines(),
2419
self.get_file(path).readlines(),
2426
2420
default_revision)
2428
def get_symlink_target(self, path, file_id=None):
2422
def get_symlink_target(self, path):
2429
2423
"""See Tree.get_symlink_target"""
2431
file_id = self.path2id(path)
2424
file_id = self.path2id(path)
2432
2425
if not self._content_change(file_id):
2433
2426
return self._transform._tree.get_symlink_target(path)
2434
2427
trans_id = self._path2trans_id(path)
2455
2448
kind = 'unknown'
2456
2449
versioned_kind = self._transform._tree.stored_kind(
2457
self._transform._tree.id2path(file_id),
2450
self._transform._tree.id2path(file_id))
2459
2451
if versioned_kind == 'directory':
2460
2452
subdirs.append(child_id)
2461
2453
children.append((path_from_root, basename, kind, None,
2635
2627
trans_id = tt.create_path(entry.name, parent_id)
2636
2628
file_trans_id[file_id] = trans_id
2637
2629
tt.version_file(file_id, trans_id)
2638
executable = tree.is_executable(tree_path, file_id)
2630
executable = tree.is_executable(tree_path)
2640
2632
tt.set_executability(executable, trans_id)
2641
2633
trans_data = (trans_id, file_id,
2740
2732
if entry.kind == "file":
2741
2733
with open(target_path, 'rb') as f1, \
2742
tree.get_file(tree_path, file_id) as f2:
2734
tree.get_file(tree_path) as f2:
2743
2735
if osutils.compare_files(f1, f2):
2745
2737
elif entry.kind == "symlink":
2746
if tree.get_symlink_target(tree_path, file_id) == os.readlink(target_path):
2738
if tree.get_symlink_target(tree_path) == os.readlink(target_path):
2783
2775
name = entry.name
2784
2776
kind = entry.kind
2785
2777
if kind == 'file':
2786
with tree.get_file(path, entry.file_id) as f:
2787
executable = tree.is_executable(path, entry.file_id)
2778
with tree.get_file(path) as f:
2779
executable = tree.is_executable(path)
2788
2780
return tt.new_file(
2789
2781
name, parent_id, osutils.file_iterator(f), entry.file_id,
2794
2786
tt.set_tree_reference(entry.reference_revision, trans_id)
2795
2787
return trans_id
2796
2788
elif kind == 'symlink':
2797
target = tree.get_symlink_target(path, entry.file_id)
2789
target = tree.get_symlink_target(path)
2798
2790
return tt.new_symlink(name, parent_id, target, entry.file_id)
2800
2792
raise errors.BadFileKindError(name, kind)
2808
2800
content filters to apply to the bytes output in the working tree.
2809
2801
This only applies if the working tree supports content filtering.
2811
kind = tree.kind(path, file_id)
2803
kind = tree.kind(path)
2812
2804
if kind == 'directory':
2813
2805
tt.create_directory(trans_id)
2814
2806
elif kind == "file":
2815
2807
if chunks is None:
2816
f = tree.get_file(path, file_id)
2808
f = tree.get_file(path)
2817
2809
chunks = osutils.file_iterator(f)
2829
2821
if f is not None:
2831
2823
elif kind == "symlink":
2832
tt.create_symlink(tree.get_symlink_target(path, file_id), trans_id)
2824
tt.create_symlink(tree.get_symlink_target(path), trans_id)
2834
2826
raise AssertionError('Unknown kind %r' % kind)
2911
2903
if changed_content:
2912
2904
keep_content = False
2913
2905
if wt_kind == 'file' and (backups or target_kind is None):
2914
wt_sha1 = working_tree.get_file_sha1(wt_path, file_id)
2906
wt_sha1 = working_tree.get_file_sha1(wt_path)
2915
2907
if merge_modified.get(file_id) != wt_sha1:
2916
2908
# acquire the basis tree lazily to prevent the
2917
2909
# expense of accessing it when it's not needed ?
2947
2939
tt.create_directory(trans_id)
2948
2940
if target_kind == 'tree-reference':
2949
2941
revision = target_tree.get_reference_revision(
2950
target_path, file_id)
2951
2943
tt.set_tree_reference(revision, trans_id)
2952
2944
elif target_kind == 'symlink':
2953
2945
tt.create_symlink(target_tree.get_symlink_target(
2954
target_path, file_id), trans_id)
2946
target_path), trans_id)
2955
2947
elif target_kind == 'file':
2956
2948
deferred_files.append(
2957
2949
(target_path, (trans_id, mode_id, file_id)))
2958
2950
if basis_tree is None:
2959
2951
basis_tree = working_tree.basis_tree()
2960
2952
basis_tree.lock_read()
2961
new_sha1 = target_tree.get_file_sha1(target_path, file_id)
2962
basis_path = find_previous_path(
2963
target_tree, basis_tree, target_path)
2964
if (basis_path is not None
2965
and new_sha1 == basis_tree.get_file_sha1(basis_path, file_id)):
2953
new_sha1 = target_tree.get_file_sha1(target_path)
2954
basis_path = find_previous_path(target_tree, basis_tree, target_path)
2955
if (basis_path is not None and
2956
new_sha1 == basis_tree.get_file_sha1(basis_path)):
2966
2957
if file_id in merge_modified:
2967
2958
del merge_modified[file_id]