Skip to content
Permalink
Browse files

Uninstall installed ports before restoring snapshot

Includes uninstalling all, those active or inactive
  • Loading branch information
umeshksingla authored and neverpanic committed Jul 12, 2017
1 parent f98e721 commit 2df3aa5b184c322fe8259a6fd99a3741cadcbeb7
Showing with 107 additions and 8 deletions.
  1. +107 −8 src/macports1.0/restore.tcl
@@ -9,11 +9,13 @@ package provide restore 1.0

package require macports 1.0
package require registry 1.0
package require Pextlib 1.0
package require registry_uninstall 2.0

namespace eval restore {
proc main {opts} {
# The main function. Calls each individual function that needs to be run.

proc main {opts} {
# The main function. Calls each individual function that needs to be run.
#
# Args:
# opts - options array.
@@ -26,11 +28,108 @@ namespace eval restore {
array set options $opts

if ([info exists options(ports_restore_snapshot-id)]) {
# use that snapshot
# use that snapshot
set snapshot [fetch_snapshot options(ports_restore_snapshot-id)]
} else {
# TODO: ask if the user is fine with the latest snapshot, if 'yes'
# use latest snapshot
# TODO: ask if the user is fine with the latest snapshot, if 'yes'
# use latest snapshot
set snapshot [fetch_latest_snapshot]
}

}
}
# fetch ports and variants now

# WILL WRITE FOR FETCHING AFTER DISCUSSING WITH BRAD
# ASSUMING I GET THE FINAL PORTLIST FOR NOW

# $portlist
uninstall_installed portlist

# TODO: CLEAN PARTIAL BUILDS STEP HERE

}

proc fetch_snapshot { snapshot_id } {

}

proc fetch_latest_snapshot {} {

}

proc sort_portlist_by_dependendents { portlist } {

# Sorts a list of port references such that dependents appear before
# the ports they depend on.
#
# Args:
# portlist - the list of port references
#
# Returns:
# the list in dependency-sorted order

foreach port $portlist {
set portname [$port name]
lappend ports_for_name($portname) $port

# Avoid adding ports in loop
if {![info exists dependents($portname)]} {
set dependents($portname) {}
foreach result [$port dependents] {
lappend dependents($portname) [$result name]
}
}
}
set ret {}
foreach port $portlist {
sortdependents_helper $port ports_for_name dependents seen ret
}
return $ret
}

proc sortdependents_helper {port up_ports_for_name up_dependents up_seen up_retlist} {
upvar 1 $up_seen seen
if {![info exists seen($port)]} {
set seen($port) 1
upvar 1 $up_ports_for_name ports_for_name $up_dependents dependents $up_retlist retlist
foreach dependent $dependents([$port name]) {
if {[info exists ports_for_name($dependent)]} {
foreach entry $ports_for_name($dependent) {
sortdependents_helper $entry ports_for_name dependents seen retlist
}
}
}
lappend retlist $port
}
}

proc uninstall_installed { portlist } {

set formatted_portlist [list]

set portlist [sort_portlist_by_dependendents $portlist]

if {[info exists macports::ui_options(questions_yesno)]} {

set retvalue [$macports::ui_options(questions_yesno) "Restoring a snapshot will first uninstall all the installed ports.
Would you like to continue?" {n} 0]

if {$retvalue == 0} {
foreach port $portlist {
set name [$port name]
ui_msg "Uninstalling: $name"

try -pass_signal {
# 'registry_uninstall' takes name, version, revision, variants and an options list for a port
registry_uninstall::uninstall [$port name] [$port version] [$port revision] [$port] variants {}
} catch {{*} eCode eMessage} {
ui_error "Error uninstalling $name: $eMessage"
}
}
} else {
ui_msg "Not uninstalling ports."
return 1
}
}
return 0
}
}

0 comments on commit 2df3aa5

Please sign in to comment.
You can’t perform that action at this time.