mirror of
https://github.com/Aider-AI/aider.git
synced 2025-05-30 09:14:59 +00:00
feat: new command scommit - staged commit
This commit is contained in:
parent
03a9a94c83
commit
80d18171d4
2 changed files with 99 additions and 0 deletions
|
@ -291,6 +291,34 @@ class Commands:
|
||||||
commit_message = args.strip() if args else None
|
commit_message = args.strip() if args else None
|
||||||
self.coder.repo.commit(message=commit_message)
|
self.coder.repo.commit(message=commit_message)
|
||||||
|
|
||||||
|
def cmd_scommit(self, args=None):
|
||||||
|
"Commit edits to the repo made outside the chat (commit message optional)"
|
||||||
|
try:
|
||||||
|
self.raw_cmd_scommit(args)
|
||||||
|
except ANY_GIT_ERROR as err:
|
||||||
|
self.io.tool_error(f"Unable to complete commit: {err}")
|
||||||
|
|
||||||
|
def raw_cmd_scommit(self, args=None):
|
||||||
|
if not self.coder.repo:
|
||||||
|
self.io.tool_error("No git repository found.")
|
||||||
|
return
|
||||||
|
|
||||||
|
commit_message = args.strip() if args else None
|
||||||
|
|
||||||
|
# Show the diff of the staged changes
|
||||||
|
self.io.tool_output("Staged changes diff:")
|
||||||
|
diff = self.coder.repo.repo.git.diff("--cached") # Access git attribute of self.repo.repo
|
||||||
|
self.io.print(diff)
|
||||||
|
|
||||||
|
# Check if the repository is dirty (optional warning)
|
||||||
|
if self.coder.repo.is_dirty():
|
||||||
|
self.io.tool_warning("The repository has uncommitted changes in the working tree. Proceeding with the commit of staged changes.")
|
||||||
|
|
||||||
|
# staged ONLY:
|
||||||
|
self.coder.repo.repo.git.commit("-m", commit_message or "Staged changes commit") # test1.txt should be clean after commit
|
||||||
|
|
||||||
|
self.io.tool_output("Staged changes committed successfully.")
|
||||||
|
|
||||||
def cmd_lint(self, args="", fnames=None):
|
def cmd_lint(self, args="", fnames=None):
|
||||||
"Lint and fix in-chat files or all dirty files if none in chat"
|
"Lint and fix in-chat files or all dirty files if none in chat"
|
||||||
|
|
||||||
|
|
|
@ -491,6 +491,77 @@ class TestCommands(TestCase):
|
||||||
commands.cmd_commit(commit_message)
|
commands.cmd_commit(commit_message)
|
||||||
self.assertFalse(repo.is_dirty())
|
self.assertFalse(repo.is_dirty())
|
||||||
|
|
||||||
|
def test_cmd_scommit(self):
|
||||||
|
with GitTemporaryDirectory() as repo_dir:
|
||||||
|
repo = git.Repo()
|
||||||
|
|
||||||
|
fname1 = "ignoreme1.txt"
|
||||||
|
fname2 = "ignoreme2.txt"
|
||||||
|
fname3 = "file3.txt"
|
||||||
|
|
||||||
|
file_path = Path(repo_dir) / fname3
|
||||||
|
file_path.write_text("Initial content\n")
|
||||||
|
|
||||||
|
Path(fname2).touch()
|
||||||
|
repo.git.add(str(fname2))
|
||||||
|
repo.git.commit("-m", "initial")
|
||||||
|
|
||||||
|
repo.git.add(fname3)
|
||||||
|
|
||||||
|
aignore = Path(".aiderignore")
|
||||||
|
aignore.write_text(f"{fname1}\n{fname2}\ndir\n")
|
||||||
|
|
||||||
|
io = InputOutput(yes=True)
|
||||||
|
|
||||||
|
fnames = [fname1, fname2]
|
||||||
|
repo = GitRepo(
|
||||||
|
io,
|
||||||
|
fnames,
|
||||||
|
None,
|
||||||
|
aider_ignore_file=str(aignore),
|
||||||
|
)
|
||||||
|
|
||||||
|
coder = Coder.create(
|
||||||
|
self.GPT35,
|
||||||
|
None,
|
||||||
|
io,
|
||||||
|
fnames=fnames,
|
||||||
|
repo=repo,
|
||||||
|
)
|
||||||
|
commands = Commands(io, coder)
|
||||||
|
commands.cmd_scommit("")
|
||||||
|
|
||||||
|
self.assertFalse(coder.repo.is_dirty(path=fname3))
|
||||||
|
|
||||||
|
def test_cmd_scommit_mock(self):
|
||||||
|
with GitTemporaryDirectory() as repo_dir:
|
||||||
|
io = InputOutput(pretty=False, fancy_input=False, yes=True)
|
||||||
|
coder = Coder.create(self.GPT35, None, io)
|
||||||
|
commands = Commands(io, coder)
|
||||||
|
|
||||||
|
# Create and stage file
|
||||||
|
(Path(repo_dir) / "test1.txt").write_text("Initial content 1")
|
||||||
|
|
||||||
|
# Add and commit files using the git command
|
||||||
|
coder.repo.repo.git.add("test1.txt")
|
||||||
|
coder.repo.repo.git.commit("-m", "Initial commit")
|
||||||
|
|
||||||
|
# Modify files to make the repository dirty
|
||||||
|
(Path(repo_dir) / "test1.txt").write_text("Modified content 1")
|
||||||
|
|
||||||
|
# Stage one of the modified files
|
||||||
|
coder.repo.repo.git.add("test1.txt")
|
||||||
|
self.assertTrue(coder.repo.repo.is_dirty(path="test1.txt"))
|
||||||
|
|
||||||
|
# Mock the commit method on the Repo object
|
||||||
|
with mock.patch.object(coder.repo.repo, 'git', create=True) as mock_git:
|
||||||
|
mock_git.commit.return_value = None
|
||||||
|
# Run cmd_scommit
|
||||||
|
commands.cmd_scommit("")
|
||||||
|
|
||||||
|
# Check if the commit method was called with the correct message
|
||||||
|
mock_git.commit.assert_called_once_with("-m", "Staged changes commit")
|
||||||
|
|
||||||
def test_cmd_add_from_outside_root(self):
|
def test_cmd_add_from_outside_root(self):
|
||||||
with ChdirTemporaryDirectory() as tmp_dname:
|
with ChdirTemporaryDirectory() as tmp_dname:
|
||||||
root = Path("root")
|
root = Path("root")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue