From 720bd1e96b4e9c36d035987578fc01a9939d753f Mon Sep 17 00:00:00 2001 From: Gavin Mak Date: Wed, 23 Jul 2025 15:23:10 -0700 Subject: sync: Don't checkout if no worktree Interleaved sync should not try checkout out a project if it's a mirror. Change-Id: I2549faab197a3202d79a10e44b449b68d53e3fe7 Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/492942 Commit-Queue: Gavin Mak Reviewed-by: Scott Lee Tested-by: Gavin Mak --- subcmds/sync.py | 92 ++++++++++++++++++++++++++++++--------------------------- 1 file changed, 49 insertions(+), 43 deletions(-) (limited to 'subcmds/sync.py') diff --git a/subcmds/sync.py b/subcmds/sync.py index b02fdd02..c0310c56 100644 --- a/subcmds/sync.py +++ b/subcmds/sync.py @@ -2269,51 +2269,57 @@ later is required to fix a server side protocol bug. checkout_finish = None checkout_stderr = "" - if fetch_success and not opt.network_only: - checkout_start = time.time() - stderr_capture = io.StringIO() - try: - with contextlib.redirect_stderr(stderr_capture): - syncbuf = SyncBuffer( - project.manifest.manifestProject.config, - detach_head=opt.detach_head, + if fetch_success: + # We skip checkout if it's network-only or if the project has no + # working tree (e.g., a mirror). + if opt.network_only or not project.worktree: + checkout_success = True + else: + # This is a normal project that needs a checkout. + checkout_start = time.time() + stderr_capture = io.StringIO() + try: + with contextlib.redirect_stderr(stderr_capture): + syncbuf = SyncBuffer( + project.manifest.manifestProject.config, + detach_head=opt.detach_head, + ) + local_half_errors = [] + project.Sync_LocalHalf( + syncbuf, + force_sync=opt.force_sync, + force_checkout=opt.force_checkout, + force_rebase=opt.rebase, + errors=local_half_errors, + verbose=opt.verbose, + ) + checkout_success = syncbuf.Finish() + if local_half_errors: + checkout_error = SyncError( + aggregate_errors=local_half_errors + ) + except KeyboardInterrupt: + logger.error( + "Keyboard interrupt while processing %s", project.name ) - local_half_errors = [] - project.Sync_LocalHalf( - syncbuf, - force_sync=opt.force_sync, - force_checkout=opt.force_checkout, - force_rebase=opt.rebase, - errors=local_half_errors, - verbose=opt.verbose, + except GitError as e: + checkout_error = e + logger.error( + "error.GitError: Cannot checkout %s: %s", + project.name, + e, ) - checkout_success = syncbuf.Finish() - if local_half_errors: - checkout_error = SyncError( - aggregate_errors=local_half_errors - ) - except KeyboardInterrupt: - logger.error( - "Keyboard interrupt while processing %s", project.name - ) - except GitError as e: - checkout_error = e - logger.error( - "error.GitError: Cannot checkout %s: %s", project.name, e - ) - except Exception as e: - checkout_error = e - logger.error( - "error: Cannot checkout %s: %s: %s", - project.name, - type(e).__name__, - e, - ) - finally: - checkout_finish = time.time() - checkout_stderr = stderr_capture.getvalue() - elif fetch_success: - checkout_success = True + except Exception as e: + checkout_error = e + logger.error( + "error: Cannot checkout %s: %s: %s", + project.name, + type(e).__name__, + e, + ) + finally: + checkout_finish = time.time() + checkout_stderr = stderr_capture.getvalue() # Consolidate all captured output. captured_parts = [] -- cgit v1.2.3-54-g00ecf