mirror of
https://github.com/usestrix/strix.git
synced 2026-09-08 22:21:05 +00:00
fix(interface): correct workspace-subdir collision and copy-diff classification (#0)
This commit is contained in:
parent
7141ccff62
commit
b2143ef3d9
2 changed files with 58 additions and 4 deletions
|
|
@ -746,6 +746,7 @@ def _classify_diff_entries(entries: list[DiffEntry]) -> dict[str, Any]:
|
|||
analyzable_files: list[str] = []
|
||||
analyzable_seen: set[str] = set()
|
||||
modified_seen: set[str] = set()
|
||||
added_seen: set[str] = set()
|
||||
|
||||
for entry in entries:
|
||||
path = entry.path
|
||||
|
|
@ -757,7 +758,7 @@ def _classify_diff_entries(entries: list[DiffEntry]) -> dict[str, Any]:
|
|||
continue
|
||||
|
||||
if entry.status == "A":
|
||||
added_files.append(path)
|
||||
_append_unique(added_files, added_seen, path)
|
||||
_append_unique(analyzable_files, analyzable_seen, path)
|
||||
continue
|
||||
|
||||
|
|
@ -780,7 +781,7 @@ def _classify_diff_entries(entries: list[DiffEntry]) -> dict[str, Any]:
|
|||
continue
|
||||
|
||||
if entry.status == "C":
|
||||
_append_unique(modified_files, modified_seen, path)
|
||||
_append_unique(added_files, added_seen, path)
|
||||
_append_unique(analyzable_files, analyzable_seen, path)
|
||||
continue
|
||||
|
||||
|
|
@ -1177,10 +1178,20 @@ def assign_workspace_subdirs(targets_info: list[dict[str, Any]]) -> None:
|
|||
continue
|
||||
|
||||
count = name_counts.get(base_name, 0) + 1
|
||||
name_counts[base_name] = count
|
||||
|
||||
workspace_subdir = base_name if count == 1 else f"{base_name}-{count}"
|
||||
|
||||
# Avoid colliding with a subdir already allocated to another target
|
||||
# (e.g. base names ["api-2", "api", "api"] would otherwise both map to "api-2").
|
||||
max_attempts = len(targets_info) + 1
|
||||
attempts = 0
|
||||
while workspace_subdir in name_counts and attempts < max_attempts:
|
||||
count += 1
|
||||
workspace_subdir = f"{base_name}-{count}"
|
||||
attempts += 1
|
||||
|
||||
name_counts[base_name] = count
|
||||
name_counts[workspace_subdir] = count
|
||||
|
||||
details["workspace_subdir"] = workspace_subdir
|
||||
|
||||
|
||||
|
|
|
|||
43
tests/test_diff_workspace_utils.py
Normal file
43
tests/test_diff_workspace_utils.py
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
"""Tests for diff classification and workspace-subdir assignment in interface.utils."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Any
|
||||
|
||||
from strix.interface.utils import (
|
||||
DiffEntry,
|
||||
_classify_diff_entries,
|
||||
assign_workspace_subdirs,
|
||||
)
|
||||
|
||||
|
||||
def _local_target(path: str) -> dict[str, Any]:
|
||||
return {"type": "local_code", "details": {"target_path": path}}
|
||||
|
||||
|
||||
def test_assign_workspace_subdirs_avoids_suffix_collision() -> None:
|
||||
# Base names derive to ["api-2", "api", "api"]; the third target's naive
|
||||
# suffix "api-2" would collide with the first, silently dropping a repo.
|
||||
targets = [
|
||||
_local_target("/srv/api-2"),
|
||||
_local_target("/srv/api"),
|
||||
_local_target("/other/api"),
|
||||
]
|
||||
|
||||
assign_workspace_subdirs(targets)
|
||||
|
||||
subdirs = [t["details"]["workspace_subdir"] for t in targets]
|
||||
assert len(set(subdirs)) == 3
|
||||
assert subdirs[0] == "api-2"
|
||||
assert subdirs[1] == "api"
|
||||
assert subdirs[2] not in {"api-2", "api"}
|
||||
|
||||
|
||||
def test_classify_diff_entries_copy_is_added_not_modified() -> None:
|
||||
result = _classify_diff_entries(
|
||||
[DiffEntry(status="C", path="new.py", old_path="orig.py", similarity=100)]
|
||||
)
|
||||
|
||||
assert "new.py" in result["added_files"]
|
||||
assert "new.py" not in result["modified_files"]
|
||||
assert "new.py" in result["analyzable_files"]
|
||||
Loading…
Add table
Reference in a new issue