From d57f755ec6c670e27f1358c07a87f98ceaf5329f Mon Sep 17 00:00:00 2001 From: Pavan Kumar Sunkara Date: Thu, 5 Mar 2026 20:34:48 +0530 Subject: [PATCH] Get diff against the base commit --- packages/bot/pyproject.toml | 2 +- packages/bot/src/automa/bot/resources/code.py | 53 ++++++---- packages/bot/tests/fixtures/download/LICENSE | 0 .../{download_git => download/_git}/HEAD | 0 .../bot/tests/fixtures/download/_git/config | 5 + .../bot/tests/fixtures/download/_git/index | Bin 0 -> 209 bytes .../tests/fixtures/download/_git/logs/HEAD | 1 + .../download/_git/logs/refs/heads/master | 1 + .../55/75f40bc4ead411b690b6f2f09636e3468ef12e | Bin 0 -> 164 bytes .../58/2ebe2cc578f2c9b9c124a3d2a65afa0c3c9df2 | Bin 0 -> 65 bytes .../e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 | Bin .../fixtures/download/_git/refs/heads/master | 1 + .../bot/tests/fixtures/download_git/index | Bin 137 -> 0 bytes .../cc/3f46ae7fdf71747b66b3e4272c0e5fe290d116 | Bin 151 -> 0 bytes .../f9/3e3a1a1525fb5b91020da86e44810c87a2d7bc | Bin 54 -> 0 bytes .../fixtures/download_git/refs/heads/master | 1 - packages/bot/tests/resources/test_code.py | 98 +++++++++++++++--- uv.lock | 4 +- 18 files changed, 124 insertions(+), 42 deletions(-) create mode 100644 packages/bot/tests/fixtures/download/LICENSE rename packages/bot/tests/fixtures/{download_git => download/_git}/HEAD (100%) create mode 100644 packages/bot/tests/fixtures/download/_git/config create mode 100644 packages/bot/tests/fixtures/download/_git/index create mode 100644 packages/bot/tests/fixtures/download/_git/logs/HEAD create mode 100644 packages/bot/tests/fixtures/download/_git/logs/refs/heads/master create mode 100644 packages/bot/tests/fixtures/download/_git/objects/55/75f40bc4ead411b690b6f2f09636e3468ef12e create mode 100644 packages/bot/tests/fixtures/download/_git/objects/58/2ebe2cc578f2c9b9c124a3d2a65afa0c3c9df2 rename packages/bot/tests/fixtures/{download_git => download/_git}/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 (100%) create mode 100644 packages/bot/tests/fixtures/download/_git/refs/heads/master delete mode 100644 packages/bot/tests/fixtures/download_git/index delete mode 100644 packages/bot/tests/fixtures/download_git/objects/cc/3f46ae7fdf71747b66b3e4272c0e5fe290d116 delete mode 100644 packages/bot/tests/fixtures/download_git/objects/f9/3e3a1a1525fb5b91020da86e44810c87a2d7bc delete mode 100644 packages/bot/tests/fixtures/download_git/refs/heads/master diff --git a/packages/bot/pyproject.toml b/packages/bot/pyproject.toml index fae1741..564a2e1 100644 --- a/packages/bot/pyproject.toml +++ b/packages/bot/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "automa-bot" -version = "0.3.0" +version = "0.4.0" authors = [{ name = "Sunkara, Inc.", email = "engineering@automa.app" }] description = "Bot SDK for Automa" diff --git a/packages/bot/src/automa/bot/resources/code.py b/packages/bot/src/automa/bot/resources/code.py index 20ed1be..fd2bb28 100644 --- a/packages/bot/src/automa/bot/resources/code.py +++ b/packages/bot/src/automa/bot/resources/code.py @@ -24,10 +24,15 @@ # TODO: Use programmatic git instead of git command -def get_diff(path: str) -> str: +def get_diff(path: str, base_commit: str | None = None) -> str: """Get the diff for the given git repository path.""" + args = ["git", "diff"] + + if base_commit: + args.append(base_commit) + result = subprocess.run( - ["git", "diff"], + args, cwd=path, capture_output=True, text=True, @@ -78,12 +83,12 @@ def _read_token(self, folder: str) -> str | None: return token - def _read_base_commit(self, folder: str) -> str | None: + def _read_base_commit(self, folder: str, type: str) -> str | None: base_commit = None try: with open( - f"{folder}/.git/automa_proposal_base_commit", "r", encoding="utf8" + f"{folder}/.git/automa_{type}_base_commit", "r", encoding="utf8" ) as f: base_commit = f.read().strip() except FileNotFoundError: @@ -103,16 +108,8 @@ def _clone_code(self, folder: str, url: str) -> None: check=True, ) - # Note down the base commit - result = subprocess.run( - ["git", "rev-parse", "HEAD"], - cwd=path, - capture_output=True, - text=True, - check=True, - ) - - self._write_base_commit(folder, result.stdout.strip()) + # Note down the base commit to send in proposal + self._write_base_commit(folder, "proposal") def _extract_download(self, folder: str) -> None: rmtree(folder, ignore_errors=True) @@ -121,17 +118,27 @@ def _extract_download(self, folder: str) -> None: with tarfile.open(f"{folder}.tar.gz", "r:gz") as tar: tar.extractall(path=folder) + # Note down the base commit to be used in generating diff + self._write_base_commit(folder, "diff") + def _write_token(self, folder: str, token: str) -> None: # Save the proposal token for later use with open(f"{folder}/.git/automa_proposal_token", "w", encoding="utf8") as f: f.write(token) - def _write_base_commit(self, folder: str, base_commit: str) -> None: - # Save the base commit for later use + def _write_base_commit(self, folder: str, type: str) -> None: + result = subprocess.run( + ["git", "rev-parse", "HEAD"], + cwd=folder, + capture_output=True, + text=True, + check=True, + ) + with open( - f"{folder}/.git/automa_proposal_base_commit", "w", encoding="utf8" + f"{folder}/.git/automa_{type}_base_commit", "w", encoding="utf8" ) as f: - f.write(base_commit) + f.write(result.stdout.strip()) class CodeResource(SyncAPIResource, BaseCodeResource): @@ -202,12 +209,13 @@ def propose( ): path = self._path(body["task"]) token = self._read_token(path) - base_commit = self._read_base_commit(path) + base_commit = self._read_base_commit(path, "proposal") + diff_base_commit = self._read_base_commit(path, "diff") if not token: raise ValueError("Failed to read the stored proposal token") - diff = get_diff(path) + diff = get_diff(path, base_commit or diff_base_commit) return self._client.post( "/bot/code/propose", @@ -295,12 +303,13 @@ async def propose( ): path = self._path(body["task"]) token = await to_thread(self._read_token, path) - base_commit = await to_thread(self._read_base_commit, path) + base_commit = await to_thread(self._read_base_commit, path, "proposal") + diff_base_commit = await to_thread(self._read_base_commit, path, "diff") if not token: raise ValueError("Failed to read the stored proposal token") - diff = await to_thread(get_diff, path) + diff = await to_thread(get_diff, path, base_commit or diff_base_commit) return await self._client.post( "/bot/code/propose", diff --git a/packages/bot/tests/fixtures/download/LICENSE b/packages/bot/tests/fixtures/download/LICENSE new file mode 100644 index 0000000..e69de29 diff --git a/packages/bot/tests/fixtures/download_git/HEAD b/packages/bot/tests/fixtures/download/_git/HEAD similarity index 100% rename from packages/bot/tests/fixtures/download_git/HEAD rename to packages/bot/tests/fixtures/download/_git/HEAD diff --git a/packages/bot/tests/fixtures/download/_git/config b/packages/bot/tests/fixtures/download/_git/config new file mode 100644 index 0000000..515f483 --- /dev/null +++ b/packages/bot/tests/fixtures/download/_git/config @@ -0,0 +1,5 @@ +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true diff --git a/packages/bot/tests/fixtures/download/_git/index b/packages/bot/tests/fixtures/download/_git/index new file mode 100644 index 0000000000000000000000000000000000000000..9ba53f59679c786ace977535b9270c97b73f7461 GIT binary patch literal 209 zcmZ?q402{*U|<5_%$2PQaw{)Z!)OLZW>yBB>4FRljY}99m|s9J1H-eqk7jSWc+J_n zTXS7`)Qv+=dV(i1u={vAyZQyY0u9P+?ai~eHEC 1772718655 +0530 commit (initial): Downloaded code diff --git a/packages/bot/tests/fixtures/download/_git/logs/refs/heads/master b/packages/bot/tests/fixtures/download/_git/logs/refs/heads/master new file mode 100644 index 0000000..3daa442 --- /dev/null +++ b/packages/bot/tests/fixtures/download/_git/logs/refs/heads/master @@ -0,0 +1 @@ +0000000000000000000000000000000000000000 5575f40bc4ead411b690b6f2f09636e3468ef12e automa[bot] <60525818+automa[bot]@users.noreply.github.com> 1772718655 +0530 commit (initial): Downloaded code diff --git a/packages/bot/tests/fixtures/download/_git/objects/55/75f40bc4ead411b690b6f2f09636e3468ef12e b/packages/bot/tests/fixtures/download/_git/objects/55/75f40bc4ead411b690b6f2f09636e3468ef12e new file mode 100644 index 0000000000000000000000000000000000000000..2f2c1b1a49f92a0ed411d3af7f8a9a66eeab09ab GIT binary patch literal 164 zcmV;V09*ff0ZY!$&CM)PFfuk_C@D%!RWP+MN=-^NN=`O4w@5QewoI~2HZ(FxG)^%} zG&4<1OEgF}PPR-*GvZ1tEy>6)Qb;T<$m^Gc{GvHZV0d;DR`&B$dj>a=GM}=jG%l Srlh7QBAVlXr?Ff%bx@bPqZ^$T`ocsBRZ>`fQ1IeT|&t}Bnaap*}; X@Iy!auQO}-on literal 0 HcmV?d00001 diff --git a/packages/bot/tests/fixtures/download_git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 b/packages/bot/tests/fixtures/download/_git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 similarity index 100% rename from packages/bot/tests/fixtures/download_git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 rename to packages/bot/tests/fixtures/download/_git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/packages/bot/tests/fixtures/download/_git/refs/heads/master b/packages/bot/tests/fixtures/download/_git/refs/heads/master new file mode 100644 index 0000000..ffa0078 --- /dev/null +++ b/packages/bot/tests/fixtures/download/_git/refs/heads/master @@ -0,0 +1 @@ +5575f40bc4ead411b690b6f2f09636e3468ef12e diff --git a/packages/bot/tests/fixtures/download_git/index b/packages/bot/tests/fixtures/download_git/index deleted file mode 100644 index 083dc8096158f8cbe937c6dcec4e10f855487c5a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 137 zcmZ?q402{*U|<4b#*E4^SBv#+chf$W-DW+Lsm{R2%*vn>(#pWlxP*a$`2_?sFg%<4 zX!fRy*POk(HP@9#-8l55CwL+QXOOF-i?6F*ZVE$4kgF@uJV^#a1p}_1c2-iNs=uQr lGV!j+b7|yhUvz!X#th?KGx8^$ywq|6)QV2*aOUzU7F3n9WQV1^1%T6pxRIn)k3F;LW7aLky z8akxsCT8a7CFkebDHxiY8kt*|n;9D_Xd9Rs8*o9aFG;1?ATH0m%#zH+90iDpTmUK| FLSD(aH-`WK diff --git a/packages/bot/tests/fixtures/download_git/objects/f9/3e3a1a1525fb5b91020da86e44810c87a2d7bc b/packages/bot/tests/fixtures/download_git/objects/f9/3e3a1a1525fb5b91020da86e44810c87a2d7bc deleted file mode 100644 index 91fccd447fe1ae44bda5ac217479c40ea5879984..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54 zcmb