mirror of
https://github.com/macports/mpbb.git
synced 2026-07-12 18:18:44 -07:00
Use dict for portinfo, options, variations etc
This commit is contained in:
@@ -30,10 +30,10 @@
|
||||
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
proc split_variants {variants} {
|
||||
set result {}
|
||||
set result [dict create]
|
||||
set l [regexp -all -inline -- {([-+])([[:alpha:]_]+[\w\.]*)} $variants]
|
||||
foreach { match sign variant } $l {
|
||||
lappend result $variant $sign
|
||||
dict set result $variant $sign
|
||||
}
|
||||
return $result
|
||||
}
|
||||
@@ -59,9 +59,9 @@ if {[catch {set one_result [mportlookup $portname]}] || [llength $one_result] <
|
||||
exit 0
|
||||
}
|
||||
|
||||
array set portinfo [lindex $one_result 1]
|
||||
if {[info exists portinfo(porturl)]} {
|
||||
if {[catch {set mport [mportopen $portinfo(porturl) [list subport $portinfo(name)] $variations]}]} {
|
||||
lassign $one_result portname portinfo
|
||||
if {[dict exists $portinfo porturl]} {
|
||||
if {[catch {set mport [mportopen [dict get $portinfo porturl] [dict create subport $portname] $variations]}]} {
|
||||
ui_warn "failed to open port: $portname"
|
||||
puts "nonexistent"
|
||||
exit 0
|
||||
|
||||
@@ -61,22 +61,22 @@ try {
|
||||
}
|
||||
|
||||
# parse the given variants from the command line
|
||||
array set variants {}
|
||||
set variants [dict create]
|
||||
foreach item [lrange $::argv 1 end] {
|
||||
foreach {_ sign variant} [regexp -all -inline -- {([-+])([[:alpha:]_]+[\w\.]*)} $item] {
|
||||
set variants($variant) $sign
|
||||
dict set variants $variant $sign
|
||||
}
|
||||
}
|
||||
|
||||
# open the port to get its active variants
|
||||
array set portinfo [lindex $result 1]
|
||||
lassign $result portname portinfo
|
||||
#try -pass_signal {...}
|
||||
try {
|
||||
set mport [mportopen $portinfo(porturl) [list subport $portname] [array get variants]]
|
||||
set mport [mportopen [dict get $portinfo porturl] [dict create subport $portname] $variants]
|
||||
} on error {eMessage} {
|
||||
ui_error "mportopen ${portinfo(porturl)} failed: $eMessage"
|
||||
ui_error "mportopen $portname from [dict get $portinfo porturl] failed: $eMessage"
|
||||
exit 1
|
||||
}
|
||||
|
||||
array set info [mportinfo $mport]
|
||||
puts $info(canonical_active_variants)
|
||||
set portinfo [mportinfo $mport]
|
||||
puts [dict get $portinfo canonical_active_variants]
|
||||
|
||||
+81
-86
@@ -94,26 +94,26 @@ try {
|
||||
}
|
||||
|
||||
# parse the given variants from the command line
|
||||
array set variants {}
|
||||
set variants [dict create]
|
||||
foreach item [lrange $::argv 1 end] {
|
||||
foreach {_ sign variant} [regexp -all -inline -- {([-+])([[:alpha:]_]+[\w\.]*)} $item] {
|
||||
set variants($variant) $sign
|
||||
dict set variants $variant $sign
|
||||
}
|
||||
}
|
||||
|
||||
# open the port so we can run dependency calculation
|
||||
array set portinfo [lindex $result 1]
|
||||
lassign $result portname portinfo
|
||||
#try -pass_signal {...}
|
||||
try {
|
||||
set mport [mportopen $portinfo(porturl) [list subport $portinfo(name)] [array get variants]]
|
||||
set mport [mportopen [dict get $portinfo porturl] [dict create subport $portname] $variants]
|
||||
} on error {eMessage} {
|
||||
ui_error "mportopen ${portinfo(porturl)} failed: $eMessage"
|
||||
ui_error "mportopen of $portname from [dict get $portinfo porturl] failed: $eMessage"
|
||||
exit 2
|
||||
}
|
||||
|
||||
array set portinfo [mportinfo $mport]
|
||||
set portinfo [mportinfo $mport]
|
||||
# Also checking for matching archive, in case supported_archs changed
|
||||
if {[registry::entry imaged $portinfo(name) $portinfo(version) $portinfo(revision) $portinfo(canonical_active_variants)] ne ""
|
||||
if {[registry::entry imaged $portname [dict get $portinfo version] [dict get $portinfo revision] [dict get $portinfo canonical_active_variants]] ne ""
|
||||
&& [[ditem_key $mport workername] eval [list _archive_available]]} {
|
||||
puts "$::argv already installed, not installing or activating dependencies"
|
||||
exit 0
|
||||
@@ -182,12 +182,11 @@ proc check_dep_needs_port {depspec retvar} {
|
||||
}
|
||||
|
||||
# Get the ports needed by a given port.
|
||||
proc collect_deps {portinfovar retvar} {
|
||||
upvar $portinfovar portinfo
|
||||
proc collect_deps {portinfo retvar} {
|
||||
upvar $retvar ret
|
||||
foreach deptype $::recursive_depstypes {
|
||||
if {[info exists portinfo($deptype)]} {
|
||||
foreach depspec $portinfo($deptype) {
|
||||
if {[dict exists $portinfo $deptype]} {
|
||||
foreach depspec [dict get $portinfo $deptype] {
|
||||
check_dep_needs_port $depspec ret
|
||||
}
|
||||
}
|
||||
@@ -207,13 +206,10 @@ proc get_maintainers {args} {
|
||||
ui_error "mportlookup $portname failed: $eMessage"
|
||||
continue
|
||||
}
|
||||
array unset portinfo
|
||||
array set portinfo [lindex $result 1]
|
||||
foreach sublist [macports::unobscure_maintainers $portinfo(maintainers)] {
|
||||
foreach {key value} $sublist {
|
||||
if {$key eq "email"} {
|
||||
lappend retlist $value
|
||||
}
|
||||
set portinfo [lindex $result 1]
|
||||
foreach maintainer [macports::unobscure_maintainers [dict get $portinfo maintainers]] {
|
||||
if {[dict exists $maintainer email]} {
|
||||
lappend retlist [dict get $maintainer email]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -225,26 +221,26 @@ proc open_port {portname} {
|
||||
set result [mportlookup $portname]
|
||||
if {[llength $result] < 2} {
|
||||
ui_error "No such port: $portname"
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[ERROR\] (unknown dependency '$portname') maintainers: [get_maintainers $::portname]."
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[FAIL\] (unknown dependency '$portname') maintainers: [get_maintainers $::portname]."
|
||||
exit 1
|
||||
}
|
||||
} on error {eMessage} {
|
||||
ui_error "mportlookup $portname failed: $eMessage"
|
||||
exit 2
|
||||
}
|
||||
array set portinfo [lindex $result 1]
|
||||
lassign $result portname portinfo
|
||||
try {
|
||||
set mport [mportopen $portinfo(porturl) [list subport $portinfo(name)] [list]]
|
||||
set mport [mportopen [dict get $portinfo porturl] [dict create subport $portname] ""]
|
||||
} on error {eMessage} {
|
||||
ui_error "mportopen $portinfo(porturl) failed: $eMessage"
|
||||
ui_error "mportopen $portname from [dict get $portinfo porturl] failed: $eMessage"
|
||||
exit 2
|
||||
}
|
||||
|
||||
if {![info exists ::mportinfo_array($mport)]} {
|
||||
set ::mportinfo_array($mport) [mportinfo $mport]
|
||||
set portinfo [mportinfo $mport]
|
||||
if {![dict exists $::mportinfo_array $mport]} {
|
||||
dict set ::mportinfo_array $mport $portinfo
|
||||
}
|
||||
array set portinfo $::mportinfo_array($mport)
|
||||
return [list $mport [array get portinfo]]
|
||||
return [list $mport $portinfo]
|
||||
}
|
||||
|
||||
# Deactivate the given port, first deactivating any active dependents
|
||||
@@ -256,41 +252,41 @@ proc deactivate_with_dependents {e} {
|
||||
foreach dependent [$e dependents] {
|
||||
deactivate_with_dependents $dependent
|
||||
}
|
||||
if {![registry::run_target $e deactivate [list ports_nodepcheck 1]]
|
||||
&& [catch {portimage::deactivate [$e name] [$e version] [$e revision] [$e variants] [list ports_nodepcheck 1]} result]} {
|
||||
set options [dict create ports_nodepcheck 1]
|
||||
if {![registry::run_target $e deactivate $options]
|
||||
&& [catch {portimage::deactivate [$e name] [$e version] [$e revision] [$e variants] $options} result]} {
|
||||
puts stderr $::errorInfo
|
||||
puts stderr "Deactivating [$e name] @[$e version]_[$e revision][$e variants] failed: $result"
|
||||
exit 2
|
||||
}
|
||||
}
|
||||
|
||||
proc deactivate_unneeded {portinfovar} {
|
||||
upvar $portinfovar portinfo
|
||||
|
||||
proc deactivate_unneeded {portinfo} {
|
||||
# Unfortunately mportdepends doesn't have quite the right semantics
|
||||
# to be useful here. It's concerned with what is needed and not
|
||||
# present, whereas here we're concerned with removing what we can do
|
||||
# without. Future API opportunity?
|
||||
set deplist [list]
|
||||
foreach deptype $::toplevel_depstypes {
|
||||
if {[info exists portinfo($deptype)]} {
|
||||
foreach depspec $portinfo($deptype) {
|
||||
if {[dict exists $portinfo $deptype]} {
|
||||
foreach depspec [dict get $portinfo $deptype] {
|
||||
check_dep_needs_port $depspec deplist
|
||||
}
|
||||
}
|
||||
}
|
||||
set needed_array [dict create]
|
||||
set mports_array [dict create]
|
||||
while {$deplist ne ""} {
|
||||
set dep [lindex $deplist end]
|
||||
set deplist [lreplace ${deplist}[set deplist {}] end end]
|
||||
if {![info exists needed_array($dep)]} {
|
||||
set needed_array($dep) 1
|
||||
if {![dict exists $needed_array $dep]} {
|
||||
dict set needed_array $dep 1
|
||||
set needed [list]
|
||||
lassign [open_port $dep] mports_array($dep) infolist
|
||||
array unset depportinfo
|
||||
array set depportinfo $infolist
|
||||
collect_deps depportinfo needed
|
||||
lassign [open_port $dep] mport depportinfo
|
||||
dict set mports_array $dep $mport
|
||||
collect_deps $depportinfo needed
|
||||
foreach newdep $needed {
|
||||
if {![info exists needed_array($newdep)]} {
|
||||
if {![dict exists $needed_array $newdep]} {
|
||||
lappend deplist $newdep
|
||||
}
|
||||
}
|
||||
@@ -305,16 +301,15 @@ proc deactivate_unneeded {portinfovar} {
|
||||
# latter will reduce performance for universal installations a
|
||||
# bit, but those are much less common and this ensures
|
||||
# consistent behaviour.
|
||||
if {![info exists needed_array([$e name])]} {
|
||||
if {![dict exists $needed_array [$e name]]} {
|
||||
deactivate_with_dependents $e
|
||||
} else {
|
||||
array unset entryinfo
|
||||
array set entryinfo $::mportinfo_array($mports_array([$e name]))
|
||||
if {$entryinfo(version) ne [$e version]
|
||||
|| $entryinfo(revision) != [$e revision]
|
||||
|| $entryinfo(canonical_active_variants) ne [$e variants]} {
|
||||
set entryinfo [dict get $::mportinfo_array [dict get $mports_array [$e name]]]
|
||||
if {[dict get $entryinfo version] ne [$e version]
|
||||
|| [dict get $entryinfo revision] != [$e revision]
|
||||
|| [dict get $entryinfo canonical_active_variants] ne [$e variants]} {
|
||||
lappend dependents_check_list $e
|
||||
puts stderr "[$e name] installed version @[$e version]_[$e revision][$e variants] doesn't match tree version $entryinfo(version)_$entryinfo(revision)$entryinfo(canonical_active_variants)"
|
||||
puts stderr "[$e name] installed version @[$e version]_[$e revision][$e variants] doesn't match tree version [dict get $entryinfo version]_[dict get $entryinfo revision][dict get $entryinfo canonical_active_variants]"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -329,14 +324,15 @@ proc deactivate_unneeded {portinfovar} {
|
||||
# earlier - it most likely won't be used again (and will be
|
||||
# reopened in the uncommon case that it is needed.)
|
||||
foreach e [registry::entry installed] {
|
||||
mportclose $mports_array([$e name])
|
||||
mportclose [dict get $mports_array [$e name]]
|
||||
}
|
||||
}
|
||||
|
||||
puts stderr "init took [expr {[clock seconds] - $start_time}] seconds"
|
||||
set start_time [clock seconds]
|
||||
|
||||
if {[catch {deactivate_unneeded portinfo} result]} {
|
||||
set mportinfo_array [dict create]
|
||||
if {[catch {deactivate_unneeded $portinfo} result]} {
|
||||
ui_error $::errorInfo
|
||||
ui_error "deactivate_unneeded failed: $result"
|
||||
exit 2
|
||||
@@ -360,7 +356,7 @@ if {[catch {mportdepends $mport "activate" 1 1 0 dlist} result]} {
|
||||
|
||||
proc append_it {ditem} {
|
||||
lappend ::dlist_sorted $ditem
|
||||
set ::mportinfo_array($ditem) [mportinfo $ditem]
|
||||
dict set ::mportinfo_array $ditem [mportinfo $ditem]
|
||||
return 0
|
||||
}
|
||||
try {
|
||||
@@ -391,12 +387,12 @@ puts $log_status_dependencies ""
|
||||
|
||||
## ensure dependencies are installed and active
|
||||
proc checkdep_failcache {ditem} {
|
||||
array set depinfo $::mportinfo_array($ditem)
|
||||
set depinfo [dict get $::mportinfo_array $ditem]
|
||||
|
||||
if {[check_failcache $depinfo(name) [ditem_key $ditem porturl] $depinfo(canonical_active_variants)]} {
|
||||
tee "Dependency '$depinfo(name)' with variants '$depinfo(canonical_active_variants)' has previously failed and is required." $::log_status_dependencies stderr
|
||||
puts "Port $depinfo(name) previously failed in build [check_failcache $depinfo(name) [ditem_key $ditem porturl] $depinfo(canonical_active_variants) yes]"
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[ERROR\] (failed to install dependency '$depinfo(name)') maintainers: [get_maintainers $::portname $depinfo(name)]."
|
||||
if {[check_failcache [dict get $depinfo name] [ditem_key $ditem porturl] [dict get $depinfo canonical_active_variants]]} {
|
||||
tee "Dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' has previously failed and is required." $::log_status_dependencies stderr
|
||||
puts "Port [dict get $depinfo name] previously failed in build [check_failcache [dict get $depinfo name] [ditem_key $ditem porturl] [dict get $depinfo canonical_active_variants] yes]"
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[FAIL\] (failed to install dependency '[dict get $depinfo name]') maintainers: [get_maintainers $::portname [dict get $depinfo name]]."
|
||||
# could keep going to report all deps in the failcache, but failing fast seems better
|
||||
exit 1
|
||||
}
|
||||
@@ -426,12 +422,12 @@ proc clean_workdirs {} {
|
||||
|
||||
# Returns 0 if dep is installed, 1 if not
|
||||
proc install_dep_archive {ditem} {
|
||||
array set depinfo $::mportinfo_array($ditem)
|
||||
set depinfo [dict get $::mportinfo_array $ditem]
|
||||
incr ::dependencies_counter
|
||||
set msg "Installing dependency ($::dependencies_counter of $::dependencies_count) '$depinfo(name)' with variants '$depinfo(canonical_active_variants)'"
|
||||
set msg "Installing dependency ($::dependencies_counter of $::dependencies_count) '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]'"
|
||||
puts -nonewline $::log_status_dependencies "$msg ... "
|
||||
puts "----> ${msg}"
|
||||
if {[registry::entry imaged $depinfo(name) $depinfo(version) $depinfo(revision) $depinfo(canonical_active_variants)] ne ""} {
|
||||
if {[registry::entry imaged [dict get $depinfo name] [dict get $depinfo version] [dict get $depinfo revision] [dict get $depinfo canonical_active_variants]] ne ""} {
|
||||
puts "Already installed, nothing to do"
|
||||
puts $::log_status_dependencies {[OK]}
|
||||
return 0
|
||||
@@ -449,14 +445,14 @@ proc install_dep_archive {ditem} {
|
||||
if {$fail || $result > 0 || [$workername eval [list find_portarchive_path]] eq ""} {
|
||||
# The known_fail case should normally be caught before now, but
|
||||
# it's quick and easy to check and may save a build.
|
||||
if {[info exists depinfo(known_fail)] && [string is true -strict $depinfo(known_fail)]} {
|
||||
puts stderr "Dependency '$depinfo(name)' with variants '$depinfo(canonical_active_variants)' is known to fail, aborting."
|
||||
if {[dict exists $depinfo known_fail] && [string is true -strict [dict get $depinfo known_fail]]} {
|
||||
puts stderr "Dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' is known to fail, aborting."
|
||||
puts $::log_status_dependencies {[FAIL] (known_fail)}
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[ERROR\] (dependency '$depinfo(name)' known to fail) maintainers: [get_maintainers $::portname $depinfo(name)]."
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[FAIL\] (dependency '[dict get $depinfo name]' known to fail) maintainers: [get_maintainers $::portname [dict get $depinfo name]]."
|
||||
exit 1
|
||||
}
|
||||
# This dep will have to be built, not just installed
|
||||
puts stderr "Fetching archive for dependency '$depinfo(name)' with variants '$depinfo(canonical_active_variants)' failed."
|
||||
puts stderr "Fetching archive for dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' failed."
|
||||
puts $::log_status_dependencies {[MISSING]}
|
||||
return 1
|
||||
}
|
||||
@@ -467,9 +463,9 @@ proc install_dep_archive {ditem} {
|
||||
set fail 1
|
||||
}
|
||||
if {$fail || $result > 0} {
|
||||
puts stderr "Installing from archive for dependency '$depinfo(name)' with variants '$depinfo(canonical_active_variants)' failed, aborting."
|
||||
puts stderr "Installing from archive for dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' failed, aborting."
|
||||
puts $::log_status_dependencies {[FAIL]}
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[ERROR\] (failed to install dependency '$depinfo(name)')."
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[FAIL\] (failed to install dependency '$depinfo(name)')."
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -487,10 +483,9 @@ proc close_open_mports {} {
|
||||
set macports::open_mports [list]
|
||||
}
|
||||
|
||||
proc install_dep_source {portinfo_list} {
|
||||
array set depinfo $portinfo_list
|
||||
proc install_dep_source {depinfo} {
|
||||
incr ::build_counter
|
||||
set msg "Building dependency ($::build_counter of $::build_count) '$depinfo(name)' with variants '$depinfo(canonical_active_variants)'"
|
||||
set msg "Building dependency ($::build_counter of $::build_count) '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]'"
|
||||
puts -nonewline $::log_status_dependencies "$msg ... "
|
||||
puts "----> ${msg}"
|
||||
|
||||
@@ -499,15 +494,15 @@ proc install_dep_source {portinfo_list} {
|
||||
set macports::channels(info) {}
|
||||
close_open_mports
|
||||
clean_workdirs
|
||||
array unset ::mportinfo_array
|
||||
set ditem [lindex [open_port $depinfo(name)] 0]
|
||||
set ::mportinfo_array [dict create]
|
||||
set ditem [lindex [open_port [dict get $depinfo name]] 0]
|
||||
# Ensure archivefetch is not attempted at all
|
||||
set workername [ditem_key $ditem workername]
|
||||
$workername eval [list set portutil::archive_available_result 0]
|
||||
$workername eval [list archive_sites]
|
||||
|
||||
# deactivate ports not needed for this dep
|
||||
if {[catch {deactivate_unneeded depinfo} result]} {
|
||||
if {[catch {deactivate_unneeded $depinfo} result]} {
|
||||
ui_error $::errorInfo
|
||||
ui_error "deactivate_unneeded failed: $result"
|
||||
exit 2
|
||||
@@ -525,9 +520,9 @@ proc install_dep_source {portinfo_list} {
|
||||
set fail 1
|
||||
}
|
||||
if {$fail || $result > 0} {
|
||||
puts stderr "Fetch of dependency '$depinfo(name)' with variants '$depinfo(canonical_active_variants)' failed, aborting."
|
||||
puts stderr "Fetch of dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' failed, aborting."
|
||||
puts $::log_status_dependencies {[FAIL] (fetch)}
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[ERROR\] (failed to fetch dependency '$depinfo(name)') maintainers: [get_maintainers $::portname $depinfo(name)]."
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[FAIL\] (failed to fetch dependency '[dict get $depinfo name]') maintainers: [get_maintainers $::portname [dict get $depinfo name]]."
|
||||
exit 1
|
||||
}
|
||||
if {[catch {mportexec $ditem checksum} result]} {
|
||||
@@ -536,9 +531,9 @@ proc install_dep_source {portinfo_list} {
|
||||
set fail 1
|
||||
}
|
||||
if {$fail || $result > 0} {
|
||||
puts stderr "Checksum of dependency '$depinfo(name)' with variants '$depinfo(canonical_active_variants)' failed, aborting."
|
||||
puts stderr "Checksum of dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' failed, aborting."
|
||||
puts $::log_status_dependencies {[FAIL] (checksum)}
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[ERROR\] (failed to checksum dependency '$depinfo(name)') maintainers: [get_maintainers $::portname $depinfo(name)]."
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[FAIL\] (failed to checksum dependency '[dict get $depinfo name]') maintainers: [get_maintainers $::portname [dict get $depinfo name]]."
|
||||
exit 1
|
||||
}
|
||||
|
||||
@@ -549,12 +544,12 @@ proc install_dep_source {portinfo_list} {
|
||||
set fail 1
|
||||
}
|
||||
if {$fail || $result > 0} {
|
||||
puts stderr "Build of dependency '$depinfo(name)' with variants '$depinfo(canonical_active_variants)' failed, aborting."
|
||||
puts stderr "Build of dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' failed, aborting."
|
||||
puts $::log_status_dependencies {[FAIL]}
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[ERROR\] (failed to install dependency '$depinfo(name)') maintainers: [get_maintainers $::portname $depinfo(name)]."
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[FAIL\] (failed to install dependency '[dict get $depinfo name]') maintainers: [get_maintainers $::portname [dict get $depinfo name]]."
|
||||
|
||||
if {$::failcache_dir ne ""} {
|
||||
failcache_update $depinfo(name) [ditem_key $ditem porturl] $depinfo(canonical_active_variants) 1
|
||||
failcache_update [dict get $depinfo name] [ditem_key $ditem porturl] [dict get $depinfo canonical_active_variants] 1
|
||||
}
|
||||
ui_debug "Open mports:"
|
||||
foreach mport $macports::open_mports {
|
||||
@@ -565,7 +560,7 @@ proc install_dep_source {portinfo_list} {
|
||||
|
||||
# Success. Clear any failcache entry.
|
||||
if {$::failcache_dir ne ""} {
|
||||
failcache_update $depinfo(name) [ditem_key $ditem porturl] $depinfo(canonical_active_variants) 0
|
||||
failcache_update [dict get $depinfo name] [ditem_key $ditem porturl] [dict get $depinfo canonical_active_variants] 0
|
||||
}
|
||||
puts $::log_status_dependencies {[OK]}
|
||||
}
|
||||
@@ -578,7 +573,7 @@ set missing_deps [list]
|
||||
try {
|
||||
foreach ditem $dlist_sorted {
|
||||
if {[install_dep_archive $ditem]} {
|
||||
lappend missing_deps $::mportinfo_array($ditem)
|
||||
lappend missing_deps [dict get $::mportinfo_array $ditem]
|
||||
}
|
||||
}
|
||||
} on error {eMessage} {
|
||||
@@ -610,15 +605,15 @@ if {$build_count > 0} {
|
||||
set macports::channels(debug) {}
|
||||
set macports::channels(info) {}
|
||||
close_open_mports
|
||||
array unset ::mportinfo_array
|
||||
set ::mportinfo_array [dict create]
|
||||
try {
|
||||
set mport [mportopen $portinfo(porturl) [list subport $portinfo(name)] [array get variants]]
|
||||
set mport [mportopen [dict get $portinfo porturl] [dict create subport $portname] $variants]
|
||||
} on error {eMessage} {
|
||||
ui_error "mportopen $portinfo(porturl) failed: $eMessage"
|
||||
ui_error "mportopen $portname from [dict get $portinfo porturl] failed: $eMessage"
|
||||
exit 2
|
||||
}
|
||||
[ditem_key $mport workername] eval [list set portutil::archive_available_result 0]
|
||||
if {[catch {deactivate_unneeded portinfo} result]} {
|
||||
if {[catch {deactivate_unneeded $portinfo} result]} {
|
||||
ui_error $::errorInfo
|
||||
ui_error "deactivate_unneeded failed: $result"
|
||||
exit 2
|
||||
@@ -666,9 +661,9 @@ proc activate_dep {ditem} {
|
||||
set fail 1
|
||||
}
|
||||
if {$fail || $result > 0} {
|
||||
array set depinfo $::mportinfo_array($ditem)
|
||||
puts stderr "Activation of dependency '$depinfo(name)' with variants '$depinfo(canonical_active_variants)' failed, aborting."
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[ERROR\] (failed to activate dependency '$depinfo(name)') maintainers: [get_maintainers $::portname $depinfo(name)]."
|
||||
set depinfo [dict get $::mportinfo_array $ditem]
|
||||
puts stderr "Activation of dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' failed, aborting."
|
||||
puts $::log_subports_progress "Building '$::portname' ... \[FAIL\] (failed to activate dependency '[dict get $depinfo name]') maintainers: [get_maintainers $::portname [dict get $depinfo name]]."
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,9 +33,8 @@ if {$failcache_dir eq ""} {
|
||||
file delete -force [file join $failcache_dir $f]
|
||||
continue
|
||||
}
|
||||
array unset portinfo
|
||||
array set portinfo [lindex $result 1]
|
||||
set hash [port_files_checksum $portinfo(porturl)]
|
||||
set portinfo [lindex $result 1]
|
||||
set hash [port_files_checksum [dict get $portinfo porturl]]
|
||||
if {$entry_hash ne $hash} {
|
||||
puts "Removing stale failcache entry: $f"
|
||||
file delete -force [file join $failcache_dir $f]
|
||||
|
||||
@@ -73,11 +73,10 @@ while {[gets $infd line] >= 0} {
|
||||
continue
|
||||
}
|
||||
|
||||
array unset portinfo
|
||||
array set portinfo [lindex $result 1]
|
||||
lassign $result portname portinfo
|
||||
|
||||
foreach e [registry::entry imaged $portinfo(name)] {
|
||||
if {[$e version] ne $portinfo(version) || [$e revision] != $portinfo(revision)} {
|
||||
foreach e [registry::entry imaged $portname] {
|
||||
if {[$e version] ne [dict get $portinfo version] || [$e revision] != [dict get $portinfo revision]} {
|
||||
puts "Skipping [$e name] @[$e version]_[$e revision][$e variants] (not current)"
|
||||
continue
|
||||
}
|
||||
|
||||
+44
-55
@@ -58,13 +58,13 @@ foreach vers {20 21 22 23} {
|
||||
}
|
||||
set deptypes [list depends_fetch depends_extract depends_patch depends_build depends_lib depends_run depends_test]
|
||||
|
||||
array set processed [list]
|
||||
array set mirror_done [list]
|
||||
array set distfiles_results [list]
|
||||
set processed [dict create]
|
||||
set mirror_done [dict create]
|
||||
set distfiles_results [dict create]
|
||||
|
||||
proc check_mirror_done {portname} {
|
||||
if {[info exists ::mirror_done($portname)]} {
|
||||
return $::mirror_done($portname)
|
||||
if {[dict exists $::mirror_done $portname]} {
|
||||
return [dict get $::mirror_done $portname]
|
||||
}
|
||||
set cache_entry [file join $::mirrorcache_dir [string toupper [string index $portname 0]] $portname]
|
||||
if {[file isfile $cache_entry]} {
|
||||
@@ -72,9 +72,8 @@ proc check_mirror_done {portname} {
|
||||
if {[llength $result] < 2} {
|
||||
return 0
|
||||
}
|
||||
array unset portinfo
|
||||
array set portinfo [lindex $result 1]
|
||||
set portfile [file join [macports::getportdir $portinfo(porturl)] Portfile]
|
||||
set portinfo [lindex $result 1]
|
||||
set portfile [file join [macports::getportdir [dict get $portinfo porturl]] Portfile]
|
||||
if {[file isfile $portfile]} {
|
||||
set portfile_hash [sha256 file $portfile]
|
||||
set fd [open $cache_entry]
|
||||
@@ -83,29 +82,28 @@ proc check_mirror_done {portname} {
|
||||
close $fd
|
||||
if {$portfile_hash eq $entry_hash} {
|
||||
if {$partial eq ""} {
|
||||
set ::mirror_done($portname) 1
|
||||
dict set ::mirror_done $portname 1
|
||||
return 1
|
||||
} else {
|
||||
set ::mirror_done($portname) $partial
|
||||
dict set ::mirror_done $portname $partial
|
||||
return $partial
|
||||
}
|
||||
} else {
|
||||
file delete -force $cache_entry
|
||||
set ::mirror_done($portname) 0
|
||||
dict set ::mirror_done $portname 0
|
||||
}
|
||||
}
|
||||
} else {
|
||||
set ::mirror_done($portname) 0
|
||||
dict set ::mirror_done $portname 0
|
||||
}
|
||||
return 0
|
||||
}
|
||||
|
||||
proc set_mirror_done {portname value} {
|
||||
if {![info exists ::mirror_done($portname)] || $::mirror_done($portname) != 1} {
|
||||
if {![dict exists $::mirror_done $portname] || [dict get $::mirror_done $portname] != 1} {
|
||||
set result [mportlookup $portname]
|
||||
array unset portinfo
|
||||
array set portinfo [lindex $result 1]
|
||||
set portfile [file join [macports::getportdir $portinfo(porturl)] Portfile]
|
||||
set portinfo [lindex $result 1]
|
||||
set portfile [file join [macports::getportdir [dict get $portinfo porturl]] Portfile]
|
||||
set portfile_hash [sha256 file $portfile]
|
||||
|
||||
set cache_dir [file join $::mirrorcache_dir [string toupper [string index $portname 0]]]
|
||||
@@ -117,16 +115,15 @@ proc set_mirror_done {portname value} {
|
||||
puts $fd $value
|
||||
}
|
||||
close $fd
|
||||
set ::mirror_done($portname) 1
|
||||
dict set ::mirror_done $portname 1
|
||||
}
|
||||
}
|
||||
|
||||
proc get_dep_list {portinfovar} {
|
||||
upvar $portinfovar portinfo
|
||||
set deps {}
|
||||
proc get_dep_list {portinfo} {
|
||||
set deps [list]
|
||||
foreach deptype $::deptypes {
|
||||
if {[info exists portinfo($deptype)]} {
|
||||
foreach dep $portinfo($deptype) {
|
||||
if {[dict exists $portinfo $deptype]} {
|
||||
foreach dep [dict get $portinfo $deptype] {
|
||||
lappend deps [lindex [split $dep :] end]
|
||||
}
|
||||
}
|
||||
@@ -134,18 +131,14 @@ proc get_dep_list {portinfovar} {
|
||||
return $deps
|
||||
}
|
||||
|
||||
proc get_variants {portinfovar} {
|
||||
upvar $portinfovar portinfo
|
||||
if {![info exists portinfo(vinfo)]} {
|
||||
proc get_variants {portinfo} {
|
||||
if {![dict exists $portinfo vinfo]} {
|
||||
return {}
|
||||
}
|
||||
set variants {}
|
||||
array set vinfo $portinfo(vinfo)
|
||||
foreach v [array names vinfo] {
|
||||
array unset variant
|
||||
array set variant $vinfo($v)
|
||||
if {![info exists variant(is_default)] || $variant(is_default) ne "+"} {
|
||||
lappend variants $v
|
||||
dict for {vname variant} [dict get $portinfo vinfo] {
|
||||
if {![dict exists $variant is_default] || [dict get $variant is_default] ne "+"} {
|
||||
lappend variants $vname
|
||||
}
|
||||
}
|
||||
return $variants
|
||||
@@ -161,7 +154,7 @@ proc save_distfiles_results {mport succeeded} {
|
||||
set distpath [_mportkey $mport distpath]
|
||||
foreach distfile $all_dist_files {
|
||||
set filepath [file join $distpath $distfile]
|
||||
set ::distfiles_results($filepath) $succeeded
|
||||
dict set ::distfiles_results $filepath $succeeded
|
||||
}
|
||||
}
|
||||
|
||||
@@ -201,9 +194,9 @@ proc skip_mirror {mport identifier} {
|
||||
}
|
||||
set distfile [getdistname $distfile]
|
||||
set filepath [file join $distpath $distfile]
|
||||
if {![info exists ::distfiles_results($filepath)]} {
|
||||
if {![dict exists $::distfiles_results $filepath]} {
|
||||
set any_unmirrored 1
|
||||
} elseif {$::distfiles_results($filepath) == 0} {
|
||||
} elseif {[dict get $::distfiles_results $filepath] == 0} {
|
||||
ui_msg "Skipping ${identifier}: $distfile already failed checksum"
|
||||
return 2
|
||||
}
|
||||
@@ -216,24 +209,22 @@ proc skip_mirror {mport identifier} {
|
||||
}
|
||||
|
||||
|
||||
proc mirror_port {portinfo_list} {
|
||||
array set portinfo $portinfo_list
|
||||
set portname $portinfo(name)
|
||||
set porturl $portinfo(porturl)
|
||||
set ::processed($portname) 1
|
||||
proc mirror_port {portinfo} {
|
||||
set portname [dict get $portinfo name]
|
||||
set porturl [dict get $portinfo porturl]
|
||||
dict set ::processed $portname 1
|
||||
set do_mirror 1
|
||||
set attempted 0
|
||||
set succeeded 0
|
||||
if {[lsearch -exact -nocase $portinfo(license) "nomirror"] >= 0} {
|
||||
if {[lsearch -exact -nocase [dict get $portinfo license] "nomirror"] >= 0} {
|
||||
ui_msg "Not mirroring $portname due to license"
|
||||
set do_mirror 0
|
||||
}
|
||||
if {[catch {mportopen $porturl [list subport $portname] {}} mport]} {
|
||||
if {[catch {mportopen $porturl [dict create subport $portname] {}} mport]} {
|
||||
ui_error "mportopen $porturl failed: $mport"
|
||||
return 1
|
||||
}
|
||||
array unset portinfo
|
||||
array set portinfo [mportinfo $mport]
|
||||
set portinfo [mportinfo $mport]
|
||||
|
||||
set skip_result [skip_mirror $mport $portname]
|
||||
if {$do_mirror && $skip_result == 0} {
|
||||
@@ -251,18 +242,17 @@ proc mirror_port {portinfo_list} {
|
||||
}
|
||||
mportclose $mport
|
||||
|
||||
set deps [get_dep_list portinfo]
|
||||
set variants [get_variants portinfo]
|
||||
set deps [get_dep_list $portinfo]
|
||||
set variants [get_variants $portinfo]
|
||||
|
||||
foreach variant $variants {
|
||||
ui_msg "$portname +${variant}"
|
||||
if {[catch {mportopen $porturl [list subport $portname] [list $variant +]} mport]} {
|
||||
if {[catch {mportopen $porturl [dict create subport $portname] [dict create $variant +]} mport]} {
|
||||
ui_error "mportopen $porturl failed: $mport"
|
||||
continue
|
||||
}
|
||||
array unset portinfo
|
||||
array set portinfo [mportinfo $mport]
|
||||
lappend deps {*}[get_dep_list portinfo]
|
||||
set portinfo [mportinfo $mport]
|
||||
lappend deps {*}[get_dep_list $portinfo]
|
||||
set skip_result [skip_mirror $mport "$portname +${variant}"]
|
||||
if {$do_mirror && $skip_result == 0} {
|
||||
incr attempted
|
||||
@@ -281,13 +271,12 @@ proc mirror_port {portinfo_list} {
|
||||
|
||||
foreach {os_major os_arch} $::platforms {
|
||||
ui_msg "$portname with platform 'darwin $os_major $os_arch'"
|
||||
if {[catch {mportopen $porturl [list subport $portname os_major $os_major os_arch $os_arch] {}} mport]} {
|
||||
if {[catch {mportopen $porturl [dict create subport $portname os_major $os_major os_arch $os_arch] {}} mport]} {
|
||||
ui_error "mportopen $porturl failed: $mport"
|
||||
continue
|
||||
}
|
||||
array unset portinfo
|
||||
array set portinfo [mportinfo $mport]
|
||||
lappend deps {*}[get_dep_list portinfo]
|
||||
set portinfo [mportinfo $mport]
|
||||
lappend deps {*}[get_dep_list $portinfo]
|
||||
set skip_result [skip_mirror $mport "$portname darwin $os_major $os_arch"]
|
||||
if {$do_mirror && $skip_result == 0} {
|
||||
incr attempted
|
||||
@@ -306,7 +295,7 @@ proc mirror_port {portinfo_list} {
|
||||
|
||||
set dep_failed 0
|
||||
foreach dep [lsort -unique $deps] {
|
||||
if {![info exists ::processed($dep)] && [check_mirror_done $dep] == 0} {
|
||||
if {![dict exists $::processed $dep] && [check_mirror_done $dep] == 0} {
|
||||
set result [mportlookup $dep]
|
||||
if {[llength $result] < 2} {
|
||||
ui_error "No such port: $dep"
|
||||
@@ -338,7 +327,7 @@ if {[lindex $::argv 0] eq "-c"} {
|
||||
|
||||
set exitval 0
|
||||
foreach portname $::argv {
|
||||
if {[info exists ::processed($portname)]} {
|
||||
if {[dict exists $::processed $portname]} {
|
||||
ui_msg "skipping ${portname}, already processed"
|
||||
continue
|
||||
}
|
||||
|
||||
@@ -32,10 +32,10 @@
|
||||
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
proc split_variants {variants} {
|
||||
set result {}
|
||||
set result [dict create]
|
||||
set l [regexp -all -inline -- {([-+])([[:alpha:]_]+[\w\.]*)} $variants]
|
||||
foreach { match sign variant } $l {
|
||||
lappend result $variant $sign
|
||||
dict set result $variant $sign
|
||||
}
|
||||
return $result
|
||||
}
|
||||
@@ -74,21 +74,21 @@ try {
|
||||
}
|
||||
|
||||
# open the port so we can run dependency calculation
|
||||
array set portinfo [lindex $result 1]
|
||||
lassign $result portname portinfo
|
||||
#try -pass_signal {...}
|
||||
try {
|
||||
set mport [mportopen $portinfo(porturl) [list subport $portname] $variations]
|
||||
set mport [mportopen [dict get $portinfo porturl] [dict create subport $portname] $variations]
|
||||
} on error {eMessage} {
|
||||
ui_error "mportopen ${portinfo(porturl)} failed: $eMessage"
|
||||
ui_error "mportopen for $portname with url [dict get $portinfo porturl] failed: $eMessage"
|
||||
exit 1
|
||||
}
|
||||
|
||||
# obtain PortInfo array for this port and print the list of included
|
||||
# PortGroups
|
||||
array set portinfo [mportinfo $mport]
|
||||
set portinfo [mportinfo $mport]
|
||||
# only ports that include at least one PortGroup have portinfo(portgroups) set
|
||||
if {[info exists portinfo(portgroups)]} {
|
||||
foreach portgroup $portinfo(portgroups) {
|
||||
if {[dict exists $portinfo portgroups]} {
|
||||
foreach portgroup [dict get $portinfo portgroups] {
|
||||
lassign $portgroup group version
|
||||
puts "$group-$version"
|
||||
}
|
||||
|
||||
@@ -19,18 +19,18 @@ package require Tclx
|
||||
mportinit
|
||||
|
||||
random seed
|
||||
array set candidates {}
|
||||
set candidates [dict create]
|
||||
|
||||
fs-traverse -ignoreErrors -- f [list ${macports::portdbpath}/distfiles] {
|
||||
if {[file type $f] eq "file"} {
|
||||
# 0 for distfile, 1 for port
|
||||
set candidates($f) 0
|
||||
dict set candidates $f 0
|
||||
}
|
||||
}
|
||||
|
||||
foreach port [registry::entry imaged] {
|
||||
if {[$port dependents] eq ""} {
|
||||
set candidates($port) 1
|
||||
dict set candidates $port 1
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,7 +44,7 @@ proc active_files_size {port} {
|
||||
return $total
|
||||
}
|
||||
|
||||
set candidate_list [array names candidates]
|
||||
set candidate_list [dict keys $candidates]
|
||||
# It is tempting to sort by size and delete the largest things first,
|
||||
# but picking randomly greatly reduces the chance that we will just
|
||||
# uninstall one huge port that will immediately be reinstalled as a
|
||||
@@ -53,7 +53,7 @@ while {$cur_free < $target && [llength $candidate_list] > 0} {
|
||||
set i [random [llength $candidate_list]]
|
||||
set chosen [lindex $candidate_list $i]
|
||||
set candidate_list [lreplace ${candidate_list}[set candidate_list {}] $i $i]
|
||||
if {$candidates($chosen) == 0} {
|
||||
if {[dict get $candidates $chosen] == 0} {
|
||||
set size [file size $chosen]
|
||||
incr cur_free $size
|
||||
puts "Deleting $chosen ($size bytes)"
|
||||
@@ -69,14 +69,14 @@ while {$cur_free < $target && [llength $candidate_list] > 0} {
|
||||
set deps [$chosen dependencies]
|
||||
puts "Uninstalling [$chosen name] @[$chosen version]_[$chosen revision][$chosen variants] ($size bytes)"
|
||||
if {!$dryrun} {
|
||||
if {![registry::run_target $chosen uninstall [list]]} {
|
||||
if {![registry::run_target $chosen uninstall ""]} {
|
||||
# Portfile failed, use the registry directly
|
||||
registry_uninstall::uninstall [$chosen name] [$chosen version] [$chosen revision] [$chosen variants] [list]
|
||||
registry_uninstall::uninstall [$chosen name] [$chosen version] [$chosen revision] [$chosen variants] ""
|
||||
}
|
||||
}
|
||||
foreach dep $deps {
|
||||
if {![info exists candidates($dep)] && [$dep dependents] eq ""} {
|
||||
set candidates($dep) 1
|
||||
if {![dict exists $candidates $dep] && [$dep dependents] eq ""} {
|
||||
dict set candidates $dep 1
|
||||
lappend candidate_list $dep
|
||||
}
|
||||
}
|
||||
|
||||
+118
-116
@@ -48,14 +48,14 @@ proc ui_channels {priority} {
|
||||
|
||||
|
||||
proc process_port_deps {portname} {
|
||||
set deplist $::portdepinfo($portname)
|
||||
unset ::portdepinfo($portname)
|
||||
if {[info exists ::portsoftdeps($portname)]} {
|
||||
lappend deplist {*}$::portsoftdeps($portname)
|
||||
unset ::portsoftdeps($portname)
|
||||
set deplist [dict get $::portdepinfo $portname]
|
||||
dict unset ::portdepinfo $portname
|
||||
if {[dict exists $::portsoftdeps $portname]} {
|
||||
lappend deplist {*}[dict get $::portsoftdeps $portname]
|
||||
dict unset ::portsoftdeps $portname
|
||||
}
|
||||
foreach portdep $deplist {
|
||||
if {[info exists ::portdepinfo($portdep)]} {
|
||||
if {[dict exists $::portdepinfo $portdep]} {
|
||||
process_port_deps $portdep
|
||||
}
|
||||
}
|
||||
@@ -63,45 +63,45 @@ proc process_port_deps {portname} {
|
||||
}
|
||||
|
||||
proc check_failing_deps {portname} {
|
||||
if {[info exists ::failingports($portname)]} {
|
||||
return $::failingports($portname)
|
||||
if {[dict exists ::failingports $portname]} {
|
||||
return [dict get $::failingports $portname]
|
||||
}
|
||||
# Protect against dependency cycles
|
||||
set ::failingports($portname) [list 3 $portname]
|
||||
foreach portdep $::portdepinfo($portname) {
|
||||
dict set ::failingports $portname [list 3 $portname]
|
||||
foreach portdep [dict get $::portdepinfo $portname] {
|
||||
set dep_ret [check_failing_deps $portdep]
|
||||
# 0 = ok, 1 = known_fail, 2 = failcache, 3 = dep cycle
|
||||
set status [lindex $dep_ret 0]
|
||||
if {$status != 0} {
|
||||
set failed_dep [lindex $dep_ret 1]
|
||||
if {$::outputports($portname) == 1} {
|
||||
if {[dict get $::outputports $portname] == 1} {
|
||||
if {$status == 1} {
|
||||
if {[info exists ::requestedports($portname)]} {
|
||||
puts stderr "Excluding $::canonicalnames($portname) because its dependency '$failed_dep' is known to fail"
|
||||
if {[dict exists $::requestedports $portname]} {
|
||||
puts stderr "Excluding [dict get $::canonicalnames $portname] because its dependency '$failed_dep' is known to fail"
|
||||
}
|
||||
set ::outputports($portname) 0
|
||||
} elseif {$status == 2 && ![info exists ::requestedports($portname)]} {
|
||||
dict set ::outputports $portname 0
|
||||
} elseif {$status == 2 && ![dict exists $::requestedports $portname]} {
|
||||
# Exclude deps that will fail due to their own dep being in the failcache.
|
||||
# But still output requested ports so the failure will be reported.
|
||||
set ::outputports($portname) 0
|
||||
dict set ::outputports $portname 0
|
||||
} elseif {$status == 3} {
|
||||
if {[info exists ::requestedports($portname)]} {
|
||||
puts stderr "Warning: $::canonicalnames($portname) appears to have a cyclic dependency involving '$portdep'"
|
||||
if {[dict exists $::requestedports $portname]} {
|
||||
puts stderr "Warning: [dict get $::canonicalnames $portname] appears to have a cyclic dependency involving '$portdep'"
|
||||
}
|
||||
# Some cycles involving depends_test exist, which don't cause
|
||||
# problems yet only because we don't run tests.
|
||||
#set ::outputports($portname) 0
|
||||
#dict set ::outputports $portname 0
|
||||
}
|
||||
}
|
||||
# keep processing other deps for now if there was a dep cycle
|
||||
if {$status != 3} {
|
||||
set ::failingports($portname) [list $status $failed_dep]
|
||||
return $::failingports($portname)
|
||||
dict set ::failingports $portname [list $status $failed_dep]
|
||||
return [dict get $::failingports $portname]
|
||||
}
|
||||
}
|
||||
}
|
||||
set ::failingports($portname) [list 0 ""]
|
||||
return $::failingports($portname)
|
||||
dict set ::failingports $portname [list 0 ""]
|
||||
return [dict get $::failingports $portname]
|
||||
}
|
||||
|
||||
source [file join [file dirname [info script]] failcache.tcl]
|
||||
@@ -158,9 +158,10 @@ if {$jobs_dir ne "" && $archive_site_public ne "" && $archive_site_private ne ""
|
||||
|
||||
set is_64bit_capable [sysctl hw.cpu64bit_capable]
|
||||
|
||||
array set portdepinfo {}
|
||||
array set portsoftdeps {}
|
||||
array set canonicalnames {}
|
||||
set portdepinfo [dict create]
|
||||
set portsoftdeps [dict create]
|
||||
set canonicalnames [dict create]
|
||||
set failingports [dict create]
|
||||
set todo [list]
|
||||
if {[lindex $argv 0] eq "-"} {
|
||||
while {[gets stdin line] >= 0} {
|
||||
@@ -172,10 +173,13 @@ if {[lindex $argv 0] eq "-"} {
|
||||
}
|
||||
}
|
||||
# save the ones that the user actually wants to know about
|
||||
set inputports [dict create]
|
||||
set outputports [dict create]
|
||||
set requestedports [dict create]
|
||||
foreach p $todo {
|
||||
set inputports($p) 1
|
||||
set outputports($p) 1
|
||||
set requestedports($p) 1
|
||||
dict set inputports $p 1
|
||||
dict set outputports $p 1
|
||||
dict set requestedports $p 1
|
||||
}
|
||||
# process all recursive deps
|
||||
set depstypes [list depends_fetch depends_extract depends_patch depends_build depends_lib depends_run]
|
||||
@@ -183,87 +187,87 @@ while {[llength $todo] > 0} {
|
||||
set p [lindex $todo 0]
|
||||
set todo [lreplace ${todo}[set todo {}] 0 0]
|
||||
|
||||
if {![info exists portdepinfo($p)]} {
|
||||
if {![dict exists $portdepinfo $p]} {
|
||||
if {[catch {mportlookup $p} result]} {
|
||||
puts stderr "$errorInfo"
|
||||
error "Failed to find port '$p': $result"
|
||||
}
|
||||
if {[llength $result] < 2} {
|
||||
puts stderr "port $p not found in the index"
|
||||
set portdepinfo($p) [list]
|
||||
set outputports($p) 0
|
||||
dict set portdepinfo $p ""
|
||||
dict set outputports $p 0
|
||||
continue
|
||||
}
|
||||
|
||||
array set portinfo [lindex $result 1]
|
||||
set portinfo [lindex $result 1]
|
||||
|
||||
if {[info exists inputports($p)]} {
|
||||
if {[dict exists $inputports $p]} {
|
||||
if {$failcache_dir ne ""} {
|
||||
failcache_clear_all $portinfo(name)
|
||||
failcache_clear_all [dict get $portinfo name]
|
||||
}
|
||||
if {[info exists portinfo(subports)]} {
|
||||
foreach subport $portinfo(subports) {
|
||||
if {[dict exists $portinfo subports]} {
|
||||
foreach subport [dict get $portinfo subports] {
|
||||
set splower [string tolower $subport]
|
||||
if {![info exists portdepinfo($splower)]} {
|
||||
if {![dict exists $portdepinfo $splower]} {
|
||||
lappend todo $splower
|
||||
}
|
||||
if {![info exists requestedports($splower)]} {
|
||||
set outputports($splower) 1
|
||||
set requestedports($splower) 1
|
||||
if {![dict exists $requestedports $splower]} {
|
||||
dict set outputports $splower 1
|
||||
dict set requestedports $splower 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
set opened 0
|
||||
if {$outputports($p) == 1} {
|
||||
if {[info exists portinfo(replaced_by)]} {
|
||||
if {[info exists requestedports($p)]} {
|
||||
puts stderr "Excluding $portinfo(name) because it is replaced by $portinfo(replaced_by)"
|
||||
if {[dict get $outputports $p] == 1} {
|
||||
if {[dict exists $portinfo replaced_by]} {
|
||||
if {[dict exists $requestedports $p]} {
|
||||
puts stderr "Excluding [dict get $portinfo name] because it is replaced by [dict get $portinfo replaced_by]"
|
||||
}
|
||||
set outputports($p) 0
|
||||
} elseif {[info exists portinfo(known_fail)] && [string is true -strict $portinfo(known_fail)]} {
|
||||
if {[info exists requestedports($p)]} {
|
||||
puts stderr "Excluding $portinfo(name) because it is known to fail"
|
||||
dict set outputports $p 0
|
||||
} elseif {[dict exists $portinfo known_fail] && [string is true -strict [dict get $portinfo known_fail]]} {
|
||||
if {[dict exists $requestedports $p]} {
|
||||
puts stderr "Excluding [dict get $portinfo name] because it is known to fail"
|
||||
}
|
||||
set outputports($p) 0
|
||||
set failingports($p) [list 1 $portinfo(name)]
|
||||
} elseif {$failcache_dir ne "" && ![info exists requestedports($p)]} {
|
||||
dict set outputports $p 0
|
||||
dict set failingports $p [list 1 [dict get $portinfo name]]
|
||||
} elseif {$failcache_dir ne "" && ![dict exists $requestedports $p]} {
|
||||
# exclude dependencies with a failcache entry
|
||||
if {![catch {mportopen $portinfo(porturl) [list subport $portinfo(name)] ""} result]} {
|
||||
if {![catch {mportopen [dict get $portinfo porturl] [dict create subport [dict get $portinfo name]] ""} result]} {
|
||||
set opened 1
|
||||
set mport $result
|
||||
array set portinfo [mportinfo $mport]
|
||||
if {![info exists portinfo(canonical_active_variants)]} {
|
||||
puts stderr "Warning: $portinfo(name) has no canonical_active_variants"
|
||||
set outputports($p) 0
|
||||
} elseif {[check_failcache $portinfo(name) $portinfo(porturl) $portinfo(canonical_active_variants)] != 0} {
|
||||
set outputports($p) 0
|
||||
set failingports($p) [list 2 $portinfo(name)]
|
||||
set portinfo [mportinfo $mport]
|
||||
if {![dict exists $portinfo canonical_active_variants]} {
|
||||
puts stderr "Warning: [dict get $portinfo name] has no canonical_active_variants"
|
||||
dict set outputports $p 0
|
||||
} elseif {[check_failcache [dict get $portinfo name] [dict get $portinfo porturl] [dict get $portinfo canonical_active_variants]] != 0} {
|
||||
dict set outputports $p 0
|
||||
dict set failingports $p [list 2 [dict get $portinfo name]]
|
||||
}
|
||||
} else {
|
||||
set outputports($p) 0
|
||||
dict set outputports $p 0
|
||||
}
|
||||
}
|
||||
if {$archive_site_public ne "" && $outputports($p) == 1} {
|
||||
if {$archive_site_public ne "" && [dict get $outputports $p] == 1} {
|
||||
# FIXME: support non-default variants
|
||||
if {$opened == 1 || ![catch {mportopen $portinfo(porturl) [list subport $portinfo(name)] ""} result]} {
|
||||
if {$opened == 1 || ![catch {mportopen [dict get $portinfo porturl] [dict create subport [dict get $portinfo name]] ""} result]} {
|
||||
if {$opened != 1} {
|
||||
set opened 1
|
||||
set mport $result
|
||||
array set portinfo [mportinfo $mport]
|
||||
set portinfo [mportinfo $mport]
|
||||
}
|
||||
set workername [ditem_key $mport workername]
|
||||
set archive_name [$workername eval {get_portimage_name}]
|
||||
set archive_name_encoded [portfetch::percent_encode $archive_name]
|
||||
if {![catch {curl getsize ${archive_site_public}/$portinfo(name)/${archive_name_encoded}} size] && $size > 0} {
|
||||
if {![catch {curl getsize ${archive_site_public}/[dict get $portinfo name]/${archive_name_encoded}} size] && $size > 0} {
|
||||
# Check for other installed variants that might not have been uploaded
|
||||
set archives_prefix ${macports::portdbpath}/software/$portinfo(name)/$portinfo(name)-$portinfo(version)_$portinfo(revision)
|
||||
set archives_prefix ${macports::portdbpath}/software/[dict get $portinfo name]/[dict get $portinfo name]-[dict get $portinfo version]_[dict get $portinfo revision]
|
||||
set any_archive_missing 0
|
||||
foreach installed_archive [glob -nocomplain -tails -path ${archives_prefix} *] {
|
||||
if {$installed_archive ne $archive_name} {
|
||||
set installed_archive_encoded [portfetch::percent_encode $installed_archive]
|
||||
if {[catch {curl getsize ${archive_site_public}/$portinfo(name)/${installed_archive_encoded}} size] || $size <= 0} {
|
||||
if {[catch {curl getsize ${archive_site_public}/[dict get $portinfo name]/${installed_archive_encoded}} size] || $size <= 0} {
|
||||
set any_archive_missing 1
|
||||
puts stderr "$installed_archive installed but not uploaded"
|
||||
break
|
||||
@@ -271,75 +275,75 @@ while {[llength $todo] > 0} {
|
||||
}
|
||||
}
|
||||
if {!$any_archive_missing} {
|
||||
if {[info exists requestedports($p)]} {
|
||||
puts stderr "Excluding $portinfo(name) because it has already been built and uploaded to the public server"
|
||||
if {[dict exists $requestedports $p]} {
|
||||
puts stderr "Excluding [dict get $portinfo name] because it has already been built and uploaded to the public server"
|
||||
}
|
||||
set outputports($p) 0
|
||||
dict set outputports $p 0
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if {[info exists requestedports($p)]} {
|
||||
puts stderr "Excluding $portinfo(name) because it failed to open: $result"
|
||||
if {[dict exists $requestedports $p]} {
|
||||
puts stderr "Excluding [dict get $portinfo name] because it failed to open: $result"
|
||||
}
|
||||
set outputports($p) 0
|
||||
dict set outputports $p 0
|
||||
}
|
||||
if {$outputports($p) == 1 && $archive_site_private ne "" && $jobs_dir ne ""} {
|
||||
if {[dict get $outputports $p] == 1 && $archive_site_private ne "" && $jobs_dir ne ""} {
|
||||
# FIXME: support non-default variants
|
||||
set results [check_licenses $portinfo(name) [list]]
|
||||
if {[lindex $results 0] == 1 && ![catch {curl getsize ${archive_site_private}/$portinfo(name)/${archive_name_encoded}} size] && $size > 0} {
|
||||
if {[info exists requestedports($p)]} {
|
||||
puts stderr "Excluding $portinfo(name) because it is not distributable and it has already been built and uploaded to the private server"
|
||||
set results [check_licenses [dict get $portinfo name] [list]]
|
||||
if {[lindex $results 0] == 1 && ![catch {curl getsize ${archive_site_private}/[dict get $portinfo name]/${archive_name_encoded}} size] && $size > 0} {
|
||||
if {[dict exists $requestedports $p]} {
|
||||
puts stderr "Excluding [dict get $portinfo name] because it is not distributable and it has already been built and uploaded to the private server"
|
||||
}
|
||||
set outputports($p) 0
|
||||
dict set outputports $p 0
|
||||
}
|
||||
}
|
||||
}
|
||||
if {$outputports($p) == 1 &&
|
||||
if {[dict get $outputports $p] == 1 &&
|
||||
($::macports::os_major <= 10 || $::macports::os_major >= 18)} {
|
||||
if {$opened == 1 || ![catch {mportopen $portinfo(porturl) [list subport $portinfo(name)] ""} result]} {
|
||||
if {$opened == 1 || ![catch {mportopen [dict get $portinfo porturl] [dict create subport [dict get $portinfo name]] ""} result]} {
|
||||
if {$opened != 1} {
|
||||
set opened 1
|
||||
set mport $result
|
||||
array set portinfo [mportinfo $mport]
|
||||
set portinfo [mportinfo $mport]
|
||||
}
|
||||
set supported_archs [_mportkey $mport supported_archs]
|
||||
switch $::macports::os_arch {
|
||||
arm {
|
||||
if {$supported_archs ne "" && $supported_archs ne "noarch" && "arm64" ni $supported_archs} {
|
||||
if {[info exists requestedports($p)]} {
|
||||
puts stderr "Excluding $portinfo(name) because it does not support the arm64 arch"
|
||||
if {[dict exists $requestedports $p]} {
|
||||
puts stderr "Excluding [dict get $portinfo name] because it does not support the arm64 arch"
|
||||
}
|
||||
set outputports($p) 0
|
||||
dict set outputports $p 0
|
||||
}
|
||||
}
|
||||
i386 {
|
||||
if {${is_64bit_capable}} {
|
||||
if {$::macports::os_major >= 18 && $supported_archs ne "" && $supported_archs ne "noarch" && "x86_64" ni $supported_archs} {
|
||||
if {[info exists requestedports($p)]} {
|
||||
puts stderr "Excluding $portinfo(name) because it does not support the x86_64 arch"
|
||||
if {[dict exists $requestedports $p]} {
|
||||
puts stderr "Excluding [dict get $portinfo name] because it does not support the x86_64 arch"
|
||||
}
|
||||
set outputports($p) 0
|
||||
dict set outputports $p 0
|
||||
}
|
||||
} elseif {$supported_archs ne "" && $supported_archs ne "noarch" && ("x86_64" ni $supported_archs || "i386" ni $supported_archs)} {
|
||||
if {[info exists requestedports($p)]} {
|
||||
puts stderr "Excluding $portinfo(name) because the ${::macports::macosx_version}_x86_64 builder will build it"
|
||||
if {[dict exists $requestedports $p]} {
|
||||
puts stderr "Excluding [dict get $portinfo name] because the ${::macports::macosx_version}_x86_64 builder will build it"
|
||||
}
|
||||
set outputports($p) 0
|
||||
dict set outputports $p 0
|
||||
}
|
||||
}
|
||||
powerpc {
|
||||
if {$supported_archs ne "" && $supported_archs ne "noarch" && "ppc" ni $supported_archs} {
|
||||
if {[info exists requestedports($p)]} {
|
||||
puts stderr "Excluding $portinfo(name) because it does not support the ppc arch"
|
||||
if {[dict exists $requestedports $p]} {
|
||||
puts stderr "Excluding [dict get $portinfo name] because it does not support the ppc arch"
|
||||
}
|
||||
set outputports($p) 0
|
||||
dict set outputports $p 0
|
||||
}
|
||||
}
|
||||
default {}
|
||||
}
|
||||
} else {
|
||||
puts stderr "Excluding $portinfo(name) because it failed to open: $result"
|
||||
set outputports($p) 0
|
||||
puts stderr "Excluding [dict get $portinfo name] because it failed to open: $result"
|
||||
dict set outputports $p 0
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -348,34 +352,34 @@ while {[llength $todo] > 0} {
|
||||
mportclose $mport
|
||||
}
|
||||
|
||||
if {$outputports($p) == 1} {
|
||||
set canonicalnames($p) $portinfo(name)
|
||||
if {[dict get $outputports $p] == 1} {
|
||||
dict set canonicalnames $p [dict get $portinfo name]
|
||||
}
|
||||
|
||||
# If $requestedports($p) == 0, we're seeing the port again as a dependency of
|
||||
# something else and thus need to follow its deps even if it was excluded.
|
||||
if {$outputports($p) == 1 || ![info exists requestedports($p)] || $requestedports($p) == 0} {
|
||||
set portdepinfo($p) [list]
|
||||
if {[dict get $outputports $p] == 1 || ![dict exists $requestedports $p] || [dict get $requestedports $p] == 0} {
|
||||
dict set portdepinfo $p [list]
|
||||
foreach depstype $depstypes {
|
||||
if {[info exists portinfo($depstype)] && $portinfo($depstype) ne ""} {
|
||||
foreach onedep $portinfo($depstype) {
|
||||
if {[dict exists $portinfo $depstype] && [dict get $portinfo $depstype] ne ""} {
|
||||
foreach onedep [dict get $portinfo $depstype] {
|
||||
set depname [string tolower [lindex [split [lindex $onedep 0] :] end]]
|
||||
if {[string match port:* $onedep]} {
|
||||
lappend portdepinfo($p) $depname
|
||||
dict lappend portdepinfo $p $depname
|
||||
} else {
|
||||
# soft deps are installed before their dependents, but
|
||||
# don't cause exclusion if they are failing
|
||||
# real problematic example: bin:xattr:xattr
|
||||
lappend portsoftdeps($p) $depname
|
||||
dict lappend portsoftdeps $p $depname
|
||||
}
|
||||
if {![info exists outputports($depname)]} {
|
||||
if {![dict exists $outputports $depname]} {
|
||||
lappend todo $depname
|
||||
if {$include_deps} {
|
||||
set outputports($depname) 1
|
||||
dict set outputports $depname 1
|
||||
} else {
|
||||
set outputports($depname) 0
|
||||
dict set outputports $depname 0
|
||||
}
|
||||
} elseif {[info exists requestedports($depname)] && ![info exists portdepinfo($depname)]} {
|
||||
} elseif {[dict exists $requestedports $depname] && ![dict exists $portdepinfo $depname]} {
|
||||
# may or may not have been checked for exclusion yet
|
||||
lappend todo $depname
|
||||
}
|
||||
@@ -385,11 +389,9 @@ while {[llength $todo] > 0} {
|
||||
}
|
||||
|
||||
# Mark as having been processed at least once.
|
||||
if {[info exists requestedports($p)]} {
|
||||
set requestedports($p) 0
|
||||
if {[dict exists $requestedports $p]} {
|
||||
dict set requestedports $p 0
|
||||
}
|
||||
|
||||
array unset portinfo
|
||||
}
|
||||
}
|
||||
|
||||
@@ -397,20 +399,20 @@ if {$jobs_dir ne "" && $license_db_dir ne "" && $archive_site_public ne "" && $a
|
||||
write_license_db $license_db_dir
|
||||
}
|
||||
|
||||
set sorted_portnames [lsort -dictionary [array names portdepinfo]]
|
||||
set sorted_portnames [lsort -dictionary [dict keys $portdepinfo]]
|
||||
foreach portname $sorted_portnames {
|
||||
check_failing_deps $portname
|
||||
}
|
||||
|
||||
set portlist [list]
|
||||
foreach portname $sorted_portnames {
|
||||
if {[info exists portdepinfo($portname)]} {
|
||||
if {[dict exists $portdepinfo $portname]} {
|
||||
process_port_deps $portname
|
||||
}
|
||||
}
|
||||
|
||||
foreach portname $portlist {
|
||||
if {$outputports($portname) == 1} {
|
||||
puts $canonicalnames($portname)
|
||||
if {[dict get $outputports $portname] == 1} {
|
||||
puts [dict get $canonicalnames $portname]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,10 +31,10 @@
|
||||
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
proc split_variants {variants} {
|
||||
set result {}
|
||||
set result [dict create]
|
||||
set l [regexp -all -inline -- {([-+])([[:alpha:]_]+[\w\.]*)} $variants]
|
||||
foreach { match sign variant } $l {
|
||||
lappend result $variant $sign
|
||||
dict set result $variant $sign
|
||||
}
|
||||
return $result
|
||||
}
|
||||
@@ -64,14 +64,13 @@ if {[catch {set one_result [mportlookup $portname]}] || [llength $one_result] <
|
||||
exit 1
|
||||
}
|
||||
|
||||
array set portinfo [lindex $one_result 1]
|
||||
set portname $portinfo(name)
|
||||
lassign $one_result portname portinfo
|
||||
|
||||
if {[info exists portinfo(porturl)]} {
|
||||
if {[catch {set mport [mportopen $portinfo(porturl) [list subport $portname] $variations]}]} {
|
||||
if {[dict exists $portinfo porturl]} {
|
||||
if {[catch {set mport [mportopen [dict get $portinfo porturl] [dict create subport $portname] $variations]}]} {
|
||||
ui_warn "failed to open port: $portname"
|
||||
} else {
|
||||
set archs [_mportkey $mport supported_archs]
|
||||
puts [expr {$archs ne "" ? $archs : "x86_64 i386 ppc64 ppc"}]
|
||||
puts [expr {$archs ne "" ? $archs : "arm64 i386 ppc ppc64 x86_64"}]
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,8 @@ if {$showVersion} {
|
||||
|
||||
# Create a lookup table for determining whether a port has dependents
|
||||
# (regardless of whether or not those dependents are currently installed)
|
||||
set dependents [dict create]
|
||||
set a_dependency [dict create]
|
||||
foreach source $macports::sources {
|
||||
set source [lindex $source 0]
|
||||
macports_try -pass_signal {
|
||||
@@ -48,19 +50,16 @@ foreach source $macports::sources {
|
||||
|
||||
macports_try -pass_signal {
|
||||
while {[gets $fd line] >= 0} {
|
||||
array unset portinfo
|
||||
set name [lindex $line 0]
|
||||
set len [lindex $line 1]
|
||||
set line [read $fd $len]
|
||||
array set portinfo $line
|
||||
lassign $line name len
|
||||
set portinfo [read $fd $len]
|
||||
|
||||
# depends_test is not included because mpbb doesn't run `port test'
|
||||
foreach field {depends_build depends_extract depends_fetch depends_lib depends_patch depends_run} {
|
||||
if {[info exists portinfo($field)]} {
|
||||
foreach dependency $portinfo($field) {
|
||||
foreach field [list depends_build depends_extract depends_fetch depends_lib depends_patch depends_run] {
|
||||
if {[dict exists $portinfo $field]} {
|
||||
foreach dependency [dict get $portinfo $field] {
|
||||
set lowercase_dependency_name [string tolower [lindex [split $dependency :] end]]
|
||||
incr dependents($lowercase_dependency_name)
|
||||
set a_dependency($lowercase_dependency_name) $name
|
||||
dict incr dependents $lowercase_dependency_name
|
||||
dict set a_dependency $lowercase_dependency_name $name
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -80,12 +79,12 @@ proc removal_reason {installed_name} {
|
||||
global dependents a_dependency
|
||||
set reason ""
|
||||
set lowercase_name [string tolower $installed_name]
|
||||
if {![info exists dependents($lowercase_name)]} {
|
||||
if {![dict exists $dependents $lowercase_name]} {
|
||||
set reason "no port in the PortIndex depends on $installed_name"
|
||||
} elseif {$dependents($lowercase_name) == 1} {
|
||||
set dependency_reason [removal_reason $a_dependency($lowercase_name)]
|
||||
} elseif {[dict get $dependents $lowercase_name] == 1} {
|
||||
set dependency_reason [removal_reason [dict get $a_dependency $lowercase_name]]
|
||||
if {$dependency_reason ne ""} {
|
||||
set reason "only $a_dependency($lowercase_name) depends on $installed_name and $dependency_reason"
|
||||
set reason "only [dict get $a_dependency $lowercase_name] depends on $installed_name and $dependency_reason"
|
||||
}
|
||||
}
|
||||
return $reason
|
||||
@@ -100,13 +99,15 @@ proc deactivate_with_dependents {e} {
|
||||
foreach dependent [$e dependents] {
|
||||
deactivate_with_dependents $dependent
|
||||
}
|
||||
if {![registry::run_target $e deactivate [list ports_nodepcheck 1]]
|
||||
&& [catch {portimage::deactivate [$e name] [$e version] [$e revision] [$e variants] [list ports_nodepcheck 1]} result]} {
|
||||
set options [dict create ports_nodepcheck 1]
|
||||
if {![registry::run_target $e deactivate $options]
|
||||
&& [catch {portimage::deactivate [$e name] [$e version] [$e revision] [$e variants] $options} result]} {
|
||||
puts stderr $::errorInfo
|
||||
puts stderr "Deactivating [$e name] @[$e version]_[$e revision][$e variants] failed: $result"
|
||||
}
|
||||
}
|
||||
|
||||
set uninstall_options [dict create ports_force 1]
|
||||
foreach port [registry::entry imaged] {
|
||||
# Set to yes if a port should be uninstalled
|
||||
set uninstall no
|
||||
@@ -122,11 +123,10 @@ foreach port [registry::entry imaged] {
|
||||
ui_msg "Removing ${installed_name} @${installed_version}_${installed_revision}${installed_variants} because it is no longer in the PortIndex"
|
||||
set uninstall yes
|
||||
} else {
|
||||
array unset portinfo
|
||||
array set portinfo [lindex $portindex_match 1]
|
||||
set portinfo [lindex $portindex_match 1]
|
||||
|
||||
set portspec "$installed_name @${installed_version}_$installed_revision$installed_variants"
|
||||
if {$portinfo(version) ne $installed_version || $portinfo(revision) != $installed_revision} {
|
||||
if {[dict get $portinfo version] ne $installed_version || [dict get $portinfo revision] != $installed_revision} {
|
||||
# The version in the index is different than the installed one
|
||||
ui_msg "Removing $portspec because there is a newer version in the PortIndex"
|
||||
set uninstall yes
|
||||
@@ -139,7 +139,7 @@ foreach port [registry::entry imaged] {
|
||||
set uninstall no
|
||||
if {no} {
|
||||
set lowercase_name [string tolower $installed_name]
|
||||
ui_msg "Not removing $portspec because it has $dependents($lowercase_name) dependents"
|
||||
ui_msg "Not removing $portspec because it has [dict get $dependents $lowercase_name] dependents"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -150,9 +150,9 @@ foreach port [registry::entry imaged] {
|
||||
deactivate_with_dependents $dependent
|
||||
}
|
||||
# Try to run the target via the portfile first, so pre/post code runs
|
||||
if {![registry::run_target $port uninstall [list ports_force 1]]} {
|
||||
if {![registry::run_target $port uninstall $uninstall_options]} {
|
||||
# Portfile failed, use the registry directly
|
||||
registry_uninstall::uninstall $installed_name $installed_version $installed_revision $installed_variants [list ports_force 1]
|
||||
registry_uninstall::uninstall $installed_name $installed_version $installed_revision $installed_variants $uninstall_options
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user