From 0395c174ca5221dd936c19143ced454dac56d54a Mon Sep 17 00:00:00 2001
From: Felix Lange <fjl@twurst.com>
Date: Tue, 10 Mar 2015 14:31:54 +0100
Subject: [PATCH] cmd/ethereum: fix line editing setup and history

---
 cmd/ethereum/js.go | 17 +++++++++++------
 1 file changed, 11 insertions(+), 6 deletions(-)

diff --git a/cmd/ethereum/js.go b/cmd/ethereum/js.go
index de73e83a2..5432fb9b1 100644
--- a/cmd/ethereum/js.go
+++ b/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)) {