<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/8925321a9a0cfb46c86f29bdd40de1594d341e2b">https://github.com/macports/macports-base/commit/8925321a9a0cfb46c86f29bdd40de1594d341e2b</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 8925321a9a0cfb46c86f29bdd40de1594d341e2b
</span>Author: Umesh Singla <umeshksingla@gmail.com>
AuthorDate: Mon Mar 12 22:07:49 2018 +0100

<span style='display:block; white-space:pre;color:#404040;'>    Restore only the active ports
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    and move the port variants to the snapshot_ports table, removing
</span><span style='display:block; white-space:pre;color:#404040;'>    the separate variants table
</span>---
 src/cregistry/snapshot.c | 252 ++++++-----------------------------------------
 src/cregistry/snapshot.h |   7 +-
 src/cregistry/sql.c      |  25 +----
 src/port/port.tcl        |   2 +-
 4 files changed, 34 insertions(+), 252 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 36b629a..1715d95 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;'>@@ -248,56 +248,43 @@ int snapshot_store_ports(reg_registry* reg, reg_snapshot* snapshot, reg_error* e
</span>     reg_error error;
     int i, entry_count;
     int result = 1;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    entry_count = reg_entry_imaged(reg, NULL, NULL, NULL, NULL,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            &entries, &error);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    entry_count = reg_entry_installed(reg, NULL, &entries, &error);
</span>     char* key1 = "name";
     char* key2 = "requested";
     char* key3 = "state";
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    char* key4 = "variants";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    char* key5 = "negated_variants";
</span>     if (entry_count >= 0) {
         for ( i = 0; i < entry_count; i++) {
             char* port_name;
             char* requested;
             char* state;
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            char* positive_variants_str;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            char* negative_variants_str;
</span>             sqlite3_stmt* stmt = NULL;
             reg_entry* entry = NULL;
             if (reg_entry_propget(entries[i], key1, &port_name, &error)
                 && reg_entry_propget(entries[i], key2, &requested, &error)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                && reg_entry_propget(entries[i], key3, &state, &error)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                && reg_entry_propget(entries[i], key3, &state, &error)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                && reg_entry_propget(entries[i], key4, &positive_variants_str, &error)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                && reg_entry_propget(entries[i], key5, &negative_variants_str, &error)) {
</span> 
                 char* query = "INSERT INTO registry.snapshot_ports "
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "(snapshots_id, port_name, requested, state) "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    "VALUES (?, ?, ?, ?)";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "(snapshots_id, port_name, requested, state, variants, negated_variants) "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "VALUES (?, ?, ?, ?, ?, ?)";
</span> 
                 if ((sqlite3_prepare_v2(reg->db, query, -1, &stmt, NULL) == SQLITE_OK)
                         && (sqlite3_bind_int64(stmt, 1, snapshot->id) == SQLITE_OK)
                         && (sqlite3_bind_text(stmt, 2, port_name, -1, SQLITE_STATIC) == SQLITE_OK)
                         && (sqlite3_bind_int64(stmt, 3, atoi(requested)) == SQLITE_OK)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        && (sqlite3_bind_text(stmt, 4, state, -1, SQLITE_STATIC) == SQLITE_OK)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        && (sqlite3_bind_text(stmt, 4, state, -1, SQLITE_STATIC) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        && (sqlite3_bind_text(stmt, 5, positive_variants_str, -1, SQLITE_STATIC) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        && (sqlite3_bind_text(stmt, 6, negative_variants_str, -1, SQLITE_STATIC) == SQLITE_OK)) {
</span>                     int r;
                     do {
                         r = sqlite3_step(stmt);
                         switch (r) {
                             case SQLITE_DONE:
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                                // store variants for entries[i]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                entry = (reg_entry*)malloc(sizeof(reg_entry));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                if (entry) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                    entry->id = sqlite3_last_insert_rowid(reg->db);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                    entry->reg = reg;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                    entry->proc = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                    int port_variants_saved = snapshot_store_port_variants(
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                        reg, entries[i], entry->id, errPtr);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                    switch (port_variants_saved) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                        case 1:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                            // TODO: pass the custom SUCCESS messages
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                        case 0:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                            reg_sqlite_error(reg->db, errPtr, query);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                            result = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                }
</span>                                 break;
                             case SQLITE_BUSY:
                                 break;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -322,86 +309,6 @@ int snapshot_store_ports(reg_registry* reg, reg_snapshot* snapshot, reg_error* e
</span> }
 
 /**
<span style='display:block; white-space:pre;background:#ffe0e0;'>- * helper method for storing variants for a port in a snapshot
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * @param [in] reg                  associated registry
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * @param [in] port_entry           registry.ports port to get current variants to store
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                    and not snapshot_port
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * @param [in] snapshot_port_id     sqlite_int64 id of the port in snapshot_ports table
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * @param [out] errPtr              on error, a description of the error that occurred
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * @return                          true if success; 0 if failure
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-int snapshot_store_port_variants(reg_registry* reg, reg_entry* port_entry,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    int snapshot_ports_id, reg_error* errPtr) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    reg_error error;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    int i, result = 1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    char* key1 = "variants";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    char* key2 = "negated_variants";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    char* positive_variants_str;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    char* negative_variants_str;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if(reg_entry_propget(port_entry, key1, &positive_variants_str, &error)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        && reg_entry_propget(port_entry, key2, &negative_variants_str, &error)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        int variant_space = 100;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        variant* all_variants = (variant*) malloc(variant_space * 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 == NULL) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        char* pos_delim = "+";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        char* neg_delim = "-";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        int variant_count = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        int p = get_parsed_variants(positive_variants_str, all_variants, pos_delim, &variant_count);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if (p < 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        int n = get_parsed_variants(negative_variants_str, all_variants, neg_delim, &variant_count);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if (n < 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        for ( i = 0; i < variant_count; i++){
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            sqlite3_stmt* stmt = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            char* query = "INSERT INTO registry.snapshot_port_variants "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                "(snapshot_ports_id, variant_name, variant_sign) "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                "VALUES (?, ?, ?)";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            variant v = *(all_variants + i);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if((sqlite3_prepare_v2(reg->db, query, -1, &stmt, NULL) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    && (sqlite3_bind_int64(stmt, 1, snapshot_ports_id) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    && (sqlite3_bind_text(stmt, 2, v.variant_name, -1, SQLITE_STATIC) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    && (sqlite3_bind_text(stmt, 3, v.variant_sign, -1, SQLITE_STATIC) == SQLITE_OK)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                int r;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                do {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    r = sqlite3_step(stmt);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    switch (r) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        case SQLITE_DONE:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        case SQLITE_BUSY:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        default:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            reg_sqlite_error(reg->db, errPtr, query);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            result = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                } while (r == SQLITE_BUSY);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                reg_sqlite_error(reg->db, errPtr, query);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                result = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        free(all_variants);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return result;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-/**
</span>  * reg_snapshot_ports_get: Gets the ports of a snapshot.
  *
  * @param [in] snapshot   snapshot to get property from
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -418,10 +325,13 @@ int reg_snapshot_ports_get(reg_snapshot* snapshot, port*** ports, reg_error* err
</span> 
     const char* port_name;
     const char* state;
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    const char* positive_variants;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    const char* negated_variants;
</span> 
     if ((sqlite3_prepare_v2(reg->db, query, -1, &stmt, NULL) == SQLITE_OK)
         && (sqlite3_bind_int64(stmt, 1, snapshot->id) == SQLITE_OK )) {
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        // TODO: why 10?
</span>         port** result = (port**)malloc(10 * sizeof(port*));
 
         if (!result) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -432,10 +342,9 @@ int reg_snapshot_ports_get(reg_snapshot* snapshot, port*** ports, reg_error* err
</span>         int result_space = 10;
         int r;
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        variant** variants;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span>         sqlite_int64 snapshot_port_id;
         int requested;
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        char* variantstr = NULL;
</span> 
         do {
             r = sqlite3_step(stmt);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -446,55 +355,30 @@ int reg_snapshot_ports_get(reg_snapshot* snapshot, port*** ports, reg_error* err
</span>                     port_name = (const char*) sqlite3_column_text(stmt, 2);
                     requested = (int) sqlite3_column_int64(stmt, 3);
                     state = (const char*) sqlite3_column_text(stmt, 4);
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                    positive_variants = (const char*) sqlite3_column_text(stmt, 5);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    negated_variants = (const char*) sqlite3_column_text(stmt, 6);
</span> 
                     port* current_port = (port*) malloc(sizeof(port));
                     if (!current_port) {
                         return -1;
                     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    current_port->name = strdup(port_name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    current_port->requested = requested;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    current_port->state = strdup(state);
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    variants = (variant**) malloc(sizeof(variant*));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if (!variants) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    variantstr = malloc(strlen(positive_variants) + strlen(negated_variants) + 1);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if (!variantstr) {
</span>                         return -1;
                     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    int variant_count = reg_snapshot_ports_get_helper(reg, snapshot_port_id, &variants, errPtr);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    current_port->variant_count = variant_count;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    char* variantstr = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if (current_port->variant_count > 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        // construct the variant string in the form '+var1-var2+var3'
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        size_t variantstrlen = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        for (int j = 0; j < current_port->variant_count; ++j) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            variantstrlen += strlen(variants[j]->variant_sign);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            variantstrlen += strlen(variants[j]->variant_name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    variantstr[0] = '\0';
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    strcat(variantstr, positive_variants);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    strcat(variantstr, negated_variants);
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        // +1 for \0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        variantstr = malloc(variantstrlen + 1);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        if (!variantstr) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            return -1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        variantstr[0] = '\0';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        for (int j = 0; j < current_port->variant_count; ++j) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            strcat(variantstr, variants[j]->variant_sign);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            strcat(variantstr, variants[j]->variant_name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        current_port->variants = variantstr;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        current_port->variants = strdup("\0");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    current_port->name = strdup(port_name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    current_port->requested = requested;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    current_port->state = strdup(state);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    current_port->variants = variantstr;
</span> 
                     if (!reg_listcat((void***)&result, &result_count, &result_space, current_port)) {
                             r = SQLITE_ERROR;
                     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    int i;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    for (i = 0; i < variant_count; i++) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        free(variants[i]);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    free(variants);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    variants = NULL;
</span>                     break;
                 case SQLITE_DONE:
                     break;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -530,86 +414,6 @@ int reg_snapshot_ports_get(reg_snapshot* snapshot, port*** ports, reg_error* err
</span> }
 
 /**
<span style='display:block; white-space:pre;background:#ffe0e0;'>- * reg_snapshot_ports_get_helper: Gets the variants of a port in snapshot.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * @param [in] reg                  associated registry
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * @param [in] snapshot_port_id     sqlite_int64 id of the port in snapshot_ports table
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * @param [out] variants            variants in the 'struct variant' form in snapshot.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * @param [out] errPtr              on error, a description of the error that occurred
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * @return                          variant_count if success; -1 if failure
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-int reg_snapshot_ports_get_helper(reg_registry* reg, sqlite_int64 snapshot_port_id,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    variant*** variants, reg_error* errPtr) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    sqlite3_stmt* stmt = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    char* query = "SELECT * FROM registry.snapshot_port_variants WHERE snapshot_ports_id=?";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if ((sqlite3_prepare_v2(reg->db, query, -1, &stmt, NULL) == SQLITE_OK)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        && (sqlite3_bind_int64(stmt, 1, snapshot_port_id) == SQLITE_OK )) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        int result_count = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        int result_space = 10;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        int r;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        variant** result = (variant**)malloc(result_space * sizeof(variant*));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if (!result) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return -1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        const char* variant_name;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        const char* variant_sign;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        do {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            r = sqlite3_step(stmt);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            switch (r) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                case SQLITE_ROW:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    variant_name = (const char*)sqlite3_column_text(stmt, 2);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    variant_sign = (const char*)sqlite3_column_text(stmt, 3);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    variant* element = (variant*)malloc(sizeof(variant));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if (!element) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        return -1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    element->variant_name = strdup(variant_name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    element->variant_sign = strdup(variant_sign);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if (!reg_listcat((void***)&result, &result_count, &result_space, element)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        r = SQLITE_ERROR;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                case SQLITE_DONE:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                case SQLITE_BUSY:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    continue;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                default:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    reg_sqlite_error(reg->db, errPtr, query);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        } while (r == SQLITE_ROW || r == SQLITE_BUSY);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if (r == SQLITE_DONE) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            *variants = result;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return result_count;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            int i;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            for (i = 0; i < result_count; i++) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                free((*(*variants + i))->variant_name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                free((*(*variants + i))->variant_sign);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            free(variants);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return -1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        sqlite3_finalize(stmt);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        reg_sqlite_error(reg->db, errPtr, query);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if (stmt) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            sqlite3_finalize(stmt);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return -1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-/**
</span>  * Gets a named property of a snapshot. The property named must be one
  * that exists in the table and must not be one with internal meaning
  * such as `id` or `state`.
<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 e2c6d88..d169265 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;'>@@ -76,16 +76,11 @@ reg_snapshot* reg_snapshot_create(reg_registry* reg, char* note,
</span> // helper method for storing ports for this snapshot
 int snapshot_store_ports(reg_registry* reg, reg_snapshot* snapshot,
         reg_error* errPtr);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-// helper method for storing variants for a port in a snapshot
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-int snapshot_store_port_variants(reg_registry* reg, reg_entry* port_entry,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        int snapshot_ports_id, reg_error* errPtr);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> // snapshot properties retrieval methods
 int reg_snapshot_propget(reg_snapshot* snapshot, char* key, char** value,
         reg_error* errPtr);
 int reg_snapshot_ports_get(reg_snapshot* snapshot, port*** ports,
         reg_error* errPtr);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-int reg_snapshot_ports_get_helper(reg_registry* reg,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        sqlite_int64 snapshot_port_id, variant*** variants,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        reg_error* errPtr);
</span> 
 #endif /* _CSNAPSHOT_H */
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/cregistry/sql.c b/src/cregistry/sql.c
</span><span style='display:block; white-space:pre;color:#808080;'>index a96aa48..aba6c81 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/cregistry/sql.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/cregistry/sql.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -211,21 +211,12 @@ int create_tables(sqlite3* db, reg_error* errPtr) {
</span>             ", port_name TEXT COLLATE NOCASE"
             ", requested INTEGER"
             ", state TEXT COLLATE NOCASE"
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            ", variants TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ", negated_variants TEXT"
</span>             ", FOREIGN KEY(snapshots_id) REFERENCES snapshots(id)"
             " ON DELETE CASCADE"
             ")",
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        /* snapshot port variants table */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        /* all variants (+, -) of the ports in a snapshot */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        "CREATE TABLE registry.snapshot_port_variants ("
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-              "id INTEGER PRIMARY KEY"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ", snapshot_ports_id INTEGER"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ", variant_name TEXT COLLATE NOCASE"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ", variant_sign TEXT"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ", FOREIGN KEY(snapshot_ports_id) REFERENCES snapshot_ports(id)"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            " ON DELETE CASCADE"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ")",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span>         "COMMIT",
         NULL
     };
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -759,20 +750,12 @@ int update_db(sqlite3* db, reg_error* errPtr) {
</span>                     ", port_name TEXT COLLATE NOCASE"
                     ", requested INTEGER"
                     ", state TEXT COLLATE NOCASE"
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                    ", variants TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    ", negated_variants TEXT"
</span>                     ", FOREIGN KEY(snapshots_id) REFERENCES snapshots(id)"
                     " ON DELETE CASCADE"
                     ")",
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                /* snapshot port variants table */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                "CREATE TABLE registry.snapshot_port_variants ("
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                      "id INTEGER PRIMARY KEY"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    ", snapshot_ports_id INTEGER"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    ", variant_name TEXT COLLATE NOCASE"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    ", variant_sign TEXT"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    ", FOREIGN KEY(snapshot_ports_id) REFERENCES snapshot_ports(id)"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    " ON DELETE CASCADE"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    ")",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span>                 /* Update version and commit */
                 "UPDATE registry.metadata SET value = '1.205' WHERE key = 'version'",
                 "COMMIT",
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port/port.tcl b/src/port/port.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index d56b994..d434065 100755
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port/port.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port/port.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2841,7 +2841,7 @@ proc action_restore { action portlist opts } {
</span> proc action_migrate { action portlist opts } {
     return [macports::migrate_main $opts]
     set result [macports::migrate_main $opts]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {$result = -999} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$result == -999} {
</span>         # MacPorts base was upgraded, re-execute migrate with the --continue flag
         execl $::argv0 [list {*}$::argv "--continue"]
         ui_debug "Would have executed $::argv0 $::argv --continue"
</pre><pre style='margin:0'>

</pre>