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