[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