From f94f56addfb0dab2b661859442c59efe89eea5d3 Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Sun, 13 Apr 2014 21:22:08 -0700 Subject: [PATCH] Fix (hopefully) bug where an empty patch was generated. Closes #76 --- pre_commit/staged_files_only.py | 8 ++++---- tests/staged_files_only_test.py | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/pre_commit/staged_files_only.py b/pre_commit/staged_files_only.py index f3e34829..8d27d9da 100644 --- a/pre_commit/staged_files_only.py +++ b/pre_commit/staged_files_only.py @@ -17,11 +17,11 @@ def staged_files_only(cmd_runner): cmd_runner - PrefixedCommandRunner """ # Determine if there are unstaged files - retcode, _, _ = cmd_runner.run( - ['git', 'diff-files', '--quiet'], + retcode, diff_stdout, _ = cmd_runner.run( + ['git', 'diff', '--ignore-submodules', '--binary', '--exit-code'], retcode=None, ) - if retcode: + if retcode and diff_stdout.strip(): patch_filename = cmd_runner.path('patch{0}'.format(int(time.time()))) logger.warning('Unstaged files detected.') logger.info( @@ -29,7 +29,7 @@ def staged_files_only(cmd_runner): ) # Save the current unstaged changes as a patch with open(patch_filename, 'w') as patch_file: - cmd_runner.run(['git', 'diff', '--binary'], stdout=patch_file) + patch_file.write(diff_stdout) # Clear the working directory of unstaged changes cmd_runner.run(['git', 'checkout', '--', '.']) diff --git a/tests/staged_files_only_test.py b/tests/staged_files_only_test.py index 5722af3a..adb0b015 100644 --- a/tests/staged_files_only_test.py +++ b/tests/staged_files_only_test.py @@ -1,3 +1,5 @@ +import logging +import mock import os.path import pytest import shutil @@ -215,3 +217,32 @@ def test_sub_something_unstaged(sub_staged, cmd_runner): _test_sub_state(sub_staged, 'sha2', 'AM') _test_sub_state(sub_staged, 'sha2', 'AM') + + +@pytest.yield_fixture +def fake_logging_handler(): + class FakeHandler(logging.Handler): + def __init__(self): + logging.Handler.__init__(self) + self.logs = [] + + def emit(self, record): + self.logs.append(record) + + pre_commit_logger = logging.getLogger('pre_commit') + original_level = pre_commit_logger.getEffectiveLevel() + handler = FakeHandler() + pre_commit_logger.addHandler(handler) + pre_commit_logger.setLevel(logging.WARNING) + yield handler + pre_commit_logger.setLevel(original_level) + pre_commit_logger.removeHandler(handler) + + +def test_diff_returns_1_no_diff_though(fake_logging_handler, foo_staged): + cmd_runner = mock.Mock() + cmd_runner.run.return_value = (1, '', '') + cmd_runner.path.return_value = '.pre-commit-files_patch' + with staged_files_only(cmd_runner): + pass + assert not fake_logging_handler.logs