<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>