Skip to content

Commit f94f56a

Browse files
committed
Fix (hopefully) bug where an empty patch was generated. Closes pre-commit#76
1 parent 6d8621c commit f94f56a

2 files changed

Lines changed: 35 additions & 4 deletions

File tree

pre_commit/staged_files_only.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,19 @@ def staged_files_only(cmd_runner):
1717
cmd_runner - PrefixedCommandRunner
1818
"""
1919
# Determine if there are unstaged files
20-
retcode, _, _ = cmd_runner.run(
21-
['git', 'diff-files', '--quiet'],
20+
retcode, diff_stdout, _ = cmd_runner.run(
21+
['git', 'diff', '--ignore-submodules', '--binary', '--exit-code'],
2222
retcode=None,
2323
)
24-
if retcode:
24+
if retcode and diff_stdout.strip():
2525
patch_filename = cmd_runner.path('patch{0}'.format(int(time.time())))
2626
logger.warning('Unstaged files detected.')
2727
logger.info(
2828
'Stashing unstaged files to {0}.'.format(patch_filename),
2929
)
3030
# Save the current unstaged changes as a patch
3131
with open(patch_filename, 'w') as patch_file:
32-
cmd_runner.run(['git', 'diff', '--binary'], stdout=patch_file)
32+
patch_file.write(diff_stdout)
3333

3434
# Clear the working directory of unstaged changes
3535
cmd_runner.run(['git', 'checkout', '--', '.'])

tests/staged_files_only_test.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import logging
2+
import mock
13
import os.path
24
import pytest
35
import shutil
@@ -215,3 +217,32 @@ def test_sub_something_unstaged(sub_staged, cmd_runner):
215217
_test_sub_state(sub_staged, 'sha2', 'AM')
216218

217219
_test_sub_state(sub_staged, 'sha2', 'AM')
220+
221+
222+
@pytest.yield_fixture
223+
def fake_logging_handler():
224+
class FakeHandler(logging.Handler):
225+
def __init__(self):
226+
logging.Handler.__init__(self)
227+
self.logs = []
228+
229+
def emit(self, record):
230+
self.logs.append(record)
231+
232+
pre_commit_logger = logging.getLogger('pre_commit')
233+
original_level = pre_commit_logger.getEffectiveLevel()
234+
handler = FakeHandler()
235+
pre_commit_logger.addHandler(handler)
236+
pre_commit_logger.setLevel(logging.WARNING)
237+
yield handler
238+
pre_commit_logger.setLevel(original_level)
239+
pre_commit_logger.removeHandler(handler)
240+
241+
242+
def test_diff_returns_1_no_diff_though(fake_logging_handler, foo_staged):
243+
cmd_runner = mock.Mock()
244+
cmd_runner.run.return_value = (1, '', '')
245+
cmd_runner.path.return_value = '.pre-commit-files_patch'
246+
with staged_files_only(cmd_runner):
247+
pass
248+
assert not fake_logging_handler.logs

0 commit comments

Comments
 (0)