[PATCH b4 24/27] ty: an unknown remote tip is undetermined, not unpublished
Christian Brauner <[email protected]> Fri, 31 Jul 2026 11:21:23 +0200
| Newsgroups | org.kernel.linux.tools |
|---|---|
| Message-ID | <20260731-work-b4-editor-branch-guard-v1-24-de68a7c8e4cb@kernel.org> |
When none of the tips a remote advertises exist in the local repository there is nothing to compute ancestry against, and the publish check returned False for "not yet visible". We can't see the commit either way, so that is not something we know. The queue keeps the message waiting either way, and so far the cron report has kept quiet either way. "Not yet visible" is normal operation and "Check failed" is deliberately grouped with it, because a remote we could not reach is a transient that must not mail the maintainer on every sweep. So a repository that is stale, or simply not the one the series was applied in, waits forever without ever saying anything. Make the tri-state honest, so that "b4 review cron --dry-run" and the queue delivery modal name a failed check rather than normal waiting. Then say the one thing we can positively identify: we have the remote's answer, and none of it is in this repository. That is a standing misconfiguration and not a transient, so it warns instead of debugging, which is the level a delivery sweep lets through. Narrowing the check to the branch named in the thanks message made this easier to hit. The old check had every advertised head to look for and now there is often exactly one. 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 5e225a7..650ec84 100644 --- a/src/b4/ty.py +++ b/src/b4/ty.py @@ -1073,7 +1073,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', @@ -1118,8 +1119,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 5b08587..f4537ba 100644 --- a/src/tests/test_ty.py +++ b/src/tests/test_ty.py @@ -311,7 +311,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') @@ -336,7 +337,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( @@ -387,9 +388,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