<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch master
in repository macports-base.
</pre>
<p><a href="https://github.com/macports/macports-base/commit/738e5f5a450a800687f9946969550ac73fdd5d98">https://github.com/macports/macports-base/commit/738e5f5a450a800687f9946969550ac73fdd5d98</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 738e5f5a450a800687f9946969550ac73fdd5d98
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Fri Feb 16 06:37:24 2018 +1100
<span style='display:block; white-space:pre;color:#404040;'> Unload startupitems at deactivate time
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Also load the startupitem of newly upgraded ports if it was loaded
</span><span style='display:block; white-space:pre;color:#404040;'> for the old version.
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Fixes: https://trac.macports.org/ticket/23677
</span>---
src/macports1.0/macports.tcl | 24 ++++++++++----
src/port1.0/portdeactivate.tcl | 8 ++---
src/port1.0/portload.tcl | 2 +-
src/port1.0/portstartupitem.tcl | 72 ++++++++++++++++++++++++++++++-----------
4 files changed, 77 insertions(+), 29 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/macports.tcl b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 7393522..b9913a9 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3985,6 +3985,7 @@ proc macports::_upgrade {portname dspec variationslist optionslist {depscachenam
</span> return 0
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ set workername [ditem_key $mport workername]
</span> if {$will_build} {
if {$already_installed
&& ([info exists options(ports_upgrade_force)] || $build_override == 1)} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3992,7 +3993,6 @@ proc macports::_upgrade {portname dspec variationslist optionslist {depscachenam
</span> # fresh one will be either fetched or built locally.
# Ideally this would be done in the interp_options when we mportopen,
# but we don't know if we want to do this at that point.
<span style='display:block; white-space:pre;background:#ffe0e0;'>- set workername [ditem_key $mport workername]
</span> $workername eval {set force_archive_refresh yes}
# run archivefetch and destroot for version_in_tree
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4027,6 +4027,12 @@ proc macports::_upgrade {portname dspec variationslist optionslist {depscachenam
</span> }
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ # check if the startupitem is loaded, so we can load again it after upgrading
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # (deactivating the old version will unload the startupitem)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {$portname eq $newname} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set load_startupitem [$workername eval {portstartupitem::is_loaded}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # are we installing an existing version due to force or epoch override?
if {$already_installed
&& ([info exists options(ports_upgrade_force)] || $build_override == 1)} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -4084,11 +4090,17 @@ proc macports::_upgrade {portname dspec variationslist optionslist {depscachenam
</span> ui_msg "Skipping deactivate $portname @${version_active}_${revision_active}$variant_active (dry run)"
}
ui_msg "Skipping activate $newname @${version_in_tree}_${revision_in_tree}$portinfo(canonical_active_variants) (dry run)"
<span style='display:block; white-space:pre;background:#ffe0e0;'>- } elseif {[catch {set result [mportexec $mport activate]} result]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_error "Couldn't activate $newname ${version_in_tree}_${revision_in_tree}$portinfo(canonical_active_variants): $result"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- catch {mportclose $mport}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[catch {mportexec $mport activate} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_error "Couldn't activate $newname ${version_in_tree}_${revision_in_tree}$portinfo(canonical_active_variants): $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ catch {mportclose $mport}
</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;'>+ if {$load_startupitem && [catch {mportexec $mport load} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_debug $::errorInfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_warn "Error loading startupitem for ${newname}: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span> }
# Check if we have to do dependents
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portdeactivate.tcl b/src/port1.0/portdeactivate.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index fbdfb5a..5941e5a 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portdeactivate.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portdeactivate.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -56,12 +56,12 @@ proc portdeactivate::deactivate_start {args} {
</span> }
proc portdeactivate::deactivate_main {args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global subport version revision portvariants user_options startupitem.autostart UI_PREFIX
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ global subport version revision portvariants user_options UI_PREFIX
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>- if {[tbool startupitem.autostart]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_notice "$UI_PREFIX [format [msgcat::mc "Unloading %s"] [option subport]]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[portstartupitem::is_loaded]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_notice "$UI_PREFIX [format [msgcat::mc "Unloading startupitem for %s"] $subport]"
</span> if {[eval_targets "unload"]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- ui_warn [format [msgcat::mc "Failed to unload %s, continuing anyway."] [option subport]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ui_warn [format [msgcat::mc "Failed to unload startupitem for %s (continuing anyway)"] $subport]
</span> }
}
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portload.tcl b/src/port1.0/portload.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 7712266..12eba2f 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portload.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portload.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -48,7 +48,7 @@ default load.asroot yes
</span> set_ui_prefix
proc portload::load_main {args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- global startupitem.type startupitem.name startupitem.location startupitem.plist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ global startupitem.location startupitem.plist
</span> set launchctl_path ${portutil::autoconf::launchctl_path}
foreach { path } "/Library/${startupitem.location}/${startupitem.plist}" {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portstartupitem.tcl b/src/port1.0/portstartupitem.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 401a468..26ea2a6 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portstartupitem.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portstartupitem.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -99,13 +99,31 @@ default startupitem.requires ""
</span> default startupitem.restart ""
default startupitem.start ""
default startupitem.stop ""
<span style='display:block; white-space:pre;background:#ffe0e0;'>-default startupitem.type {$system_options(startupitem_type)}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+default startupitem.type {[portstartupitem::get_startupitem_type]}
</span> default startupitem.uniquename {org.macports.${startupitem.name}}
default startupitem.daemondo.verbosity 1
set_ui_prefix
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# Calculate a default value for startupitem.type
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portstartupitem::get_startupitem_type {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ global system_options os.platform
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set type $system_options(startupitem_type)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {$type eq "default" || $type eq ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ switch -- ${os.platform} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ darwin {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return "launchd"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ default {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return "none"
</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;'>+ return $type
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> proc portstartupitem::startupitem_create_darwin_launchd {args} {
global UI_PREFIX prefix destroot destroot.keepdirs subport macosx_deployment_target \
startupitem.name startupitem.uniquename startupitem.plist startupitem.location \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -264,7 +282,7 @@ proc portstartupitem::startupitem_create_darwin_launchd {args} {
</span>
# Translate into appropriate arguments to daemondo
set pidStyle [lindex ${startupitem.pidfile} 0]
<span style='display:block; white-space:pre;background:#ffe0e0;'>- switch ${pidStyle} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ switch -- ${pidStyle} {
</span> none { lappend args "--pid=none" }
auto { lappend args "--pid=fileauto" "--pidfile" ${pidFile} }
clean { lappend args "--pid=fileclean" "--pidfile" ${pidFile} }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -345,22 +363,8 @@ proc portstartupitem::startupitem_create_darwin_launchd {args} {
</span> }
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc portstartupitem::startupitem_create {args} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- global UI_PREFIX startupitem.type os.platform
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set startupitem.type [string tolower ${startupitem.type}]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # Calculate a default value for startupitem.type
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if {${startupitem.type} eq "default" || ${startupitem.type} eq ""} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- switch -exact ${os.platform} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- darwin {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set startupitem.type "launchd"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- default {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- set startupitem.type "none"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portstartupitem::startupitem_create {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ global UI_PREFIX startupitem.type
</span>
if {${startupitem.type} eq "none"} {
ui_notice "$UI_PREFIX [msgcat::mc "Skipping creation of control script"]"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -373,3 +377,35 @@ proc portstartupitem::startupitem_create {args} {
</span> }
}
}
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Check if this port's startupitem is loaded
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Returns: 1 if loaded, 0 otherwise
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portstartupitem::is_loaded {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[option startupitem.type] eq "launchd"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set launchctl_path ${portutil::autoconf::launchctl_path}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {$launchctl_path eq ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # assuming not loaded if there's no launchctl
</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;'>+ global os.major startupitem.uniquename
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {${os.major} >= 14} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {![catch {exec -ignorestderr $launchctl_path print system/${startupitem.uniquename} >/dev/null}]} {
</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;'>+ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[getuid] == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ elevateToRoot "launchctl list"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set elevated 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ret 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {![catch {exec -ignorestderr $launchctl_path list ${startupitem.uniquename} >/dev/null}]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ set ret 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if {[info exists elevated]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ dropPrivileges
</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;'>+ return 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span></pre><pre style='margin:0'>
</pre>