253
253
def __init__(self, repository, revision_id):
254
254
self._revision_id = revision_id
255
255
self._repository = repository
256
self._submodules = None
256
257
self.store = repository._git.object_store
257
258
if not isinstance(revision_id, bytes):
258
259
raise TypeError(revision_id)
273
274
self._fileid_map = self.mapping.get_fileid_map(
274
275
self.store.__getitem__, self.tree)
276
def _get_nested_repository(self, path):
277
nested_repo_transport = self._repository.user_transport.clone(path)
277
def _submodule_info(self):
278
if self._submodules is None:
280
with self.get_file('.gitmodules') as f:
281
config = GitConfigFile.from_file(f)
284
for path, url, section in parse_submodules(config)}
285
except errors.NoSuchFile:
286
self._submodules = {}
287
return self._submodules
289
def _get_submodule_repository(self, relpath):
290
if not isinstance(relpath, bytes):
291
raise TypeError(relpath)
293
info = self._submodule_info()[relpath]
295
nested_repo_transport = self._repository.user_transport.clone(relpath.decode('utf-8'))
297
nested_repo_transport = self._repository.control_transport.clone(
298
posixpath.join('modules', info[0]))
278
299
nested_controldir = _mod_controldir.ControlDir.open_from_transport(
279
300
nested_repo_transport)
280
301
return nested_controldir.find_repository()
303
def get_nested_tree(self, path):
304
encoded_path = path.encode('utf-8')
305
nested_repo = self._get_submodule_repository(encoded_path)
306
ref_rev = self.get_reference_revision(path)
307
return nested_repo.revision_tree(ref_rev)
282
309
def supports_rename_tracking(self):
565
592
"""See RevisionTree.get_symlink_target."""
566
593
(store, mode, hexsha) = self._lookup_path(path)
567
594
if S_ISGITLINK(mode):
568
nested_repo = self._get_nested_repository(path)
595
nested_repo = self._get_submodule_repository(path.encode('utf-8'))
569
596
return nested_repo.lookup_foreign_revision_id(hexsha)
590
617
elif kind == 'symlink':
591
618
return (kind, None, None, store[hexsha].data.decode('utf-8'))
592
619
elif kind == 'tree-reference':
593
nested_repo = self._get_nested_repository(path)
620
nested_repo = self._get_submodule_repository(path.encode('utf-8'))
594
621
return (kind, None, None,
595
622
nested_repo.lookup_foreign_revision_id(hexsha))