summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaMont Jones <lamontjones@google.com>2022-06-01 21:03:34 +0000
committerLaMont Jones <lamontjones@google.com>2022-06-08 16:49:08 +0000
commitff6b1dae1e9f2e7405690c1aeedf7e0c7d768460 (patch)
treec0ffaeea5ed6ccee683f47e6cef5a8897b130cb7
parentbdcba7dc36f1c8e6041681eb5b3b5229c93c7c5c (diff)
downloadgit-repo-ff6b1dae1e9f2e7405690c1aeedf7e0c7d768460.tar.gz
Only sync superproject if it will be used.
If the user says `--no-use-superproject`, then do not bother syncing the superproject. Also add/update docstrings and comments throughout. Change-Id: I9cdad706130501bab9a22d3099a1dae605e9c194 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/338975 Tested-by: LaMont Jones <lamontjones@google.com> Reviewed-by: Mike Frysinger <vapier@google.com>
-rw-r--r--command.py12
-rw-r--r--git_superproject.py17
-rw-r--r--manifest_xml.py49
-rw-r--r--project.py11
-rw-r--r--subcmds/sync.py2
5 files changed, 71 insertions, 20 deletions
diff --git a/command.py b/command.py
index bd6d0817..7c68ebc5 100644
--- a/command.py
+++ b/command.py
@@ -277,6 +277,18 @@ class Command(object):
277 def GetProjects(self, args, manifest=None, groups='', missing_ok=False, 277 def GetProjects(self, args, manifest=None, groups='', missing_ok=False,
278 submodules_ok=False, all_manifests=False): 278 submodules_ok=False, all_manifests=False):
279 """A list of projects that match the arguments. 279 """A list of projects that match the arguments.
280
281 Args:
282 args: a list of (case-insensitive) strings, projects to search for.
283 manifest: an XmlManifest, the manifest to use, or None for default.
284 groups: a string, the manifest groups in use.
285 missing_ok: a boolean, whether to allow missing projects.
286 submodules_ok: a boolean, whether to allow submodules.
287 all_manifests: a boolean, if True then all manifests and submanifests are
288 used. If False, then only the local (sub)manifest is used.
289
290 Returns:
291 A list of matching Project instances.
280 """ 292 """
281 if all_manifests: 293 if all_manifests:
282 if not manifest: 294 if not manifest:
diff --git a/git_superproject.py b/git_superproject.py
index 07bc2645..5d00bd72 100644
--- a/git_superproject.py
+++ b/git_superproject.py
@@ -18,7 +18,7 @@ For more information on superproject, check out:
18https://en.wikibooks.org/wiki/Git/Submodules_and_Superprojects 18https://en.wikibooks.org/wiki/Git/Submodules_and_Superprojects
19 19
20Examples: 20Examples:
21 superproject = Superproject() 21 superproject = Superproject(manifest, name, remote, revision)
22 UpdateProjectsResult = superproject.UpdateProjectsRevisionId(projects) 22 UpdateProjectsResult = superproject.UpdateProjectsRevisionId(projects)
23""" 23"""
24 24
@@ -99,8 +99,8 @@ class Superproject(object):
99 self._work_git_name = git_name + _SUPERPROJECT_GIT_NAME 99 self._work_git_name = git_name + _SUPERPROJECT_GIT_NAME
100 self._work_git = os.path.join(self._superproject_path, self._work_git_name) 100 self._work_git = os.path.join(self._superproject_path, self._work_git_name)
101 101
102 # The following are command arguemnts, rather then superproject attributes, 102 # The following are command arguemnts, rather than superproject attributes,
103 # and where included here originally. They should eventually become 103 # and were included here originally. They should eventually become
104 # arguments that are passed down from the public methods, instead of being 104 # arguments that are passed down from the public methods, instead of being
105 # treated as attributes. 105 # treated as attributes.
106 self._git_event_log = None 106 self._git_event_log = None
@@ -329,7 +329,8 @@ class Superproject(object):
329 """Update revisionId of every project in projects with the commit id. 329 """Update revisionId of every project in projects with the commit id.
330 330
331 Args: 331 Args:
332 projects: List of projects whose revisionId needs to be updated. 332 projects: a list of projects whose revisionId needs to be updated.
333 git_event_log: an EventLog, for git tracing.
333 334
334 Returns: 335 Returns:
335 UpdateProjectsResult 336 UpdateProjectsResult
@@ -431,9 +432,15 @@ def UseSuperproject(use_superproject, manifest):
431 Args: 432 Args:
432 use_superproject: option value from optparse. 433 use_superproject: option value from optparse.
433 manifest: manifest to use. 434 manifest: manifest to use.
435
436 Returns:
437 Whether the superproject should be used.
434 """ 438 """
435 439
436 if use_superproject is not None: 440 if not manifest.superproject:
441 # This (sub) manifest does not have a superproject definition.
442 return False
443 elif use_superproject is not None:
437 return use_superproject 444 return use_superproject
438 else: 445 else:
439 client_value = manifest.manifestProject.use_superproject 446 client_value = manifest.manifestProject.use_superproject
diff --git a/manifest_xml.py b/manifest_xml.py
index db7a9286..32f6b687 100644
--- a/manifest_xml.py
+++ b/manifest_xml.py
@@ -348,7 +348,7 @@ class XmlManifest(object):
348 be |repodir|/|MANIFEST_FILE_NAME|. 348 be |repodir|/|MANIFEST_FILE_NAME|.
349 local_manifests: Full path to the directory of local override manifests. 349 local_manifests: Full path to the directory of local override manifests.
350 This will usually be |repodir|/|LOCAL_MANIFESTS_DIR_NAME|. 350 This will usually be |repodir|/|LOCAL_MANIFESTS_DIR_NAME|.
351 outer_client: RepoClient of the outertree. 351 outer_client: RepoClient of the outer manifest.
352 parent_groups: a string, the groups to apply to this projects. 352 parent_groups: a string, the groups to apply to this projects.
353 submanifest_path: The submanifest root relative to the repo root. 353 submanifest_path: The submanifest root relative to the repo root.
354 default_groups: a string, the default manifest groups to use. 354 default_groups: a string, the default manifest groups to use.
@@ -776,18 +776,21 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
776 776
777 @property 777 @property
778 def is_submanifest(self): 778 def is_submanifest(self):
779 """Whether this manifest is a submanifest""" 779 """Whether this manifest is a submanifest.
780
781 This is safe to use as long as the outermost manifest XML has been parsed.
782 """
780 return self._outer_client and self._outer_client != self 783 return self._outer_client and self._outer_client != self
781 784
782 @property 785 @property
783 def outer_client(self): 786 def outer_client(self):
784 """The instance of the outermost manifest client""" 787 """The instance of the outermost manifest client."""
785 self._Load() 788 self._Load()
786 return self._outer_client 789 return self._outer_client
787 790
788 @property 791 @property
789 def all_manifests(self): 792 def all_manifests(self):
790 """Generator yielding all (sub)manifests.""" 793 """Generator yielding all (sub)manifests, in depth-first order."""
791 self._Load() 794 self._Load()
792 outer = self._outer_client 795 outer = self._outer_client
793 yield outer 796 yield outer
@@ -796,7 +799,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
796 799
797 @property 800 @property
798 def all_children(self): 801 def all_children(self):
799 """Generator yielding all child submanifests.""" 802 """Generator yielding all (present) child submanifests."""
800 self._Load() 803 self._Load()
801 for child in self._submanifests.values(): 804 for child in self._submanifests.values():
802 if child.repo_client: 805 if child.repo_client:
@@ -813,7 +816,14 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
813 816
814 @property 817 @property
815 def all_paths(self): 818 def all_paths(self):
816 """All project paths for all (sub)manifests. See `paths`.""" 819 """All project paths for all (sub)manifests.
820
821 See also `paths`.
822
823 Returns:
824 A dictionary of {path: Project()}. `path` is relative to the outer
825 manifest.
826 """
817 ret = {} 827 ret = {}
818 for tree in self.all_manifests: 828 for tree in self.all_manifests:
819 prefix = tree.path_prefix 829 prefix = tree.path_prefix
@@ -829,7 +839,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
829 def paths(self): 839 def paths(self):
830 """Return all paths for this manifest. 840 """Return all paths for this manifest.
831 841
832 Return: 842 Returns:
833 A dictionary of {path: Project()}. `path` is relative to this manifest. 843 A dictionary of {path: Project()}. `path` is relative to this manifest.
834 """ 844 """
835 self._Load() 845 self._Load()
@@ -843,11 +853,13 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
843 853
844 @property 854 @property
845 def remotes(self): 855 def remotes(self):
856 """Return a list of remotes for this manifest."""
846 self._Load() 857 self._Load()
847 return self._remotes 858 return self._remotes
848 859
849 @property 860 @property
850 def default(self): 861 def default(self):
862 """Return default values for this manifest."""
851 self._Load() 863 self._Load()
852 return self._default 864 return self._default
853 865
@@ -1090,8 +1102,8 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
1090 if override: 1102 if override:
1091 self.manifestFile = savedManifestFile 1103 self.manifestFile = savedManifestFile
1092 1104
1093 # Now that we have loaded this manifest, load any submanifest manifests 1105 # Now that we have loaded this manifest, load any submanifests as well.
1094 # as well. We need to do this after self._loaded is set to avoid looping. 1106 # We need to do this after self._loaded is set to avoid looping.
1095 for name in self._submanifests: 1107 for name in self._submanifests:
1096 tree = self._submanifests[name] 1108 tree = self._submanifests[name]
1097 spec = tree.ToSubmanifestSpec() 1109 spec = tree.ToSubmanifestSpec()
@@ -1659,6 +1671,10 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
1659 name: a string, the name of the project. 1671 name: a string, the name of the project.
1660 path: a string, the path of the project. 1672 path: a string, the path of the project.
1661 remote: a string, the remote.name of the project. 1673 remote: a string, the remote.name of the project.
1674
1675 Returns:
1676 A tuple of (relpath, worktree, gitdir, objdir, use_git_worktrees) for the
1677 project with |name| and |path|.
1662 """ 1678 """
1663 # The manifest entries might have trailing slashes. Normalize them to avoid 1679 # The manifest entries might have trailing slashes. Normalize them to avoid
1664 # unexpected filesystem behavior since we do string concatenation below. 1680 # unexpected filesystem behavior since we do string concatenation below.
@@ -1666,7 +1682,7 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
1666 name = name.rstrip('/') 1682 name = name.rstrip('/')
1667 remote = remote.rstrip('/') 1683 remote = remote.rstrip('/')
1668 use_git_worktrees = False 1684 use_git_worktrees = False
1669 use_remote_name = bool(self._outer_client._submanifests) 1685 use_remote_name = self.is_multimanifest
1670 relpath = path 1686 relpath = path
1671 if self.IsMirror: 1687 if self.IsMirror:
1672 worktree = None 1688 worktree = None
@@ -1696,6 +1712,9 @@ https://gerrit.googlesource.com/git-repo/+/HEAD/docs/manifest-format.md
1696 name: a string, the name of the project. 1712 name: a string, the name of the project.
1697 all_manifests: a boolean, if True, then all manifests are searched. If 1713 all_manifests: a boolean, if True, then all manifests are searched. If
1698 False, then only this manifest is searched. 1714 False, then only this manifest is searched.
1715
1716 Returns:
1717 A list of Project instances with name |name|.
1699 """ 1718 """
1700 if all_manifests: 1719 if all_manifests:
1701 return list(itertools.chain.from_iterable( 1720 return list(itertools.chain.from_iterable(
@@ -1956,6 +1975,16 @@ class RepoClient(XmlManifest):
1956 """Manages a repo client checkout.""" 1975 """Manages a repo client checkout."""
1957 1976
1958 def __init__(self, repodir, manifest_file=None, submanifest_path='', **kwargs): 1977 def __init__(self, repodir, manifest_file=None, submanifest_path='', **kwargs):
1978 """Initialize.
1979
1980 Args:
1981 repodir: Path to the .repo/ dir for holding all internal checkout state.
1982 It must be in the top directory of the repo client checkout.
1983 manifest_file: Full path to the manifest file to parse. This will usually
1984 be |repodir|/|MANIFEST_FILE_NAME|.
1985 submanifest_path: The submanifest root relative to the repo root.
1986 **kwargs: Additional keyword arguments, passed to XmlManifest.
1987 """
1959 self.isGitcClient = False 1988 self.isGitcClient = False
1960 submanifest_path = submanifest_path or '' 1989 submanifest_path = submanifest_path or ''
1961 if submanifest_path: 1990 if submanifest_path:
diff --git a/project.py b/project.py
index 8668bae9..8fed8f5e 100644
--- a/project.py
+++ b/project.py
@@ -33,6 +33,7 @@ import fetch
33from git_command import GitCommand, git_require 33from git_command import GitCommand, git_require
34from git_config import GitConfig, IsId, GetSchemeFromUrl, GetUrlCookieFile, \ 34from git_config import GitConfig, IsId, GetSchemeFromUrl, GetUrlCookieFile, \
35 ID_RE 35 ID_RE
36import git_superproject
36from git_trace2_event_log import EventLog 37from git_trace2_event_log import EventLog
37from error import GitError, UploadError, DownloadError 38from error import GitError, UploadError, DownloadError
38from error import ManifestInvalidRevisionError, ManifestInvalidPathError 39from error import ManifestInvalidRevisionError, ManifestInvalidPathError
@@ -2180,6 +2181,8 @@ class Project(object):
2180 if prune: 2181 if prune:
2181 cmd.append('--prune') 2182 cmd.append('--prune')
2182 2183
2184 # Always pass something for --recurse-submodules, git with GIT_DIR behaves
2185 # incorrectly when not given `--recurse-submodules=no`. (b/218891912)
2183 cmd.append(f'--recurse-submodules={"on-demand" if submodules else "no"}') 2186 cmd.append(f'--recurse-submodules={"on-demand" if submodules else "no"}')
2184 2187
2185 spec = [] 2188 spec = []
@@ -3486,8 +3489,8 @@ class ManifestProject(MetaProject):
3486 git_event_log: an EventLog, for git tracing. 3489 git_event_log: an EventLog, for git tracing.
3487 """ 3490 """
3488 # TODO(lamontjones): when refactoring sync (and init?) consider how to 3491 # TODO(lamontjones): when refactoring sync (and init?) consider how to
3489 # better get the init options that we should use when syncing uncovers a new 3492 # better get the init options that we should use for new submanifests that
3490 # submanifest. 3493 # are added when syncing an existing workspace.
3491 git_event_log = git_event_log or EventLog() 3494 git_event_log = git_event_log or EventLog()
3492 spec = submanifest.ToSubmanifestSpec() 3495 spec = submanifest.ToSubmanifestSpec()
3493 # Use the init options from the existing manifestProject, or the parent if 3496 # Use the init options from the existing manifestProject, or the parent if
@@ -3874,8 +3877,8 @@ class ManifestProject(MetaProject):
3874 ) 3877 )
3875 3878
3876 # Lastly, if the manifest has a <superproject> then have the superproject 3879 # Lastly, if the manifest has a <superproject> then have the superproject
3877 # sync it if it will be used. 3880 # sync it (if it will be used).
3878 if self.manifest.superproject: 3881 if git_superproject.UseSuperproject(use_superproject, self.manifest):
3879 sync_result = self.manifest.superproject.Sync(git_event_log) 3882 sync_result = self.manifest.superproject.Sync(git_event_log)
3880 if not sync_result.success: 3883 if not sync_result.success:
3881 print('warning: git update of superproject for ' 3884 print('warning: git update of superproject for '
diff --git a/subcmds/sync.py b/subcmds/sync.py
index 0abe23d6..fa61d551 100644
--- a/subcmds/sync.py
+++ b/subcmds/sync.py
@@ -316,7 +316,7 @@ later is required to fix a server side protocol bug.
316 if not have_superproject: 316 if not have_superproject:
317 return 317 return
318 318
319 if opt.local_only: 319 if opt.local_only and manifest.superproject:
320 manifest_path = manifest.superproject.manifest_path 320 manifest_path = manifest.superproject.manifest_path
321 if manifest_path: 321 if manifest_path:
322 self._ReloadManifest(manifest_path, manifest) 322 self._ReloadManifest(manifest_path, manifest)