Skip to content

Commit a59b9ed

Browse files
[LSP] Get new/modified functions inside a git commit (#694)
* lsp: get new/modified functions inside a git commit * better name * refactor * revert
1 parent fdaf6c0 commit a59b9ed

File tree

3 files changed

+49
-7
lines changed

3 files changed

+49
-7
lines changed

codeflash/code_utils/git_utils.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,18 @@
2323
from git import Repo
2424

2525

26-
def get_git_diff(repo_directory: Path | None = None, *, uncommitted_changes: bool = False) -> dict[str, list[int]]:
26+
def get_git_diff(
27+
repo_directory: Path | None = None, *, only_this_commit: Optional[str] = None, uncommitted_changes: bool = False
28+
) -> dict[str, list[int]]:
2729
if repo_directory is None:
2830
repo_directory = Path.cwd()
2931
repository = git.Repo(repo_directory, search_parent_directories=True)
3032
commit = repository.head.commit
31-
if uncommitted_changes:
33+
if only_this_commit:
34+
uni_diff_text = repository.git.diff(
35+
only_this_commit + "^1", only_this_commit, ignore_blank_lines=True, ignore_space_at_eol=True
36+
)
37+
elif uncommitted_changes:
3238
uni_diff_text = repository.git.diff(None, "HEAD", ignore_blank_lines=True, ignore_space_at_eol=True)
3339
else:
3440
uni_diff_text = repository.git.diff(

codeflash/discovery/functions_to_optimize.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,16 @@ def get_functions_to_optimize(
232232

233233
def get_functions_within_git_diff(uncommitted_changes: bool) -> dict[str, list[FunctionToOptimize]]: # noqa: FBT001
234234
modified_lines: dict[str, list[int]] = get_git_diff(uncommitted_changes=uncommitted_changes)
235-
modified_functions: dict[str, list[FunctionToOptimize]] = {}
235+
return get_functions_within_lines(modified_lines)
236+
237+
238+
def get_functions_inside_a_commit(commit_hash: str) -> dict[str, list[FunctionToOptimize]]:
239+
modified_lines: dict[str, list[int]] = get_git_diff(only_this_commit=commit_hash)
240+
return get_functions_within_lines(modified_lines)
241+
242+
243+
def get_functions_within_lines(modified_lines: dict[str, list[int]]) -> dict[str, list[FunctionToOptimize]]:
244+
functions: dict[str, list[FunctionToOptimize]] = {}
236245
for path_str, lines_in_file in modified_lines.items():
237246
path = Path(path_str)
238247
if not path.exists():
@@ -246,14 +255,14 @@ def get_functions_within_git_diff(uncommitted_changes: bool) -> dict[str, list[F
246255
continue
247256
function_lines = FunctionVisitor(file_path=str(path))
248257
wrapper.visit(function_lines)
249-
modified_functions[str(path)] = [
258+
functions[str(path)] = [
250259
function_to_optimize
251260
for function_to_optimize in function_lines.functions
252261
if (start_line := function_to_optimize.starting_line) is not None
253262
and (end_line := function_to_optimize.ending_line) is not None
254263
and any(start_line <= line <= end_line for line in lines_in_file)
255264
]
256-
return modified_functions
265+
return functions
257266

258267

259268
def get_all_files_and_functions(module_root_path: Path) -> dict[str, list[FunctionToOptimize]]:

codeflash/lsp/beta.py

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@
1313
from codeflash.cli_cmds.cli import process_pyproject_config
1414
from codeflash.code_utils.git_utils import create_diff_patch_from_worktree
1515
from codeflash.code_utils.shell_utils import save_api_key_to_rc
16-
from codeflash.discovery.functions_to_optimize import filter_functions, get_functions_within_git_diff
16+
from codeflash.discovery.functions_to_optimize import (
17+
filter_functions,
18+
get_functions_inside_a_commit,
19+
get_functions_within_git_diff,
20+
)
1721
from codeflash.either import is_successful
1822
from codeflash.lsp.server import CodeflashLanguageServer, CodeflashLanguageServerProtocol
1923

@@ -22,6 +26,8 @@
2226

2327
from lsprotocol import types
2428

29+
from codeflash.discovery.functions_to_optimize import FunctionToOptimize
30+
2531

2632
@dataclass
2733
class OptimizableFunctionsParams:
@@ -39,6 +45,11 @@ class ProvideApiKeyParams:
3945
api_key: str
4046

4147

48+
@dataclass
49+
class OptimizableFunctionsInCommitParams:
50+
commit_hash: str
51+
52+
4253
server = CodeflashLanguageServer("codeflash-language-server", "v1.0", protocol_cls=CodeflashLanguageServerProtocol)
4354

4455

@@ -47,6 +58,22 @@ def get_functions_in_current_git_diff(
4758
server: CodeflashLanguageServer, _params: OptimizableFunctionsParams
4859
) -> dict[str, str | dict[str, list[str]]]:
4960
functions = get_functions_within_git_diff(uncommitted_changes=True)
61+
file_to_qualified_names = _group_functions_by_file(server, functions)
62+
return {"functions": file_to_qualified_names, "status": "success"}
63+
64+
65+
@server.feature("getOptimizableFunctionsInCommit")
66+
def get_functions_in_commit(
67+
server: CodeflashLanguageServer, params: OptimizableFunctionsInCommitParams
68+
) -> dict[str, str | dict[str, list[str]]]:
69+
functions = get_functions_inside_a_commit(params.commit_hash)
70+
file_to_qualified_names = _group_functions_by_file(server, functions)
71+
return {"functions": file_to_qualified_names, "status": "success"}
72+
73+
74+
def _group_functions_by_file(
75+
server: CodeflashLanguageServer, functions: dict[str, list[FunctionToOptimize]]
76+
) -> dict[str, list[str]]:
5077
file_to_funcs_to_optimize, _ = filter_functions(
5178
modified_functions=functions,
5279
tests_root=server.optimizer.test_cfg.tests_root,
@@ -58,7 +85,7 @@ def get_functions_in_current_git_diff(
5885
file_to_qualified_names: dict[str, list[str]] = {
5986
str(path): [f.qualified_name for f in funcs] for path, funcs in file_to_funcs_to_optimize.items()
6087
}
61-
return {"functions": file_to_qualified_names, "status": "success"}
88+
return file_to_qualified_names
6289

6390

6491
@server.feature("getOptimizableFunctions")

0 commit comments

Comments
 (0)