upload: Suggest full sync if hooks fail with partially synced tree

Pre-upload hooks may fail because of partial syncs.

Bug: b/271507654
Change-Id: I124cd386c5af2c34e1dcaa3e86916624e235b1e3
Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/383474
Reviewed-by: Mike Frysinger <vapier@google.com>
Commit-Queue: Gavin Mak <gavinmak@google.com>
Tested-by: Gavin Mak <gavinmak@google.com>
This commit is contained in:
Gavin Mak 2023-08-22 01:24:46 +00:00 committed by LUCI
parent 321b7934b5
commit 16109a66b7
3 changed files with 11 additions and 4 deletions

View File

@ -1696,7 +1696,7 @@ later is required to fix a server side protocol bug.
) )
self._fetch_times = _FetchTimes(manifest) self._fetch_times = _FetchTimes(manifest)
self._local_sync_state = _LocalSyncState(manifest) self._local_sync_state = LocalSyncState(manifest)
if not opt.local_only: if not opt.local_only:
with multiprocessing.Manager() as manager: with multiprocessing.Manager() as manager:
with ssh.ProxyManager(manager) as ssh_proxy: with ssh.ProxyManager(manager) as ssh_proxy:
@ -1932,7 +1932,7 @@ class _FetchTimes(object):
platform_utils.remove(self._path, missing_ok=True) platform_utils.remove(self._path, missing_ok=True)
class _LocalSyncState(object): class LocalSyncState(object):
_LAST_FETCH = "last_fetch" _LAST_FETCH = "last_fetch"
_LAST_CHECKOUT = "last_checkout" _LAST_CHECKOUT = "last_checkout"

View File

@ -26,6 +26,7 @@ from git_command import GitCommand
from git_refs import R_HEADS from git_refs import R_HEADS
from hooks import RepoHook from hooks import RepoHook
from project import ReviewableBranch from project import ReviewableBranch
from subcmds.sync import LocalSyncState
_DEFAULT_UNUSUAL_COMMIT_THRESHOLD = 5 _DEFAULT_UNUSUAL_COMMIT_THRESHOLD = 5
@ -804,6 +805,12 @@ Gerrit Code Review: https://www.gerritcodereview.com/
if not hook.Run( if not hook.Run(
project_list=pending_proj_names, worktree_list=pending_worktrees project_list=pending_proj_names, worktree_list=pending_worktrees
): ):
if LocalSyncState(manifest).IsPartiallySynced():
print(
"Partially synced tree detected. Syncing all projects "
"may resolve issues you're seeing.",
file=sys.stderr,
)
ret = 1 ret = 1
if ret: if ret:
return ret return ret

View File

@ -110,7 +110,7 @@ def test_cli_jobs(argv, jobs_manifest, jobs, jobs_net, jobs_check):
class LocalSyncState(unittest.TestCase): class LocalSyncState(unittest.TestCase):
"""Tests for _LocalSyncState.""" """Tests for LocalSyncState."""
_TIME = 10 _TIME = 10
@ -129,7 +129,7 @@ class LocalSyncState(unittest.TestCase):
def _new_state(self, time=_TIME): def _new_state(self, time=_TIME):
with mock.patch("time.time", return_value=time): with mock.patch("time.time", return_value=time):
return sync._LocalSyncState(self.manifest) return sync.LocalSyncState(self.manifest)
def test_set(self): def test_set(self):
"""Times are set.""" """Times are set."""