def _send_command_and_read_response()

in nailgun-client/py/ng.py [0:0]


    def _send_command_and_read_response(self, cmd, cmd_args, filearg, env, cwd):
        self.stdin_thread.start()
        self.send_thread.start()

        try:

            if filearg:
                self._send_file_arg(filearg)
            for cmd_arg in cmd_args:
                self._send_chunk(cmd_arg, CHUNKTYPE_ARG)
            self._send_env_var("NAILGUN_FILESEPARATOR", os.sep)
            self._send_env_var("NAILGUN_PATHSEPARATOR", os.pathsep)
            self._send_tty_format(self.stdin)
            self._send_tty_format(self.stdout)
            self._send_tty_format(self.stderr)
            for k, v in env.items():
                self._send_env_var(k, v)
            self._send_chunk(cwd, CHUNKTYPE_DIR)
            self._send_chunk(cmd, CHUNKTYPE_CMD)

            if self.heartbeat_thread is not None:
                self.heartbeat_thread.start()

            while self.exit_code is None:
                self._process_next_chunk()

        finally:

            self.shutdown_event.set()

            with self.stdin_condition:
                self.stdin_condition.notify()
            with self.send_condition:
                self.send_condition.notify()
            if self.heartbeat_thread is not None:
                with self.heartbeat_condition:
                    self.heartbeat_condition.notify()
                self.heartbeat_thread.join(THREAD_TERMINATION_TIMEOUT_SEC)
            self.stdin_thread.join(THREAD_TERMINATION_TIMEOUT_SEC)
            self.send_thread.join(THREAD_TERMINATION_TIMEOUT_SEC)

        return self.exit_code