Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions src/google/adk/cli/cli_create.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,28 +72,36 @@
"""


_GENERATED_GITIGNORE_ENTRIES = (".env", ".adk/")


def _ensure_dotenv_gitignored(agent_folder: str) -> None:
"""Ensures generated secrets are excluded from version control."""
"""Ensures generated secrets and local runtime data are excluded from
version control."""
gitignore_file_path = os.path.join(agent_folder, ".gitignore")
dotenv_entry = ".env"

if not os.path.exists(gitignore_file_path):
with open(gitignore_file_path, "w", encoding="utf-8") as f:
f.write(f"{dotenv_entry}\n")
f.write("".join(f"{entry}\n" for entry in _GENERATED_GITIGNORE_ENTRIES))
return

with open(gitignore_file_path, "r", encoding="utf-8") as f:
content = f.read()

existing_lines = content.splitlines()
if dotenv_entry in existing_lines:
missing_entries = [
entry
for entry in _GENERATED_GITIGNORE_ENTRIES
if entry not in existing_lines
]
if not missing_entries:
return

# Append .env, ensuring proper newline separation.
# Append missing entries, ensuring proper newline separation.
with open(gitignore_file_path, "a", encoding="utf-8") as f:
if content and not content.endswith("\n"):
f.write("\n")
f.write(f"{dotenv_entry}\n")
f.write("".join(f"{entry}\n" for entry in missing_entries))


def _generate_files(
Expand Down
34 changes: 28 additions & 6 deletions tests/unittests/cli/utils/test_cli_create.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def test_generate_files_with_api_key(agent_folder: Path) -> None:
env_content = (agent_folder / ".env").read_text()
assert "GOOGLE_API_KEY=dummy-key" in env_content
assert "GOOGLE_GENAI_USE_ENTERPRISE=0" in env_content
assert (agent_folder / ".gitignore").read_text() == ".env\n"
assert (agent_folder / ".gitignore").read_text() == ".env\n.adk/\n"
assert (agent_folder / "agent.py").exists()
assert (agent_folder / "__init__.py").exists()

Expand Down Expand Up @@ -162,7 +162,9 @@ def test_generate_files_appends_dotenv_to_existing_gitignore(
str(agent_folder), model="gemini-2.0-flash-001", type="code"
)

assert (agent_folder / ".gitignore").read_text() == "__pycache__\n.env\n"
assert (
agent_folder / ".gitignore"
).read_text() == "__pycache__\n.env\n.adk/\n"


def test_generate_files_appends_dotenv_to_existing_gitignore_with_newline(
Expand All @@ -176,21 +178,41 @@ def test_generate_files_appends_dotenv_to_existing_gitignore_with_newline(
str(agent_folder), model="gemini-2.0-flash-001", type="code"
)

assert (agent_folder / ".gitignore").read_text() == "__pycache__\n.env\n"
assert (
agent_folder / ".gitignore"
).read_text() == "__pycache__\n.env\n.adk/\n"


def test_generate_files_does_not_duplicate_dotenv_gitignore_entry(
agent_folder: Path,
) -> None:
"""Existing .env ignore entries should not be duplicated."""
"""Existing .env and .adk/ ignore entries should not be duplicated."""
agent_folder.mkdir(parents=True, exist_ok=True)
(agent_folder / ".gitignore").write_text("__pycache__\n.env\n.adk/\n")

cli_create._generate_files(
str(agent_folder), model="gemini-2.0-flash-001", type="code"
)

assert (
agent_folder / ".gitignore"
).read_text() == "__pycache__\n.env\n.adk/\n"


def test_generate_files_adds_missing_adk_entry_to_existing_gitignore(
agent_folder: Path,
) -> None:
"""A .gitignore missing only .adk/ should have it appended."""
agent_folder.mkdir(parents=True, exist_ok=True)
(agent_folder / ".gitignore").write_text("__pycache__\n.env\n")

cli_create._generate_files(
str(agent_folder), model="gemini-2.0-flash-001", type="code"
)

assert (agent_folder / ".gitignore").read_text() == "__pycache__\n.env\n"
assert (
agent_folder / ".gitignore"
).read_text() == "__pycache__\n.env\n.adk/\n"


# run_cmd
Expand Down Expand Up @@ -274,7 +296,7 @@ def test_run_cmd_with_type_config(
env_file = agent_dir / ".env"
assert env_file.exists()
assert "GOOGLE_API_KEY=test-key" in env_file.read_text()
assert (agent_dir / ".gitignore").read_text() == ".env\n"
assert (agent_dir / ".gitignore").read_text() == ".env\n.adk/\n"


# Prompt helpers
Expand Down