Skip to content

Commit c778fd4

Browse files
committed
Fix: Improve handling of branches that are behind the target branch in the git selector (#2151)
1 parent e8c4c4d commit c778fd4

File tree

3 files changed

+11
-5
lines changed

3 files changed

+11
-5
lines changed

sqlmesh/core/selector.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ def add_sub_results(sr: t.Set[str]) -> None:
168168
def _expand_git(self, target_branch: str) -> t.Set[str]:
169169
git_modified_files = {
170170
*self._git_client.list_untracked_files(),
171-
*self._git_client.list_changed_files(target_branch=target_branch),
171+
*self._git_client.list_uncommitted_changed_files(),
172+
*self._git_client.list_committed_changed_files(target_branch=target_branch),
172173
}
173174
matched_models = {m.fqn for m in self._models.values() if m._path in git_modified_files}
174175

sqlmesh/utils/git.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,12 @@ def list_untracked_files(self) -> t.List[Path]:
1515
["ls-files", "--others", "--exclude-standard"], self._work_dir
1616
)
1717

18-
def list_changed_files(self, target_branch: str = "main") -> t.List[Path]:
18+
def list_uncommitted_changed_files(self) -> t.List[Path]:
19+
return self._execute_list_output(["diff", "--name-only", "--diff-filter=d"], self._git_root)
20+
21+
def list_committed_changed_files(self, target_branch: str = "main") -> t.List[Path]:
1922
return self._execute_list_output(
20-
["diff", "--name-only", "--diff-filter=d", target_branch], self._git_root
23+
["diff", "--name-only", "--diff-filter=d", f"{target_branch}..."], self._git_root
2124
)
2225

2326
def _execute_list_output(self, commands: t.List[str], base_path: Path) -> t.List[Path]:

tests/core/test_selector.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,14 +408,16 @@ def test_expand_git_selection(
408408

409409
git_client_mock = mocker.Mock()
410410
git_client_mock.list_untracked_files.return_value = []
411-
git_client_mock.list_changed_files.return_value = [model_a._path, model_c._path]
411+
git_client_mock.list_uncommitted_changed_files.return_value = []
412+
git_client_mock.list_committed_changed_files.return_value = [model_a._path, model_c._path]
412413

413414
selector = Selector(mocker.Mock(), models)
414415
selector._git_client = git_client_mock
415416

416417
assert selector.expand_model_selections(expressions) == expected_fqns
417418

418-
git_client_mock.list_changed_files.assert_called_once_with(target_branch="main")
419+
git_client_mock.list_committed_changed_files.assert_called_once_with(target_branch="main")
420+
git_client_mock.list_uncommitted_changed_files.assert_called_once()
419421
git_client_mock.list_untracked_files.assert_called_once()
420422

421423

0 commit comments

Comments
 (0)