refactor(util): move expand_tilde to top-level claude_bottle/util.py
test / run tests/run_tests.py (pull_request) Successful in 21s
test / run tests/run_tests.py (pull_request) Successful in 21s
_expand_tilde was a path-string helper on DockerBottleBackend but nothing about it was Docker-specific — any future backend reading host paths from manifest entries would want it. Lift to claude_bottle/util.py (sibling of log.py / manifest.py) as a public expand_tilde() function. Docker-specific primitives stay in claude_bottle/backend/docker/util.py.
This commit is contained in:
@@ -21,6 +21,7 @@ from ... import pipelock
|
|||||||
from ...env_resolve import env_resolve
|
from ...env_resolve import env_resolve
|
||||||
from ...log import die, info
|
from ...log import die, info
|
||||||
from ...manifest import SshEntry
|
from ...manifest import SshEntry
|
||||||
|
from ...util import expand_tilde
|
||||||
from .. import BottleBackend, BottleCleanupPlan, BottlePlan, BottleSpec
|
from .. import BottleBackend, BottleCleanupPlan, BottlePlan, BottleSpec
|
||||||
from . import network as network_mod
|
from . import network as network_mod
|
||||||
from . import util as docker_mod
|
from . import util as docker_mod
|
||||||
@@ -360,7 +361,7 @@ class DockerBottleBackend(BottleBackend):
|
|||||||
the y/N so the user doesn't get prompted for a plan with a
|
the y/N so the user doesn't get prompted for a plan with a
|
||||||
missing key."""
|
missing key."""
|
||||||
for entry in entries:
|
for entry in entries:
|
||||||
key = self._expand_tilde(entry.IdentityFile)
|
key = expand_tilde(entry.IdentityFile)
|
||||||
if not os.path.isfile(key):
|
if not os.path.isfile(key):
|
||||||
die(f"ssh key file not found for host '{entry.Host}': {key}")
|
die(f"ssh key file not found for host '{entry.Host}': {key}")
|
||||||
|
|
||||||
@@ -431,7 +432,7 @@ class DockerBottleBackend(BottleBackend):
|
|||||||
container_key_paths: list[str] = []
|
container_key_paths: list[str] = []
|
||||||
for entry in bottle.ssh:
|
for entry in bottle.ssh:
|
||||||
name = entry.Host
|
name = entry.Host
|
||||||
key = self._expand_tilde(entry.IdentityFile)
|
key = expand_tilde(entry.IdentityFile)
|
||||||
hostname = entry.Hostname
|
hostname = entry.Hostname
|
||||||
user = entry.User
|
user = entry.User
|
||||||
port = entry.Port
|
port = entry.Port
|
||||||
@@ -540,12 +541,6 @@ class DockerBottleBackend(BottleBackend):
|
|||||||
check=True,
|
check=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
def _expand_tilde(self, path: str) -> str:
|
|
||||||
if path.startswith("~"):
|
|
||||||
home = os.environ.get("HOME", "")
|
|
||||||
return home + path[1:]
|
|
||||||
return path
|
|
||||||
|
|
||||||
def provision_git(self, plan: BottlePlan, target: str) -> None:
|
def provision_git(self, plan: BottlePlan, target: str) -> None:
|
||||||
"""If --cwd was set and the host cwd has a .git directory, copy
|
"""If --cwd was set and the host cwd has a .git directory, copy
|
||||||
it into /home/node/workspace/.git and fix ownership. No-op
|
it into /home/node/workspace/.git and fix ownership. No-op
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
"""Cross-cutting utility helpers used by multiple modules.
|
||||||
|
|
||||||
|
Top-level (i.e. backend-agnostic) — Docker-specific helpers live in
|
||||||
|
claude_bottle/backend/docker/util.py."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
|
def expand_tilde(path: str) -> str:
|
||||||
|
"""Expand a leading '~' to $HOME. Leaves paths without a leading
|
||||||
|
tilde unchanged. Falls back to the empty string if $HOME is unset
|
||||||
|
(callers should already have checked HOME if they care)."""
|
||||||
|
if path.startswith("~"):
|
||||||
|
home = os.environ.get("HOME", "")
|
||||||
|
return home + path[1:]
|
||||||
|
return path
|
||||||
Reference in New Issue
Block a user