Another approach.

This commit is contained in:
Itamar Turner-Trauring 2023-01-12 10:36:39 -05:00
parent e142f051b4
commit dd89ca6d4f
2 changed files with 43 additions and 3 deletions

View File

@ -91,11 +91,13 @@ jobs:
# On Windows, a non-blocking pipe might respond (when emulating Unix-y # On Windows, a non-blocking pipe might respond (when emulating Unix-y
# API) with ENOSPC to indicate buffer full. Trial doesn't handle this # API) with ENOSPC to indicate buffer full. Trial doesn't handle this
# well. So, we pipe the output through cat to make buffer handling someone # well. So, we pipe the output through pipethrough that will hopefully be
# else's problem. # able to do the right thing by using Windows APIs.
- name: Run tox for corresponding Python version - name: Run tox for corresponding Python version
if: ${{ contains(matrix.os, 'windows') }} if: ${{ contains(matrix.os, 'windows') }}
run: python -m tox | cat run: |
pip install twisted
python -m tox | python misc/windows-enospc/passthrough.py
- name: Upload eliot.log - name: Upload eliot.log
uses: actions/upload-artifact@v3 uses: actions/upload-artifact@v3

View File

@ -0,0 +1,38 @@
"""
Writing to non-blocking pipe can result in ENOSPC when using Unix APIs on
Windows. So, this program passes through data from stdin to stdout, using
Windows APIs instead of Unix-y APIs.
"""
import sys
from twisted.internet.stdio import StandardIO
from twisted.internet import reactor
from twisted.internet.protocol import Protocol
from twisted.internet.interfaces import IHalfCloseableProtocol
from twisted.internet.error import ReactorNotRunning
from zope.interface import implementer
@implementer(IHalfCloseableProtocol)
class Passthrough(Protocol):
def readConnectionLost(self):
self.transport.loseConnection()
def writeConnectionLost(self):
try:
reactor.stop()
except ReactorNotRunning:
pass
def dataReceived(self, data):
self.transport.write(data)
def connectionLost(self, reason):
try:
reactor.stop()
except ReactorNotRunning:
pass
std = StandardIO(Passthrough())
reactor.run()