From dd367ba1b8add6280d9971d8a7936fc71e23bdc2 Mon Sep 17 00:00:00 2001 From: Guillaume Mazoyer Date: Wed, 5 Nov 2025 11:32:09 +0100 Subject: [PATCH 01/10] Add `graph_version` to branch --- infrahub_sdk/branch.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/infrahub_sdk/branch.py b/infrahub_sdk/branch.py index 2b1905ce..13540586 100644 --- a/infrahub_sdk/branch.py +++ b/infrahub_sdk/branch.py @@ -21,6 +21,7 @@ class BranchData(BaseModel): sync_with_git: bool is_default: bool has_schema_changes: bool + graph_version: int | None = None origin_branch: str | None = None branched_from: str @@ -34,6 +35,7 @@ class BranchData(BaseModel): "is_default": None, "sync_with_git": None, "has_schema_changes": None, + "graph_version": None, } BRANCH_DATA_FILTER = {"@filters": {"name": "$branch_name"}} From 9692822f3fa99e16a25e55bd1302ebd85c7ab14f Mon Sep 17 00:00:00 2001 From: Guillaume Mazoyer Date: Wed, 5 Nov 2025 11:34:18 +0100 Subject: [PATCH 02/10] Add changelog record --- changelog/+branch-graph-version.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 changelog/+branch-graph-version.added.md diff --git a/changelog/+branch-graph-version.added.md b/changelog/+branch-graph-version.added.md new file mode 100644 index 00000000..b62680ce --- /dev/null +++ b/changelog/+branch-graph-version.added.md @@ -0,0 +1 @@ +Add `graph_version` property to `Branch` \ No newline at end of file From 8e6365eb1fdc5687e5131e2932bf13e1209dd725 Mon Sep 17 00:00:00 2001 From: Guillaume Mazoyer Date: Wed, 5 Nov 2025 14:01:17 +0100 Subject: [PATCH 03/10] Also add `status` --- changelog/+branch-graph-version-status.added.md | 1 + changelog/+branch-graph-version.added.md | 1 - infrahub_sdk/branch.py | 10 ++++++++++ tests/unit/sdk/conftest.py | 4 ++++ 4 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 changelog/+branch-graph-version-status.added.md delete mode 100644 changelog/+branch-graph-version.added.md diff --git a/changelog/+branch-graph-version-status.added.md b/changelog/+branch-graph-version-status.added.md new file mode 100644 index 00000000..7546285d --- /dev/null +++ b/changelog/+branch-graph-version-status.added.md @@ -0,0 +1 @@ +Add `graph_version` and `status` properties to `Branch` \ No newline at end of file diff --git a/changelog/+branch-graph-version.added.md b/changelog/+branch-graph-version.added.md deleted file mode 100644 index b62680ce..00000000 --- a/changelog/+branch-graph-version.added.md +++ /dev/null @@ -1 +0,0 @@ -Add `graph_version` property to `Branch` \ No newline at end of file diff --git a/infrahub_sdk/branch.py b/infrahub_sdk/branch.py index 13540586..9befb84e 100644 --- a/infrahub_sdk/branch.py +++ b/infrahub_sdk/branch.py @@ -1,6 +1,7 @@ from __future__ import annotations import warnings +from enum import StrEnum from typing import TYPE_CHECKING, Any, Literal, overload from urllib.parse import urlencode @@ -14,6 +15,13 @@ from .client import InfrahubClient, InfrahubClientSync +class BranchStatus(StrEnum): + OPEN = "OPEN" + NEED_REBASE = "NEED_REBASE" + NEED_UPGRADE_REBASE = "NEED_UPGRADE_REBASE" + DELETING = "DELETING" + + class BranchData(BaseModel): id: str name: str @@ -22,6 +30,7 @@ class BranchData(BaseModel): is_default: bool has_schema_changes: bool graph_version: int | None = None + status: BranchStatus origin_branch: str | None = None branched_from: str @@ -36,6 +45,7 @@ class BranchData(BaseModel): "sync_with_git": None, "has_schema_changes": None, "graph_version": None, + "status": None, } BRANCH_DATA_FILTER = {"@filters": {"name": "$branch_name"}} diff --git a/tests/unit/sdk/conftest.py b/tests/unit/sdk/conftest.py index 451a2adb..efa4f845 100644 --- a/tests/unit/sdk/conftest.py +++ b/tests/unit/sdk/conftest.py @@ -1498,6 +1498,8 @@ async def mock_branches_list_query(httpx_mock: HTTPXMock) -> HTTPXMock: "origin_branch": "main", "branched_from": "2023-02-17T09:30:17.811719Z", "has_schema_changes": False, + "graph_version": 99, + "status": "OPEN", }, { "id": "7d9f817a-b958-4e76-8528-8afd0c689ada", @@ -1507,6 +1509,8 @@ async def mock_branches_list_query(httpx_mock: HTTPXMock) -> HTTPXMock: "origin_branch": "main", "branched_from": "2023-02-17T09:30:17.811719Z", "has_schema_changes": True, + "graph_version": None, + "status": "NEED_UPGRADE_REBASE", }, ] } From 56f27f10cd84cc37d193538d3376038c3aa44d74 Mon Sep 17 00:00:00 2001 From: Guillaume Mazoyer Date: Wed, 5 Nov 2025 14:05:34 +0100 Subject: [PATCH 04/10] Ensure compat with previous python version --- infrahub_sdk/branch.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/infrahub_sdk/branch.py b/infrahub_sdk/branch.py index 9befb84e..8508cc4a 100644 --- a/infrahub_sdk/branch.py +++ b/infrahub_sdk/branch.py @@ -1,7 +1,7 @@ from __future__ import annotations import warnings -from enum import StrEnum +from enum import Enum from typing import TYPE_CHECKING, Any, Literal, overload from urllib.parse import urlencode @@ -15,7 +15,7 @@ from .client import InfrahubClient, InfrahubClientSync -class BranchStatus(StrEnum): +class BranchStatus(str, Enum): OPEN = "OPEN" NEED_REBASE = "NEED_REBASE" NEED_UPGRADE_REBASE = "NEED_UPGRADE_REBASE" From 2936873cbc4713a08b9a1eca930c3dcf16e266f2 Mon Sep 17 00:00:00 2001 From: Guillaume Mazoyer Date: Wed, 5 Nov 2025 14:13:22 +0100 Subject: [PATCH 05/10] Show graph version/status in infrahubctl output --- infrahub_sdk/ctl/branch.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/infrahub_sdk/ctl/branch.py b/infrahub_sdk/ctl/branch.py index b44be462..b37fa1cf 100644 --- a/infrahub_sdk/ctl/branch.py +++ b/infrahub_sdk/ctl/branch.py @@ -46,6 +46,8 @@ async def list_branch(_: str = CONFIG_PARAM) -> None: table.add_column("Sync with Git") table.add_column("Has Schema Changes") table.add_column("Is Default") + table.add_column("Graph Version") + table.add_column("Status") # identify the default branch and always print it first default_branch = [branch for branch in branches.values() if branch.is_default][0] @@ -57,6 +59,8 @@ async def list_branch(_: str = CONFIG_PARAM) -> None: "[green]True" if default_branch.sync_with_git else "[#FF7F50]False", "[green]True" if default_branch.has_schema_changes else "[#FF7F50]False", "[green]True" if default_branch.is_default else "[#FF7F50]False", + str(default_branch.graph_version), + default_branch.status, ) for branch in branches.values(): @@ -71,6 +75,8 @@ async def list_branch(_: str = CONFIG_PARAM) -> None: "[green]True" if branch.sync_with_git else "[#FF7F50]False", "[green]True" if default_branch.has_schema_changes else "[#FF7F50]False", "[green]True" if branch.is_default else "[#FF7F50]False", + str(branch.graph_version), + branch.status, ) console.print(table) From 6f44eb180f06bfa9124e8eecdc98fc06395ac7e8 Mon Sep 17 00:00:00 2001 From: Guillaume Mazoyer Date: Wed, 5 Nov 2025 14:23:11 +0100 Subject: [PATCH 06/10] Fix mock data --- tests/unit/ctl/conftest.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/unit/ctl/conftest.py b/tests/unit/ctl/conftest.py index e63efec1..30ce70d7 100644 --- a/tests/unit/ctl/conftest.py +++ b/tests/unit/ctl/conftest.py @@ -36,6 +36,8 @@ async def mock_branches_list_query(httpx_mock: HTTPXMock) -> HTTPXMock: "origin_branch": "main", "branched_from": "2023-02-17T09:30:17.811719Z", "has_schema_changes": False, + "graph_version": 99, + "status": "OPEN", }, { "id": "7d9f817a-b958-4e76-8528-8afd0c689ada", @@ -45,6 +47,8 @@ async def mock_branches_list_query(httpx_mock: HTTPXMock) -> HTTPXMock: "origin_branch": "main", "branched_from": "2023-02-17T09:30:17.811719Z", "has_schema_changes": True, + "graph_version": None, + "status": "NEED_UPGRADE_REBASE", }, ] } From 51d58c0909036f6a2ba938685dd2afc982455f08 Mon Sep 17 00:00:00 2001 From: Guillaume Mazoyer Date: Wed, 5 Nov 2025 14:24:40 +0100 Subject: [PATCH 07/10] Better output for branches with no version --- infrahub_sdk/ctl/branch.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/infrahub_sdk/ctl/branch.py b/infrahub_sdk/ctl/branch.py index b37fa1cf..7ff00c94 100644 --- a/infrahub_sdk/ctl/branch.py +++ b/infrahub_sdk/ctl/branch.py @@ -59,7 +59,7 @@ async def list_branch(_: str = CONFIG_PARAM) -> None: "[green]True" if default_branch.sync_with_git else "[#FF7F50]False", "[green]True" if default_branch.has_schema_changes else "[#FF7F50]False", "[green]True" if default_branch.is_default else "[#FF7F50]False", - str(default_branch.graph_version), + str(default_branch.graph_version) if default_branch.graph_version else "", default_branch.status, ) @@ -75,7 +75,7 @@ async def list_branch(_: str = CONFIG_PARAM) -> None: "[green]True" if branch.sync_with_git else "[#FF7F50]False", "[green]True" if default_branch.has_schema_changes else "[#FF7F50]False", "[green]True" if branch.is_default else "[#FF7F50]False", - str(branch.graph_version), + str(branch.graph_version) if default_branch.graph_version else "", branch.status, ) From c2622401978588877c49c4c7eb0e2f4246f5b894 Mon Sep 17 00:00:00 2001 From: Guillaume Mazoyer Date: Wed, 5 Nov 2025 16:34:51 +0100 Subject: [PATCH 08/10] Consider branch as open if no value provided --- infrahub_sdk/branch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infrahub_sdk/branch.py b/infrahub_sdk/branch.py index 8508cc4a..4f5e050f 100644 --- a/infrahub_sdk/branch.py +++ b/infrahub_sdk/branch.py @@ -30,7 +30,7 @@ class BranchData(BaseModel): is_default: bool has_schema_changes: bool graph_version: int | None = None - status: BranchStatus + status: BranchStatus = BranchStatus.OPEN origin_branch: str | None = None branched_from: str From d8fdd7b575a9ad8e713bac0dc55dcb91f30b4dde Mon Sep 17 00:00:00 2001 From: Guillaume Mazoyer Date: Wed, 5 Nov 2025 16:46:53 +0100 Subject: [PATCH 09/10] Fix ctl --- infrahub_sdk/ctl/branch.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infrahub_sdk/ctl/branch.py b/infrahub_sdk/ctl/branch.py index 7ff00c94..c08fa6b3 100644 --- a/infrahub_sdk/ctl/branch.py +++ b/infrahub_sdk/ctl/branch.py @@ -75,7 +75,7 @@ async def list_branch(_: str = CONFIG_PARAM) -> None: "[green]True" if branch.sync_with_git else "[#FF7F50]False", "[green]True" if default_branch.has_schema_changes else "[#FF7F50]False", "[green]True" if branch.is_default else "[#FF7F50]False", - str(branch.graph_version) if default_branch.graph_version else "", + str(branch.graph_version) if branch.graph_version else "", branch.status, ) From 5e8e3042dc7abe8411390d2dbdc701130b085999 Mon Sep 17 00:00:00 2001 From: Guillaume Mazoyer Date: Wed, 5 Nov 2025 16:58:32 +0100 Subject: [PATCH 10/10] Remove graph version from output --- infrahub_sdk/ctl/branch.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/infrahub_sdk/ctl/branch.py b/infrahub_sdk/ctl/branch.py index c08fa6b3..42d88384 100644 --- a/infrahub_sdk/ctl/branch.py +++ b/infrahub_sdk/ctl/branch.py @@ -46,7 +46,6 @@ async def list_branch(_: str = CONFIG_PARAM) -> None: table.add_column("Sync with Git") table.add_column("Has Schema Changes") table.add_column("Is Default") - table.add_column("Graph Version") table.add_column("Status") # identify the default branch and always print it first @@ -59,7 +58,6 @@ async def list_branch(_: str = CONFIG_PARAM) -> None: "[green]True" if default_branch.sync_with_git else "[#FF7F50]False", "[green]True" if default_branch.has_schema_changes else "[#FF7F50]False", "[green]True" if default_branch.is_default else "[#FF7F50]False", - str(default_branch.graph_version) if default_branch.graph_version else "", default_branch.status, ) @@ -75,7 +73,6 @@ async def list_branch(_: str = CONFIG_PARAM) -> None: "[green]True" if branch.sync_with_git else "[#FF7F50]False", "[green]True" if default_branch.has_schema_changes else "[#FF7F50]False", "[green]True" if branch.is_default else "[#FF7F50]False", - str(branch.graph_version) if branch.graph_version else "", branch.status, )