From a57d9e55d6f7c528af0cd27ea42fce429848bdb0 Mon Sep 17 00:00:00 2001 From: "Paul Gauthier (aider)" Date: Wed, 28 Aug 2024 11:21:28 -0700 Subject: [PATCH] fix: handle directory creation errors in setup_git_home --- aider/main.py | 20 ++++++++++++++------ tests/basic/test_main.py | 30 ++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 8 deletions(-) diff --git a/aider/main.py b/aider/main.py index 6339a3abf..c55146923 100644 --- a/aider/main.py +++ b/aider/main.py @@ -58,15 +58,23 @@ def setup_git_home(io): # Assume it's a new project name project_name = choice new_dir = home / project_name - new_dir.mkdir(parents=True, exist_ok=True) - os.chdir(new_dir) - return str(new_dir) + try: + new_dir.mkdir(parents=True, exist_ok=True) + os.chdir(new_dir) + return str(new_dir) + except OSError as e: + io.tool_error(f"Error creating directory: {e}") + return None project_name = io.user_input("Enter a name for your new project directory:") new_dir = home / project_name - new_dir.mkdir(parents=True, exist_ok=True) - os.chdir(new_dir) - return str(new_dir) + try: + new_dir.mkdir(parents=True, exist_ok=True) + os.chdir(new_dir) + return str(new_dir) + except OSError as e: + io.tool_error(f"Error creating directory: {e}") + return None def get_git_root(): diff --git a/tests/basic/test_main.py b/tests/basic/test_main.py index ae92a8ed8..a8fbd4791 100644 --- a/tests/basic/test_main.py +++ b/tests/basic/test_main.py @@ -99,7 +99,8 @@ class TestMain(TestCase): @patch("aider.main.Path.glob") @patch("aider.main.os.chdir") @patch("aider.main.InputOutput") - def test_setup_git_home_new_project(self, mock_io, mock_chdir, mock_glob, mock_home): + @patch("pathlib.Path.mkdir") + def test_setup_git_home_new_project(self, mock_mkdir, mock_io, mock_chdir, mock_glob, mock_home): mock_home.return_value = Path("/home/user") mock_glob.return_value = [Path("/home/user/repo1/.git"), Path("/home/user/repo2/.git")] mock_io.return_value.prompt_ask.return_value = "new_project" @@ -110,6 +111,7 @@ class TestMain(TestCase): "Found git repositories in your home directory:" ) mock_io.return_value.prompt_ask.assert_called_once() + mock_mkdir.assert_called_once_with(parents=True, exist_ok=True) mock_chdir.assert_called_once_with(Path("/home/user/new_project")) self.assertEqual(result, str(Path("/home/user/new_project"))) @@ -117,7 +119,8 @@ class TestMain(TestCase): @patch("aider.main.Path.glob") @patch("aider.main.os.chdir") @patch("aider.main.InputOutput") - def test_setup_git_home_no_existing_repos(self, mock_io, mock_chdir, mock_glob, mock_home): + @patch("pathlib.Path.mkdir") + def test_setup_git_home_no_existing_repos(self, mock_mkdir, mock_io, mock_chdir, mock_glob, mock_home): mock_home.return_value = Path("/home/user") mock_glob.return_value = [] mock_io.return_value.user_input.return_value = "new_project" @@ -128,9 +131,32 @@ class TestMain(TestCase): mock_io.return_value.user_input.assert_called_once_with( "Enter a name for your new project directory:" ) + mock_mkdir.assert_called_once_with(parents=True, exist_ok=True) mock_chdir.assert_called_once_with(Path("/home/user/new_project")) self.assertEqual(result, str(Path("/home/user/new_project"))) + @patch("aider.main.Path.home") + @patch("aider.main.Path.glob") + @patch("aider.main.os.chdir") + @patch("aider.main.InputOutput") + @patch("pathlib.Path.mkdir") + def test_setup_git_home_directory_creation_error(self, mock_mkdir, mock_io, mock_chdir, mock_glob, mock_home): + mock_home.return_value = Path("/home/user") + mock_glob.return_value = [] + mock_io.return_value.user_input.return_value = "new_project" + mock_mkdir.side_effect = OSError("Permission denied") + + result = setup_git_home(mock_io.return_value) + + mock_io.return_value.tool_output.assert_not_called() + mock_io.return_value.user_input.assert_called_once_with( + "Enter a name for your new project directory:" + ) + mock_mkdir.assert_called_once_with(parents=True, exist_ok=True) + mock_chdir.assert_not_called() + mock_io.return_value.tool_error.assert_called_once_with("Error creating directory: Permission denied") + self.assertIsNone(result) + def test_main_with_git_config_yml(self): make_repo()