From fb2e042a121128d2e9893fbe8811ed86547581b6 Mon Sep 17 00:00:00 2001 From: Christian Bundy Date: Wed, 26 Feb 2020 20:40:23 -0800 Subject: [PATCH] Remove debug output and add comments Problem: The previous code was printing debug output so that I could ensure that my argument checking worked correctly, but we don't want to distribute a binary that echoes back your arguments to you. Solution: Remove the debug output and add lots of comments to document all of my misunderstandings of how the current code works. :~) --- scripts/oasis.go | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/scripts/oasis.go b/scripts/oasis.go index 3eaba20..b7bb29b 100644 --- a/scripts/oasis.go +++ b/scripts/oasis.go @@ -7,27 +7,51 @@ import ( "path/filepath" ) +// The relative path to the `node` binary depends on the platform, so we +// pass this via an `-ldflags` hack I don't completely understand. In my +// head this is similar to how GCC lets you use `-D` to define a macro to +// be inserted by the preprocessor. var node string func main() { + // The problem with relative paths is that they only work when + // you run `./oasis-platform-x64`, but not when you run a command + // like `./path/to/oasis-platform-x64`. To resolve this problem + // we need to put together an absolute path, which we can build + // with the first argument (the relative path of this executable) + // and the relative path of either the `node` binary or the + // source code directory so that we can run `node src`. node := filepath.Join(filepath.Dir(os.Args[0]), node) src := filepath.Join(filepath.Dir(os.Args[0]), "src") + // We know that the command will be the absolute path to `node` + // and the first argument will be the absolute path to the `src` + // directory, but we need to get collect the rest of the arguments + // programatically by pulling them out of the `os.Args` slice and + // putting them in a new slice called `args`. args := []string{src} - for i := 1; i < len(os.Args); i++ { args = append(args, os.Args[i]) } + // This seems to execute the script and pass-through all of the + // arguments we want, *plus* it hooks up stdout and stderr, but + // the exit code of Oasis doesn't seem to be passed through. This + // is easy to test with a command like: + // + // ./oasis-platform-x64 --port -1 + // + // This should give an exit code of 1, but it seems to exit 0. :/ cmd := exec.Command(node, args...) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr - err := cmd.Run() + // This catches problems like "no such file or directory" if the + // `node` variable points to a path where there isn't a binary. + // + // TODO: I think we're supposed to handle the exit code here. + err := cmd.Run() if err != nil { fmt.Println(err) } - - - fmt.Println(args) }