(part of) commit 0019b6e68af9bda8b368a7073e5eb927607f00e2 Author: SÅ‚awomir Nizio Date: Sat Mar 21 22:08:50 2020 +0100 [entropy.misc, rigo] fix file-like objects with Python 3 FakeOutFile and LogFile need .buffer like Python 3 "text" file objects which is needed when in rigo standard output/error is replaced, and then it reaches Portage which does this: if sys.hexversion >= 0x3000000 and fd in (sys.stdout, sys.stderr): fd = fd.buffer fd.write(mystr) (/usr/lib64/python3.6/site-packages/portage/util/__init__.py). Entropy internal code did not need this. Note, after this commit, changes done previously: 1) commit 0869912ec4c630d2946e835b2585367e233c1c15 [entropy.spm] Rigo related Python 3 fix File "/usr/lib64/python3.6/site-packages/entropy/spm/plugins/interfaces/portage_plugin/__init__.py", line 101, in _pusher self._std.buffer.write(chunk) AttributeError: 'FakeOutFile' object has no attribute 'buffer' 2) commit 8700aade27cb4117bf102afc7bd22ba6acfd8aa8 [entropy.spm, rigo] Rigo related Python 3 fixes 1) File "/usr/lib/python-exec/python3.6/RigoDaemon_app.py", line 362, in _pusher fobj.write(chunk) TypeError: write() argument must be str, not bytes 2) File "/usr/lib64/python3.6/site-packages/entropy/spm/plugins/interfaces/portage_plugin/__init__.py", line 77, in __init__ self.buffer = Writer(self, self._std.buffer) AttributeError: 'FakeOutFile' object has no attribute 'buffer' (...) could be likely reverted; not tested, it could be better to have them anyway to avoid futher re/encoding/checks if conversions are needed (subjective). Fixes bug 5899. diff --git a/app/RigoDaemon_app.py b/app/RigoDaemon_app.py index 39c4aeefe..33b45e5b8 100755 --- a/app/RigoDaemon_app.py +++ b/app/RigoDaemon_app.py @@ -79,7 +79,7 @@ from entropy.exceptions import DependenciesNotFound, \ EntropyPackageException, InterruptError, RepositoryError from entropy.i18n import _ from entropy.misc import LogFile, ParallelTask, TimeScheduled, \ - ReadersWritersSemaphore + ReadersWritersSemaphore, FileobjCompatBuffer from entropy.fetchers import UrlFetcher, MultipleUrlFetcher from entropy.output import TextInterface, purple, teal from entropy.client.interfaces import Client @@ -340,6 +340,10 @@ class FakeOutFile(object): self._app_mgmt_mutex = app_mgmt_mutex self._app_mgmt_notes = app_mgmt_notes self._rfd, self._wfd = os.pipe() + + if const_is_python3(): + self.buffer = FileobjCompatBuffer(self) + task = ParallelTask(self._pusher) task.name = "FakeOutFilePusher" task.daemon = True