From 20e1efcfe153fc5fac4c9715d1ac207d65891c8f Mon Sep 17 00:00:00 2001 From: Vladimir Vereschaka Date: Thu, 6 Oct 2022 19:07:33 -0700 Subject: [PATCH] Update the remote test launch utility (utils/remote-exec.py). Allowed a single file execution without the execution directory. --- llvm/utils/remote-exec.py | 60 +++++++++++++++++++++++++-------------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/llvm/utils/remote-exec.py b/llvm/utils/remote-exec.py index 481885b0c6c0..37b261cca7ee 100644 --- a/llvm/utils/remote-exec.py +++ b/llvm/utils/remote-exec.py @@ -41,7 +41,7 @@ def scp(args, src, dst): def main(): parser = argparse.ArgumentParser() parser.add_argument('--host', type=str, required=True) - parser.add_argument('--execdir', type=str, required=True) + parser.add_argument('--execdir', type=str, required=False) parser.add_argument('--extra-ssh-args', type=str, required=False) parser.add_argument('--extra-scp-args', type=str, required=False) parser.add_argument('--codesign_identity', type=str, required=False, default=None) @@ -55,7 +55,7 @@ def main(): # and changing their path when running on the remote host. It's also possible # for there to be no such executable, for example in the case of a .sh.cpp # test. - parser.add_argument('--exec-pattern', type=str, required=False, default='.*\.tmp\.exe', + parser.add_argument('--exec-pattern', type=str, required=False, default='.*', help='The name regex pattern of the executables generated by \ a test file. Specifying it allows us to do custom \ processing like codesigning test-executables \ @@ -68,6 +68,15 @@ def main(): args = parser.parse_args() commandLine = args.command + execdir = args.execdir + if execdir == '.': + # Retrieve the exec directory from the command line. + execdir, _ = os.path.split(commandLine[0]) + if execdir == '': + # Get the current directory in that case. + execdir = os.getcwd() + arcname = os.path.basename(execdir) if execdir else None + # Create a temporary directory where the test will be run. # That is effectively the value of %T on the remote host. tmp = subprocess.check_output( @@ -78,6 +87,8 @@ def main(): isExecutable = lambda exe: re.match(args.exec_pattern, exe) and os.path.exists(exe) pathOnRemote = lambda file: posixpath.join(tmp, os.path.basename(file)) + remoteCommands = [] + try: # Do any necessary codesigning of test-executables found in the command line. if args.codesign_identity: @@ -88,27 +99,34 @@ def main(): # tar up the execution directory (which contains everything that's needed # to run the test), and copy the tarball over to the remote host. - try: - tmpTar = tempfile.NamedTemporaryFile(suffix='.tar', delete=False) - with tarfile.open(fileobj=tmpTar, mode='w') as tarball: - tarball.add(args.execdir, arcname=os.path.basename(args.execdir)) + if execdir: + try: + tmpTar = tempfile.NamedTemporaryFile(suffix='.tar', delete=False) + with tarfile.open(fileobj=tmpTar, mode='w') as tarball: + tarball.add(execdir, arcname=arcname) - # Make sure we close the file before we scp it, because accessing - # the temporary file while still open doesn't work on Windows. - tmpTar.close() - remoteTarball = pathOnRemote(tmpTar.name) - subprocess.check_call(scp(args, tmpTar.name, remoteTarball)) - finally: - # Make sure we close the file in case an exception happens before - # we've closed it above -- otherwise close() is idempotent. - tmpTar.close() - os.remove(tmpTar.name) + # Make sure we close the file before we scp it, because accessing + # the temporary file while still open doesn't work on Windows. + tmpTar.close() + remoteTarball = pathOnRemote(tmpTar.name) + subprocess.check_call(scp(args, tmpTar.name, remoteTarball)) + finally: + # Make sure we close the file in case an exception happens before + # we've closed it above -- otherwise close() is idempotent. + tmpTar.close() + os.remove(tmpTar.name) - # Untar the dependencies in the temporary directory and remove the tarball. - remoteCommands = [ - 'tar -xf {} -C {} --strip-components 1'.format(remoteTarball, tmp), - 'rm {}'.format(remoteTarball) - ] + # Untar the dependencies in the temporary directory and remove the tarball. + remoteCommands.extend([ + 'tar -xf {} -C {} --strip-components 1'.format(remoteTarball, tmp), + 'rm {}'.format(remoteTarball) + ]) + else: + # Copy only the files, which are specified in the command line. + # Copy them to remote host one by one. + for x in commandLine: + _, f = os.path.split(x) + subprocess.check_call(scp(args, x, pathOnRemote(f))) # Make sure all executables in the remote command line have 'execute' # permissions on the remote host. The host that compiled the test-executable