From 3c5329599c6a07176fb80848f8592c5f90944a31 Mon Sep 17 00:00:00 2001
From: Bas van Kervel <bas@ethdev.com>
Date: Thu, 7 Apr 2016 13:48:24 +0200
Subject: [PATCH] cmd/geth: add JS preload parameter

---
 cmd/geth/js.go     | 18 ++++++++++++++++++
 cmd/geth/main.go   | 15 +++++++++++++++
 cmd/geth/usage.go  |  1 +
 cmd/utils/flags.go |  4 ++++
 4 files changed, 38 insertions(+)

diff --git a/cmd/geth/js.go b/cmd/geth/js.go
index a4b14d7b1..b01fd7e36 100644
--- a/cmd/geth/js.go
+++ b/cmd/geth/js.go
@@ -27,6 +27,7 @@ import (
 	"sort"
 	"strings"
 
+	"github.com/codegangsta/cli"
 	"github.com/ethereum/go-ethereum/cmd/utils"
 	"github.com/ethereum/go-ethereum/common"
 	"github.com/ethereum/go-ethereum/common/registrar"
@@ -331,6 +332,23 @@ func (self *jsre) UnlockAccount(addr []byte) bool {
 	}
 }
 
+// preloadJSFiles loads JS files that the user has specified with ctx.PreLoadJSFlag into
+// the JSRE. If not all files could be loaded it will return an error describing the error.
+func (self *jsre) preloadJSFiles(ctx *cli.Context) error {
+	if ctx.GlobalString(utils.PreLoadJSFlag.Name) != "" {
+		assetPath := ctx.GlobalString(utils.JSpathFlag.Name)
+		jsFiles := strings.Split(ctx.GlobalString(utils.PreLoadJSFlag.Name), ",")
+		for _, file := range jsFiles {
+			filename := common.AbsolutePath(assetPath, strings.TrimSpace(file))
+			if err := self.re.Exec(filename); err != nil {
+				return fmt.Errorf("%s: %v", file, err)
+			}
+		}
+	}
+	return nil
+}
+
+// exec executes the JS file with the given filename and stops the JSRE
 func (self *jsre) exec(filename string) error {
 	if err := self.re.Exec(filename); err != nil {
 		self.re.Stop(false)
diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index 645743c13..c0a7ba318 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -331,6 +331,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/Javascipt-Conso
 		utils.IPCApiFlag,
 		utils.IPCPathFlag,
 		utils.ExecFlag,
+		utils.PreLoadJSFlag,
 		utils.WhisperEnabledFlag,
 		utils.DevModeFlag,
 		utils.TestNetFlag,
@@ -427,6 +428,13 @@ func attach(ctx *cli.Context) {
 		true,
 	)
 
+	// preload user defined JS files into the console
+	err = repl.preloadJSFiles(ctx)
+	if err != nil {
+		utils.Fatalf("unable to preload JS file %v", err)
+	}
+
+	// in case the exec flag holds a JS statement execute it and return
 	if ctx.GlobalString(utils.ExecFlag.Name) != "" {
 		repl.batch(ctx.GlobalString(utils.ExecFlag.Name))
 	} else {
@@ -477,6 +485,13 @@ func console(ctx *cli.Context) {
 		ctx.GlobalString(utils.RPCCORSDomainFlag.Name),
 		client, true)
 
+	// preload user defined JS files into the console
+	err = repl.preloadJSFiles(ctx)
+	if err != nil {
+		utils.Fatalf("unable to preload JS file %v", err)
+	}
+
+	// in case the exec flag holds a JS statement execute it and return
 	if script := ctx.GlobalString(utils.ExecFlag.Name); script != "" {
 		repl.batch(script)
 	} else {
diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go
index e2adf7305..5d36b5b1d 100644
--- a/cmd/geth/usage.go
+++ b/cmd/geth/usage.go
@@ -101,6 +101,7 @@ var AppHelpFlagGroups = []flagGroup{
 			utils.RPCCORSDomainFlag,
 			utils.JSpathFlag,
 			utils.ExecFlag,
+			utils.PreLoadJSFlag,
 		},
 	},
 	{
diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go
index 2f10938e3..4822a47f7 100644
--- a/cmd/utils/flags.go
+++ b/cmd/utils/flags.go
@@ -296,6 +296,10 @@ var (
 		Name:  "exec",
 		Usage: "Execute JavaScript statement (only in combination with console/attach)",
 	}
+	PreLoadJSFlag = cli.StringFlag{
+		Name:  "preload",
+		Usage: "Comma separated list of JavaScript files to preload into the console",
+	}
 
 	// Network Settings
 	MaxPeersFlag = cli.IntFlag{
-- 
GitLab