<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/2df3aa5b184c322fe8259a6fd99a3741cadcbeb7">https://github.com/macports/macports-base/commit/2df3aa5b184c322fe8259a6fd99a3741cadcbeb7</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 2df3aa5b184c322fe8259a6fd99a3741cadcbeb7
</span>Author: Umesh Singla <umeshksingla@macports.org>
AuthorDate: Thu Jul 13 03:19:02 2017 +0530

<span style='display:block; white-space:pre;color:#404040;'>    Uninstall installed ports before restoring snapshot
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Includes uninstalling all, those active or inactive
</span>---
 src/macports1.0/restore.tcl | 115 +++++++++++++++++++++++++++++++++++++++++---
 1 file changed, 107 insertions(+), 8 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/restore.tcl b/src/macports1.0/restore.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index d93e81c..ba7cc0c 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/restore.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/restore.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -9,11 +9,13 @@ package provide restore 1.0
</span> 
 package require macports 1.0
 package require registry 1.0
<span style='display:block; white-space:pre;background:#e0ffe0;'>+package require Pextlib 1.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+package require registry_uninstall 2.0
</span> 
 namespace eval restore {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   proc main {opts} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           # The main function. Calls each individual function that needs to be run.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc main {opts} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # The main function. Calls each individual function that needs to be run.
</span>         #
         # Args:
         #           opts - options array.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -26,11 +28,108 @@ namespace eval restore {
</span>         array set options $opts
 
         if ([info exists options(ports_restore_snapshot-id)]) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                # use that snapshot
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # use that snapshot
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set snapshot [fetch_snapshot options(ports_restore_snapshot-id)]
</span>         } else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                # TODO: ask if the user is fine with the latest snapshot, if 'yes'
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           # use latest snapshot
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # TODO: ask if the user is fine with the latest snapshot, if 'yes'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # use latest snapshot
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set snapshot [fetch_latest_snapshot]
</span>         }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span>\ No newline at end of file
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        # fetch ports and variants now
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # WILL WRITE FOR FETCHING AFTER DISCUSSING WITH BRAD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # ASSUMING I GET THE FINAL PORTLIST FOR NOW
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # $portlist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        uninstall_installed portlist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # TODO: CLEAN PARTIAL BUILDS STEP HERE
</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><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc fetch_snapshot { snapshot_id } {
</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><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc fetch_latest_snapshot {} {
</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><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc sort_portlist_by_dependendents { portlist } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Sorts a list of port references such that dependents appear before
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # the ports they depend on.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Args:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #       portlist - the list of port references
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # Returns:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #       the list in dependency-sorted order
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach port $portlist {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set portname [$port name]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend ports_for_name($portname) $port
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Avoid adding ports in loop
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![info exists dependents($portname)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set dependents($portname) {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                foreach result [$port dependents] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    lappend dependents($portname) [$result name]
</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><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set ret {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach port $portlist {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            sortdependents_helper $port ports_for_name dependents seen ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return $ret
</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;'>+    proc sortdependents_helper {port up_ports_for_name up_dependents up_seen up_retlist} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        upvar 1 $up_seen seen
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {![info exists seen($port)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set seen($port) 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            upvar 1 $up_ports_for_name ports_for_name $up_dependents dependents $up_retlist retlist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach dependent $dependents([$port name]) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[info exists ports_for_name($dependent)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    foreach entry $ports_for_name($dependent) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        sortdependents_helper $entry ports_for_name dependents seen retlist
</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><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend retlist $port
</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><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc uninstall_installed { portlist } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set formatted_portlist  [list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set portlist [sort_portlist_by_dependendents $portlist]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[info exists macports::ui_options(questions_yesno)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set retvalue [$macports::ui_options(questions_yesno) "Restoring a snapshot will first uninstall all the installed ports.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            Would you like to continue?" {n} 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$retvalue == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                foreach port $portlist {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set name [$port name]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                     ui_msg "Uninstalling: $name"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    try -pass_signal {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        # 'registry_uninstall' takes name, version, revision, variants and an options list for a port
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        registry_uninstall::uninstall [$port name] [$port version] [$port revision] [$port] variants {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    } catch {{*} eCode eMessage} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        ui_error "Error uninstalling $name: $eMessage"
</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;'>+            } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_msg "Not uninstalling ports."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                return 1
</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;'>+        return 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span></pre><pre style='margin:0'>

</pre>