From 3fbf76a336c6c0f96e8f4965caee853248dc4f68 Mon Sep 17 00:00:00 2001 From: AlexTemirov Date: Mon, 10 Aug 2026 20:51:38 -0700 Subject: [PATCH] fix(device): accept hardware snapshots during discovery --- editor-server/device_installer.py | 14 ++++++++++---- tests/test_editor_devices.py | 7 ++++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/editor-server/device_installer.py b/editor-server/device_installer.py index a425c5f..8791d99 100644 --- a/editor-server/device_installer.py +++ b/editor-server/device_installer.py @@ -1887,8 +1887,11 @@ def adopt_legacy_hardware_services( legacy_private="$legacy/.blacknode-hardware" marker="__BLACKNODE_HARDWARE_ADOPTION__=" -valid_target_checkout() { - [[ -d "$1/.git" && -f "$1/pyproject.toml" ]] \ +valid_target_package() { + [[ -f "$1/pyproject.toml" \ + && -f "$1/blacknode_robot/__init__.py" \ + && -f "$1/configure.sh" \ + && -f "$1/install-service.sh" ]] \ && grep -Eq '^[[:space:]]*name[[:space:]]*=[[:space:]]*["'"'"']blacknode-robot["'"'"'][[:space:]]*$' \ "$1/pyproject.toml" } @@ -1899,7 +1902,7 @@ def adopt_legacy_hardware_services( "$1/pyproject.toml" } -valid_target_checkout "$target" || { +valid_target_package "$target" || { echo "The organized Hardware package is missing or invalid: $target" >&2 exit 4 } @@ -2068,7 +2071,10 @@ def configure_hardware_services( service_instance="" legacy="$HOME/blacknode-hardware" fi -[[ -d "$target/.git" && -f "$target/pyproject.toml" ]] \ +[[ -f "$target/pyproject.toml" \ + && -f "$target/blacknode_robot/__init__.py" \ + && -f "$target/configure.sh" \ + && -f "$target/install-service.sh" ]] \ && grep -Eq '^[[:space:]]*name[[:space:]]*=[[:space:]]*["'"'"']blacknode-(robot|hardware)["'"'"'][[:space:]]*$' \ "$target/pyproject.toml" || { echo "The organized Hardware package is missing or invalid: $target" >&2 diff --git a/tests/test_editor_devices.py b/tests/test_editor_devices.py index b9f8ac3..5d01e50 100644 --- a/tests/test_editor_devices.py +++ b/tests/test_editor_devices.py @@ -1411,8 +1411,11 @@ def fake_run(_connection, command, **kwargs): self.assertNotIn("ssh-password", uploaded[0]) self.assertIn('target="$HOME/Blacknode/devices/default/hardware"', uploaded[0]) self.assertIn('legacy="$HOME/blacknode-hardware"', uploaded[0]) - self.assertIn("valid_target_checkout", uploaded[0]) + self.assertIn("valid_target_package", uploaded[0]) self.assertIn("valid_legacy_checkout", uploaded[0]) + self.assertIn('"$1/blacknode_robot/__init__.py"', uploaded[0]) + target_validation = uploaded[0].split("valid_legacy_checkout()", 1)[0] + self.assertNotIn('"$1/.git"', target_validation) self.assertIn("blacknode-robot", uploaded[0]) self.assertIn("blacknode-hardware", uploaded[0]) self.assertIn('cp -a -- "$legacy_private" "$temporary_private"', uploaded[0]) @@ -1489,6 +1492,8 @@ def fake_run(_connection, command, **kwargs): 'target="$HOME/Blacknode/devices/$instance/hardware"', uploaded[0], ) + self.assertIn('"$target/blacknode_robot/__init__.py"', uploaded[0]) + self.assertNotIn('[[ -d "$target/.git"', uploaded[0]) self.assertIn( '[[ "$directory" == "$legacy" ]] || continue', uploaded[0],