From 964948b33de393512a7ecd5a39c4464f110f7a0a Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Wed, 10 May 2017 12:49:39 -0700 Subject: [PATCH] Fix non-ascii merge commit messages in python2 --- pre_commit/git.py | 6 +++--- tests/commands/install_uninstall_test.py | 13 +++++++++++++ tests/git_test.py | 4 ++-- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/pre_commit/git.py b/pre_commit/git.py index d4277e79..2ed02993 100644 --- a/pre_commit/git.py +++ b/pre_commit/git.py @@ -48,10 +48,10 @@ def is_in_merge_conflict(): def parse_merge_msg_for_conflicts(merge_msg): # Conflicted files start with tabs return [ - line.lstrip('#').strip() + line.lstrip(b'#').strip().decode('UTF-8') for line in merge_msg.splitlines() # '#\t' for git 2.4.1 - if line.startswith(('\t', '#\t')) + if line.startswith((b'\t', b'#\t')) ] @@ -60,7 +60,7 @@ def get_conflicted_files(): logger.info('Checking merge-conflict files only.') # Need to get the conflicted files from the MERGE_MSG because they could # have resolved the conflict by choosing one side or the other - merge_msg = open(os.path.join(get_git_dir('.'), 'MERGE_MSG')).read() + merge_msg = open(os.path.join(get_git_dir('.'), 'MERGE_MSG'), 'rb').read() merge_conflict_filenames = parse_merge_msg_for_conflicts(merge_msg) # This will get the rest of the changes made after the merge. diff --git a/tests/commands/install_uninstall_test.py b/tests/commands/install_uninstall_test.py index cd4c6850..ad8d2456 100644 --- a/tests/commands/install_uninstall_test.py +++ b/tests/commands/install_uninstall_test.py @@ -1,3 +1,4 @@ +# -*- coding: UTF-8 -*- from __future__ import absolute_import from __future__ import unicode_literals @@ -190,6 +191,18 @@ def test_commit_am(tempdir_factory): assert ret == 0 +def test_unicode_merge_commit_message(tempdir_factory): + path = make_consuming_repo(tempdir_factory, 'script_hooks_repo') + with cwd(path): + assert install(Runner(path, C.CONFIG_FILE)) == 0 + cmd_output('git', 'checkout', 'master', '-b', 'foo') + cmd_output('git', 'commit', '--allow-empty', '-m', 'branch2') + cmd_output('git', 'checkout', 'master') + cmd_output('git', 'merge', 'foo', '--no-ff', '--no-commit', '-m', '☃') + # Used to crash + cmd_output('git', 'commit', '--no-edit') + + def test_install_idempotent(tempdir_factory): path = make_consuming_repo(tempdir_factory, 'script_hooks_repo') with cwd(path): diff --git a/tests/git_test.py b/tests/git_test.py index c18dcd83..ffe1c1aa 100644 --- a/tests/git_test.py +++ b/tests/git_test.py @@ -142,8 +142,8 @@ def test_get_conflicted_files_unstaged_files(in_merge_conflict): assert ret == {'conflict_file'} -MERGE_MSG = "Merge branch 'foo' into bar\n\nConflicts:\n\tconflict_file\n" -OTHER_MERGE_MSG = MERGE_MSG + '\tother_conflict_file\n' +MERGE_MSG = b"Merge branch 'foo' into bar\n\nConflicts:\n\tconflict_file\n" +OTHER_MERGE_MSG = MERGE_MSG + b'\tother_conflict_file\n' @pytest.mark.parametrize(