Attribute more diagnostic messages

This commit is contained in:
Neil Booth 2015-09-06 22:04:44 +09:00
parent 93b99ebded
commit 39615333c0
2 changed files with 32 additions and 28 deletions

View File

@ -37,8 +37,8 @@ from electrum.bitcoin import MIN_RELAY_TX_FEE, COIN, is_valid
from electrum.plugins import run_hook
from electrum.i18n import _
from electrum.util import block_explorer, block_explorer_info, block_explorer_URL
from electrum.util import print_error, print_msg
from electrum.util import format_satoshis, format_satoshis_plain, format_time, NotEnoughFunds, StoreDict
from electrum.util import format_satoshis, format_satoshis_plain, format_time
from electrum.util import PrintError, NotEnoughFunds, StoreDict
from electrum import Transaction
from electrum import mnemonic
from electrum import util, bitcoin, commands, Wallet
@ -105,7 +105,7 @@ expiration_values = [
class ElectrumWindow(QMainWindow):
class ElectrumWindow(QMainWindow, PrintError):
labelsChanged = pyqtSignal()
def __init__(self, config, network, gui_object):
@ -184,6 +184,10 @@ class ElectrumWindow(QMainWindow):
self.require_fee_update = False
self.tx_notifications = []
def diagnostic_name(self):
return "%s/%s" % (PrintError.diagnostic_name(self),
self.wallet.basename() if self.wallet else "None")
def is_hidden(self):
return self.isMinimized() or self.isHidden()
@ -228,7 +232,7 @@ class ElectrumWindow(QMainWindow):
def close_wallet(self):
if self.wallet:
print_error('close_wallet', self.wallet.storage.path)
self.print_error('close_wallet', self.wallet.storage.path)
self.wallet.storage.put('accounts_expanded', self.accounts_expanded)
self.wallet.stop_threads()
run_hook('close_wallet')
@ -417,7 +421,7 @@ class ElectrumWindow(QMainWindow):
def notify_transactions(self):
if not self.network or not self.network.is_connected():
return
print_error("Notifying GUI")
self.print_error("Notifying GUI")
if len(self.tx_notifications) > 0:
# Combine the transactions if there are more then three
tx_amount = len(self.tx_notifications)
@ -2855,7 +2859,7 @@ class ElectrumWindow(QMainWindow):
msg += '\n\n' + _('Requires') + ':\n' + '\n'.join(map(lambda x: x[1], descr.get('requires')))
grid.addWidget(HelpButton(msg), i, 2)
except Exception:
print_msg("Error: cannot display plugin", name)
self.print_msg("error: cannot display plugin", name)
traceback.print_exc(file=sys.stdout)
grid.setRowStretch(i+1,1)
vbox.addLayout(Buttons(CloseButton(d)))

View File

@ -16,20 +16,17 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import sys
import os
import hashlib
import ast
import threading
import random
import time
import math
import json
import copy
from operator import itemgetter
from util import print_msg, print_error, NotEnoughFunds
from util import profiler
from util import NotEnoughFunds, PrintError, profiler
from bitcoin import *
from account import *
@ -49,14 +46,14 @@ import paymentrequest
IMPORTED_ACCOUNT = '/x'
class WalletStorage(object):
class WalletStorage(PrintError):
def __init__(self, path):
self.lock = threading.RLock()
self.data = {}
self.path = path
self.file_exists = False
print_error( "wallet path", self.path )
self.print_error("wallet path", self.path)
if self.path:
self.read(self.path)
@ -87,7 +84,7 @@ class WalletStorage(object):
json.dumps(key)
json.dumps(value)
except:
print_error('Failed to convert label to json format', key)
self.print_error('Failed to convert label to json format', key)
continue
self.data[key] = value
self.file_exists = True
@ -106,7 +103,7 @@ class WalletStorage(object):
json.dumps(key)
json.dumps(value)
except:
print_error("json error: cannot save", key)
self.print_error("json error: cannot save", key)
return
with self.lock:
if value is not None:
@ -136,7 +133,7 @@ class WalletStorage(object):
class Abstract_Wallet(object):
class Abstract_Wallet(PrintError):
"""
Wallet classes are created to handle various address generation methods.
Completion states (watching-only, single account, no seed, etc) are handled inside classes.
@ -191,6 +188,9 @@ class Abstract_Wallet(object):
if self.storage.get('wallet_type') is None:
self.storage.put('wallet_type', self.wallet_type, True)
def diagnostic_name(self):
return self.basename()
@profiler
def load_transactions(self):
self.txi = self.storage.get('txi', {})
@ -202,7 +202,7 @@ class Abstract_Wallet(object):
tx = Transaction(raw)
self.transactions[tx_hash] = tx
if self.txi.get(tx_hash) is None and self.txo.get(tx_hash) is None and (tx_hash not in self.pruned_txo.values()):
print_error("removing unreferenced tx", tx_hash)
self.print_error("removing unreferenced tx", tx_hash)
self.transactions.pop(tx_hash)
@profiler
@ -291,7 +291,7 @@ class Abstract_Wallet(object):
except:
pass
else:
print_error("cannot load account", v)
self.print_error("cannot load account", v)
def synchronize(self):
pass
@ -689,7 +689,7 @@ class Abstract_Wallet(object):
for addr, l in dd.items():
for n, v, is_cb in l:
if n == prevout_n:
print_error("found pay-to-pubkey address:", addr)
self.print_error("found pay-to-pubkey address:", addr)
return addr
def add_transaction(self, tx_hash, tx):
@ -745,7 +745,7 @@ class Abstract_Wallet(object):
def remove_transaction(self, tx_hash):
with self.transaction_lock:
print_error("removing tx from history", tx_hash)
self.print_error("removing tx from history", tx_hash)
#tx = self.transactions.pop(tx_hash)
for ser, hh in self.pruned_txo.items():
if hh == tx_hash:
@ -841,7 +841,7 @@ class Abstract_Wallet(object):
# fixme: this may happen if history is incomplete
if balance not in [None, 0]:
print_error("Error: history not synchronized")
self.print_error("Error: history not synchronized")
return []
return h2
@ -930,7 +930,7 @@ class Abstract_Wallet(object):
fee = fixed_fee if fixed_fee is not None else self.estimated_fee(tx, fee_per_kb)
continue
break
print_error("using %d inputs"%len(tx.inputs))
self.print_error("using %d inputs"%len(tx.inputs))
# change address
if not change_addr:
@ -963,11 +963,11 @@ class Abstract_Wallet(object):
change_amount = total - ( amount + fee )
if change_amount > DUST_THRESHOLD:
tx.outputs.append(('address', change_addr, change_amount))
print_error('change', change_amount)
self.print_error('change', change_amount)
else:
print_error('not keeping dust', change_amount)
self.print_error('not keeping dust', change_amount)
else:
print_error('not keeping dust', change_amount)
self.print_error('not keeping dust', change_amount)
# Sort the inputs and outputs deterministically
tx.BIP_LI01_sort()
@ -1100,7 +1100,7 @@ class Abstract_Wallet(object):
vr = self.verified_tx.keys() + self.unverified_tx.keys()
for tx_hash in self.transactions.keys():
if tx_hash not in vr:
print_error("removing transaction", tx_hash)
self.print_error("removing transaction", tx_hash)
self.transactions.pop(tx_hash)
def start_threads(self, network):
@ -1743,19 +1743,19 @@ class BIP32_HD_Wallet(BIP32_Wallet):
self.next_account = self.get_next_account(None)
self.storage.put('next_account2', self.next_account)
except:
print_error('cannot get next account')
self.print_error('cannot get next account')
# check pending account
if self.next_account is not None:
next_id, next_xpub, next_pubkey, next_address = self.next_account
if self.address_is_old(next_address):
print_error("creating account", next_id)
self.print_error("creating account", next_id)
self.add_account(next_id, BIP32_Account({'xpub':next_xpub}))
# here the user should get a notification
self.next_account = None
self.storage.put('next_account2', self.next_account)
elif self.history.get(next_address, []):
if next_id not in self.accounts:
print_error("create pending account", next_id)
self.print_error("create pending account", next_id)
self.accounts[next_id] = PendingAccount({'pending':True, 'address':next_address, 'pubkey':next_pubkey})
self.save_accounts()