diff --git a/cmd/geth/js.go b/cmd/geth/js.go index 6e4e3e0c1..761943b63 100644 --- a/cmd/geth/js.go +++ b/cmd/geth/js.go @@ -220,6 +220,25 @@ func (self *jsre) loadAutoCompletion() { } } +func (self *jsre) batch(statement string) { + val, err := self.re.Run(statement) + + if err != nil { + fmt.Printf("error: %v", err) + } else if val.IsDefined() && val.IsObject() { + obj, _ := self.re.Get("ret_result") + fmt.Printf("%v", obj) + } else if val.IsDefined() { + fmt.Printf("%v", val) + } + + if self.atexit != nil { + self.atexit() + } + + self.re.Stop(false) +} + // show summary of current geth instance func (self *jsre) welcome() { self.re.Eval(`console.log('instance: ' + web3.version.client);`) diff --git a/cmd/geth/main.go b/cmd/geth/main.go index f1e8ace3d..e5c3614fc 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -255,6 +255,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso utils.IPCDisabledFlag, utils.IPCApiFlag, utils.IPCPathFlag, + utils.ExecFlag, utils.WhisperEnabledFlag, utils.VMDebugFlag, utils.ProtocolVersionFlag, @@ -337,8 +338,12 @@ func attach(ctx *cli.Context) { true, nil) - repl.welcome() - repl.interactive() + if ctx.GlobalString(utils.ExecFlag.Name) != "" { + repl.batch(ctx.GlobalString(utils.ExecFlag.Name)) + } else { + repl.welcome() + repl.interactive() + } } func console(ctx *cli.Context) { @@ -368,8 +373,12 @@ func console(ctx *cli.Context) { nil, ) - repl.welcome() - repl.interactive() + if ctx.GlobalString(utils.ExecFlag.Name) != "" { + repl.batch(ctx.GlobalString(utils.ExecFlag.Name)) + } else { + repl.welcome() + repl.interactive() + } ethereum.Stop() ethereum.WaitForShutdown() diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 092bc5511..a9d449d1f 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -227,6 +227,10 @@ var ( Usage: "Filename for IPC socket/pipe", Value: DirectoryString{common.DefaultIpcPath()}, } + ExecFlag = cli.StringFlag{ + Name: "exec", + Usage: "Execute javascript statement (only in combination with console/attach)", + } // Network Settings MaxPeersFlag = cli.IntFlag{ Name: "maxpeers", diff --git a/rpc/api/api_test.go b/rpc/api/api_test.go index 3e464c281..7e273ef28 100644 --- a/rpc/api/api_test.go +++ b/rpc/api/api_test.go @@ -3,12 +3,13 @@ package api import ( "testing" - "github.com/ethereum/go-ethereum/rpc/codec" "encoding/json" "strconv" + "github.com/ethereum/go-ethereum/common/compiler" - "github.com/ethereum/go-ethereum/rpc/shared" "github.com/ethereum/go-ethereum/eth" + "github.com/ethereum/go-ethereum/rpc/codec" + "github.com/ethereum/go-ethereum/rpc/shared" "github.com/ethereum/go-ethereum/xeth" ) @@ -58,11 +59,11 @@ func TestCompileSolidity(t *testing.T) { t.Skip("WARNING: skipping test because of solc different version (%v, test written for %v, may need to update)", solc.Version(), solcVersion) } source := `contract test {\n` + - " /// @notice Will multiply `a` by 7." + `\n` + - ` function multiply(uint a) returns(uint d) {\n` + - ` return a * 7;\n` + - ` }\n` + - `}\n` + " /// @notice Will multiply `a` by 7." + `\n` + + ` function multiply(uint a) returns(uint d) {\n` + + ` return a * 7;\n` + + ` }\n` + + `}\n` jsonstr := `{"jsonrpc":"2.0","method":"eth_compileSolidity","params":["` + source + `"],"id":64}` diff --git a/rpc/api/eth.go b/rpc/api/eth.go index 91577c4d5..cafa05e34 100644 --- a/rpc/api/eth.go +++ b/rpc/api/eth.go @@ -250,7 +250,6 @@ func (self *ethApi) Sign(req *shared.Request) (interface{}, error) { return v, nil } - func (self *ethApi) PushTx(req *shared.Request) (interface{}, error) { args := new(NewDataArgs) if err := self.codec.Decode(req.Params, &args); err != nil { diff --git a/rpc/api/eth_args.go b/rpc/api/eth_args.go index 54eb7201d..02f438f0c 100644 --- a/rpc/api/eth_args.go +++ b/rpc/api/eth_args.go @@ -227,32 +227,32 @@ func (args *GetDataArgs) UnmarshalJSON(b []byte) (err error) { } type NewDataArgs struct { - Data string + Data string } func (args *NewDataArgs) UnmarshalJSON(b []byte) (err error) { - var obj []interface{} + var obj []interface{} - if err := json.Unmarshal(b, &obj); err != nil { - return shared.NewDecodeParamError(err.Error()) - } + if err := json.Unmarshal(b, &obj); err != nil { + return shared.NewDecodeParamError(err.Error()) + } - // Check for sufficient params - if len(obj) < 1 { - return shared.NewInsufficientParamsError(len(obj), 1) - } + // Check for sufficient params + if len(obj) < 1 { + return shared.NewInsufficientParamsError(len(obj), 1) + } - data, ok := obj[0].(string) - if !ok { - return shared.NewInvalidTypeError("data", "not a string") - } - args.Data = data + data, ok := obj[0].(string) + if !ok { + return shared.NewInvalidTypeError("data", "not a string") + } + args.Data = data - if len(args.Data) == 0 { - return shared.NewValidationError("data", "is required") - } + if len(args.Data) == 0 { + return shared.NewValidationError("data", "is required") + } - return nil + return nil } type NewSigArgs struct {