[PATCH b4 v2 28/44] ty: an unknown remote tip is undetermined, not unpublished
Christian Brauner <[email protected]> Fri, 31 Jul 2026 23:59:09 +0200
| Newsgroups | org.kernel.linux.tools |
|---|---|
| Message-ID | <20260731-work-b4-editor-branch-guard-v2-28-243fd19d322d@kernel.org> |
When none of the tips a remote advertises exist locally there is nothing to compute ancestry against, and the check said "not yet visible", which is normal waiting and reports nothing. A stale or wrong repository therefore waited forever in silence. Report a failed check as a failure rather than as waiting, and warn when the remote's tips are entirely absent locally: that is a standing misconfiguration, not a transient. Signed-off-by: Christian Brauner (Amutable) <[email protected]> --- src/b4/ty.py | 18 +++++++++++++++--- src/tests/test_ty.py | 9 +++++---- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/b4/ty.py b/src/b4/ty.py index a23a339..e4b2867 100644 --- a/src/b4/ty.py +++ b/src/b4/ty.py @@ -1075,7 +1075,8 @@ def commit_reachable_on_remote( belongs to. Returns True/False, or None if the state could not be determined - (e.g. the remote is unreachable). + (e.g. the remote is unreachable, or none of the advertised tips are + in the local repository). """ gitargs = [ '-c', @@ -1120,8 +1121,19 @@ def commit_reachable_on_remote( if len(chunks) == 2 and chunks[1] == 'commit': known.append(chunks[0]) if not known: - logger.debug('No advertised heads of %s exist locally', repo_url) - return False + # Undetermined, not unpublished: without the objects we cannot + # say anything about the commit, and reporting "not yet visible" + # would hide a stale (or simply wrong) local repository behind + # what looks like normal waiting. Warn rather than debug: a cron + # sweep silences narration but keeps warnings, and this one is a + # standing misconfiguration that would otherwise wait forever. + logger.warning( + 'None of the heads advertised by %s exist in %s; cannot tell ' + 'whether the commit is published', + repo_url, + gitdir or os.getcwd(), + ) + return None # Empty output means every commit reachable from ours is also # reachable from one of the known tips, i.e. ours is published ecode, out = b4.git_run_command(gitdir, ['rev-list', '-1', commit, '--not', *known]) diff --git a/src/tests/test_ty.py b/src/tests/test_ty.py index 8ca5184..3ccd6a4 100644 --- a/src/tests/test_ty.py +++ b/src/tests/test_ty.py @@ -350,7 +350,8 @@ def test_commit_reachable_unknown_tips( monkeypatch: pytest.MonkeyPatch, tmp_path: pathlib.Path ) -> None: """Advertised tips we have no objects for cannot prove anything, so - the check stays conservative (pending) until the next fetch.""" + the answer is 'don't know' -- which keeps the message queued, but + reports a failed check rather than normal waiting.""" local = str(tmp_path / 'local') pub = str(tmp_path / 'pub') other = str(tmp_path / 'other') @@ -375,7 +376,7 @@ def test_commit_reachable_unknown_tips( assert ecode == 0, out monkeypatch.chdir(local) # c1 is actually published, but the only advertised tip is unknown here - assert b4.ty.commit_reachable_on_remote(c1, pub) is False + assert b4.ty.commit_reachable_on_remote(c1, pub) is None def test_commit_reachable_branch_filter( @@ -426,9 +427,9 @@ def test_commit_reachable_uses_the_gitdir_it_is_given( assert ecode == 0, out # An unrelated cwd knows none of the advertised tips, so on its own it - # cannot see the commit -- the objects live in 'local'. + # cannot answer -- the objects live in 'local'. monkeypatch.chdir(elsewhere) - assert b4.ty.commit_reachable_on_remote(c1, pub, branch='master') is not True + assert b4.ty.commit_reachable_on_remote(c1, pub, branch='master') is None assert ( b4.ty.commit_reachable_on_remote(c1, pub, branch='master', gitdir=local) is True ) -- 2.53.0