Skip to content
Permalink
Browse files

WIP: Sort ports before installing

Largely taken from restore_ports.tcl, TODO is to have only one
sorting function for both uninstalling and installing.
  • Loading branch information
umeshksingla authored and neverpanic committed Jul 19, 2017
1 parent 6d8da67 commit 06eea36a347a62cfe549061eee623c080a141b4c
Showing with 84 additions and 0 deletions.
  1. +84 −0 src/macports1.0/migrate.tcl
@@ -49,6 +49,7 @@ namespace eval migrate {
# ASSUMING I GET THE FINAL PORTLIST FOR NOW
# $portlist
uninstall_installed portlist
sort_ports portlist
recover_ports_state portlist


@@ -64,6 +65,89 @@ namespace eval migrate {

}

proc dependenciesForPort {portName variantInfo} {

set dependencyList [list]
set portSearchResult [mportlookup $portName]

# TODO: error handling, if any?

array set portInfo [lindex $portSearchResult 1]

set dependencyTypes { depends_fetch depends_extract depends_build depends_lib depends_run }
foreach dependencyType $dependencyTypes {
if {[info exists portInfo($dependencyType)] && [string length $portInfo($dependencyType)] > 0} {
foreach dependency $portInfo($dependencyType) {
lappend dependencyList [lindex [split $dependency:] end]
}
}
}
return $dependencyList
}

proc sort_ports {portlist} {

array set port_installed {}
array set port_deps {}
array set port_in_list {}

set newList [list]

foreach port $portlist {

set name [lindex $port 0]
set version [lindex $port 1]
set variants [lindex $port 2]
set active [lindex $port 3]

if {![info exists port_in_list($name)]} {
set port_in_list($name) 1
set port_installed($name) 0
} else {
incr port_in_list($name)
}

if {![info exists port_deps(${name},${variants})]} {
set port_deps(${name},${variants}) [dependenciesForPort $name $variants]
}

lappend newList [list $active $name $variants]
}

set operationList [list]

while {[llength $newList] > 0} {

set oldLen [llength $newList]
foreach port $newList {
foreach {active name variants} $port break

if {$active && $port_installed($name) < ($port_in_list($name) - 1)} {
continue
}
set installable 1
foreach dep $port_deps(${name},${variants}) {
if {[info exists port_installed($dep)] && $port_installed($dep) == 0} {
set installable 0
break
}
}
if {$installable} {
lappend operationList [list $name $variants $active]
incr port_installed($name)
set index [lsearch $newList [list $name $variants $active]]
set newList [lreplace $newList $index $index]
}
}

if {[llength $newList] == $oldLen} {
return -code error "stuck in loop"
}
}

return $operationList
}

proc sort_portlist_by_dependendents { portlist } {

# Sorts a list of port references such that dependents appear before

0 comments on commit 06eea36

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