From 4de2448aa95885af3203d7a7380b8adeaffb817a Mon Sep 17 00:00:00 2001 From: "Waylon S. Walker" Date: Tue, 25 Nov 2025 20:54:39 -0600 Subject: [PATCH] better unpushed_commits detection --- workspaces.py | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/workspaces.py b/workspaces.py index 99b88ab..2937104 100755 --- a/workspaces.py +++ b/workspaces.py @@ -644,30 +644,39 @@ def find_repo_for_worktree( def has_unpushed_commits(repo_path: Path, branch: str) -> bool: """ - Detect if branch has commits not on its upstream. - Uses 'git rev-list @{u}..HEAD'; if non-empty, there are unpushed commits. + Detect if `branch` has commits not on its upstream. + + If no upstream is configured, we *do not* treat that as "unpushed" anymore, + just "can't check", and return False (so rm won't block on it). """ - # Check if upstream exists - code, _, _ = run_cmd( + # Find upstream ref, e.g. origin/branch + code, out, _ = run_cmd( ["git", "rev-parse", "--abbrev-ref", "--symbolic-full-name", "@{u}"], cwd=repo_path, ) if code != 0: - # No upstream configured; treat as unpushed work. - return True + # No upstream configured; assume "not able to check", *not* a blocker. + return False + upstream = out.strip() + if not upstream or upstream == "@{u}": + return False + + # Number of commits on HEAD that are not in upstream code, out, _ = run_cmd( - ["git", "rev-list", "@{u}..HEAD", "--count"], + ["git", "rev-list", "--count", f"{upstream}..{branch}"], cwd=repo_path, ) if code != 0: - return True + # If we can't check, don't block + return False + try: count = int(out.strip() or "0") except ValueError: - return True - return count > 0 + return False + return count > 0 def is_branch_integrated_into_main( repo_path: Path,