def call(cline, env, cwd, loc, cb, context, echo, justprint=False): #TODO: call this once up-front somewhere and save the result? shell, msys = util.checkmsyscompat() shellreason = None if msys and cline.startswith('/'): shellreason = "command starts with /" else: argv, badchar = clinetoargv(cline) if argv is None: shellreason = "command contains shell-special character '%s'" % ( badchar, ) elif len(argv) and argv[0] in shellwords: shellreason = "command starts with shell primitive '%s'" % ( argv[0], ) if shellreason is not None: _log.debug("%s: using shell: %s: '%s'", loc, shellreason, cline) if msys: if len(cline) > 3 and cline[1] == ':' and cline[2] == '/': cline = '/' + cline[0] + cline[2:] cline = [shell, "-c", cline] context.call(cline, shell=not msys, env=env, cwd=cwd, cb=cb, echo=echo, justprint=justprint) return if not len(argv): cb(res=0) return if argv[0] == command.makepypath: command.main(argv[1:], env, cwd, cb) return if argv[0:2] == [ sys.executable.replace('\\', '/'), command.makepypath.replace('\\', '/') ]: command.main(argv[2:], env, cwd, cb) return if argv[0].find('/') != -1: executable = util.normaljoin(cwd, argv[0]) else: executable = None context.call(argv, executable=executable, shell=False, env=env, cwd=cwd, cb=cb, echo=echo, justprint=justprint)
def resolve(self, makefile, variables, fd, setting): #TODO: call this once up-front somewhere and save the result? shell, msys = util.checkmsyscompat() cline = self._arguments[0].resolvestr(makefile, variables, setting) log.debug("%s: running shell command '%s'" % (self.loc, cline)) cline = [shell, "-c", cline] p = subprocess.Popen(cline, env=makefile.env, shell=False, stdout=subprocess.PIPE, cwd=makefile.workdir) stdout, stderr = p.communicate() stdout = stdout.replace('\r\n', '\n') if stdout.endswith('\n'): stdout = stdout[:-1] stdout = stdout.replace('\n', ' ') fd.write(stdout)
def call(cline, env, cwd, loc, cb, context, echo, justprint=False): #TODO: call this once up-front somewhere and save the result? shell, msys = util.checkmsyscompat() shellreason = None if msys and cline.startswith('/'): shellreason = "command starts with /" else: argv, badchar = clinetoargv(cline, blacklist_gray=True) if argv is None: shellreason = "command contains shell-special character '%s'" % (badchar,) elif len(argv) and argv[0] in shellwords: shellreason = "command starts with shell primitive '%s'" % (argv[0],) else: argv = doglobbing(argv, cwd) if shellreason is not None: _log.debug("%s: using shell: %s: '%s'", loc, shellreason, cline) if msys: if len(cline) > 3 and cline[1] == ':' and cline[2] == '/': cline = '/' + cline[0] + cline[2:] cline = [shell, "-c", cline] context.call(cline, shell=False, env=env, cwd=cwd, cb=cb, echo=echo, justprint=justprint) return if not len(argv): cb(res=0) return if argv[0] == command.makepypath: command.main(argv[1:], env, cwd, cb) return if argv[0:2] == [sys.executable.replace('\\', '/'), command.makepypath.replace('\\', '/')]: command.main(argv[2:], env, cwd, cb) return if argv[0].find('/') != -1: executable = util.normaljoin(cwd, argv[0]) else: executable = None context.call(argv, executable=executable, shell=False, env=env, cwd=cwd, cb=cb, echo=echo, justprint=justprint)
def prepare_command(cline, cwd, loc): """ Returns a list of command and arguments for the given command line string. If the command needs to be run through a shell for some reason, the returned list contains the shell invocation. """ #TODO: call this once up-front somewhere and save the result? shell, msys = util.checkmsyscompat() shellreason = None executable = None if msys and cline.startswith('/'): shellreason = "command starts with /" else: argv, badchar = clinetoargv(cline, cwd) if argv is None: shellreason = "command contains shell-special character '%s'" % ( badchar, ) elif len(argv) and argv[0] in shellwords: shellreason = "command starts with shell primitive '%s'" % ( argv[0], ) elif argv and (os.sep in argv[0] or os.altsep and os.altsep in argv[0]): executable = util.normaljoin(cwd, argv[0]) # Avoid "%1 is not a valid Win32 application" errors, assuming # that if the executable path is to be resolved with PATH, it will # be a Win32 executable. if sys.platform == 'win32' and os.path.isfile(executable) and open( executable, 'rb').read(2) == "#!": shellreason = "command executable starts with a hashbang" if shellreason is not None: _log.debug("%s: using shell: %s: '%s'", loc, shellreason, cline) if msys: if len(cline) > 3 and cline[1] == ':' and cline[2] == '/': cline = '/' + cline[0] + cline[2:] argv = [shell, "-c", cline] executable = None return executable, argv
def prepare_command(cline, cwd, loc): """ Returns a list of command and arguments for the given command line string. If the command needs to be run through a shell for some reason, the returned list contains the shell invocation. """ #TODO: call this once up-front somewhere and save the result? shell, msys = util.checkmsyscompat() shellreason = None executable = None if msys and cline.startswith('/'): shellreason = "command starts with /" else: argv, badchar = clinetoargv(cline, cwd) if argv is None: shellreason = "command contains shell-special character '%s'" % (badchar,) elif len(argv) and argv[0] in shellwords: shellreason = "command starts with shell primitive '%s'" % (argv[0],) elif argv and (os.sep in argv[0] or os.altsep and os.altsep in argv[0]): executable = util.normaljoin(cwd, argv[0]) # Avoid "%1 is not a valid Win32 application" errors, assuming # that if the executable path is to be resolved with PATH, it will # be a Win32 executable. if sys.platform == 'win32' and os.path.isfile(executable) and open(executable, 'rb').read(2) == "#!": shellreason = "command executable starts with a hashbang" if shellreason is not None: _log.debug("%s: using shell: %s: '%s'", loc, shellreason, cline) if msys: if len(cline) > 3 and cline[1] == ':' and cline[2] == '/': cline = '/' + cline[0] + cline[2:] argv = [shell, "-c", cline] executable = None return executable, argv