<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch master
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/19c933969bc62ee54c86fbadaf4d98252b3df5ee">https://github.com/macports/macports-base/commit/19c933969bc62ee54c86fbadaf4d98252b3df5ee</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 19c93396 Preserve only requested variants on upgrade
</span>19c93396 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 19c933969bc62ee54c86fbadaf4d98252b3df5ee
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Thu Apr 15 03:51:13 2021 +1000

<span style='display:block; white-space:pre;color:#404040;'>    Preserve only requested variants on upgrade
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Fixes: https://trac.macports.org/ticket/46956
</span>---
 src/cregistry/sql.c                | 103 ++++++++++++++++++++++++++++++++++++-
 src/macports1.0/macports.tcl       |  63 ++++++++++++++---------
 src/port/port.tcl                  |  13 +++--
 src/port1.0/portinstall.tcl        |   6 +--
 src/port1.0/portutil.tcl           |  11 ++--
 src/registry2.0/entryobj.c         |   4 +-
 src/registry2.0/portuninstall.tcl  |  10 +++-
 src/registry2.0/receipt_sqlite.tcl |   4 +-
 src/registry2.0/registry.tcl       |   2 +-
 9 files changed, 169 insertions(+), 47 deletions(-)

<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 193a4f3d..8ed4eb79 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;'>@@ -160,7 +160,7 @@ int create_tables(sqlite3* db, reg_error* errPtr) {
</span>             ", version TEXT COLLATE VERSION"
             ", revision INTEGER"
             ", variants TEXT"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            ", negated_variants TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ", requested_variants TEXT"
</span>             ", state TEXT"
             ", date DATETIME"
             ", installtype TEXT"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -746,6 +746,105 @@ int update_db(sqlite3* db, reg_error* errPtr) {
</span>             continue;
         }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (sql_version(NULL, -1, version, -1, "1.210") < 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            /* add */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            static char* version_1_210_queries[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if SQLITE_VERSION_NUMBER >= 3025000
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "ALTER TABLE registry.ports RENAME COLUMN negated_variants TO requested_variants",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                /* Create a temporary table */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "CREATE TEMPORARY TABLE mp_ports_backup ("
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "id INTEGER PRIMARY KEY"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", name TEXT COLLATE NOCASE"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", portfile TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", location TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", epoch INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", version TEXT COLLATE VERSION"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", revision INTEGER"
</span><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><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", state TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", date DATETIME"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", installtype TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", archs TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", requested INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", os_platform TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", os_major INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", cxx_stdlib TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", cxx_stdlib_overridden INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", UNIQUE (name, epoch, version, revision, variants)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ")",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                /* Copy all data into the temporary table */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "INSERT INTO mp_ports_backup SELECT id, name, portfile, location, epoch, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "version, revision, variants, negated_variants, state, date, installtype, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "archs, requested, os_platform, os_major, cxx_stdlib, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "cxx_stdlib_overridden FROM registry.ports",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                /* Drop the original table and re-create it with the new structure */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "DROP TABLE registry.ports",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "CREATE TABLE registry.ports ("
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "id INTEGER PRIMARY KEY"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", name TEXT COLLATE NOCASE"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", portfile TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", location TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", epoch INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", version TEXT COLLATE VERSION"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", revision INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", variants TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", requested_variants TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", state TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", date DATETIME"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", installtype TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", archs TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", requested INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", os_platform TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", os_major INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", cxx_stdlib TEXT"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", cxx_stdlib_overridden INTEGER"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ", UNIQUE (name, epoch, version, revision, variants)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ")",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "CREATE INDEX registry.port_name ON ports"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "(name, epoch, version, revision, variants)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "CREATE INDEX registry.port_state ON ports(state)",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                /* Copy all data back from temporary table */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "INSERT INTO registry.ports (id, name, portfile, location, epoch, version, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "revision, variants, requested_variants, state, date, installtype, archs, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "requested, os_platform, os_major, cxx_stdlib, cxx_stdlib_overridden) "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "SELECT id, name, portfile, location, epoch, version, revision, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "variants, negated_variants, state, date, installtype, archs, "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "requested, os_platform, os_major, cxx_stdlib, cxx_stdlib_overridden "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    "FROM mp_ports_backup",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                /* Remove temporary table */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "DROP TABLE mp_ports_backup",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                /* Assume all existing variants were requested, which often
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   won't be true, but does match the former upgrade behaviour. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "UPDATE registry.ports SET requested_variants = variants || requested_variants",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "UPDATE registry.metadata SET value = '1.210' WHERE key = 'version'",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                "COMMIT",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                NULL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            sqlite3_finalize(stmt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            stmt = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if (!do_queries(db, version_1_210_queries, errPtr)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                rollback_db(db);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            did_update = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            continue;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>         /* add new versions here, but remember to:
          *  - finalize the version query statement and set stmt to NULL
          *  - do _not_ use "BEGIN" in your query list, since a transaction has
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -755,7 +854,7 @@ int update_db(sqlite3* db, reg_error* errPtr) {
</span>          *  - update the current version number below
          */
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if (sql_version(NULL, -1, version, -1, "1.205") > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (sql_version(NULL, -1, version, -1, "1.210") > 0) {
</span>             /* the registry was already upgraded to a newer version and cannot be used anymore */
             reg_throw(errPtr, REG_INVALID, "Version number in metadata table is newer than expected.");
             sqlite3_finalize(stmt);
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/macports.tcl b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index ba9d42b4..f52e09a5 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1959,13 +1959,18 @@ proc mportopen_installed {name version revision variants options} {
</span>     set portfile_dir [file join ${registry.path} registry portfiles ${name}-${version}_${revision} [$regref portfile]]
 
     set variations {}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set minusvariant [lrange [split [$regref negated_variants] -] 1 end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Relies on all negated variants being at the end of requested_variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set minusvariant [lrange [split [$regref requested_variants] -] 1 end]
</span>     set plusvariant [lrange [split [$regref variants] +] 1 end]
     foreach v $plusvariant {
         lappend variations $v +
     }
     foreach v $minusvariant {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        lappend variations $v -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[string first "+" $v] == -1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend variations $v -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_warn "Invalid negated variant for $name @${version}_${revision}${variants}: $v"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span>     }
 
     array set options_array $options
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4006,9 +4011,9 @@ proc macports::_upgrade {portname dspec variationslist optionslist {depscachenam
</span>         set oldvariant $variant_installed
         set regref [registry::open_entry $portname $version_installed $revision_installed $variant_installed $epoch_installed]
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set oldnegatedvariant [registry::property_retrieve $regref negated_variants]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {$oldnegatedvariant == 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set oldnegatedvariant {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set oldrequestedvariant [registry::property_retrieve $regref requested_variants]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$oldrequestedvariant == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set oldrequestedvariant {}
</span>     }
     set requestedflag [registry::property_retrieve $regref requested]
     set os_platform_installed [registry::property_retrieve $regref os_platform]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4032,29 +4037,39 @@ proc macports::_upgrade {portname dspec variationslist optionslist {depscachenam
</span> 
     set globalvarlist [array get macports::global_variations]
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set minusvariant [lrange [split $oldnegatedvariant -] 1 end]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set plusvariant [lrange [split $oldvariant +] 1 end]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    ui_debug "Merging existing variants '${oldvariant}$oldnegatedvariant' into variants"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Relies on all negated variants being at the end of requested_variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set splitvariant [split $oldrequestedvariant -]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set minusvariant [lrange $splitvariant 1 end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set plusvariant [lrange [split $splitvariant +] 1 end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ui_debug "Merging existing requested variants '${oldrequestedvariant}' into variants"
</span>     set oldvariantlist [list]
     foreach v $plusvariant {
         lappend oldvariantlist $v +
     }
     foreach v $minusvariant {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        lappend oldvariantlist $v -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[string first "+" $v] == -1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend oldvariantlist $v -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set installedvariations($v) -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_warn "Invalid negated variant for ${portname}: $v"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # save the current variants for dependency calculation purposes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # in case we don't end up upgrading this port
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set plusvariant [lrange [split $oldvariant +] 1 end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach v $plusvariant {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set installedvariations($v) +
</span>     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # merge in the old variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # merge in the old requested variants
</span>     foreach {variation value} $oldvariantlist {
         if {![info exists variations($variation)]} {
             set variations($variation) $value
         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        # save the current variants for dependency calculation purposes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # in case we don't end up upgrading this port
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set installedvariations($variation) $value
</span>     }
 
     # Now merge in the global (i.e. variants.conf) variations.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # We wait until now so that existing variants for this port
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # We wait until now so that existing requested variants for this port
</span>     # override global variations
     foreach {variation value} $globalvarlist {
         if {![info exists variations($variation)]} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4145,16 +4160,16 @@ proc macports::_upgrade {portname dspec variationslist optionslist {depscachenam
</span>             if {[info exists portinfo(canonical_active_variants)] && $portinfo(canonical_active_variants) ne $oldvariant} {
                 if {[llength $variationslist] > 0} {
                     ui_warn "Skipping upgrade since $portname ${version_installed}_$revision_installed >= $portname ${version_in_tree}_${revision_in_tree}, even though installed variants \"$oldvariant\" do not match \"$portinfo(canonical_active_variants)\". Use 'upgrade --enforce-variants' to switch to the requested variants."
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    # reopen with the installed variants so deps are calculated correctly
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    catch {mportclose $mport}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if {[catch {set mport [mportopen $porturl [array get interp_options] [array get installedvariations]]} result]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        ui_error "Unable to open port: $result"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        return 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    }
</span>                 } else {
                     ui_debug "Skipping upgrade since $portname ${version_installed}_$revision_installed >= $portname ${version_in_tree}_${revision_in_tree}, even though installed variants \"$oldvariant\" do not match \"$portinfo(canonical_active_variants)\"."
                 }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                # reopen with the installed variants so deps are calculated correctly
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                catch {mportclose $mport}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[catch {set mport [mportopen $porturl [array get interp_options] [array get installedvariations]]} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    ui_error "Unable to open port: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    return 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span>             } else {
                 ui_debug "No need to upgrade! $portname ${version_installed}_$revision_installed >= $portname ${version_in_tree}_$revision_in_tree"
             }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5195,7 +5210,7 @@ proc macports::revupgrade_scanandrebuild {broken_port_counts_name opts} {
</span>         if {$macports::revupgrade_mode ne "rebuild"} {
             ui_msg "$macports::ui_prefix Found $num_broken_ports broken port${s}:"
             foreach port $broken_ports {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui_msg "     [$port name] @[$port version] [$port variants][$port negated_variants]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_msg "     [$port name] @[$port version]_[$port revision][$port variants]"
</span>                 if {[info exists broken_files_by_port($port)]} {
                     foreach f $broken_files_by_port($port) {
                         ui_msg "         $f"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5280,7 +5295,7 @@ proc macports::revupgrade_scanandrebuild {broken_port_counts_name opts} {
</span>         foreach port $topsort_ports {
             lappend broken_portnames [$port name]@[$port version][$port variants]
             if {![info exists macports::ui_options(questions_yesno)]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui_msg "     [$port name] @[$port version] [$port variants][$port negated_variants]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_msg "     [$port name] @[$port version]_[$port revision][$port variants]"
</span>             }
         }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5390,7 +5405,7 @@ proc macports::revupgrade_buildgraph {port stackname adjlistname revadjlistname
</span> 
     set visited($port) true
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    ui_debug "Processing port [$port name] @[$port epoch]:[$port version]_[$port revision] [$port variants] [$port negated_variants]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ui_debug "Processing port [$port name] @[$port epoch]:[$port version]_[$port revision][$port variants]"
</span>     set dependent_ports [$port dependents]
     foreach dep $dependent_ports {
         set is_broken_port false
<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 97ea67b9..88163b82 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;'>@@ -3296,19 +3296,18 @@ proc action_installed { action portlist opts } {
</span>             set ivariants [lindex $i 3]
             set iactive [lindex $i 4]
             set extra ""
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set nvariants ""
</span>             if {[macports::ui_isset ports_verbose]} {
                 set regref [registry::open_entry $iname $iversion $irevision $ivariants [lindex $i 5]]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                set nvariants [registry::property_retrieve $regref negated_variants]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if {$nvariants == 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    set nvariants ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set rvariants [registry::property_retrieve $regref requested_variants]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {$rvariants != 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    append extra " requested_variants='$rvariants'"
</span>                 }
                 set os_platform [registry::property_retrieve $regref os_platform]
                 set os_major [registry::property_retrieve $regref os_major]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                set archs [registry::property_retrieve $regref archs]
</span>                 if {$os_platform != 0 && $os_platform ne "" && $os_major != 0 && $os_major ne ""} {
                     append extra " platform='$os_platform $os_major'"
                 }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                set archs [registry::property_retrieve $regref archs]
</span>                 if {$archs != 0 && $archs ne ""} {
                     append extra " archs='$archs'"
                 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3318,9 +3317,9 @@ proc action_installed { action portlist opts } {
</span>                 }
             }
             if { $iactive == 0 } {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                puts "  $iname @${iversion}_${irevision}${ivariants}${nvariants}${extra}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                puts "  $iname @${iversion}_${irevision}${ivariants}${extra}"
</span>             } elseif { $iactive == 1 } {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                puts "  $iname @${iversion}_${irevision}${ivariants}${nvariants} (active)${extra}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                puts "  $iname @${iversion}_${irevision}${ivariants} (active)${extra}"
</span>             }
         }
     } elseif { $restrictedList } {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portinstall.tcl b/src/port1.0/portinstall.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index dc3b29dd..928a3a5c 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portinstall.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portinstall.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -333,7 +333,7 @@ proc portinstall::extract_contents {location type} {
</span> 
 proc portinstall::install_main {args} {
     global subport version portpath depends_run revision user_options \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    portvariants negated_variants depends_lib PortInfo epoch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    portvariants requested_variants depends_lib PortInfo epoch \
</span>     os.platform os.major portarchivetype installPlist registry.path porturl \
     portinstall::file_is_binary portinstall::actual_cxx_stdlib portinstall::cxx_stdlib_overridden
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -398,8 +398,8 @@ proc portinstall::install_main {args} {
</span>         }
         # Trick to have a portable GMT-POSIX epoch-based time.
         $regref date [expr {[clock scan now -gmt true] - [clock scan "1970-1-1 00:00:00" -gmt true]}]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[info exists negated_variants]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            $regref negated_variants $negated_variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[info exists requested_variants]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            $regref requested_variants $requested_variants
</span>         }
 
         foreach dep_portname $dep_portnames {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portutil.tcl b/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index a57d73f5..53f3fe6e 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2020,7 +2020,7 @@ proc canonicalize_variants {variants {sign "+"}} {
</span> }
 
 proc eval_variants {variations} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global all_variants PortInfo requested_variations portvariants negated_variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global all_variants PortInfo requested_variations portvariants requested_variants
</span>     set dlist $all_variants
     upvar $variations upvariations
     set chosen [choose_variants $dlist upvariations]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2086,13 +2086,16 @@ proc eval_variants {variations} {
</span>     set PortInfo(active_variants) $activevariants
     set PortInfo(canonical_active_variants) $portvariants
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # now set the negated variants
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set negated_list [list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # now set the requested variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach dvar $chosen {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set thevar [ditem_key $dvar provides]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend requested_list $thevar "+"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span>     foreach dvar $negated {
         set thevar [ditem_key $dvar provides]
         lappend negated_list $thevar "-"
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set negated_variants [canonicalize_variants $negated_list "-"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set requested_variants [canonicalize_variants $requested_list "+"][canonicalize_variants $negated_list "-"]
</span> 
     return 0
 }
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/entryobj.c b/src/registry2.0/entryobj.c
</span><span style='display:block; white-space:pre;color:#808080;'>index df79c97b..7005c3d6 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/entryobj.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/entryobj.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -47,7 +47,7 @@ const char* entry_props[] = {
</span>     "version",
     "revision",
     "variants",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    "negated_variants",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    "requested_variants",
</span>     "date",
     "state",
     "installtype",
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -426,7 +426,7 @@ static entry_obj_cmd_type entry_cmds[] = {
</span>     { "version", entry_obj_prop },
     { "revision", entry_obj_prop },
     { "variants", entry_obj_prop },
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    { "negated_variants", entry_obj_prop },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    { "requested_variants", entry_obj_prop },
</span>     { "date", entry_obj_prop },
     { "state", entry_obj_prop },
     { "installtype", entry_obj_prop },
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/portuninstall.tcl b/src/registry2.0/portuninstall.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 01b838a7..638f3d06 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/portuninstall.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/portuninstall.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -72,13 +72,19 @@ proc generate_deplist {port {optslist ""}} {
</span>             array set depportinfo [lindex $result 1]
             set porturl $depportinfo(porturl)
             set variations [list]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set minusvariant [lrange [split [registry::property_retrieve $port negated_variants] -] 1 end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Relies on all negated variants being at the end of requested_variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set minusvariant [lrange [split [registry::property_retrieve $port requested_variants] -] 1 end]
</span>             set plusvariant [lrange [split [$port variants] +] 1 end]
             foreach v $plusvariant {
                 lappend variations $v "+"
             }
             foreach v $minusvariant {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                lappend variations $v "-"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[string first "+" $v] == -1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    lappend variations $v "-"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    ui_warn "Invalid negated variant for $portname @[$port version]_[$port revision][$port variants]: $v"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                
</span>             }
             if {![catch {set mport [mportopen $porturl [concat $optslist subport $portname] [array get variations]]} result]} {
                 array unset depportinfo
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/receipt_sqlite.tcl b/src/registry2.0/receipt_sqlite.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index d89de2fc..4541e9d0 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/receipt_sqlite.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/receipt_sqlite.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -359,7 +359,7 @@ proc list_dependents {name version revision variants} {
</span> #  \li \c imagefiles A list of files installed by this port
 #  \li \c files A list of filenames as which the imagefiles should be activated
 #      if state is "installed"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-#  \li \c negated_variants The canonical representation of the negated variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#  \li \c requested_variants The canonical representation of the requested variants
</span> #  \li \c os_platform The platform on which the port was installed
 #  \li \c os_major The major version of the OS on which the port was installed
 #  \li \c archs A list of architectures of this port
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -395,7 +395,7 @@ proc create_entry_l {proplist} {
</span>         } else {
             $regref map $props(files)
         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        foreach key {negated_variants os_platform os_major archs} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach key {requested_variants os_platform os_major archs} {
</span>             if {$props($key) != 0} {
                 $regref $key $props($key)
             } else {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/registry.tcl b/src/registry2.0/registry.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 2646948d..6ba0bab7 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/registry.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/registry.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -446,7 +446,7 @@ proc convert_to_sqlite {} {
</span> 
         lappend proplist date [receipt_flat::property_retrieve $iref date]
         lappend proplist epoch [receipt_flat::property_retrieve $iref epoch]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        lappend proplist negated_variants [receipt_flat::property_retrieve $iref negated_variants]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend proplist requested_variants ${ivariants}[receipt_flat::property_retrieve $iref negated_variants]
</span>         lappend proplist requested [receipt_flat::property_retrieve $iref requested]
         lappend proplist os_platform [receipt_flat::property_retrieve $iref os_platform]
         lappend proplist os_major [receipt_flat::property_retrieve $iref os_major]
</pre><pre style='margin:0'>

</pre>