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