From 17e53680f201bf4530315c098b1de958fb446c0c Mon Sep 17 00:00:00 2001 From: Baptiste Daroussin Date: Thu, 15 Dec 2016 14:02:10 +0100 Subject: [PATCH] Improve portability by not relying on /dev/fd Some Operation System does not have it on by default (or older versions) does not support it at all --- diffoscope/difference.py | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/diffoscope/difference.py b/diffoscope/difference.py index 76a02a0..3c7199a 100644 --- a/diffoscope/difference.py +++ b/diffoscope/difference.py @@ -25,6 +25,8 @@ import hashlib import threading import contextlib import subprocess +import tempfile +import shutil from multiprocessing.dummy import Queue @@ -138,20 +140,14 @@ DIFF_CHUNK = 4096 @tool_required('diff') -def run_diff(fd1, fd2, end_nl_q1, end_nl_q2): - cmd = ['diff', '-aU7', '/dev/fd/%d' % fd1, '/dev/fd/%d' % fd2] +def run_diff(fifo1, fifo2, end_nl_q1, end_nl_q2): + cmd = ['diff', '-aU7', fifo1, fifo2] logger.debug('running %s', cmd) - if hasattr(os, 'set_inheritable'): # new in Python 3.4 - os.set_inheritable(fd1, True) - os.set_inheritable(fd2, True) p = subprocess.Popen(cmd, shell=False, bufsize=1, stdin=subprocess.PIPE, stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - pass_fds=(fd1, fd2)) + stderr=subprocess.STDOUT) p.stdin.close() - os.close(fd1) - os.close(fd2) parser = DiffParser(p.stdout, end_nl_q1, end_nl_q2) t_read = threading.Thread(target=parser.parse) t_read.daemon = True @@ -202,13 +198,11 @@ def feed(feeder, f, end_nl_q): @contextlib.contextmanager -def fd_from_feeder(feeder, end_nl_q): - pipe_r, pipe_w = os.pipe() - outf = os.fdopen(pipe_w, 'wb') +def fd_from_feeder(feeder, end_nl_q, fifo): + outf = open(fifo, 'wb') t = ExThread(target=feed, args=(feeder, outf, end_nl_q)) t.daemon = True t.start() - yield pipe_r try: t.join() finally: @@ -273,9 +267,14 @@ def make_feeder_from_command(command): def diff(feeder1, feeder2): end_nl_q1 = Queue() end_nl_q2 = Queue() - with fd_from_feeder(feeder1, end_nl_q1) as fd1: - with fd_from_feeder(feeder2, end_nl_q2) as fd2: - return run_diff(fd1, fd2, end_nl_q1, end_nl_q2) + tmpdir = tempfile.mkdtemp() + fifo1 = "%s/f1" % tmpdir + fifo2 = "%s/f2" % tmpdir + fd_from_feeder(feeder1, end_nl_q1, fifo1) + fd_from_feeder(feeder2, end_nl_q2, fifo2) + ret = run_diff(fifo1, fifo2, end_nl_q1, end_nl_q2) + shutil.rmtree(tmpdir) + return ret class Difference(object): -- 2.11.0