diff --git a/src/register/ledger-core/split-register-control.c b/src/register/ledger-core/split-register-control.c index 315c94ec3c..0b168a99f4 100644 --- a/src/register/ledger-core/split-register-control.c +++ b/src/register/ledger-core/split-register-control.c @@ -712,10 +712,11 @@ gnc_split_register_auto_completion (SplitRegister *reg, info->blank_split_guid = *xaccSplitGetGUID(blank_split); } - if ((pending_trans != NULL) && (pending_trans != trans)) - if (xaccTransIsOpen (pending_trans)) - xaccTransCommitEdit (pending_trans); - + if ((pending_trans != NULL) && (pending_trans != trans)) { + if (xaccTransIsOpen (pending_trans)) + xaccTransCommitEdit (pending_trans); + else g_assert_not_reached(); + } pending_trans = trans; info->pending_trans_guid = *xaccTransGetGUID (pending_trans); diff --git a/src/register/ledger-core/split-register-load.c b/src/register/ledger-core/split-register-load.c index c483f8a92c..c0165a4939 100644 --- a/src/register/ledger-core/split-register-load.c +++ b/src/register/ledger-core/split-register-load.c @@ -235,7 +235,17 @@ gnc_split_register_load (SplitRegister *reg, GList * slist, xaccTransSetDateSecs (new_trans, info->last_date_entered); blank_split = xaccMallocSplit (gnc_get_current_book ()); xaccSplitSetParent(blank_split, new_trans); - xaccTransCommitEdit (new_trans); + /* We don't want to commit this transaction yet, because the split + doesn't even belong to an account yet. But, we don't want to + set this transaction as the pending transaction either, because + we want to pretend that it hasn't been changed. We depend on + some other code (somewhere) to commit this transaction if we + really edit it, even though it's not marked as the pending + transaction. */ + + /* Wouldn't it be a bug to open this transaction if there was already a + pending transaction? */ + g_assert(pending_trans == NULL); info->blank_split_guid = *xaccSplitGetGUID (blank_split); info->blank_split_edited = FALSE; @@ -515,11 +525,13 @@ gnc_split_register_load (SplitRegister *reg, GList * slist, * from the account. */ if (!found_pending) { - if (xaccTransIsOpen (pending_trans)) - xaccTransCommitEdit (pending_trans); + if (xaccTransIsOpen (pending_trans)) + xaccTransCommitEdit (pending_trans); + else if (pending_trans) + g_assert_not_reached(); - info->pending_trans_guid = *guid_null (); - pending_trans = NULL; + info->pending_trans_guid = *guid_null (); + pending_trans = NULL; } /* Set up the hint transaction, split, transaction split, and column. */ diff --git a/src/register/ledger-core/split-register.c b/src/register/ledger-core/split-register.c index 26cd8b9e70..1134f430bb 100644 --- a/src/register/ledger-core/split-register.c +++ b/src/register/ledger-core/split-register.c @@ -1008,7 +1008,8 @@ gnc_split_register_unvoid_current_trans (SplitRegister *reg) } void -gnc_split_register_empty_current_trans_except_split (SplitRegister *reg, Split *split) +gnc_split_register_empty_current_trans_except_split (SplitRegister *reg, + Split *split) { SRInfo *info; Transaction *trans; @@ -1028,7 +1029,9 @@ gnc_split_register_empty_current_trans_except_split (SplitRegister *reg, Split * i++; } - /* This is now the pending transaction */ + /* This is now the pending transaction */ + g_assert(xaccTransLookup(&info->pending_trans_guid, + gnc_get_current_book()) == NULL); info = gnc_split_register_get_info (reg); info->pending_trans_guid = *xaccTransGetGUID(trans); @@ -1338,13 +1341,24 @@ gnc_split_register_save (SplitRegister *reg, gboolean do_commit) blank_split = NULL; } else - return FALSE; + return FALSE; /* nothing to do */ } else if (!xaccTransIsOpen (trans)) return FALSE; - if (xaccTransIsOpen (trans)) - xaccTransCommitEdit (trans); + /* CAS: The code here used to unconditionally commit any open + transaction. But, even if it's open, what if it was opened by + someone else? I've made it so we only commit if we began the + edit. */ + if (xaccTransIsOpen (trans)) { + if (trans == pending_trans) { + info->pending_trans_guid = *guid_null (); + PINFO("commiting trans (%p)", trans); + xaccTransCommitEdit (trans); + } else { + DEBUG("trans (%p) != pending (%p)", trans, pending_trans); + } + } if (pending_trans == trans) { @@ -1373,9 +1387,16 @@ gnc_split_register_save (SplitRegister *reg, gboolean do_commit) /* determine whether we should commit the pending transaction */ if (pending_trans != trans) { - if (xaccTransIsOpen (pending_trans)) - xaccTransCommitEdit (pending_trans); - + // FIXME: How could the pending transaction not be open? + // FIXME: For that matter, how could an open pending + // transaction ever not be the current trans? + if (xaccTransIsOpen (pending_trans)) { + g_message("Impossible? commiting pending %p", pending_trans); + xaccTransCommitEdit (pending_trans); + } else if (pending_trans) + g_assert_not_reached(); + + PINFO("beginning edit of trans %p", trans); xaccTransBeginEdit (trans); pending_trans = trans; info->pending_trans_guid = *xaccTransGetGUID(trans); @@ -1421,10 +1442,10 @@ gnc_split_register_save (SplitRegister *reg, gboolean do_commit) { SRSaveData *sd; - sd = gnc_split_register_save_data_new (trans, split, - (info->trans_expanded || - reg->style == REG_STYLE_AUTO_LEDGER || - reg->style == REG_STYLE_JOURNAL)); + sd = gnc_split_register_save_data_new ( + trans, split, (info->trans_expanded || + reg->style == REG_STYLE_AUTO_LEDGER || + reg->style == REG_STYLE_JOURNAL)); gnc_table_save_cells (reg->table, sd); gnc_split_register_save_data_destroy (sd); } @@ -2371,6 +2392,7 @@ gnc_split_register_cleanup (SplitRegister *reg) { if (xaccTransIsOpen (pending_trans)) xaccTransCommitEdit (pending_trans); + else g_assert_not_reached(); info->pending_trans_guid = *guid_null (); pending_trans = NULL;