<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>