Skip to content

Commit

Permalink
reclaim: add option to keep build deps
Browse files Browse the repository at this point in the history
  • Loading branch information
jmroot committed Dec 9, 2024
1 parent 1b43b56 commit bbc10c2
Show file tree
Hide file tree
Showing 2 changed files with 92 additions and 39 deletions.
129 changes: 91 additions & 38 deletions src/macports1.0/reclaim.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ namespace eval reclaim {
return
}

uninstall_unrequested
uninstall_unrequested [dict exists $opts ports_reclaim_keep-build-deps]
uninstall_inactive
remove_distfiles
remove_builds
Expand Down Expand Up @@ -663,13 +663,14 @@ namespace eval reclaim {
} elseif {${retval} == 0} {
set options [dict create ports_force true]
foreach port $inactive_ports {
set portname [$port name]
# Note: 'uninstall' takes a name, version, revision, variants and an options list.
macports_try -pass_signal {
if {[macports::global_option_isset ports_uninstall_no-exec] || ![registry::run_target $port uninstall $options]} {
registry_uninstall::uninstall [$port name] [$port version] [$port revision] [$port variants] $options
registry_uninstall::uninstall $portname [$port version] [$port revision] [$port variants] $options
}
} on error {eMessage} {
ui_error "Error uninstalling $name: $eMessage"
ui_error "Error uninstalling $portname: $eMessage"
}
}
} else {
Expand All @@ -683,8 +684,70 @@ namespace eval reclaim {
return 0
}

proc get_build_deps {portname requested_variants} {
set build_deps [list]
lassign [mportlookup $portname] portname portinfo
if {[dict exists $portinfo porturl]} {
set options [dict create subport $portname]

set splitvariant [split $requested_variants -]
set minusvariant [lrange $splitvariant 1 end]
set splitvariant [split [lindex $splitvariant 0] +]
set plusvariant [lrange $splitvariant 1 end]
set variations [dict create]
foreach v $plusvariant {
dict set variations $v +
}
foreach v $minusvariant {
if {[string first "+" $v] == -1} {
dict set variations $v -
}
}

proc uninstall_unrequested {} {
if {[catch {set mport [mportopen [dict get $portinfo porturl] $options $variations]} result]} {
ui_debug "unable to open port $name ${requested_variants}: $result"
} else {
set portinfo [mportinfo $mport]
mportclose $mport
}
foreach type {depends_fetch depends_extract depends_patch depends_build} {
if {[dict exists $portinfo $type]} {
foreach d [dict get $portinfo $type] {
lappend build_deps [lindex [split $d :] end]
}
}
}
} else {
ui_debug "lookup of $portname failed"
}
return $build_deps
}

proc mark_deps_needed {port inc_build} {
upvar is_needed is_needed
set portname [$port name]
foreach dep [$port dependencies] {
set depname [$dep name]
if {![dict exists $is_needed $depname] || ![dict get $is_needed $depname]} {
ui_debug "$depname is needed by $portname"
dict set is_needed $depname 1
mark_deps_needed $dep $inc_build
}
}
if {$inc_build} {
foreach depname [get_build_deps $portname [$port requested_variants]] {
if {![dict exists $is_needed $depname] || ![dict get $is_needed $depname]} {
ui_debug "$depname is needed by $portname"
dict set is_needed $depname 1
foreach dep [registry::entry installed $depname] {
mark_deps_needed $dep $inc_build
}
}
}
}
}

proc uninstall_unrequested {keep_build_deps} {

# Attempts to uninstall unrequested ports no requested ports depend on
#
Expand All @@ -693,48 +756,35 @@ namespace eval reclaim {
# Returns:
# 0 if execution was successful. Errors (for now) if execution wasn't.

set installed_ports [sort_portlist_by_dependendents [registry::entry installed]]

set unnecessary_ports [list]
set unnecessary_names [list]
set unnecessary_count 0

set isrequested [dict create]
set is_needed [dict create]

global macports::ui_prefix macports::ui_options
ui_msg "$ui_prefix Checking for unnecessary unrequested ports"

foreach port [sort_portlist_by_dependendents [registry::entry imaged]] {
foreach port $installed_ports {
set portname [$port name]
if {![dict exists $isrequested $portname] || [dict get $isrequested $portname] == 0} {
dict set isrequested $portname [$port requested]
}
if {[dict get $isrequested $portname] == 0} {
set dependents [$port dependents]
foreach dependent $dependents {
set dname [$dependent name]
if {![dict exists $isrequested $dname]} {
ui_debug "$portname appears to have a circular dependency involving $dname"
dict set isrequested $portname 1
break
} elseif {[dict get $isrequested $dname] != 0} {
ui_debug "$portname is requested by $dname"
dict set isrequested $portname 1
break
}
}
#foreach dependent $dependents {
# registry::entry close $dependent
#}

if {[dict get $isrequested $portname] == 0} {
lappend unnecessary_ports $port
lappend unnecessary_names "$portname @[$port version]_[$port revision][$port variants]"
incr unnecessary_count
} else {
#registry::entry close $port
if {![dict exists $is_needed $portname] || ![dict get $is_needed $portname]} {
dict set is_needed $portname [$port requested]
if {[dict get $is_needed $portname]} {
mark_deps_needed $port $keep_build_deps
}
}
}

foreach port $installed_ports {
set portname [$port name]
if {![dict get $is_needed $portname]} {
lappend unnecessary_ports $port
lappend unnecessary_names "$portname @[$port version]_[$port revision][$port variants]"
}
}
set unnecessary_count [llength $unnecessary_ports]

if { $unnecessary_count == 0 } {
ui_msg "Found no unrequested ports without requested dependents."

Expand All @@ -747,21 +797,24 @@ namespace eval reclaim {
if {${retval} == 0 && [macports::global_option_isset ports_dryrun]} {
ui_msg "Skipping uninstall of unrequested ports (dry run)"
} elseif {${retval} == 0} {
set options [dict create ports_force true]
foreach port $unnecessary_ports {
# Note: 'uninstall' takes a name, version, revision, variants and an options list.
macports_try -pass_signal {
registry_uninstall::uninstall [$port name] [$port version] [$port revision] [$port variants] {ports_force true}
if {[macports::global_option_isset ports_uninstall_no-exec] || ![registry::run_target $port uninstall $options]} {
registry_uninstall::uninstall [$port name] [$port version] [$port revision] [$port variants] $options
}
} on error {eMessage} {
ui_error "Error uninstalling $name: $eMessage"
ui_error "Error uninstalling $portname: $eMessage"
}
}
} else {
ui_msg "Not uninstalling ports; use 'port setrequested' to mark a port as explicitly requested."
}
foreach port $unnecessary_ports {
#foreach port $unnecessary_ports {
# may have been uninstalled and thus already closed
#catch {registry::entry close $port}
}
#}
}
return 0
}
Expand Down
2 changes: 1 addition & 1 deletion src/port/port.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -4247,7 +4247,7 @@ set cmd_opts_array [dict create {*}{
upgrade {force enforce-variants no-replace no-rev-upgrade}
rev-upgrade {id-loadcmd-check}
diagnose {quiet}
reclaim {enable-reminders disable-reminders}
reclaim {enable-reminders disable-reminders keep-build-deps}
fetch {no-mirrors}
bump {patch}
snapshot {create list {diff 1} all {delete 1} help {note 1} {export 1} {import 1}}
Expand Down

0 comments on commit bbc10c2

Please sign in to comment.