/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to breezy/git/tree.py

  • Committer: Breezy landing bot
  • Author(s): Jelmer Vernooij
  • Date: 2019-07-07 16:54:07 UTC
  • mfrom: (7358.4.2 get-nested-tree)
  • Revision ID: breezy.the.bot@gmail.com-20190707165407-esmijfmbvjdlgzyu
Add ``Tree.get_nested_tree`` for retrieving a nested tree from another tree.

Merged from https://code.launchpad.net/~jelmer/brz/get-nested-tree/+merge/369476

Show diffs side-by-side

added added

removed removed

Lines of Context:
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)
275
276
 
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:
 
279
            try:
 
280
                with self.get_file('.gitmodules') as f:
 
281
                    config = GitConfigFile.from_file(f)
 
282
                    self._submodules = {
 
283
                        path: (url, section)
 
284
                        for path, url, section in parse_submodules(config)}
 
285
            except errors.NoSuchFile:
 
286
                self._submodules = {}
 
287
        return self._submodules
 
288
 
 
289
    def _get_submodule_repository(self, relpath):
 
290
        if not isinstance(relpath, bytes):
 
291
            raise TypeError(relpath)
 
292
        try:
 
293
            info = self._submodule_info()[relpath]
 
294
        except KeyError:
 
295
            nested_repo_transport = self._repository.user_transport.clone(relpath.decode('utf-8'))
 
296
        else:
 
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()
281
302
 
 
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)
 
308
 
282
309
    def supports_rename_tracking(self):
283
310
        return False
284
311
 
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)
570
597
        else:
571
598
            return None
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))
596
623
        else: