[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