diff options
| author | LaMont Jones <lamontjones@google.com> | 2022-04-07 21:57:06 +0000 |
|---|---|---|
| committer | LaMont Jones <lamontjones@google.com> | 2022-04-14 22:24:04 +0000 |
| commit | a46047a822ad13738af9b17a524a0bd483b98033 (patch) | |
| tree | f24b75ccf9d063979600564fb9f9af01fcfb0c4f | |
| parent | 5fa912b0d148cf92f72640ac7dcff98c5db11853 (diff) | |
| download | git-repo-a46047a822ad13738af9b17a524a0bd483b98033.tar.gz | |
sync: refactor use of self.manifest
We need to iterate over multiple manifests, and generally use the
outer_client.manifest for multi-manifest support. This refactors the
use of self.manifest into a chosen manifest.
Change-Id: I992f21d610c929675e99555ece9c38df4b635839
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/334699
Tested-by: LaMont Jones <lamontjones@google.com>
Reviewed-by: Mike Frysinger <vapier@google.com>
| -rw-r--r-- | subcmds/sync.py | 150 | ||||
| -rw-r--r-- | tests/test_subcmds_sync.py | 2 |
2 files changed, 83 insertions, 69 deletions
diff --git a/subcmds/sync.py b/subcmds/sync.py index 3451ab6b..9a66e48b 100644 --- a/subcmds/sync.py +++ b/subcmds/sync.py | |||
| @@ -170,9 +170,9 @@ later is required to fix a server side protocol bug. | |||
| 170 | PARALLEL_JOBS = 1 | 170 | PARALLEL_JOBS = 1 |
| 171 | 171 | ||
| 172 | def _CommonOptions(self, p): | 172 | def _CommonOptions(self, p): |
| 173 | if self.manifest: | 173 | if self.outer_client and self.outer_client.manifest: |
| 174 | try: | 174 | try: |
| 175 | self.PARALLEL_JOBS = self.manifest.default.sync_j | 175 | self.PARALLEL_JOBS = self.outer_client.manifest.default.sync_j |
| 176 | except ManifestParseError: | 176 | except ManifestParseError: |
| 177 | pass | 177 | pass |
| 178 | super()._CommonOptions(p) | 178 | super()._CommonOptions(p) |
| @@ -270,25 +270,32 @@ later is required to fix a server side protocol bug. | |||
| 270 | dest='repo_upgraded', action='store_true', | 270 | dest='repo_upgraded', action='store_true', |
| 271 | help=SUPPRESS_HELP) | 271 | help=SUPPRESS_HELP) |
| 272 | 272 | ||
| 273 | def _GetBranch(self): | 273 | def _GetBranch(self, manifest_project): |
| 274 | """Returns the branch name for getting the approved manifest.""" | 274 | """Returns the branch name for getting the approved smartsync manifest. |
| 275 | p = self.manifest.manifestProject | 275 | |
| 276 | b = p.GetBranch(p.CurrentBranch) | 276 | Args: |
| 277 | manifest_project: the manifestProject to query. | ||
| 278 | """ | ||
| 279 | b = manifest_project.GetBranch(manifest_project.CurrentBranch) | ||
| 277 | branch = b.merge | 280 | branch = b.merge |
| 278 | if branch.startswith(R_HEADS): | 281 | if branch.startswith(R_HEADS): |
| 279 | branch = branch[len(R_HEADS):] | 282 | branch = branch[len(R_HEADS):] |
| 280 | return branch | 283 | return branch |
| 281 | 284 | ||
| 282 | def _GetCurrentBranchOnly(self, opt): | 285 | def _GetCurrentBranchOnly(self, opt, manifest): |
| 283 | """Returns whether current-branch or use-superproject options are enabled. | 286 | """Returns whether current-branch or use-superproject options are enabled. |
| 284 | 287 | ||
| 288 | Args: | ||
| 289 | opt: Program options returned from optparse. See _Options(). | ||
| 290 | manifest: The manifest to use. | ||
| 291 | |||
| 285 | Returns: | 292 | Returns: |
| 286 | True if a superproject is requested, otherwise the value of the | 293 | True if a superproject is requested, otherwise the value of the |
| 287 | current_branch option (True, False or None). | 294 | current_branch option (True, False or None). |
| 288 | """ | 295 | """ |
| 289 | return git_superproject.UseSuperproject(opt.use_superproject, self.manifest) or opt.current_branch_only | 296 | return git_superproject.UseSuperproject(opt.use_superproject, manifest) or opt.current_branch_only |
| 290 | 297 | ||
| 291 | def _UpdateProjectsRevisionId(self, opt, args, load_local_manifests, superproject_logging_data): | 298 | def _UpdateProjectsRevisionId(self, opt, args, load_local_manifests, superproject_logging_data, manifest): |
| 292 | """Update revisionId of every project with the SHA from superproject. | 299 | """Update revisionId of every project with the SHA from superproject. |
| 293 | 300 | ||
| 294 | This function updates each project's revisionId with SHA from superproject. | 301 | This function updates each project's revisionId with SHA from superproject. |
| @@ -300,6 +307,7 @@ later is required to fix a server side protocol bug. | |||
| 300 | docstring for details. | 307 | docstring for details. |
| 301 | load_local_manifests: Whether to load local manifests. | 308 | load_local_manifests: Whether to load local manifests. |
| 302 | superproject_logging_data: A dictionary of superproject data that is to be logged. | 309 | superproject_logging_data: A dictionary of superproject data that is to be logged. |
| 310 | manifest: The manifest to use. | ||
| 303 | 311 | ||
| 304 | Returns: | 312 | Returns: |
| 305 | Returns path to the overriding manifest file instead of None. | 313 | Returns path to the overriding manifest file instead of None. |
| @@ -312,7 +320,7 @@ later is required to fix a server side protocol bug. | |||
| 312 | if opt.local_only: | 320 | if opt.local_only: |
| 313 | manifest_path = superproject.manifest_path | 321 | manifest_path = superproject.manifest_path |
| 314 | if manifest_path: | 322 | if manifest_path: |
| 315 | self._ReloadManifest(manifest_path, load_local_manifests) | 323 | self._ReloadManifest(manifest_path, manifest, load_local_manifests) |
| 316 | return manifest_path | 324 | return manifest_path |
| 317 | 325 | ||
| 318 | all_projects = self.GetProjects(args, | 326 | all_projects = self.GetProjects(args, |
| @@ -323,7 +331,7 @@ later is required to fix a server side protocol bug. | |||
| 323 | manifest_path = update_result.manifest_path | 331 | manifest_path = update_result.manifest_path |
| 324 | superproject_logging_data['updatedrevisionid'] = bool(manifest_path) | 332 | superproject_logging_data['updatedrevisionid'] = bool(manifest_path) |
| 325 | if manifest_path: | 333 | if manifest_path: |
| 326 | self._ReloadManifest(manifest_path, load_local_manifests) | 334 | self._ReloadManifest(manifest_path, manifest, load_local_manifests) |
| 327 | else: | 335 | else: |
| 328 | if print_messages: | 336 | if print_messages: |
| 329 | print('warning: Update of revisionId from superproject has failed, ' | 337 | print('warning: Update of revisionId from superproject has failed, ' |
| @@ -366,16 +374,16 @@ later is required to fix a server side protocol bug. | |||
| 366 | quiet=opt.quiet, | 374 | quiet=opt.quiet, |
| 367 | verbose=opt.verbose, | 375 | verbose=opt.verbose, |
| 368 | output_redir=buf, | 376 | output_redir=buf, |
| 369 | current_branch_only=self._GetCurrentBranchOnly(opt), | 377 | current_branch_only=self._GetCurrentBranchOnly(opt, project.manifest), |
| 370 | force_sync=opt.force_sync, | 378 | force_sync=opt.force_sync, |
| 371 | clone_bundle=opt.clone_bundle, | 379 | clone_bundle=opt.clone_bundle, |
| 372 | tags=opt.tags, archive=self.manifest.IsArchive, | 380 | tags=opt.tags, archive=project.manifest.IsArchive, |
| 373 | optimized_fetch=opt.optimized_fetch, | 381 | optimized_fetch=opt.optimized_fetch, |
| 374 | retry_fetches=opt.retry_fetches, | 382 | retry_fetches=opt.retry_fetches, |
| 375 | prune=opt.prune, | 383 | prune=opt.prune, |
| 376 | ssh_proxy=self.ssh_proxy, | 384 | ssh_proxy=self.ssh_proxy, |
| 377 | clone_filter=self.manifest.CloneFilter, | 385 | clone_filter=project.manifest.CloneFilter, |
| 378 | partial_clone_exclude=self.manifest.PartialCloneExclude) | 386 | partial_clone_exclude=project.manifest.PartialCloneExclude) |
| 379 | 387 | ||
| 380 | output = buf.getvalue() | 388 | output = buf.getvalue() |
| 381 | if (opt.verbose or not success) and output: | 389 | if (opt.verbose or not success) and output: |
| @@ -472,13 +480,13 @@ later is required to fix a server side protocol bug. | |||
| 472 | pm.end() | 480 | pm.end() |
| 473 | self._fetch_times.Save() | 481 | self._fetch_times.Save() |
| 474 | 482 | ||
| 475 | if not self.manifest.IsArchive: | 483 | if not self.outer_client.manifest.IsArchive: |
| 476 | self._GCProjects(projects, opt, err_event) | 484 | self._GCProjects(projects, opt, err_event) |
| 477 | 485 | ||
| 478 | return (ret, fetched) | 486 | return (ret, fetched) |
| 479 | 487 | ||
| 480 | def _FetchMain(self, opt, args, all_projects, err_event, manifest_name, | 488 | def _FetchMain(self, opt, args, all_projects, err_event, manifest_name, |
| 481 | load_local_manifests, ssh_proxy): | 489 | load_local_manifests, ssh_proxy, manifest): |
| 482 | """The main network fetch loop. | 490 | """The main network fetch loop. |
| 483 | 491 | ||
| 484 | Args: | 492 | Args: |
| @@ -489,11 +497,12 @@ later is required to fix a server side protocol bug. | |||
| 489 | manifest_name: Manifest file to be reloaded. | 497 | manifest_name: Manifest file to be reloaded. |
| 490 | load_local_manifests: Whether to load local manifests. | 498 | load_local_manifests: Whether to load local manifests. |
| 491 | ssh_proxy: SSH manager for clients & masters. | 499 | ssh_proxy: SSH manager for clients & masters. |
| 500 | manifest: The manifest to use. | ||
| 492 | 501 | ||
| 493 | Returns: | 502 | Returns: |
| 494 | List of all projects that should be checked out. | 503 | List of all projects that should be checked out. |
| 495 | """ | 504 | """ |
| 496 | rp = self.manifest.repoProject | 505 | rp = manifest.repoProject |
| 497 | 506 | ||
| 498 | to_fetch = [] | 507 | to_fetch = [] |
| 499 | now = time.time() | 508 | now = time.time() |
| @@ -517,7 +526,7 @@ later is required to fix a server side protocol bug. | |||
| 517 | # Iteratively fetch missing and/or nested unregistered submodules | 526 | # Iteratively fetch missing and/or nested unregistered submodules |
| 518 | previously_missing_set = set() | 527 | previously_missing_set = set() |
| 519 | while True: | 528 | while True: |
| 520 | self._ReloadManifest(manifest_name, load_local_manifests) | 529 | self._ReloadManifest(manifest_name, self.manifest, load_local_manifests) |
| 521 | all_projects = self.GetProjects(args, | 530 | all_projects = self.GetProjects(args, |
| 522 | missing_ok=True, | 531 | missing_ok=True, |
| 523 | submodules_ok=opt.fetch_submodules) | 532 | submodules_ok=opt.fetch_submodules) |
| @@ -552,7 +561,7 @@ later is required to fix a server side protocol bug. | |||
| 552 | Whether the fetch was successful. | 561 | Whether the fetch was successful. |
| 553 | """ | 562 | """ |
| 554 | start = time.time() | 563 | start = time.time() |
| 555 | syncbuf = SyncBuffer(self.manifest.manifestProject.config, | 564 | syncbuf = SyncBuffer(project.manifest.manifestProject.config, |
| 556 | detach_head=detach_head) | 565 | detach_head=detach_head) |
| 557 | success = False | 566 | success = False |
| 558 | try: | 567 | try: |
| @@ -689,28 +698,29 @@ later is required to fix a server side protocol bug. | |||
| 689 | t.join() | 698 | t.join() |
| 690 | pm.end() | 699 | pm.end() |
| 691 | 700 | ||
| 692 | def _ReloadManifest(self, manifest_name=None, load_local_manifests=True): | 701 | def _ReloadManifest(self, manifest_name, manifest, load_local_manifests=True): |
| 693 | """Reload the manfiest from the file specified by the |manifest_name|. | 702 | """Reload the manfiest from the file specified by the |manifest_name|. |
| 694 | 703 | ||
| 695 | It unloads the manifest if |manifest_name| is None. | 704 | It unloads the manifest if |manifest_name| is None. |
| 696 | 705 | ||
| 697 | Args: | 706 | Args: |
| 698 | manifest_name: Manifest file to be reloaded. | 707 | manifest_name: Manifest file to be reloaded. |
| 708 | manifest: The manifest to use. | ||
| 699 | load_local_manifests: Whether to load local manifests. | 709 | load_local_manifests: Whether to load local manifests. |
| 700 | """ | 710 | """ |
| 701 | if manifest_name: | 711 | if manifest_name: |
| 702 | # Override calls Unload already | 712 | # Override calls Unload already |
| 703 | self.manifest.Override(manifest_name, load_local_manifests=load_local_manifests) | 713 | manifest.Override(manifest_name, load_local_manifests=load_local_manifests) |
| 704 | else: | 714 | else: |
| 705 | self.manifest.Unload() | 715 | manifest.Unload() |
| 706 | 716 | ||
| 707 | def UpdateProjectList(self, opt): | 717 | def UpdateProjectList(self, opt, manifest): |
| 708 | new_project_paths = [] | 718 | new_project_paths = [] |
| 709 | for project in self.GetProjects(None, missing_ok=True): | 719 | for project in self.GetProjects(None, missing_ok=True): |
| 710 | if project.relpath: | 720 | if project.relpath: |
| 711 | new_project_paths.append(project.relpath) | 721 | new_project_paths.append(project.relpath) |
| 712 | file_name = 'project.list' | 722 | file_name = 'project.list' |
| 713 | file_path = os.path.join(self.manifest.subdir, file_name) | 723 | file_path = os.path.join(manifest.subdir, file_name) |
| 714 | old_project_paths = [] | 724 | old_project_paths = [] |
| 715 | 725 | ||
| 716 | if os.path.exists(file_path): | 726 | if os.path.exists(file_path): |
| @@ -722,16 +732,16 @@ later is required to fix a server side protocol bug. | |||
| 722 | continue | 732 | continue |
| 723 | if path not in new_project_paths: | 733 | if path not in new_project_paths: |
| 724 | # If the path has already been deleted, we don't need to do it | 734 | # If the path has already been deleted, we don't need to do it |
| 725 | gitdir = os.path.join(self.manifest.topdir, path, '.git') | 735 | gitdir = os.path.join(manifest.topdir, path, '.git') |
| 726 | if os.path.exists(gitdir): | 736 | if os.path.exists(gitdir): |
| 727 | project = Project( | 737 | project = Project( |
| 728 | manifest=self.manifest, | 738 | manifest=manifest, |
| 729 | name=path, | 739 | name=path, |
| 730 | remote=RemoteSpec('origin'), | 740 | remote=RemoteSpec('origin'), |
| 731 | gitdir=gitdir, | 741 | gitdir=gitdir, |
| 732 | objdir=gitdir, | 742 | objdir=gitdir, |
| 733 | use_git_worktrees=os.path.isfile(gitdir), | 743 | use_git_worktrees=os.path.isfile(gitdir), |
| 734 | worktree=os.path.join(self.manifest.topdir, path), | 744 | worktree=os.path.join(manifest.topdir, path), |
| 735 | relpath=path, | 745 | relpath=path, |
| 736 | revisionExpr='HEAD', | 746 | revisionExpr='HEAD', |
| 737 | revisionId=None, | 747 | revisionId=None, |
| @@ -747,7 +757,7 @@ later is required to fix a server side protocol bug. | |||
| 747 | fd.write('\n') | 757 | fd.write('\n') |
| 748 | return 0 | 758 | return 0 |
| 749 | 759 | ||
| 750 | def UpdateCopyLinkfileList(self): | 760 | def UpdateCopyLinkfileList(self, manifest): |
| 751 | """Save all dests of copyfile and linkfile, and update them if needed. | 761 | """Save all dests of copyfile and linkfile, and update them if needed. |
| 752 | 762 | ||
| 753 | Returns: | 763 | Returns: |
| @@ -766,7 +776,7 @@ later is required to fix a server side protocol bug. | |||
| 766 | } | 776 | } |
| 767 | 777 | ||
| 768 | copylinkfile_name = 'copy-link-files.json' | 778 | copylinkfile_name = 'copy-link-files.json' |
| 769 | copylinkfile_path = os.path.join(self.manifest.subdir, copylinkfile_name) | 779 | copylinkfile_path = os.path.join(manifest.subdir, copylinkfile_name) |
| 770 | old_copylinkfile_paths = {} | 780 | old_copylinkfile_paths = {} |
| 771 | 781 | ||
| 772 | if os.path.exists(copylinkfile_path): | 782 | if os.path.exists(copylinkfile_path): |
| @@ -797,13 +807,13 @@ later is required to fix a server side protocol bug. | |||
| 797 | json.dump(new_paths, fp) | 807 | json.dump(new_paths, fp) |
| 798 | return True | 808 | return True |
| 799 | 809 | ||
| 800 | def _SmartSyncSetup(self, opt, smart_sync_manifest_path): | 810 | def _SmartSyncSetup(self, opt, smart_sync_manifest_path, manifest): |
| 801 | if not self.manifest.manifest_server: | 811 | if not manifest.manifest_server: |
| 802 | print('error: cannot smart sync: no manifest server defined in ' | 812 | print('error: cannot smart sync: no manifest server defined in ' |
| 803 | 'manifest', file=sys.stderr) | 813 | 'manifest', file=sys.stderr) |
| 804 | sys.exit(1) | 814 | sys.exit(1) |
| 805 | 815 | ||
| 806 | manifest_server = self.manifest.manifest_server | 816 | manifest_server = manifest.manifest_server |
| 807 | if not opt.quiet: | 817 | if not opt.quiet: |
| 808 | print('Using manifest server %s' % manifest_server) | 818 | print('Using manifest server %s' % manifest_server) |
| 809 | 819 | ||
| @@ -844,7 +854,7 @@ later is required to fix a server side protocol bug. | |||
| 844 | try: | 854 | try: |
| 845 | server = xmlrpc.client.Server(manifest_server, transport=transport) | 855 | server = xmlrpc.client.Server(manifest_server, transport=transport) |
| 846 | if opt.smart_sync: | 856 | if opt.smart_sync: |
| 847 | branch = self._GetBranch() | 857 | branch = self._GetBranch(manifest.manifestProject) |
| 848 | 858 | ||
| 849 | if 'SYNC_TARGET' in os.environ: | 859 | if 'SYNC_TARGET' in os.environ: |
| 850 | target = os.environ['SYNC_TARGET'] | 860 | target = os.environ['SYNC_TARGET'] |
| @@ -870,18 +880,18 @@ later is required to fix a server side protocol bug. | |||
| 870 | % (smart_sync_manifest_path, e), | 880 | % (smart_sync_manifest_path, e), |
| 871 | file=sys.stderr) | 881 | file=sys.stderr) |
| 872 | sys.exit(1) | 882 | sys.exit(1) |
| 873 | self._ReloadManifest(manifest_name) | 883 | self._ReloadManifest(manifest_name, manifest) |
| 874 | else: | 884 | else: |
| 875 | print('error: manifest server RPC call failed: %s' % | 885 | print('error: manifest server RPC call failed: %s' % |
| 876 | manifest_str, file=sys.stderr) | 886 | manifest_str, file=sys.stderr) |
| 877 | sys.exit(1) | 887 | sys.exit(1) |
| 878 | except (socket.error, IOError, xmlrpc.client.Fault) as e: | 888 | except (socket.error, IOError, xmlrpc.client.Fault) as e: |
| 879 | print('error: cannot connect to manifest server %s:\n%s' | 889 | print('error: cannot connect to manifest server %s:\n%s' |
| 880 | % (self.manifest.manifest_server, e), file=sys.stderr) | 890 | % (manifest.manifest_server, e), file=sys.stderr) |
| 881 | sys.exit(1) | 891 | sys.exit(1) |
| 882 | except xmlrpc.client.ProtocolError as e: | 892 | except xmlrpc.client.ProtocolError as e: |
| 883 | print('error: cannot connect to manifest server %s:\n%d %s' | 893 | print('error: cannot connect to manifest server %s:\n%d %s' |
| 884 | % (self.manifest.manifest_server, e.errcode, e.errmsg), | 894 | % (manifest.manifest_server, e.errcode, e.errmsg), |
| 885 | file=sys.stderr) | 895 | file=sys.stderr) |
| 886 | sys.exit(1) | 896 | sys.exit(1) |
| 887 | 897 | ||
| @@ -892,14 +902,14 @@ later is required to fix a server side protocol bug. | |||
| 892 | if not opt.local_only: | 902 | if not opt.local_only: |
| 893 | start = time.time() | 903 | start = time.time() |
| 894 | success = mp.Sync_NetworkHalf(quiet=opt.quiet, verbose=opt.verbose, | 904 | success = mp.Sync_NetworkHalf(quiet=opt.quiet, verbose=opt.verbose, |
| 895 | current_branch_only=self._GetCurrentBranchOnly(opt), | 905 | current_branch_only=self._GetCurrentBranchOnly(opt, mp.manifest), |
| 896 | force_sync=opt.force_sync, | 906 | force_sync=opt.force_sync, |
| 897 | tags=opt.tags, | 907 | tags=opt.tags, |
| 898 | optimized_fetch=opt.optimized_fetch, | 908 | optimized_fetch=opt.optimized_fetch, |
| 899 | retry_fetches=opt.retry_fetches, | 909 | retry_fetches=opt.retry_fetches, |
| 900 | submodules=self.manifest.HasSubmodules, | 910 | submodules=mp.manifest.HasSubmodules, |
| 901 | clone_filter=self.manifest.CloneFilter, | 911 | clone_filter=mp.manifest.CloneFilter, |
| 902 | partial_clone_exclude=self.manifest.PartialCloneExclude) | 912 | partial_clone_exclude=mp.manifest.PartialCloneExclude) |
| 903 | finish = time.time() | 913 | finish = time.time() |
| 904 | self.event_log.AddSync(mp, event_log.TASK_SYNC_NETWORK, | 914 | self.event_log.AddSync(mp, event_log.TASK_SYNC_NETWORK, |
| 905 | start, finish, success) | 915 | start, finish, success) |
| @@ -907,15 +917,15 @@ later is required to fix a server side protocol bug. | |||
| 907 | if mp.HasChanges: | 917 | if mp.HasChanges: |
| 908 | syncbuf = SyncBuffer(mp.config) | 918 | syncbuf = SyncBuffer(mp.config) |
| 909 | start = time.time() | 919 | start = time.time() |
| 910 | mp.Sync_LocalHalf(syncbuf, submodules=self.manifest.HasSubmodules) | 920 | mp.Sync_LocalHalf(syncbuf, submodules=mp.manifest.HasSubmodules) |
| 911 | clean = syncbuf.Finish() | 921 | clean = syncbuf.Finish() |
| 912 | self.event_log.AddSync(mp, event_log.TASK_SYNC_LOCAL, | 922 | self.event_log.AddSync(mp, event_log.TASK_SYNC_LOCAL, |
| 913 | start, time.time(), clean) | 923 | start, time.time(), clean) |
| 914 | if not clean: | 924 | if not clean: |
| 915 | sys.exit(1) | 925 | sys.exit(1) |
| 916 | self._ReloadManifest(manifest_name) | 926 | self._ReloadManifest(manifest_name, mp.manifest) |
| 917 | if opt.jobs is None: | 927 | if opt.jobs is None: |
| 918 | self.jobs = self.manifest.default.sync_j | 928 | self.jobs = mp.manifest.default.sync_j |
| 919 | 929 | ||
| 920 | def ValidateOptions(self, opt, args): | 930 | def ValidateOptions(self, opt, args): |
| 921 | if opt.force_broken: | 931 | if opt.force_broken: |
| @@ -938,7 +948,7 @@ later is required to fix a server side protocol bug. | |||
| 938 | if opt.prune is None: | 948 | if opt.prune is None: |
| 939 | opt.prune = True | 949 | opt.prune = True |
| 940 | 950 | ||
| 941 | if self.manifest.is_multimanifest and not opt.this_manifest_only and args: | 951 | if self.outer_client.manifest.is_multimanifest and not opt.this_manifest_only and args: |
| 942 | self.OptionParser.error('partial syncs must use --this-manifest-only') | 952 | self.OptionParser.error('partial syncs must use --this-manifest-only') |
| 943 | 953 | ||
| 944 | def Execute(self, opt, args): | 954 | def Execute(self, opt, args): |
| @@ -948,18 +958,22 @@ later is required to fix a server side protocol bug. | |||
| 948 | soft_limit, _ = _rlimit_nofile() | 958 | soft_limit, _ = _rlimit_nofile() |
| 949 | self.jobs = min(self.jobs, (soft_limit - 5) // 3) | 959 | self.jobs = min(self.jobs, (soft_limit - 5) // 3) |
| 950 | 960 | ||
| 961 | manifest = self.outer_manifest | ||
| 962 | if opt.this_manifest_only or not opt.outer_manifest: | ||
| 963 | manifest = self.manifest | ||
| 964 | |||
| 951 | if opt.manifest_name: | 965 | if opt.manifest_name: |
| 952 | self.manifest.Override(opt.manifest_name) | 966 | manifest.Override(opt.manifest_name) |
| 953 | 967 | ||
| 954 | manifest_name = opt.manifest_name | 968 | manifest_name = opt.manifest_name |
| 955 | smart_sync_manifest_path = os.path.join( | 969 | smart_sync_manifest_path = os.path.join( |
| 956 | self.manifest.manifestProject.worktree, 'smart_sync_override.xml') | 970 | manifest.manifestProject.worktree, 'smart_sync_override.xml') |
| 957 | 971 | ||
| 958 | if opt.clone_bundle is None: | 972 | if opt.clone_bundle is None: |
| 959 | opt.clone_bundle = self.manifest.CloneBundle | 973 | opt.clone_bundle = manifest.CloneBundle |
| 960 | 974 | ||
| 961 | if opt.smart_sync or opt.smart_tag: | 975 | if opt.smart_sync or opt.smart_tag: |
| 962 | manifest_name = self._SmartSyncSetup(opt, smart_sync_manifest_path) | 976 | manifest_name = self._SmartSyncSetup(opt, smart_sync_manifest_path, manifest) |
| 963 | else: | 977 | else: |
| 964 | if os.path.isfile(smart_sync_manifest_path): | 978 | if os.path.isfile(smart_sync_manifest_path): |
| 965 | try: | 979 | try: |
| @@ -970,7 +984,7 @@ later is required to fix a server side protocol bug. | |||
| 970 | 984 | ||
| 971 | err_event = multiprocessing.Event() | 985 | err_event = multiprocessing.Event() |
| 972 | 986 | ||
| 973 | rp = self.manifest.repoProject | 987 | rp = manifest.repoProject |
| 974 | rp.PreSync() | 988 | rp.PreSync() |
| 975 | cb = rp.CurrentBranch | 989 | cb = rp.CurrentBranch |
| 976 | if cb: | 990 | if cb: |
| @@ -980,35 +994,35 @@ later is required to fix a server side protocol bug. | |||
| 980 | 'receive updates; run `repo init --repo-rev=stable` to fix.', | 994 | 'receive updates; run `repo init --repo-rev=stable` to fix.', |
| 981 | file=sys.stderr) | 995 | file=sys.stderr) |
| 982 | 996 | ||
| 983 | mp = self.manifest.manifestProject | 997 | mp = manifest.manifestProject |
| 984 | is_standalone_manifest = bool(mp.standalone_manifest_url) | 998 | is_standalone_manifest = bool(mp.standalone_manifest_url) |
| 985 | if not is_standalone_manifest: | 999 | if not is_standalone_manifest: |
| 986 | mp.PreSync() | 1000 | mp.PreSync() |
| 987 | 1001 | ||
| 988 | if opt.repo_upgraded: | 1002 | if opt.repo_upgraded: |
| 989 | _PostRepoUpgrade(self.manifest, quiet=opt.quiet) | 1003 | _PostRepoUpgrade(manifest, quiet=opt.quiet) |
| 990 | 1004 | ||
| 991 | if not opt.mp_update: | 1005 | if not opt.mp_update: |
| 992 | print('Skipping update of local manifest project.') | 1006 | print('Skipping update of local manifest project.') |
| 993 | elif not is_standalone_manifest: | 1007 | elif not is_standalone_manifest: |
| 994 | self._UpdateManifestProject(opt, mp, manifest_name) | 1008 | self._UpdateManifestProject(opt, mp, manifest_name) |
| 995 | 1009 | ||
| 996 | load_local_manifests = not self.manifest.HasLocalManifests | 1010 | load_local_manifests = not manifest.HasLocalManifests |
| 997 | use_superproject = git_superproject.UseSuperproject(opt.use_superproject, | 1011 | use_superproject = git_superproject.UseSuperproject(opt.use_superproject, manifest) |
| 998 | self.manifest) | 1012 | if use_superproject and (manifest.IsMirror or manifest.IsArchive): |
| 999 | if use_superproject and (self.manifest.IsMirror or self.manifest.IsArchive): | ||
| 1000 | # Don't use superproject, because we have no working tree. | 1013 | # Don't use superproject, because we have no working tree. |
| 1001 | use_superproject = False | 1014 | use_superproject = False |
| 1002 | if opt.use_superproject is not None: | 1015 | if opt.use_superproject is not None: |
| 1003 | print('Defaulting to no-use-superproject because there is no working tree.') | 1016 | print('Defaulting to no-use-superproject because there is no working tree.') |
| 1004 | superproject_logging_data = { | 1017 | superproject_logging_data = { |
| 1005 | 'superproject': use_superproject, | 1018 | 'superproject': use_superproject, |
| 1006 | 'haslocalmanifests': bool(self.manifest.HasLocalManifests), | 1019 | 'haslocalmanifests': bool(manifest.HasLocalManifests), |
| 1007 | 'hassuperprojecttag': bool(self.manifest.superproject), | 1020 | 'hassuperprojecttag': bool(manifest.superproject), |
| 1008 | } | 1021 | } |
| 1009 | if use_superproject: | 1022 | if use_superproject: |
| 1010 | manifest_name = self._UpdateProjectsRevisionId( | 1023 | manifest_name = self._UpdateProjectsRevisionId( |
| 1011 | opt, args, load_local_manifests, superproject_logging_data) or opt.manifest_name | 1024 | opt, args, load_local_manifests, superproject_logging_data, |
| 1025 | manifest) or opt.manifest_name | ||
| 1012 | 1026 | ||
| 1013 | if self.gitc_manifest: | 1027 | if self.gitc_manifest: |
| 1014 | gitc_manifest_projects = self.GetProjects(args, | 1028 | gitc_manifest_projects = self.GetProjects(args, |
| @@ -1031,7 +1045,7 @@ later is required to fix a server side protocol bug. | |||
| 1031 | if manifest_name: | 1045 | if manifest_name: |
| 1032 | manifest.Override(manifest_name) | 1046 | manifest.Override(manifest_name) |
| 1033 | else: | 1047 | else: |
| 1034 | manifest.Override(self.manifest.manifestFile) | 1048 | manifest.Override(manifest.manifestFile) |
| 1035 | gitc_utils.generate_gitc_manifest(self.gitc_manifest, | 1049 | gitc_utils.generate_gitc_manifest(self.gitc_manifest, |
| 1036 | manifest, | 1050 | manifest, |
| 1037 | gitc_projects) | 1051 | gitc_projects) |
| @@ -1041,7 +1055,7 @@ later is required to fix a server side protocol bug. | |||
| 1041 | # generate a new args list to represent the opened projects. | 1055 | # generate a new args list to represent the opened projects. |
| 1042 | # TODO: make this more reliable -- if there's a project name/path overlap, | 1056 | # TODO: make this more reliable -- if there's a project name/path overlap, |
| 1043 | # this may choose the wrong project. | 1057 | # this may choose the wrong project. |
| 1044 | args = [os.path.relpath(self.manifest.paths[path].worktree, os.getcwd()) | 1058 | args = [os.path.relpath(manifest.paths[path].worktree, os.getcwd()) |
| 1045 | for path in opened_projects] | 1059 | for path in opened_projects] |
| 1046 | if not args: | 1060 | if not args: |
| 1047 | return | 1061 | return |
| @@ -1052,7 +1066,7 @@ later is required to fix a server side protocol bug. | |||
| 1052 | err_network_sync = False | 1066 | err_network_sync = False |
| 1053 | err_update_projects = False | 1067 | err_update_projects = False |
| 1054 | 1068 | ||
| 1055 | self._fetch_times = _FetchTimes(self.manifest) | 1069 | self._fetch_times = _FetchTimes(manifest) |
| 1056 | if not opt.local_only: | 1070 | if not opt.local_only: |
| 1057 | with multiprocessing.Manager() as manager: | 1071 | with multiprocessing.Manager() as manager: |
| 1058 | with ssh.ProxyManager(manager) as ssh_proxy: | 1072 | with ssh.ProxyManager(manager) as ssh_proxy: |
| @@ -1060,7 +1074,7 @@ later is required to fix a server side protocol bug. | |||
| 1060 | ssh_proxy.sock() | 1074 | ssh_proxy.sock() |
| 1061 | all_projects = self._FetchMain(opt, args, all_projects, err_event, | 1075 | all_projects = self._FetchMain(opt, args, all_projects, err_event, |
| 1062 | manifest_name, load_local_manifests, | 1076 | manifest_name, load_local_manifests, |
| 1063 | ssh_proxy) | 1077 | ssh_proxy, manifest) |
| 1064 | 1078 | ||
| 1065 | if opt.network_only: | 1079 | if opt.network_only: |
| 1066 | return | 1080 | return |
| @@ -1076,18 +1090,18 @@ later is required to fix a server side protocol bug. | |||
| 1076 | file=sys.stderr) | 1090 | file=sys.stderr) |
| 1077 | sys.exit(1) | 1091 | sys.exit(1) |
| 1078 | 1092 | ||
| 1079 | if self.manifest.IsMirror or self.manifest.IsArchive: | 1093 | if manifest.IsMirror or manifest.IsArchive: |
| 1080 | # bail out now, we have no working tree | 1094 | # bail out now, we have no working tree |
| 1081 | return | 1095 | return |
| 1082 | 1096 | ||
| 1083 | if self.UpdateProjectList(opt): | 1097 | if self.UpdateProjectList(opt, manifest): |
| 1084 | err_event.set() | 1098 | err_event.set() |
| 1085 | err_update_projects = True | 1099 | err_update_projects = True |
| 1086 | if opt.fail_fast: | 1100 | if opt.fail_fast: |
| 1087 | print('\nerror: Local checkouts *not* updated.', file=sys.stderr) | 1101 | print('\nerror: Local checkouts *not* updated.', file=sys.stderr) |
| 1088 | sys.exit(1) | 1102 | sys.exit(1) |
| 1089 | 1103 | ||
| 1090 | err_update_linkfiles = not self.UpdateCopyLinkfileList() | 1104 | err_update_linkfiles = not self.UpdateCopyLinkfileList(manifest) |
| 1091 | if err_update_linkfiles: | 1105 | if err_update_linkfiles: |
| 1092 | err_event.set() | 1106 | err_event.set() |
| 1093 | if opt.fail_fast: | 1107 | if opt.fail_fast: |
| @@ -1102,8 +1116,8 @@ later is required to fix a server side protocol bug. | |||
| 1102 | 1116 | ||
| 1103 | # If there's a notice that's supposed to print at the end of the sync, print | 1117 | # If there's a notice that's supposed to print at the end of the sync, print |
| 1104 | # it now... | 1118 | # it now... |
| 1105 | if self.manifest.notice: | 1119 | if manifest.notice: |
| 1106 | print(self.manifest.notice) | 1120 | print(manifest.notice) |
| 1107 | 1121 | ||
| 1108 | # If we saw an error, exit with code 1 so that other scripts can check. | 1122 | # If we saw an error, exit with code 1 so that other scripts can check. |
| 1109 | if err_event.is_set(): | 1123 | if err_event.is_set(): |
diff --git a/tests/test_subcmds_sync.py b/tests/test_subcmds_sync.py index c1d1758e..aad713f2 100644 --- a/tests/test_subcmds_sync.py +++ b/tests/test_subcmds_sync.py | |||
| @@ -42,4 +42,4 @@ def test_get_current_branch_only(use_superproject, cli_args, result): | |||
| 42 | opts, _ = cmd.OptionParser.parse_args(cli_args) | 42 | opts, _ = cmd.OptionParser.parse_args(cli_args) |
| 43 | 43 | ||
| 44 | with mock.patch('git_superproject.UseSuperproject', return_value=use_superproject): | 44 | with mock.patch('git_superproject.UseSuperproject', return_value=use_superproject): |
| 45 | assert cmd._GetCurrentBranchOnly(opts) == result | 45 | assert cmd._GetCurrentBranchOnly(opts, cmd.manifest) == result |
