mirror of
https://github.com/OpenHands/OpenHands.git
synced 2025-12-26 05:48:36 +08:00
* Remove global config from memory * Remove runtime global config * Remove from storage * Remove global config * Fix event stream tests * Fix sandbox issue * Change config * Removed transferred tests * Add swe env box * Fixes on testing * Fixed some tests * Merge with stashed changes * Fix typing * Fix ipython test * Revive function * Make temp_dir fixture * Remove test to avoid circular import * fix eventstream filestore for test_runtime * fix parse arg issue that cause integration test to fail * support swebench pull from custom namespace * add back simple tests for runtime * move multi-line bash tests to test_runtime; support multi-line bash for esruntime; * add testcase to handle PS2 prompt * use bashlex for bash parsing to handle multi-line commands; add testcases for multi-line commands * revert ghcr runtime change * Apply stash * fix run as other user; make test async; * fix test runtime for run as od * add run-as-devin to all the runtime tests * handle the case when username is root * move all run-as-devin tests from sandbox; only tests a few cases on different user to save time; * move over multi-line echo related tests to test_runtime * fix user-specific jupyter by fixing the pypoetry virtualenv folder * make plugin's init async; chdir at initialization of jupyter plugin; move ipy simple testcase to test runtime; * support agentskills import in move tests for jupyter pwd tests; overload `add_env_vars` for EventStreamRuntime to update env var also in Jupyter; make agentskills read env var lazily, in case env var is updated; * fix ServerRuntime agentskills issue * move agnostic image test to test_runtime * merge runtime tests in CI * fix enable auto lint as env var * update warning message * update warning message * test for different container images * change parsing output as debug * add exception handling for update_pwd_decorator * fix unit test indentation * add plugins as default input to Runtime class; remove init_sandbox_plugins; implement add_env_var (include jupyter) in the base class; * fix server runtime auto lint * Revert "add exception handling for update_pwd_decorator" This reverts commit 2b668b1506e02145cb8f87e321aad62febca3d50. * tries to print debugging info for agentskills * explictly setting uid (try fix permission issue) * Revert "tries to print debugging info for agentskills" This reverts commit 8be4c86756f0e3fc62957b327ba2ac4999c419de. * set sandbox user id during testing to hopefully fix the permission issue * add browser tools for server runtime * try to debug for old pwd * update debug cmd * only test agnostic runtime when TEST_RUNTIME is Server * fix temp dir mkdir * load TEST_RUNTIME at the beginning * remove ipython tests * only log to file when DEBUG * default logging to project root * temporarily remove log to file * fix LLM logger dir * fix logger * make set pwd an optional aux action * fix prev pwd * fix infinity recursion * simplify * do not import the whole od library to avoid logger folder by jupyter * fix browsing * increase timeout * attempt to fix agentskills yet again * clean up in testcases, since CI maybe run as non-root * add _cause attribute for event.id * remove parent * add a bunch of debugging statement again for CI :( * fix temp_dir fixture * change all temp dir to follow pytest's tmp_path_factory * remove extra bracket * clean up error printing a bit * jupyter chdir to self.config.workspace_mount_path_in_sandbox on initialization * jupyter chdir to self.config.workspace_mount_path_in_sandbox on initialization * add typing for tmp dir fixture * clear the directory before running the test to avoid weird CI temp dir * remove agnostic test case for server runtime * Revert "remove agnostic test case for server runtime" This reverts commit 30e2181c3fc1410e69596c2dcd06be01f1d016b3. * disable agnostic tests in CI * fix test --------- Co-authored-by: Graham Neubig <neubig@gmail.com>
53 lines
1.7 KiB
Python
53 lines
1.7 KiB
Python
import bashlex
|
|
|
|
from opendevin.core.logger import opendevin_logger as logger
|
|
|
|
|
|
def split_bash_commands(commands):
|
|
try:
|
|
parsed = bashlex.parse(commands)
|
|
except bashlex.errors.ParsingError as e:
|
|
logger.debug(
|
|
f'Failed to parse bash commands\n'
|
|
f'[input]: {commands}\n'
|
|
f'[warning]: {e}\n'
|
|
f'The original command will be returned as is.'
|
|
)
|
|
# If parsing fails, return the original commands
|
|
return [commands]
|
|
|
|
result: list[str] = []
|
|
last_end = 0
|
|
|
|
for node in parsed:
|
|
start, end = node.pos
|
|
|
|
# Include any text between the last command and this one
|
|
if start > last_end:
|
|
between = commands[last_end:start]
|
|
logger.debug(f'BASH PARSING between: {between}')
|
|
if result:
|
|
result[-1] += between.rstrip()
|
|
elif between.strip():
|
|
# THIS SHOULD NOT HAPPEN
|
|
result.append(between.rstrip())
|
|
|
|
# Extract the command, preserving original formatting
|
|
command = commands[start:end].rstrip()
|
|
logger.debug(f'BASH PARSING command: {command}')
|
|
result.append(command)
|
|
|
|
last_end = end
|
|
|
|
# Add any remaining text after the last command to the last command
|
|
remaining = commands[last_end:].rstrip()
|
|
logger.debug(f'BASH PARSING remaining: {remaining}')
|
|
if last_end < len(commands) and result:
|
|
result[-1] += remaining
|
|
logger.debug(f'BASH PARSING result[-1] += remaining: {result[-1]}')
|
|
elif last_end < len(commands):
|
|
if remaining:
|
|
result.append(remaining)
|
|
logger.debug(f'BASH PARSING result.append(remaining): {result[-1]}')
|
|
return result
|