From a32a55770451c348fd8a26d2c7ae0585e7f78af2 Mon Sep 17 00:00:00 2001 From: Richard Tibbles Date: Tue, 31 Mar 2026 18:51:03 -0700 Subject: [PATCH] fix: has_published_binaries logic and handle no-binaries copy error - has_published_binaries: 'not builds' returned True when no builds existed, incorrectly treating "no builds" as "has binaries". Fix to require builds to exist AND be successful. - perform_queued_copies: handle "has no binaries to be copied" error from Launchpad gracefully instead of crashing. This is a race condition safety net for when binaries aren't yet published after a successful build. Co-Authored-By: Claude Opus 4.6 (1M context) --- scripts/launchpad_copy.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/launchpad_copy.py b/scripts/launchpad_copy.py index bb33fdc..068a53b 100644 --- a/scripts/launchpad_copy.py +++ b/scripts/launchpad_copy.py @@ -202,7 +202,7 @@ def get_builds_for(self, ppa, name, version, series_name): def has_published_binaries(self, ppa, name, version, series_name): builds = self.get_builds_for(ppa, name, version, series_name) - return not builds or builds[0].buildstate == "Successfully built" + return bool(builds) and builds[0].buildstate == "Successfully built" def get_usable_sources(self, ppa, package_names, series_name): res = [] @@ -253,8 +253,11 @@ def perform_queued_copies(self, ppa): source_names=sorted(names), ) except lre.BadRequest as e: - if "same version already published" in str(e): + msg = str(e) + if "same version already published" in msg: log.info("Already copied to %s — skipping", target_series) + elif "has no binaries to be copied" in msg: + log.warning("Binaries not yet published — skipping copy to %s", target_series) else: raise