diff --git a/pre_commit/staged_files_only.py b/pre_commit/staged_files_only.py index cfd63815..1d0c3648 100644 --- a/pre_commit/staged_files_only.py +++ b/pre_commit/staged_files_only.py @@ -8,6 +8,7 @@ import time from pre_commit.util import CalledProcessError from pre_commit.util import cmd_output +from pre_commit.util import mkdirp logger = logging.getLogger('pre_commit') @@ -43,6 +44,7 @@ def staged_files_only(patch_dir): 'Stashing unstaged files to {}.'.format(patch_filename), ) # Save the current unstaged changes as a patch + mkdirp(patch_dir) with io.open(patch_filename, 'wb') as patch_file: patch_file.write(diff_stdout_binary) diff --git a/tests/staged_files_only_test.py b/tests/staged_files_only_test.py index aec55f5d..36b19855 100644 --- a/tests/staged_files_only_test.py +++ b/tests/staged_files_only_test.py @@ -75,6 +75,15 @@ def test_foo_something_unstaged(foo_staged, patch_dir): _test_foo_state(foo_staged, 'herp\nderp\n', 'AM') +def test_does_not_crash_patch_dir_does_not_exist(foo_staged, patch_dir): + with io.open(foo_staged.foo_filename, 'w') as foo_file: + foo_file.write('hello\nworld\n') + + shutil.rmtree(patch_dir) + with staged_files_only(patch_dir): + pass + + def test_something_unstaged_ext_diff_tool(foo_staged, patch_dir, tmpdir): diff_tool = tmpdir.join('diff-tool.sh') diff_tool.write('#!/usr/bin/env bash\necho "$@"\n')