git: set repo.submodule early

Summary: This allows reposetup functions to detect if a repo is a submodule or not.

Reviewed By: sggutier

Differential Revision: D56481294

fbshipit-source-id: ef090233211bb86692b474f411b544d830927669
This commit is contained in:
Jun Wu 2024-04-30 11:45:56 -07:00 committed by Facebook GitHub Bot
parent 05a8a41812
commit ccd336a931

View File

@ -8,6 +8,7 @@ utilities for git support
""" """
import errno import errno
import functools
import hashlib import hashlib
import os import os
import re import re
@ -83,14 +84,14 @@ def isgitpeer(repo):
return isgitstore(repo) return isgitstore(repo)
def createrepo(ui, url, destpath): def createrepo(ui, url, destpath, submodule=None):
repo_config = "" repo_config = ""
if url: if url:
repo_config += "\n[paths]\ndefault = %s\n" % url repo_config += "\n[paths]\ndefault = %s\n" % url
return setup_repository( return setup_repository(
ui, destpath, create=True, initial_config=repo_config ui, destpath, create=True, initial_config=repo_config, submodule=submodule
).local() ).local()
@ -117,7 +118,7 @@ def setup_repository(ui, path, create=False, initial_config=None, submodule=None
) )
def clone(ui, url, destpath=None, update=True, pullnames=None): def clone(ui, url, destpath=None, update=True, pullnames=None, submodule=None):
"""Clone a git repo, then create a repo at dest backed by the git repo. """Clone a git repo, then create a repo at dest backed by the git repo.
update can be False, or True, or a node to update to. update can be False, or True, or a node to update to.
- False: do not update, leave an empty working copy. - False: do not update, leave an empty working copy.
@ -127,6 +128,7 @@ def clone(ui, url, destpath=None, update=True, pullnames=None):
- None: use default refspecs set by configs. - None: use default refspecs set by configs.
- []: do not fetch anything. - []: do not fetch anything.
If url is empty, create the repo but do not add a remote. If url is empty, create the repo but do not add a remote.
If submodule is set, it will be passed to `setup_repository`.
""" """
from . import hg from . import hg
@ -155,7 +157,7 @@ def clone(ui, url, destpath=None, update=True, pullnames=None):
with bindings.atexit.AtExit.rmtree(destpath): with bindings.atexit.AtExit.rmtree(destpath):
try: try:
repo = createrepo(ui, url, destpath) repo = createrepo(ui, url, destpath, submodule=submodule)
ret = initgitbare(ui, repo.svfs.join("git")) ret = initgitbare(ui, repo.svfs.join("git"))
if ret != 0: if ret != 0:
raise error.Abort(_("git clone was not successful")) raise error.Abort(_("git clone was not successful"))
@ -832,7 +834,7 @@ class Submodule:
repopath = self.gitmodulesvfs.join("gitmodules", urldigest) repopath = self.gitmodulesvfs.join("gitmodules", urldigest)
ident = identity.sniffdir(repopath) ident = identity.sniffdir(repopath)
if ident: if ident:
repo = setup_repository(self.parentrepo.baseui, repopath) repo = setup_repository(self.parentrepo.baseui, repopath, submodule=self)
else: else:
# create the repo but do not fetch anything # create the repo but do not fetch anything
repo = clone( repo = clone(
@ -841,8 +843,8 @@ class Submodule:
destpath=repopath, destpath=repopath,
update=False, update=False,
pullnames=[], pullnames=[],
submodule=self,
) )
repo.submodule = weakref.proxy(self)
self._inherit_git_config(repo) self._inherit_git_config(repo)
return repo return repo
@ -864,7 +866,7 @@ class Submodule:
ident = identity.sniffdir(repopath) ident = identity.sniffdir(repopath)
if ident: if ident:
ui.debug(" initializing submodule workingcopy at %s\n" % repopath) ui.debug(" initializing submodule workingcopy at %s\n" % repopath)
repo = setup_repository(self.parentrepo.baseui, repopath) repo = setup_repository(self.parentrepo.baseui, repopath, submodule=self)
else: else:
if self.parentrepo.wvfs.isfile(self.path): if self.parentrepo.wvfs.isfile(self.path):
ui.debug(" unlinking conflicted submodule file at %s\n" % self.path) ui.debug(" unlinking conflicted submodule file at %s\n" % self.path)
@ -876,9 +878,13 @@ class Submodule:
% (repopath, backingrepo.root) % (repopath, backingrepo.root)
) )
repo = hg.share( repo = hg.share(
backingrepo.ui, backingrepo.root, repopath, update=False, relative=True backingrepo.ui,
backingrepo.root,
repopath,
update=False,
relative=True,
repository=functools.partial(setup_repository, submodule=self),
) )
repo.submodule = weakref.proxy(self)
self._inherit_git_config(repo) self._inherit_git_config(repo)
return repo return repo