gnucash maint: Multiple changes pushed
John Ralls
jralls at code.gnucash.org
Sat Jan 2 18:15:10 EST 2016
Updated via https://github.com/Gnucash/gnucash/commit/a6185b7b (commit)
via https://github.com/Gnucash/gnucash/commit/8e1490d8 (commit)
via https://github.com/Gnucash/gnucash/commit/5e62798d (commit)
via https://github.com/Gnucash/gnucash/commit/ce5c64c6 (commit)
via https://github.com/Gnucash/gnucash/commit/6f68c58f (commit)
via https://github.com/Gnucash/gnucash/commit/c8a447fc (commit)
from https://github.com/Gnucash/gnucash/commit/c2598f89 (commit)
commit a6185b7b02cc9bdd651e2be291f47384cf685614
Author: John Ralls <jralls at ceridwen.us>
Date: Sat Jan 2 15:16:18 2016 -0800
Rename sequence_ctx to temporal_state for consistency and clarity.
diff --git a/src/app-utils/gnc-sx-instance-model.c b/src/app-utils/gnc-sx-instance-model.c
index d8e6a64..d74067e 100644
--- a/src/app-utils/gnc-sx-instance-model.c
+++ b/src/app-utils/gnc-sx-instance-model.c
@@ -377,7 +377,7 @@ _gnc_sx_gen_instances(gpointer *data, gpointer user_data)
const GDate *range_end = (const GDate*)user_data;
GDate creation_end, remind_end;
GDate cur_date;
- SXTmpStateData *sequence_ctx = gnc_sx_create_temporal_state(sx);
+ SXTmpStateData *temporal_state = gnc_sx_create_temporal_state(sx);
instances->sx = sx;
@@ -402,26 +402,26 @@ _gnc_sx_gen_instances(gpointer *data, gpointer user_data)
&inst_date, postponed->data, seq_num);
instances->instance_list =
g_list_append(instances->instance_list, inst);
- gnc_sx_destroy_temporal_state(sequence_ctx);
- sequence_ctx = gnc_sx_clone_temporal_state(postponed->data);
- gnc_sx_incr_temporal_state(sx, sequence_ctx);
+ gnc_sx_destroy_temporal_state(temporal_state);
+ temporal_state = gnc_sx_clone_temporal_state(postponed->data);
+ gnc_sx_incr_temporal_state(sx, temporal_state);
}
}
/* to-create */
g_date_clear(&cur_date, 1);
- cur_date = xaccSchedXactionGetNextInstance(sx, sequence_ctx);
+ cur_date = xaccSchedXactionGetNextInstance(sx, temporal_state);
instances->next_instance_date = cur_date;
while (g_date_valid(&cur_date) && g_date_compare(&cur_date, &creation_end) <= 0)
{
GncSxInstance *inst;
int seq_num;
- seq_num = gnc_sx_get_instance_count(sx, sequence_ctx);
+ seq_num = gnc_sx_get_instance_count(sx, temporal_state);
inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_TO_CREATE,
- &cur_date, sequence_ctx, seq_num);
+ &cur_date, temporal_state, seq_num);
instances->instance_list = g_list_append(instances->instance_list, inst);
- gnc_sx_incr_temporal_state(sx, sequence_ctx);
- cur_date = xaccSchedXactionGetNextInstance(sx, sequence_ctx);
+ gnc_sx_incr_temporal_state(sx, temporal_state);
+ cur_date = xaccSchedXactionGetNextInstance(sx, temporal_state);
}
/* reminders */
@@ -430,13 +430,13 @@ _gnc_sx_gen_instances(gpointer *data, gpointer user_data)
{
GncSxInstance *inst;
int seq_num;
- seq_num = gnc_sx_get_instance_count(sx, sequence_ctx);
+ seq_num = gnc_sx_get_instance_count(sx, temporal_state);
inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_REMINDER,
- &cur_date, sequence_ctx, seq_num);
+ &cur_date, temporal_state, seq_num);
instances->instance_list = g_list_append(instances->instance_list,
inst);
- gnc_sx_incr_temporal_state(sx, sequence_ctx);
- cur_date = xaccSchedXactionGetNextInstance(sx, sequence_ctx);
+ gnc_sx_incr_temporal_state(sx, temporal_state);
+ cur_date = xaccSchedXactionGetNextInstance(sx, temporal_state);
}
return instances;
commit 8e1490d8499aaa0bf2f0bc7c5c8cb283e1834b5e
Author: John Ralls <jralls at ceridwen.us>
Date: Sat Jan 2 15:13:51 2016 -0800
Bug 759570 - Postponing a repeating SX skips over the instance.
Reorder the temporal state creation so that it starts with any postponed
instances.
diff --git a/src/app-utils/gnc-sx-instance-model.c b/src/app-utils/gnc-sx-instance-model.c
index f14714b..d8e6a64 100644
--- a/src/app-utils/gnc-sx-instance-model.c
+++ b/src/app-utils/gnc-sx-instance-model.c
@@ -377,7 +377,7 @@ _gnc_sx_gen_instances(gpointer *data, gpointer user_data)
const GDate *range_end = (const GDate*)user_data;
GDate creation_end, remind_end;
GDate cur_date;
- void *sequence_ctx;
+ SXTmpStateData *sequence_ctx = gnc_sx_create_temporal_state(sx);
instances->sx = sx;
@@ -402,12 +402,14 @@ _gnc_sx_gen_instances(gpointer *data, gpointer user_data)
&inst_date, postponed->data, seq_num);
instances->instance_list =
g_list_append(instances->instance_list, inst);
+ gnc_sx_destroy_temporal_state(sequence_ctx);
+ sequence_ctx = gnc_sx_clone_temporal_state(postponed->data);
+ gnc_sx_incr_temporal_state(sx, sequence_ctx);
}
}
/* to-create */
g_date_clear(&cur_date, 1);
- sequence_ctx = gnc_sx_create_temporal_state(sx);
cur_date = xaccSchedXactionGetNextInstance(sx, sequence_ctx);
instances->next_instance_date = cur_date;
while (g_date_valid(&cur_date) && g_date_compare(&cur_date, &creation_end) <= 0)
commit 5e62798d7285d0a1d1b1c2126c5a73eafeff0da1
Author: John Ralls <jralls at ceridwen.us>
Date: Sat Jan 2 15:12:00 2016 -0800
Fix up some overly-long lines.
diff --git a/src/app-utils/gnc-sx-instance-model.c b/src/app-utils/gnc-sx-instance-model.c
index 54d2be2..f14714b 100644
--- a/src/app-utils/gnc-sx-instance-model.c
+++ b/src/app-utils/gnc-sx-instance-model.c
@@ -398,8 +398,10 @@ _gnc_sx_gen_instances(gpointer *data, gpointer user_data)
g_date_clear(&inst_date, 1);
inst_date = xaccSchedXactionGetNextInstance(sx, postponed->data);
seq_num = gnc_sx_get_instance_count(sx, postponed->data);
- inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_POSTPONED, &inst_date, postponed->data, seq_num);
- instances->instance_list = g_list_append(instances->instance_list, inst);
+ inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_POSTPONED,
+ &inst_date, postponed->data, seq_num);
+ instances->instance_list =
+ g_list_append(instances->instance_list, inst);
}
}
@@ -413,20 +415,24 @@ _gnc_sx_gen_instances(gpointer *data, gpointer user_data)
GncSxInstance *inst;
int seq_num;
seq_num = gnc_sx_get_instance_count(sx, sequence_ctx);
- inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_TO_CREATE, &cur_date, sequence_ctx, seq_num);
+ inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_TO_CREATE,
+ &cur_date, sequence_ctx, seq_num);
instances->instance_list = g_list_append(instances->instance_list, inst);
gnc_sx_incr_temporal_state(sx, sequence_ctx);
cur_date = xaccSchedXactionGetNextInstance(sx, sequence_ctx);
}
/* reminders */
- while (g_date_valid(&cur_date) && g_date_compare(&cur_date, &remind_end) <= 0)
+ while (g_date_valid(&cur_date) &&
+ g_date_compare(&cur_date, &remind_end) <= 0)
{
GncSxInstance *inst;
int seq_num;
seq_num = gnc_sx_get_instance_count(sx, sequence_ctx);
- inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_REMINDER, &cur_date, sequence_ctx, seq_num);
- instances->instance_list = g_list_append(instances->instance_list, inst);
+ inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_REMINDER,
+ &cur_date, sequence_ctx, seq_num);
+ instances->instance_list = g_list_append(instances->instance_list,
+ inst);
gnc_sx_incr_temporal_state(sx, sequence_ctx);
cur_date = xaccSchedXactionGetNextInstance(sx, sequence_ctx);
}
@@ -1324,7 +1330,8 @@ gnc_sx_instance_model_effect_change(GncSxInstanceModel *model,
{
// remove from postponed list
g_assert(inst->temporal_state != NULL);
- gnc_sx_remove_defer_instance(inst->parent->sx, inst->temporal_state);
+ gnc_sx_remove_defer_instance(inst->parent->sx,
+ inst->temporal_state);
}
switch (inst->state)
commit ce5c64c68a014e49077a45a5579183b1139518c7
Author: John Ralls <jralls at ceridwen.us>
Date: Sat Jan 2 15:10:21 2016 -0800
Explicitly type GncSXInstance's temporal state member.
diff --git a/src/app-utils/gnc-sx-instance-model.h b/src/app-utils/gnc-sx-instance-model.h
index e36f473..67fcddc 100644
--- a/src/app-utils/gnc-sx-instance-model.h
+++ b/src/app-utils/gnc-sx-instance-model.h
@@ -101,7 +101,7 @@ typedef struct _GncSxVariable
typedef struct _GncSxInstance
{
GncSxInstances *parent; /**< the parent instances collection. **/
- void *temporal_state; /**< the sx creation temporal state. **/
+ SXTmpStateData *temporal_state; /**< the sx creation temporal state. **/
GncSxInstanceState orig_state; /**< the original state at generation time. **/
GncSxInstanceState state; /**< the current state of the instance (during editing) **/
GDate date; /**< the instance date. **/
commit 6f68c58ffbff373ad5c615898c2a8319d000d077
Author: John Ralls <jralls at ceridwen.us>
Date: Sat Jan 2 15:09:07 2016 -0800
Clean up some noise.
Like casting SXTmpStateData* to SXTmpStateData*.
diff --git a/src/engine/SchedXaction.c b/src/engine/SchedXaction.c
index 5a0d445..1bdcb0b 100644
--- a/src/engine/SchedXaction.c
+++ b/src/engine/SchedXaction.c
@@ -899,20 +899,10 @@ xaccSchedXactionGetNextInstance (const SchedXaction *sx, SXTmpStateData *tsd)
}
else if ( xaccSchedXactionHasOccurDef( sx ) )
{
- if ( stateData )
+ if ((tsd && tsd->num_occur_rem == 0) ||
+ (!tsd && sx->num_occurances_remain == 0 ))
{
- SXTmpStateData *tsd = (SXTmpStateData*)stateData;
- if ( tsd->num_occur_rem == 0 )
- {
- g_date_clear( &next_occur, 1 );
- }
- }
- else
- {
- if ( sx->num_occurances_remain == 0 )
- {
- g_date_clear( &next_occur, 1 );
- }
+ g_date_clear( &next_occur, 1 );
}
}
return next_occur;
@@ -1080,43 +1070,36 @@ gnc_sx_create_temporal_state(const SchedXaction *sx )
}
void
-gnc_sx_incr_temporal_state(const SchedXaction *sx, SXTmpStateData *stateData )
+gnc_sx_incr_temporal_state(const SchedXaction *sx, SXTmpStateData *tsd )
{
- GDate unused;
- SXTmpStateData *tsd = (SXTmpStateData*)stateData;
-
- g_date_clear( &unused, 1 );
- tsd->last_date =
- xaccSchedXactionGetNextInstance (sx, stateData);
- if ( xaccSchedXactionHasOccurDef( sx ) )
+ g_return_if_fail(tsd != NULL);
+ tsd->last_date = xaccSchedXactionGetNextInstance (sx, tsd);
+ if (xaccSchedXactionHasOccurDef (sx))
{
- tsd->num_occur_rem -= 1;
+ --tsd->num_occur_rem;
}
- tsd->num_inst += 1;
+ ++tsd->num_inst;
}
void
-gnc_sx_destroy_temporal_state( SXTmpStateData *stateData )
+gnc_sx_destroy_temporal_state (SXTmpStateData *tsd)
{
- g_free( (SXTmpStateData*)stateData );
+ g_free(tsd);
}
SXTmpStateData*
-gnc_sx_clone_temporal_state( SXTmpStateData *stateData )
+gnc_sx_clone_temporal_state (SXTmpStateData *tsd)
{
- SXTmpStateData *toRet, *tsd;
- tsd = (SXTmpStateData*)stateData;
- toRet = g_memdup( tsd, sizeof( SXTmpStateData ) );
+ SXTmpStateData *toRet;
+ toRet = g_memdup (tsd, sizeof (SXTmpStateData));
return toRet;
}
-static
-gint
+static gint
_temporal_state_data_cmp( gconstpointer a, gconstpointer b )
{
- SXTmpStateData *tsd_a, *tsd_b;
- tsd_a = (SXTmpStateData*)a;
- tsd_b = (SXTmpStateData*)b;
+ const SXTmpStateData *tsd_a = (SXTmpStateData*)a;
+ const SXTmpStateData *tsd_b = (SXTmpStateData*)b;
if ( !tsd_a && !tsd_b )
return 0;
@@ -1143,8 +1126,8 @@ gnc_sx_add_defer_instance( SchedXaction *sx, void *deferStateData )
}
/**
- * Removes an instance from the deferred list. If the instance is no longer
- * useful; gnc_sx_destroy_temporal_state() it.
+ * Removes an instance from the deferred list. The saved SXTmpStateData existed
+ * for comparison only, so destroy it.
**/
void
gnc_sx_remove_defer_instance( SchedXaction *sx, void *deferStateData )
commit c8a447fcff1f48c0bbf0ee4f47a86a71d69c318e
Author: John Ralls <jralls at ceridwen.us>
Date: Sat Jan 2 14:57:12 2016 -0800
Remove xaccSchedXactionGetInstanceAfter
It wasn't being used in a way that distinguished it from
xaccSchedXactionGetNextInstance, which had almost exactly the same code.
diff --git a/src/app-utils/gnc-sx-instance-model.c b/src/app-utils/gnc-sx-instance-model.c
index 5ef62da..54d2be2 100644
--- a/src/app-utils/gnc-sx-instance-model.c
+++ b/src/app-utils/gnc-sx-instance-model.c
@@ -406,7 +406,7 @@ _gnc_sx_gen_instances(gpointer *data, gpointer user_data)
/* to-create */
g_date_clear(&cur_date, 1);
sequence_ctx = gnc_sx_create_temporal_state(sx);
- cur_date = xaccSchedXactionGetInstanceAfter(sx, &cur_date, sequence_ctx);
+ cur_date = xaccSchedXactionGetNextInstance(sx, sequence_ctx);
instances->next_instance_date = cur_date;
while (g_date_valid(&cur_date) && g_date_compare(&cur_date, &creation_end) <= 0)
{
@@ -416,7 +416,7 @@ _gnc_sx_gen_instances(gpointer *data, gpointer user_data)
inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_TO_CREATE, &cur_date, sequence_ctx, seq_num);
instances->instance_list = g_list_append(instances->instance_list, inst);
gnc_sx_incr_temporal_state(sx, sequence_ctx);
- cur_date = xaccSchedXactionGetInstanceAfter(sx, &cur_date, sequence_ctx);
+ cur_date = xaccSchedXactionGetNextInstance(sx, sequence_ctx);
}
/* reminders */
@@ -428,7 +428,7 @@ _gnc_sx_gen_instances(gpointer *data, gpointer user_data)
inst = gnc_sx_instance_new(instances, SX_INSTANCE_STATE_REMINDER, &cur_date, sequence_ctx, seq_num);
instances->instance_list = g_list_append(instances->instance_list, inst);
gnc_sx_incr_temporal_state(sx, sequence_ctx);
- cur_date = xaccSchedXactionGetInstanceAfter(sx, &cur_date, sequence_ctx);
+ cur_date = xaccSchedXactionGetNextInstance(sx, sequence_ctx);
}
return instances;
diff --git a/src/engine/SchedXaction.c b/src/engine/SchedXaction.c
index d4d8232..5a0d445 100644
--- a/src/engine/SchedXaction.c
+++ b/src/engine/SchedXaction.c
@@ -865,105 +865,22 @@ xaccSchedXactionSetAdvanceReminder( SchedXaction *sx, gint reminderDays )
gnc_sx_commit_edit(sx);
}
-
-GDate
-xaccSchedXactionGetNextInstance(const SchedXaction *sx, SXTmpStateData *stateData )
-{
- GDate last_occur, next_occur, tmpDate;
-
- g_date_clear( &last_occur, 1 );
- g_date_clear( &next_occur, 1 );
- g_date_clear( &tmpDate, 1 );
-
- if ( g_date_valid( &sx->last_date ) )
- {
- last_occur = sx->last_date;
- }
-
- if ( stateData != NULL )
- {
- SXTmpStateData *tsd = (SXTmpStateData*)stateData;
- last_occur = tsd->last_date;
- }
-
- if ( g_date_valid( &sx->start_date ) )
- {
- if ( g_date_valid(&last_occur) )
- {
- last_occur =
- ( g_date_compare( &last_occur,
- &sx->start_date ) > 0 ?
- last_occur : sx->start_date );
- }
- else
- {
- /* Think about this for a second, and you realize that if the
- * start date is _today_, we need a last-occur date such that
- * the 'next instance' is after that date, and equal to the
- * start date... one day should be good.
- *
- * This only holds for the first instance [read: if the
- * last[-occur]_date is invalid] */
- last_occur = sx->start_date;
- g_date_subtract_days( &last_occur, 1 );
- }
- }
-
- recurrenceListNextInstance(sx->schedule, &last_occur, &next_occur);
-
- /* out-of-bounds check */
- if ( xaccSchedXactionHasEndDate( sx ) )
- {
- const GDate *end_date = xaccSchedXactionGetEndDate( sx );
- if ( g_date_compare( &next_occur, end_date ) > 0 )
- {
- g_debug("next_occur past end date");
- g_date_clear( &next_occur, 1 );
- }
- }
- else if ( xaccSchedXactionHasOccurDef( sx ) )
- {
- if ( stateData )
- {
- SXTmpStateData *tsd = (SXTmpStateData*)stateData;
- if ( tsd->num_occur_rem == 0 )
- {
- g_debug("no more occurances remain");
- g_date_clear( &next_occur, 1 );
- }
- }
- else
- {
- if ( sx->num_occurances_remain == 0 )
- {
- g_date_clear( &next_occur, 1 );
- }
- }
- }
-
- return next_occur;
-}
-
GDate
-xaccSchedXactionGetInstanceAfter( const SchedXaction *sx,
- GDate *date,
- SXTmpStateData *stateData )
+xaccSchedXactionGetNextInstance (const SchedXaction *sx, SXTmpStateData *tsd)
{
GDate prev_occur, next_occur;
g_date_clear( &prev_occur, 1 );
- if ( date )
- {
- prev_occur = *date;
- }
-
- if ( stateData != NULL )
- {
- SXTmpStateData *tsd = (SXTmpStateData*)stateData;
+ if ( tsd != NULL )
prev_occur = tsd->last_date;
- }
- if ( ! g_date_valid( &prev_occur ) )
+ /* If prev_occur is in the "cleared" state and sx->start_date isn't, then
+ * we're at the beginning. We want to pretend prev_occur is the day before
+ * the start_date in case the start_date is today so that the SX will fire
+ * today. If start_date isn't valid either then the SX will fire anyway, no
+ * harm done.
+ */
+ if (! g_date_valid( &prev_occur ) && g_date_valid(&sx->start_date))
{
/* We must be at the beginning. */
prev_occur = sx->start_date;
@@ -1170,9 +1087,7 @@ gnc_sx_incr_temporal_state(const SchedXaction *sx, SXTmpStateData *stateData )
g_date_clear( &unused, 1 );
tsd->last_date =
- xaccSchedXactionGetInstanceAfter( sx,
- &unused,
- stateData );
+ xaccSchedXactionGetNextInstance (sx, stateData);
if ( xaccSchedXactionHasOccurDef( sx ) )
{
tsd->num_occur_rem -= 1;
diff --git a/src/engine/SchedXaction.h b/src/engine/SchedXaction.h
index 08031e1..93f0d1e 100644
--- a/src/engine/SchedXaction.h
+++ b/src/engine/SchedXaction.h
@@ -269,10 +269,8 @@ SXTmpStateData *gnc_sx_clone_temporal_state( SXTmpStateData *stateData );
* for possible action without modifying the SX state until action is
* actually taken.
*/
-GDate xaccSchedXactionGetNextInstance(const SchedXaction *sx, SXTmpStateData *stateData );
-GDate xaccSchedXactionGetInstanceAfter(const SchedXaction *sx,
- GDate *date,
- SXTmpStateData *stateData );
+GDate xaccSchedXactionGetNextInstance(const SchedXaction *sx,
+ SXTmpStateData *stateData);
/** \brief Set the schedxaction's template transaction.
Summary of changes:
src/app-utils/gnc-sx-instance-model.c | 41 +++++----
src/app-utils/gnc-sx-instance-model.h | 2 +-
src/engine/SchedXaction.c | 158 ++++++----------------------------
src/engine/SchedXaction.h | 6 +-
4 files changed, 56 insertions(+), 151 deletions(-)
More information about the gnucash-changes
mailing list