Ver Fonte

cmd/ethereum: fix line editing setup and history

Felix Lange há 10 anos atrás
pai
commit
0395c174ca
1 ficheiros alterados com 11 adições e 6 exclusões
  1. 11 6
      cmd/ethereum/js.go

+ 11 - 6
cmd/ethereum/js.go

@@ -63,6 +63,7 @@ type jsre struct {
 	ethereum *eth.Ethereum
 	xeth     *xeth.XEth
 	ps1      string
+	atexit   func()
 
 	prompter
 }
@@ -77,11 +78,13 @@ func newJSRE(ethereum *eth.Ethereum) *jsre {
 		js.prompter = dumbterm{bufio.NewReader(os.Stdin)}
 	} else {
 		lr := liner.NewLiner()
-		lr.SetCtrlCAborts(true)
-		defer lr.Close()
 		js.withHistory(func(hist *os.File) { lr.ReadHistory(hist) })
-		defer js.withHistory(func(hist *os.File) { hist.Truncate(0); lr.WriteHistory(hist) })
+		lr.SetCtrlCAborts(true)
 		js.prompter = lr
+		js.atexit = func() {
+			js.withHistory(func(hist *os.File) { hist.Truncate(0); lr.WriteHistory(hist) })
+			lr.Close()
+		}
 	}
 	return js
 }
@@ -100,7 +103,6 @@ func (self *jsre) UnlockAccount(addr []byte) bool {
 	}
 	// TODO: allow retry
 	if err := self.ethereum.AccountManager().Unlock(addr, pass); err != nil {
-		fmt.Println("Unlocking failed: ", err)
 		return false
 	} else {
 		fmt.Println("Account is now unlocked for this session.")
@@ -127,7 +129,7 @@ func (self *jsre) interactive() {
 	for {
 		input, err := self.Prompt(self.ps1)
 		if err != nil {
-			return
+			break
 		}
 		if input == "" {
 			continue
@@ -136,7 +138,7 @@ func (self *jsre) interactive() {
 		self.setIndent()
 		if indentCount <= 0 {
 			if input == "exit" {
-				return
+				break
 			}
 			hist := str[:len(str)-1]
 			self.AppendHistory(hist)
@@ -144,6 +146,9 @@ func (self *jsre) interactive() {
 			str = ""
 		}
 	}
+	if self.atexit != nil {
+		self.atexit()
+	}
 }
 
 func (self *jsre) withHistory(op func(*os.File)) {