Linux maintainer tooling and workflows
 help / color / mirror / Atom feed
From: Christian Brauner <brauner@kernel.org>
To: "Kernel.org Tools" <tools@kernel.org>
Cc: "Christian Brauner (Amutable)" <brauner@kernel.org>,
	 Konstantin Ryabitsev <konstantin@linuxfoundation.org>
Subject: [PATCH b4 24/27] ty: an unknown remote tip is undetermined, not unpublished
Date: Fri, 31 Jul 2026 11:21:23 +0200	[thread overview]
Message-ID: <20260731-work-b4-editor-branch-guard-v1-24-de68a7c8e4cb@kernel.org> (raw)
In-Reply-To: <20260731-work-b4-editor-branch-guard-v1-0-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) <brauner@kernel.org>
---
 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


  parent reply	other threads:[~2026-07-31  9:21 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-31  9:20 [PATCH b4 00/27] Stop the editor branch guard from eating review replies Christian Brauner
2026-07-31  9:21 ` [PATCH b4 01/27] review-tui: mark all outgoing mail as read, not just " Christian Brauner
2026-07-31  9:21 ` [PATCH b4 02/27] tests: cover the shared outgoing-seen helper Christian Brauner
2026-07-31  9:21 ` [PATCH b4 03/27] review: close the messages database when auto-marking fails Christian Brauner
2026-07-31  9:21 ` [PATCH b4 04/27] review: use the same busy timeout for both review databases Christian Brauner
2026-07-31  9:21 ` [PATCH b4 05/27] review: drop the unused return value from set_flags_bulk() Christian Brauner
2026-07-31  9:21 ` [PATCH b4 06/27] review: don't let archiving a series raise Christian Brauner
2026-07-31  9:21 ` [PATCH b4 07/27] tests: cover an unwritable series archive Christian Brauner
2026-07-31  9:21 ` [PATCH b4 08/27] review-tui: keep post-send bookkeeping out of the send error path Christian Brauner
2026-07-31  9:21 ` [PATCH b4 09/27] tests: cover the thank-you send's post-send bookkeeping Christian Brauner
2026-07-31  9:21 ` [PATCH b4 10/27] review-tui: say when a take didn't complete Christian Brauner
2026-07-31  9:21 ` [PATCH b4 11/27] tests: cover the unaccepted take in the thank-and-archive chain Christian Brauner
2026-07-31  9:21 ` [PATCH b4 12/27] review-tui: use the shared helper to delete a review branch Christian Brauner
2026-07-31  9:21 ` [PATCH b4 13/27] ty: check reachability in the repository the commit landed in Christian Brauner
2026-07-31  9:21 ` [PATCH b4 14/27] tests: cover the publish check using the repository it is given Christian Brauner
2026-07-31  9:21 ` [PATCH b4 15/27] edit_in_editor: make the branch guard opt-in Christian Brauner
2026-07-31  9:21 ` [PATCH b4 16/27] tests: cover the opt-in branch guard in edit_in_editor Christian Brauner
2026-07-31  9:21 ` [PATCH b4 17/27] edit_in_editor: work in the tree the caller names Christian Brauner
2026-07-31  9:21 ` [PATCH b4 18/27] tests: cover edit_in_editor working in the caller's tree Christian Brauner
2026-07-31  9:21 ` [PATCH b4 19/27] tui: route editor launches through one non-fatal helper Christian Brauner
2026-07-31  9:21 ` [PATCH b4 20/27] tests: cover an editor failure leaving the review TUI standing Christian Brauner
2026-07-31  9:21 ` [PATCH b4 21/27] review-tui: only put back a branch b4 checked out itself Christian Brauner
2026-07-31  9:21 ` [PATCH b4 22/27] tests: cover the review TUI's branch-restore guard Christian Brauner
2026-07-31  9:21 ` [PATCH b4 23/27] tests: pin the default branch in the queue-delivery fixture Christian Brauner
2026-07-31  9:21 ` Christian Brauner [this message]
2026-07-31  9:21 ` [PATCH b4 25/27] review-tui: keep post-send bookkeeping out of the review send error path Christian Brauner
2026-07-31  9:21 ` [PATCH b4 26/27] tests: cover the review send's post-send bookkeeping Christian Brauner
2026-07-31  9:21 ` [PATCH b4 27/27] review: close the tracking database when archiving fails Christian Brauner
2026-07-31 13:14 ` [PATCH b4 00/27] Stop the editor branch guard from eating review replies Christian Brauner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260731-work-b4-editor-branch-guard-v1-24-de68a7c8e4cb@kernel.org \
    --to=brauner@kernel.org \
    --cc=konstantin@linuxfoundation.org \
    --cc=tools@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox