4736: rbt patch --print does not work on Python 3

basil

What version are you running?

$ rbt --version
RBTools 1.0.1
$ python2 --version
Python 2.7.10
$ python3 --version
Python 3.6.6

What steps will reproduce the problem?

  1. Create a virtual environment and install RBTools.
  2. Run rbt patch --print <review-id>.

What is the expected output? What do you see instead?

The expected output is a readable patch, and I get the expected output when the virtual environment in step 1 is created with Python 2:

diff --git a/path/to/file1 b/path/to/file1
index d27838edc524e3813ae1019d534067e9a8bceb4c..264a986b38050f935b2f2df40875e76087fbad0e 100644
--- a/path/to/file1
+++ b/path/to/file1
@@ -41,6 +41,7 @@
[...]

However, when the virtual environment in step 1 is created with Python 3, I see the following instead:

b'diff --git a/path/to/file1 b/path/to/file1\nindex d27838edc524e3813ae1019d534067e9a8bceb4c..264a986b38050f935b2f2df40875e76087fbad0e 100644\n--- a/path/to/file1\n+++ b/path/to/file1\n@@ -41,6 +41,7 @@
[...]

What operating system are you using?

macOS High Sierra 10.13.6

Attach the debug out from the command.

$ rbt patch --debug --print <review-id>
>>> RBTools 1.0.1
>>> Python 3.6.6 (v3.6.6:4cf1f54eb7, Jun 26 2018, 19:50:54) 
[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.57)]
>>> Running on Darwin-17.7.0-x86_64-i386-64bit
>>> Home = /Users/basil
>>> Current directory = /Users/basil/path/to/repository
>>> Command line: rbt patch --debug --print 42917
>>> Making HTTP GET request to http://reviews.example.com/api/
>>> Making HTTP GET request to http://reviews.example.com/api/review-requests/42917/diffs/
>>> Cached response for HTTP GET http://reviews.example.com/api/review-requests/42917/diffs/ expired and was modified
>>> Making HTTP GET request to http://reviews.example.com/api/review-requests/42917/diffs/1/
>>> Cached response for HTTP GET http://reviews.example.com/api/review-requests/42917/diffs/1/ expired and was not modified
>>> Making HTTP GET request to http://reviews.example.com/api/review-requests/42917/diffs/1/
>>> Cached response for HTTP GET http://reviews.example.com/api/review-requests/42917/diffs/1/ expired and was not modified
b'diff --git a/path/to/file1 b/path/to/file1\nindex d27838edc524e3813ae1019d534067e9a8bceb4c..264a986b38050f935b2f2df40875e76087fbad0e 100644\n--- a/path/to/file1\n+++ b/path/to/file1\n@@ -41,6 +41,7 @@
[...]

Please provide any additional information below.

This change to RBTools works around the problem successfully on both Python 2 and Python 3:

diff --git a/rbtools/commands/patch.py b/rbtools/commands/patch.py
index 1ea5665..70c7a20 100644
--- a/rbtools/commands/patch.py
+++ b/rbtools/commands/patch.py
@@ -82,6 +82,9 @@ class Patch(Command):
         try:
             diff = diffs.get_item(diff_revision)
             diff_body = diff.get_patch().data
+            diff_body = (
+                diff_body.decode('utf-8') if isinstance(diff_body, bytes) else diff_body
+            )
             base_dir = getattr(diff, 'basedir', None) or ''
         except APIError:
             raise CommandError('The specified diff revision does not exist.')
david
#1 david

Fixed in release-1.0.x (70469c4). This will ship in 1.0.2. Thanks!

  • -New
    +Fixed
#2 rfs613

There is a similar problem with "rbt diff" command.