diff options
author | LaMont Jones <lamontjones@google.com> | 2021-11-18 22:40:18 +0000 |
---|---|---|
committer | LaMont Jones <lamontjones@google.com> | 2022-02-17 21:57:55 +0000 |
commit | cc879a97c3e2614d19b15b4661c3cab4d33139c9 (patch) | |
tree | 69d225e9f0e9d79fec8f423d9c40c275f0bf3b8c /main.py | |
parent | 87cce68b28c34fa86895baa8d7f48307382e6c75 (diff) | |
download | git-repo-cc879a97c3e2614d19b15b4661c3cab4d33139c9.tar.gz |
Add multi-manifest support with <submanifest> elementv2.22
To be addressed in another change:
- a partial `repo sync` (with a list of projects/paths to sync)
requires `--this-tree-only`.
Change-Id: I6c7400bf001540e9d7694fa70934f8f204cb5f57
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/322657
Tested-by: LaMont Jones <lamontjones@google.com>
Reviewed-by: Mike Frysinger <vapier@google.com>
Diffstat (limited to 'main.py')
-rwxr-xr-x | main.py | 43 |
1 files changed, 41 insertions, 2 deletions
@@ -127,6 +127,8 @@ global_options.add_option('--event-log', | |||
127 | help='filename of event log to append timeline to') | 127 | help='filename of event log to append timeline to') |
128 | global_options.add_option('--git-trace2-event-log', action='store', | 128 | global_options.add_option('--git-trace2-event-log', action='store', |
129 | help='directory to write git trace2 event log to') | 129 | help='directory to write git trace2 event log to') |
130 | global_options.add_option('--submanifest-path', action='store', | ||
131 | metavar='REL_PATH', help='submanifest path') | ||
130 | 132 | ||
131 | 133 | ||
132 | class _Repo(object): | 134 | class _Repo(object): |
@@ -217,7 +219,12 @@ class _Repo(object): | |||
217 | SetDefaultColoring(gopts.color) | 219 | SetDefaultColoring(gopts.color) |
218 | 220 | ||
219 | git_trace2_event_log = EventLog() | 221 | git_trace2_event_log = EventLog() |
220 | repo_client = RepoClient(self.repodir) | 222 | outer_client = RepoClient(self.repodir) |
223 | repo_client = outer_client | ||
224 | if gopts.submanifest_path: | ||
225 | repo_client = RepoClient(self.repodir, | ||
226 | submanifest_path=gopts.submanifest_path, | ||
227 | outer_client=outer_client) | ||
221 | gitc_manifest = None | 228 | gitc_manifest = None |
222 | gitc_client_name = gitc_utils.parse_clientdir(os.getcwd()) | 229 | gitc_client_name = gitc_utils.parse_clientdir(os.getcwd()) |
223 | if gitc_client_name: | 230 | if gitc_client_name: |
@@ -229,6 +236,8 @@ class _Repo(object): | |||
229 | repodir=self.repodir, | 236 | repodir=self.repodir, |
230 | client=repo_client, | 237 | client=repo_client, |
231 | manifest=repo_client.manifest, | 238 | manifest=repo_client.manifest, |
239 | outer_client=outer_client, | ||
240 | outer_manifest=outer_client.manifest, | ||
232 | gitc_manifest=gitc_manifest, | 241 | gitc_manifest=gitc_manifest, |
233 | git_event_log=git_trace2_event_log) | 242 | git_event_log=git_trace2_event_log) |
234 | except KeyError: | 243 | except KeyError: |
@@ -283,7 +292,37 @@ class _Repo(object): | |||
283 | try: | 292 | try: |
284 | cmd.CommonValidateOptions(copts, cargs) | 293 | cmd.CommonValidateOptions(copts, cargs) |
285 | cmd.ValidateOptions(copts, cargs) | 294 | cmd.ValidateOptions(copts, cargs) |
286 | result = cmd.Execute(copts, cargs) | 295 | |
296 | this_manifest_only = copts.this_manifest_only | ||
297 | # If not specified, default to using the outer manifest. | ||
298 | outer_manifest = copts.outer_manifest is not False | ||
299 | if cmd.MULTI_MANIFEST_SUPPORT or this_manifest_only: | ||
300 | result = cmd.Execute(copts, cargs) | ||
301 | elif outer_manifest and repo_client.manifest.is_submanifest: | ||
302 | # The command does not support multi-manifest, we are using a | ||
303 | # submanifest, and the command line is for the outermost manifest. | ||
304 | # Re-run using the outermost manifest, which will recurse through the | ||
305 | # submanifests. | ||
306 | gopts.submanifest_path = '' | ||
307 | result = self._Run(name, gopts, argv) | ||
308 | else: | ||
309 | # No multi-manifest support. Run the command in the current | ||
310 | # (sub)manifest, and then any child submanifests. | ||
311 | result = cmd.Execute(copts, cargs) | ||
312 | for submanifest in repo_client.manifest.submanifests.values(): | ||
313 | spec = submanifest.ToSubmanifestSpec(root=repo_client.outer_client) | ||
314 | gopts.submanifest_path = submanifest.repo_client.path_prefix | ||
315 | child_argv = argv[:] | ||
316 | child_argv.append('--no-outer-manifest') | ||
317 | # Not all subcommands support the 3 manifest options, so only add them | ||
318 | # if the original command includes them. | ||
319 | if hasattr(copts, 'manifest_url'): | ||
320 | child_argv.extend(['--manifest-url', spec.manifestUrl]) | ||
321 | if hasattr(copts, 'manifest_name'): | ||
322 | child_argv.extend(['--manifest-name', spec.manifestName]) | ||
323 | if hasattr(copts, 'manifest_branch'): | ||
324 | child_argv.extend(['--manifest-branch', spec.revision]) | ||
325 | result = self._Run(name, gopts, child_argv) or result | ||
287 | except (DownloadError, ManifestInvalidRevisionError, | 326 | except (DownloadError, ManifestInvalidRevisionError, |
288 | NoManifestException) as e: | 327 | NoManifestException) as e: |
289 | print('error: in `%s`: %s' % (' '.join([name] + argv), str(e)), | 328 | print('error: in `%s`: %s' % (' '.join([name] + argv), str(e)), |