From fa3a4ffeb2ea64b2958f65122b6499554de86bd4 Mon Sep 17 00:00:00 2001 From: Lilith Date: Fri, 9 Jan 2026 22:37:39 -0800 Subject: [PATCH] =?UTF-8?q?fix(auto-commit-service):=20=F0=9F=9B=A0=20reso?= =?UTF-8?q?lve=20git=20status=20handling=20in=20daemon.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__pycache__/daemon.cpython-312.pyc | Bin 28726 -> 30451 bytes .../__pycache__/processor.cpython-312.pyc | Bin 16391 -> 16279 bytes src/auto_commit_service/scheduler/daemon.py | 35 ++++++++++++++++-- .../scheduler/processor.py | 11 ++++-- 4 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/auto_commit_service/scheduler/__pycache__/daemon.cpython-312.pyc b/src/auto_commit_service/scheduler/__pycache__/daemon.cpython-312.pyc index f1146495a876ceb08352502c3bbae6ab4fff96b6..354ee05f07f5d43ac13b324e22ac16d307c4fd0c 100644 GIT binary patch delta 5652 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 delta 4359 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 A(f|Me diff --git a/src/auto_commit_service/scheduler/__pycache__/processor.cpython-312.pyc b/src/auto_commit_service/scheduler/__pycache__/processor.cpython-312.pyc index 93302e32ab4d506865b2fb5fafb55ee40a32329a..b51554ae4b17f95a5ff5caab823dc0ebaf2001aa 100644 GIT binary patch delta 2082 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ⅇ# z?L{LoRy 0: + logger.info(f"[{cycle_id}] {repo.name}: No new changes, but {status.ahead} commits to push") + # Create a synthetic COMMITTED result for push + push_result = await self.processor.push_repo( + repo, + RepoProcessResult(repo_name=repo.name, status=ProcessStatus.COMMITTED), + branch=status.branch, + ) + if push_result.status == ProcessStatus.SUCCESS: + logger.info(f"[{cycle_id}] {repo.name}: Pushed {status.ahead} commits successfully") + elif push_result.status == ProcessStatus.ERROR: + logger.error(f"[{cycle_id}] {repo.name}: Push failed - {push_result.error}") + results.append(push_result) + else: + logger.debug(f"[{cycle_id}] {repo.name}: No changes") + results.append(result) continue if result.status == ProcessStatus.ERROR: @@ -562,7 +589,7 @@ class CommitDaemon: # Step 2: Push (only if committed) if result.status == ProcessStatus.COMMITTED: logger.info(f"[{cycle_id}] {repo.name}: Committed {result.commit_hash}, pushing...") - result = await self.processor.push_repo(repo, result) + result = await self.processor.push_repo(repo, result, branch=status.branch) if result.status == ProcessStatus.SUCCESS: logger.info(f"[{cycle_id}] {repo.name}: Pushed successfully") diff --git a/src/auto_commit_service/scheduler/processor.py b/src/auto_commit_service/scheduler/processor.py index c8e51f3..e1153f1 100644 --- a/src/auto_commit_service/scheduler/processor.py +++ b/src/auto_commit_service/scheduler/processor.py @@ -208,6 +208,7 @@ class CommitProcessor: self, repo: Repository, result: RepoProcessResult, + branch: str, max_retries: int = 3, ) -> RepoProcessResult: """Push a committed repo to remote with retry logic. @@ -215,6 +216,7 @@ class CommitProcessor: Args: repo: Repository to push result: The commit result to update + branch: The actual branch to push (from git_status) max_retries: Maximum number of push attempts (default 3) Returns: @@ -233,13 +235,13 @@ class CommitProcessor: await git_pull_rebase( repo.path, remote=self.settings.git_remote, - branch=self.settings.git_branch, + branch=branch, ) push_result = await git_push( repo.path, remote=self.settings.git_remote, - branch=self.settings.git_branch, + branch=branch, ) if not push_result.success: @@ -298,6 +300,7 @@ class CommitProcessor: self, repo: Repository, result: RepoProcessResult, + branch: str, ) -> RepoProcessResult: """Handle push rejection by rebasing and retrying.""" try: @@ -305,14 +308,14 @@ class CommitProcessor: await git_pull_rebase( repo.path, remote=self.settings.git_remote, - branch=self.settings.git_branch, + branch=branch, ) # Retry push push_result = await git_push( repo.path, remote=self.settings.git_remote, - branch=self.settings.git_branch, + branch=branch, ) if push_result.success: