From b13e9baf4ebfcd93d5a3e9a89efe19dc34cda35a Mon Sep 17 00:00:00 2001 From: blinry Date: Fri, 26 Feb 2021 12:14:07 +0100 Subject: [PATCH] WIP: Mutex and length fix in net-test --- project.godot | 2 +- scenes/game.gd | 24 +++++++++++--- scenes/shell.gd | 64 +++++++++++++++++++------------------- scenes/tcp_server_shell.gd | 2 ++ scripts/net-test | 10 ++++-- 5 files changed, 63 insertions(+), 39 deletions(-) diff --git a/project.godot b/project.godot index daa35db..1cd98d5 100644 --- a/project.godot +++ b/project.godot @@ -58,9 +58,9 @@ boot_splash/bg_color=Color( 0, 0, 0, 1 ) [autoload] +game="*res://scenes/game.tscn" helpers="*res://scenes/helpers.gd" levels="*res://scenes/levels.gd" -game="*res://scenes/game.tscn" [display] diff --git a/scenes/game.gd b/scenes/game.gd index 4aa2a87..71710c1 100644 --- a/scenes/game.gd +++ b/scenes/game.gd @@ -15,15 +15,28 @@ var skipped_title = false var _file = "user://savegame.json" var state = {} +var mutex + func _ready(): + mutex = Mutex.new() + load_state() + if OS.has_feature("standalone"): get_tree().set_auto_accept_quit(false) else: game.toggle_music() start_remote_shell() - + yield(get_tree().create_timer(0.1), "timeout") global_shell = Shell.new() + +# var cmd = global_shell.run("echo hi") +# print(cmd) +# cmd = global_shell.run("seq 1 10") +# print(cmd) +# cmd = global_shell.run("ls") +# print(cmd) +# helpers.crash(":)") if global_shell.run("command -v git &>/dev/null && echo yes || echo no") == "no\n": game.skipped_title = true @@ -33,8 +46,6 @@ func _ready(): copy_script_to_game_env("fake-editor") copy_script_to_game_env("hint") - - load_state() func start_remote_shell(): var user_dir = ProjectSettings.globalize_path("user://") @@ -129,4 +140,9 @@ func toggle_music(): func shell_test(command): - return $ShellServer.send(command) + mutex.lock() + print("go") + var response = $ShellServer.send(command) + print("stop") + mutex.unlock() + return response diff --git a/scenes/shell.gd b/scenes/shell.gd index e406540..8394ab4 100644 --- a/scenes/shell.gd +++ b/scenes/shell.gd @@ -57,40 +57,40 @@ func run_async_thread(shell_command): hacky_command += "cd '%s' || exit 1;" % _cwd hacky_command += command + print(hacky_command) + var result - if _os == "X11" or _os == "OSX": - # Godot's OS.execute wraps each argument in double quotes before executing - # on Linux and macOS. - # Because we want to be in a single-quote context, where nothing is evaluated, - # we end those double quotes and start a single quoted string. For each single - # quote appearing in our string, we close the single quoted string, and add - # a double quoted string containing the single quote. Ooooof! - # - # Example: The string - # - # test 'fu' "bla" blubb - # - # becomes - # - # "'test '"'"'fu'"'"' "bla" blubb" - - hacky_command = '"\''+hacky_command.replace("'", "'\"'\"'")+'\'"' - result = helpers.exec(_shell_binary(), ["-c", hacky_command], crash_on_fail) - elif _os == "Windows": - # On Windows, if the command contains a newline (even if inside a string), - # execution will end. To avoid that, we first write the command to a file, - # and run that file with bash. - var script_path = game.tmp_prefix + "command" + str(randi()) - helpers.write_file(script_path, hacky_command) - result = helpers.exec(_shell_binary(), [script_path], crash_on_fail) - else: - helpers.crash("Unimplemented OS: %s" % _os) + var shell_command_internal = game.shell_test(hacky_command) +# if _os == "X11" or _os == "OSX": +# # Godot's OS.execute wraps each argument in double quotes before executing +# # on Linux and macOS. +# # Because we want to be in a single-quote context, where nothing is evaluated, +# # we end those double quotes and start a single quoted string. For each single +# # quote appearing in our string, we close the single quoted string, and add +# # a double quoted string containing the single quote. Ooooof! +# # +# # Example: The string +# # +# # test 'fu' "bla" blubb +# # +# # becomes +# # +# # "'test '"'"'fu'"'"' "bla" blubb" +# +# hacky_command = '"\''+hacky_command.replace("'", "'\"'\"'")+'\'"' +# result = helpers.exec(_shell_binary(), ["-c", hacky_command], crash_on_fail) +# elif _os == "Windows": +# # On Windows, if the command contains a newline (even if inside a string), +# # execution will end. To avoid that, we first write the command to a file, +# # and run that file with bash. +# var script_path = game.tmp_prefix + "command" + str(randi()) +# helpers.write_file(script_path, hacky_command) +# result = helpers.exec(_shell_binary(), [script_path], crash_on_fail) +# else: +# helpers.crash("Unimplemented OS: %s" % _os) - if debug: - print(result["output"]) - - shell_command.output = result["output"] - shell_command.exit_code = result["exit_code"] + shell_command.output = shell_command_internal.output + shell_command.exit_code = shell_command_internal.exit_code shell_command.emit_signal("done") func _shell_binary(): diff --git a/scenes/tcp_server_shell.gd b/scenes/tcp_server_shell.gd index 17f26ce..b5511a3 100644 --- a/scenes/tcp_server_shell.gd +++ b/scenes/tcp_server_shell.gd @@ -44,6 +44,8 @@ func send(text): var shell_command = ShellCommand.new() shell_command.command = text shell_command.output = response + print("response:") + print(response) shell_command.exit_code = exit_code return shell_command else: diff --git a/scripts/net-test b/scripts/net-test index 9d36790..1021eae 100755 --- a/scripts/net-test +++ b/scripts/net-test @@ -28,13 +28,19 @@ while(true) { } print("still connected"); my $s2; - $socket->recv($s2, ord($len)); + $socket->recv($s2, $actual_len); print($s2); STDOUT->flush(); + my $script; + open($script, ">", "/tmp/omgscript") or die $!; + #$s3 = 'export HOME=\'/home/blinry/.local/share/Oh My Git/tmp/\';export PATH=\'/home/blinry/.local/share/Oh My Git/tmp/:\'"$PATH";cd \'/home/blinry/.local/share/Oh My Git/tmp/repos/yours/\' || exit 1;find . -type f -not -path \'*/\\.git/*\''; + print $script $s2; + close($script); + $s = ""; - $command = $s2 . "\necho MAGIC\n"; + $command = ". /tmp/omgscript" . "\necho MAGIC\n"; print $in $command; inner_while: while (true) {