From b0bf084d66b23d21bf32824816031f1550513490 Mon Sep 17 00:00:00 2001 From: Alexander Szakaly Date: Thu, 24 Sep 2020 07:56:04 +0200 Subject: [PATCH] Fix bug in git_credentials() git_credentials() was converting the stdin argument to bytes. However according to the Python3 documentation subprocess.communicate() expects a string when universal_newlines=True is passed to Popen. The symptom was that git review would fail in p.communicate(stdin) on line 156 with the message "'bytes' object has no attribute 'encode'". This was observed with Python version 3.6.9 when running git-review against a gerrit repo over https, where the repo requires username and password to authenticate. Change-Id: I0c0314c3f7b0eb631e72e4ac187a9d443a2bc82b --- git_review/cmd.py | 2 +- git_review/tests/test_unit.py | 6 +++--- test-requirements.txt | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/git_review/cmd.py b/git_review/cmd.py index 19adfae2..f60bea71 100644 --- a/git_review/cmd.py +++ b/git_review/cmd.py @@ -171,7 +171,7 @@ def git_credentials(url): """Return credentials using git credential or None.""" cmd = 'git', 'credential', 'fill' stdin = 'url=%s' % url - rc, out = run_command_status(*cmd, stdin=stdin.encode('utf-8')) + rc, out = run_command_status(*cmd, stdin=stdin) if rc: return None data = dict(line.split('=', 1) for line in out.splitlines()) diff --git a/git_review/tests/test_unit.py b/git_review/tests/test_unit.py index 0854ebc7..9e201536 100644 --- a/git_review/tests/test_unit.py +++ b/git_review/tests/test_unit.py @@ -305,7 +305,7 @@ class GitReviewUnitTest(testtools.TestCase): # This gets encoded to utf8 which means the type passed down # is bytes. mock_run.assert_called_once_with('git', 'credential', 'fill', - stdin=b'url=%s' % url.encode('utf-8')) + stdin='url=%s' % url) calls = [mock.call(url), mock.call(url, auth=('user', 'pass'))] mock_get.assert_has_calls(calls) @@ -323,7 +323,7 @@ class GitReviewUnitTest(testtools.TestCase): # This gets encoded to utf8 which means the type passed down # is bytes. mock_run.assert_called_once_with('git', 'credential', 'fill', - stdin=b'url=%s' % url.encode('utf-8')) + stdin='url=%s' % url) calls = [mock.call(url), mock.call(url, auth=('user', 'pass'))] mock_get.assert_has_calls(calls) @@ -341,7 +341,7 @@ class GitReviewUnitTest(testtools.TestCase): # This gets encoded to utf8 which means the type passed down # is bytes. mock_run.assert_called_once_with('git', 'credential', 'fill', - stdin=b'url=%s' % url.encode('utf-8')) + stdin='url=%s' % url) mock_get.assert_called_once_with(url) @mock.patch('sys.argv', ['argv0', '--track', 'branch']) diff --git a/test-requirements.txt b/test-requirements.txt index 19da82ed..ad03fc16 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -1,5 +1,5 @@ hacking>=2.0.0,<2.1.0 mock fixtures>=0.3.14 -stestr>=2.2.0 +stestr>=2.2.0,<3.0.0 testtools>=0.9.34