From 737ac482a6a365392abe90325c542ae5f75ecfa4 Mon Sep 17 00:00:00 2001
From: Matthieu Imbert <matthieu.imbert@inria.fr>
Date: Tue, 28 Jan 2025 14:10:13 +0100
Subject: [PATCH] [execo, execo_g5k] use pipes.quote or shlex.quote depending
 on py version

---
 src/execo/action.py        | 8 ++++++--
 src/execo/process.py       | 6 ++++--
 src/execo/utils.py         | 9 +++++++--
 src/execo_engine/engine.py | 9 +++++++--
 4 files changed, 24 insertions(+), 8 deletions(-)

diff --git a/src/execo/action.py b/src/execo/action.py
index 1bd0fc1..ef5bc57 100644
--- a/src/execo/action.py
+++ b/src/execo/action.py
@@ -31,8 +31,12 @@ from .utils import name_from_cmdline, non_retrying_intr_cond_wait, intr_event_wa
 from traceback import format_exc
 from .substitutions import get_caller_context, remote_substitute
 from .time_utils import get_seconds, format_date, Timer
-import threading, time, pipes, tempfile, os, shutil, stat, functools
+import threading, time, sys, tempfile, os, shutil, stat, functools
 
+if sys.version_info >= (3,):
+    from shlex import quote
+else:
+    from pipes import quote
 
 class ActionLifecycleHandler(object):
 
@@ -879,7 +883,7 @@ class TaktukRemote(Action):
                                              port = global_port,
                                              connection_params = self.connection_params)))
             real_taktuk_cmdline += ("-F", taktuk_options_filename)
-            real_taktuk_cmdline = " ".join([pipes.quote(arg) for arg in real_taktuk_cmdline])
+            real_taktuk_cmdline = " ".join([quote(arg) for arg in real_taktuk_cmdline])
             real_taktuk_cmdline += " && rm -f " + taktuk_options_filename
             self._taktuk = Process(real_taktuk_cmdline)
             #self._taktuk.close_stdin = False
diff --git a/src/execo/process.py b/src/execo/process.py
index b30a778..09ad7c7 100644
--- a/src/execo/process.py
+++ b/src/execo/process.py
@@ -29,13 +29,15 @@ from traceback import format_exc
 from .report import Report
 from .exception import ProcessesFailed
 import errno, os, re, shlex, signal, subprocess
-import threading, time, pipes, sys
+import threading, time, sys
 
 if sys.version_info >= (3,):
+    from shlex import quote
     import codecs, locale
     _decode = lambda bs: codecs.decode(bs, locale.getpreferredencoding(), 'surrogateescape')
     _encode = lambda s: codecs.encode(s, locale.getpreferredencoding(), 'surrogateescape')
 else:
+    from pipes import quote
     _decode = lambda bs: bs
     _decode = lambda s: s
 
@@ -1019,7 +1021,7 @@ class Process(ProcessBase):
         if self.shell == False and (is_string(self.cmd)):
             return shlex.split(self.cmd)
         elif self.shell == True and not is_string(self.cmd):
-            return str(" ".join([ pipes.quote(arg) for arg in self.cmd ]))
+            return str(" ".join([ quote(arg) for arg in self.cmd ]))
         else:
             if sys.version_info >= (3,):
                 return self.cmd
diff --git a/src/execo/utils.py b/src/execo/utils.py
index 95c7e11..a711e09 100644
--- a/src/execo/utils.py
+++ b/src/execo/utils.py
@@ -17,7 +17,12 @@
 # along with Execo.  If not, see <http://www.gnu.org/licenses/>
 
 from .config import configuration
-import pipes, subprocess, os, time, sys, traceback, re, functools, threading, random
+import subprocess, os, time, sys, traceback, re, functools, threading, random
+
+if sys.version_info >= (3,):
+    from shlex import quote
+else:
+    from pipes import quote
 
 def comma_join(*args):
     return ", ".join([ arg for arg in args if len(arg) > 0 ])
@@ -31,7 +36,7 @@ def str_from_cmdline(cmdline):
     if is_string(cmdline):
         return cmdline
     else:
-        return " ".join([ pipes.quote(arg) for arg in cmdline ])
+        return " ".join([ quote(arg) for arg in cmdline ])
 
 def name_from_cmdline(cmdline):
     cmdline = str_from_cmdline(cmdline)
diff --git a/src/execo_engine/engine.py b/src/execo_engine/engine.py
index 7bfe6af..9c9a5d2 100644
--- a/src/execo_engine/engine.py
+++ b/src/execo_engine/engine.py
@@ -17,10 +17,15 @@
 # along with Execo.  If not, see <http://www.gnu.org/licenses/>
 
 from .log import logger
-import os, sys, time, inspect, pipes
+import os, sys, time, inspect
 from .utils import redirect_outputs, copy_outputs
 from argparse import ArgumentParser
 
+if sys.version_info >= (3,):
+    from shlex import quote
+else:
+    from pipes import quote
+
 _engineargs = sys.argv[1:]
 
 def run_meth_on_engine_ancestors(instance, method_name):
@@ -212,7 +217,7 @@ class Engine(object):
                 redirect_outputs(stdout_fname, stderr_fname)
                 logger.info("redirect stdout / stderr to %s and %s", stdout_fname, stderr_fname)
         logger.info("command line arguments: %s" % (sys.argv,))
-        logger.info("command line: " + " ".join([pipes.quote(arg) for arg in sys.argv]))
+        logger.info("command line: " + " ".join([quote(arg) for arg in sys.argv]))
         logger.info("run in directory %s", self.result_dir)
         run_meth_on_engine_ancestors(self, "init")
         run_meth_on_engine_ancestors(self, "run")
-- 
GitLab