<pre style='margin:0'>
Umesh Singla (umeshksingla) pushed a commit to branch gsoc17-migrate
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/0858538206982959ba4a15e2a9917c0d7ce2806d">https://github.com/macports/macports-base/commit/0858538206982959ba4a15e2a9917c0d7ce2806d</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 0858538206982959ba4a15e2a9917c0d7ce2806d
</span>Author: Umesh Singla <umeshksingla@macports.org>
AuthorDate: Sat Aug 26 02:01:13 2017 +0530

<span style='display:block; white-space:pre;color:#404040;'>    Add documentation for snapshot files
</span>---
 src/cregistry/snapshot.c      | 64 ++++++++++++++++++++++++++++++++++++++-----
 src/cregistry/snapshot.h      | 26 ++++++++++++------
 src/registry2.0/snapshot.c    | 20 +++++++-------
 src/registry2.0/snapshot.h    |  1 +
 src/registry2.0/snapshotobj.c |  1 +
 src/registry2.0/snapshotobj.h |  1 +
 6 files changed, 87 insertions(+), 26 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/cregistry/snapshot.c b/src/cregistry/snapshot.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 918b038..24cd878 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/cregistry/snapshot.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/cregistry/snapshot.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -40,6 +40,16 @@
</span> #include <stdlib.h>
 #include <string.h>
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * helper to parse variants into 'struct variant' form
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] variants_str     the string to parse the variants from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] delim            delimiter '+' for +ve variants, else '-'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] all_variants    list of 'struct variant's
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] variant_count   count of variants parsed till now
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @return                      false
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> int get_parsed_variants(char* variants_str, variant* all_variants,
     char* delim, int* variant_count) {
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -52,17 +62,20 @@ int get_parsed_variants(char* variants_str, variant* all_variants,
</span> 
         *(all_variants + *variant_count) = v;
         *variant_count = *variant_count + 1;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        // all_variants = (variant*) realloc(all_variants, sizeof(variant));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        // if(!all_variants) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        //     return -1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        // }
</span>     }
 
     return 0;
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Creates a new snapshot in the snapshots registry.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] reg      the registry to create the entry in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] note     any note/details to identify the snapshot by the user
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        if not time
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] errPtr  on error, a description of the error that occurred
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @return              the snapshot if success; NULL if failure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span> reg_snapshot* reg_snapshot_create(reg_registry* reg, char* note, reg_error* errPtr) {
 
     sqlite3_stmt* stmt = NULL;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -112,6 +125,14 @@ reg_snapshot* reg_snapshot_create(reg_registry* reg, char* note, reg_error* errP
</span>     return snapshot;
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * helper method for storing ports for this snapshot
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] reg          associated registry
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] snapshot     reg_snapshot, its id to use for foreignkey'ing the ports
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] errPtr      on error, a description of the error that occurred
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @return                  true if success; 0 if failure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span> int snapshot_store_ports(reg_registry* reg, reg_snapshot* snapshot, reg_error* errPtr){
     reg_entry** entries;
     reg_error error;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -190,6 +211,16 @@ int snapshot_store_ports(reg_registry* reg, reg_snapshot* snapshot, reg_error* e
</span>     return result;
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * helper method for storing variants for a port in a snapshot
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] reg                  associated registry
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] port_entry           registry.ports port to get current variants to store
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                    and not snapshot_port
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] snapshot_port_id     sqlite_int64 id of the port in snapshot_ports table
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] errPtr              on error, a description of the error that occurred
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @return                          true if success; 0 if failure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span> int snapshot_store_port_variants(reg_registry* reg, reg_entry* port_entry,
     int snapshot_ports_id, reg_error* errPtr) {
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -204,7 +235,7 @@ int snapshot_store_port_variants(reg_registry* reg, reg_entry* port_entry,
</span>     if(reg_entry_propget(port_entry, key1, &positive_variants_str, &error)
         && reg_entry_propget(port_entry, key2, &negative_variants_str, &error)) {
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        int variant_space = 10;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        int variant_space = 100;
</span>         variant* all_variants = (variant*) malloc(variant_space * sizeof(variant));
 
         if (all_variants == NULL) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -260,6 +291,14 @@ int snapshot_store_port_variants(reg_registry* reg, reg_entry* port_entry,
</span>     return result;
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * reg_snapshot_ports_get: Gets the ports of a snapshot.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] snapshot   snapshot to get property from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] ports     ports in the 'struct port' form defined in snapshot.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] errPtr    on error, a description of the error that occurred
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @return                port_count if success; -1 if failure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span> int reg_snapshot_ports_get(reg_snapshot* snapshot, port*** ports, reg_error* errPtr) {
 
     reg_registry* reg = snapshot->reg;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -312,10 +351,12 @@ int reg_snapshot_ports_get(reg_snapshot* snapshot, port*** ports, reg_error* err
</span>                     }
                     int variant_count = reg_snapshot_ports_get_helper(reg, snapshot_port_id, &variants, errPtr);
                     current_port->variant_count = variant_count;
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>                     char* variantstr = NULL;
                     if (current_port->variant_count > 0) {
                         int j;
                         variantstr = NULL;
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                        // construct the variant string in the form '+var1-var2+var3'
</span>                         for(j = 0; j < current_port->variant_count; j++) {
                             if (asprintf(&variantstr, "%s%s",
                                     (*variants)[j].variant_sign,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -370,6 +411,15 @@ int reg_snapshot_ports_get(reg_snapshot* snapshot, port*** ports, reg_error* err
</span>     }
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * reg_snapshot_ports_get_helper: Gets the variants of a port in snapshot.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] reg                  associated registry
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [in] snapshot_port_id     sqlite_int64 id of the port in snapshot_ports table
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] variants            variants in the 'struct variant' form in snapshot.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param [out] errPtr              on error, a description of the error that occurred
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @return                          variant_count if success; -1 if failure
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span> int reg_snapshot_ports_get_helper(reg_registry* reg, sqlite_int64 snapshot_port_id,
     variant*** variants, reg_error* errPtr) {
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/cregistry/snapshot.h b/src/cregistry/snapshot.h
</span><span style='display:block; white-space:pre;color:#808080;'>index 5633199..3854e0e 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/cregistry/snapshot.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/cregistry/snapshot.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -25,6 +25,7 @@
</span>  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #ifndef _CSNAPSHOT_H
 #define _CSNAPSHOT_H
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -37,41 +38,48 @@
</span> 
 #include <sqlite3.h>
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+// TODO: extend it to support requested variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> typedef struct {
     char* variant_name;
     char* variant_sign;
 } variant;
 
 typedef struct {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    char* name;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    int requested;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    char* state;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    int variant_count;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    char* variants;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    char* name;     /* port name */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    int requested;  /* 1 if port os requested, else 0 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    char* state;    /* 'imaged' or 'installed' */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    int variant_count;  /* total number of variants */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    char* variants; /* string of the form: +var1-var2+var3 */
</span> } port;
 
 typedef struct {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    sqlite_int64 id; /* rowid in database */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    sqlite_int64 id; /* rowid of snapshot in 'registry.snapshots' table */
</span>     char* note;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    port* ports;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    port* ports;    /* list of ports present while taking this snapshot */
</span>     reg_registry* reg; /* associated registry */
     char* proc; /* name of Tcl proc, if using Tcl */
 } reg_snapshot;
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// helper to parse variants into 'struct variant' form
</span> int get_parsed_variants(char* variants_str, variant* all_variants,
     char* delim, int* variant_count);
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+// create snapshot method
</span> reg_snapshot* reg_snapshot_create(reg_registry* reg, char* note,
         reg_error* errPtr);
<span style='display:block; white-space:pre;background:#e0ffe0;'>+// helper method for storing ports for this snapshot
</span> int snapshot_store_ports(reg_registry* reg, reg_snapshot* snapshot,
         reg_error* errPtr);
<span style='display:block; white-space:pre;background:#e0ffe0;'>+// helper method for storing variants for a port in a snapshot
</span> int snapshot_store_port_variants(reg_registry* reg, reg_entry* port_entry,
         int snapshot_ports_id, reg_error* errPtr);
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+// snapshot properties retrieval methods
</span> int reg_snapshot_propget(reg_snapshot* snapshot, char* key, char** value,
         reg_error* errPtr);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-int reg_snapshot_ports_get(reg_snapshot* snapshot, port*** ports, reg_error* errPtr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int reg_snapshot_ports_get(reg_snapshot* snapshot, port*** ports,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        reg_error* errPtr);
</span> int reg_snapshot_ports_get_helper(reg_registry* reg,
         sqlite_int64 snapshot_port_id, variant*** variants, reg_error* errPtr);
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/snapshot.c b/src/registry2.0/snapshot.c
</span><span style='display:block; white-space:pre;color:#808080;'>index bbeb56c..8213feb 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/snapshot.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/snapshot.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,5 +1,6 @@
</span> /*
  * snapshot.c
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ * vim:tw=80:expandtab
</span>  *
  * Copyright (c) 2017 The MacPorts Project
  * All rights reserved.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -57,7 +58,7 @@ static reg_snapshot* get_snapshot(Tcl_Interp* interp, char* name, reg_error* err
</span> /**
  * Removes the snapshot from the Tcl interpreter. Doesn't actually delete it since
  * that's the registry's job. This is written to be used as the
<span style='display:block; white-space:pre;background:#ffe0e0;'>- * `Tcl_CmdDeleteProc` for an snapshot object command.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * `Tcl_CmdDeleteProc` for a snapshot object command.
</span>  *
  * @param [in] clientData address of a reg_snapshot to remove
  */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -67,9 +68,11 @@ void delete_snapshot(ClientData clientData) {
</span>     snapshot->proc = NULL;
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-static int create_snapshot(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[]) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    printf("inside 2.0 snapshot\n");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * registry::snaphot create note
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * note is required
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static int snapshot_create(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[]) {
</span> 
     reg_registry* reg = registry_for(interp, reg_attached);
     if (objc > 3) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -80,7 +83,6 @@ static int create_snapshot(Tcl_Interp* interp, int objc, Tcl_Obj* CONST objv[])
</span>     } else {
         char* note = Tcl_GetString(objv[2]);
         reg_error error;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        /* may be a new datatype for snapshot */
</span>         reg_snapshot* new_snaphot = reg_snapshot_create(reg, note, &error);
         if (new_snaphot != NULL) {
             Tcl_Obj* result;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -126,17 +128,15 @@ typedef struct {
</span> 
 static snapshot_cmd_type snapshot_cmds[] = {
     /* Global commands */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    { "create", create_snapshot},
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-//    { "get_by_id", get_snapshot_by_id},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    { "create", snapshot_create},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    // { "get_by_id", get_snapshot_by_id},
</span>     { NULL, NULL }
 };
 
 /*
  * registry::snapshot cmd ?arg ...?
  *
<span style='display:block; white-space:pre;background:#ffe0e0;'>- * Commands manipulating snapshots in the registry. This could be called
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * `registry::port`, but that could be misleading, because `registry::item`
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * represents ports too, but not those in the registry.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Commands manipulating snapshots in the registry.
</span>  */
 int snapshot_cmd(ClientData clientData UNUSED, Tcl_Interp* interp, int objc,
         Tcl_Obj* CONST objv[]) {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/snapshot.h b/src/registry2.0/snapshot.h
</span><span style='display:block; white-space:pre;color:#808080;'>index c602c45..e262065 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/snapshot.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/snapshot.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -25,6 +25,7 @@
</span>  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #ifndef _SNAPSHOT_H
 #define _SNAPSHOT_H
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/snapshotobj.c b/src/registry2.0/snapshotobj.c
</span><span style='display:block; white-space:pre;color:#808080;'>index e3fe714..957b691 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/snapshotobj.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/snapshotobj.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,5 +1,6 @@
</span> /*
  * snapshotobj.c
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ * vim:tw=80:expandtab
</span>  *
  * Copyright (c) 2017 The MacPorts Project
  * All rights reserved.
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/snapshotobj.h b/src/registry2.0/snapshotobj.h
</span><span style='display:block; white-space:pre;color:#808080;'>index cced20a..1946ebe 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/snapshotobj.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/snapshotobj.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -25,6 +25,7 @@
</span>  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #ifndef _SNAPSHOT_OBJ_CMD_H
 #define _SNAPSHOT_OBJ_CMD_H
 
</pre><pre style='margin:0'>

</pre>