<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/f6bff9cecaf0ed7bcca6f40c2ef4e8d675395376">https://github.com/macports/macports-base/commit/f6bff9cecaf0ed7bcca6f40c2ef4e8d675395376</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new f6bff9cec _activate_contents: refactoring
</span>f6bff9cec is described below

<span style='display:block; white-space:pre;color:#808000;'>commit f6bff9cecaf0ed7bcca6f40c2ef4e8d675395376
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Thu Jun 20 03:18:10 2024 +1000

<span style='display:block; white-space:pre;color:#404040;'>    _activate_contents: refactoring
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Avoid duplicated code in rollback and non-rollback cases. Handle
</span><span style='display:block; white-space:pre;color:#404040;'>    directories in a separate list, which avoids a 'file type' call for
</span><span style='display:block; white-space:pre;color:#404040;'>    each file and allows sorting only the directories.
</span>---
 src/registry2.0/portimage.tcl | 59 ++++++++++++++++++-------------------------
 1 file changed, 25 insertions(+), 34 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/portimage.tcl b/src/registry2.0/portimage.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 5dd7ad3f6..c389dcb93 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/portimage.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/portimage.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -802,25 +802,25 @@ proc _activate_contents {port {rename_list {}}} {
</span> # TODO: look into what other dirs should go here
 variable precious_dirs [dict create /Library/LaunchDaemons 1 /Library/LaunchAgents 1]
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc _deactivate_file {dstfile} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[catch {::file type $dstfile} filetype]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui_debug "$dstfile does not exist"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Delete the given lists of files and directories, calling _progress
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# update for each one. Nonempty directories are skipped.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc _deactivate_files {files directories progress_count progress_total} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach dstfile $files {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_debug "deactivating file: $dstfile"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ::file delete -- $dstfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        incr progress_count
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        _progress update $progress_count $progress_total
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if { $filetype eq "link" } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui_debug "deactivating link: $dstfile"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        file delete -- $dstfile
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    } elseif { $filetype eq "directory" } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # 0 item means empty.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if { [llength [readdir $dstfile]] == 0 } {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui_debug "deactivating directory: $dstfile"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ::file delete -- $dstfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach dstdir $directories {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # 0 items means empty.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[llength [readdir $dstdir]] == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_debug "deactivating directory: $dstdir"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ::file delete -- $dstdir
</span>         } else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui_debug "$dstfile is not empty"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_debug "$dstdir is not empty"
</span>         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui_debug "deactivating file: $dstfile"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ::file delete -- $dstfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        incr progress_count
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        _progress update $progress_count $progress_total
</span>     }
 }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -856,12 +856,12 @@ proc _deactivate_contents {port imagefiles {force 0} {rollback 0}} {
</span>             # Split out the filename's subpaths and add them to the image list
             # as well.
             while {![dict exists $seendirs $directory]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                dict set seendirs $directory 1
</span>                 if {[dict exists $precious_dirs $directory]} {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                    dict set seendirs $directory 0
</span>                     ui_debug "directory $directory does not belong to us"
                     break
                 }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                lappend files $directory
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set seendirs $directory 1
</span>                 incr progress_total_steps
                 set directory [::file dirname $directory]
             }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -869,14 +869,15 @@ proc _deactivate_contents {port imagefiles {force 0} {rollback 0}} {
</span>             ui_debug "$file does not exist."
         }
     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    set directories [dict keys [dict filter $seendirs value 1]]
</span>     unset seendirs
 
     # Sort the list in reverse order, removing duplicates.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Since the list is sorted in reverse order, we're sure that directories
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # are after their elements.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set files [lsort -decreasing -unique $files]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Since the list is sorted in reverse order, we're sure that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # parent directories are after their elements.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set directories [lsort -decreasing -unique $directories]
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set progress_total_steps [expr {[llength $imagefiles] + [llength $files]}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set progress_total_steps [expr {[llength $imagefiles] + [llength $files] + [llength $directories]}]
</span> 
     # Avoid interruptions while removing the files and updating the database to
     # prevent inconsistencies from forming between filesystem and database.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -894,25 +895,15 @@ proc _deactivate_contents {port imagefiles {force 0} {rollback 0}} {
</span>         if {!$rollback} {
             registry::write {
                 $port deactivate $imagefiles
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                foreach file $files {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    _deactivate_file $file
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    incr progress_step
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    _progress update $progress_step $progress_total_steps
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                _deactivate_files $files $directories $progress_step $progress_total_steps
</span> 
                 # Update the port's state in the same transaction as the file
                 # delete operations.
                 $port state imaged
             }
         } else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            foreach file $files {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                _deactivate_file $file
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                incr progress_step
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                _progress update $progress_step $progress_total_steps
</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;'>+           _deactivate_files $files $directories $progress_step $progress_total_steps
</span>         }
     } finally {
         # restore the signal block state
</pre><pre style='margin:0'>

</pre>