<pre style='margin:0'>
Clemens Lang (neverpanic) pushed a commit to branch master
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/5e669e4a08b07bf662168b97918166bac8e90e4f">https://github.com/macports/macports-base/commit/5e669e4a08b07bf662168b97918166bac8e90e4f</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 5e669e4a08b07bf662168b97918166bac8e90e4f
</span>Author: Clemens Lang <cal@macports.org>
AuthorDate: Tue Mar 19 02:04:44 2024 +0100

<span style='display:block; white-space:pre;color:#404040;'>    registry2.0: Enable progress bar for activation
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    This progress bar runs in three phases, all of which spend 33.3% of the
</span><span style='display:block; white-space:pre;color:#404040;'>    progress:
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    (1) Extract the archive. Uses the -callback option for the system
</span><span style='display:block; white-space:pre;color:#404040;'>    pextlib command to count the lines printed by the extraction progress.
</span><span style='display:block; white-space:pre;color:#404040;'>    Since the archive will contain extra metadata files (+PORTFILE,
</span><span style='display:block; white-space:pre;color:#404040;'>    +CONTENTS, +DESC, +STATE, +COMMENT) and directories this step will
</span><span style='display:block; white-space:pre;color:#404040;'>    produce slightly more progress than we anticipate, which we fix at the
</span><span style='display:block; white-space:pre;color:#404040;'>    beginning of step 2.
</span><span style='display:block; white-space:pre;color:#404040;'>    (2) Check for file conflicts. Start by resetting the progress to exactly
</span><span style='display:block; white-space:pre;color:#404040;'>    33.3%, then loop over all files in the port once to identify potential
</span><span style='display:block; white-space:pre;color:#404040;'>    conflicts or ports that need to be deactivated first. This slightly
</span><span style='display:block; white-space:pre;color:#404040;'>    increases the total number of steps because it adds directories to be
</span><span style='display:block; white-space:pre;color:#404040;'>    processed in phase 3.
</span><span style='display:block; white-space:pre;color:#404040;'>    (3) Activate the files and directories.
</span>---
 src/registry2.0/portimage.tcl | 55 ++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 54 insertions(+), 1 deletion(-)

<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 24b78d3db..5895c69ab 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;'>@@ -516,7 +516,7 @@ proc extract_archive_to_tmpdir {location} {
</span>         } else {
             set cmdstring "${unarchive.pipe_cmd} ( ${unarchive.cmd} ${unarchive.pre_args} ${unarchive.args} )"
         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        system $cmdstring
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        system -callback portimage::_extract_progress $cmdstring
</span>     } on error {_ eOptions} {
         ::file delete -force $extractdir
         throw [dict get $eOptions -errorcode] [dict get $eOptions -errorinfo]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -527,15 +527,47 @@ proc extract_archive_to_tmpdir {location} {
</span>     return $extractdir
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+proc _extract_progress {event} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    variable progress_step
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    variable progress_total_steps
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    switch -- [dict get $event type] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        exec {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set progress_step 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            _progress start
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        stdin {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # we don't really care about the line, just that it exists
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            incr progress_step
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            _progress update $progress_step $progress_total_steps
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        exit {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # no cleanup, we pick up the progress where this one ended
</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;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc _progress {args} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[macports::ui_isset ports_verbose]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return
</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;'>+    ui_progress_generic {*}${args}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> ## Activates the contents of a port
 proc _activate_contents {port {rename_list {}}} {
     variable force
     variable noexec
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    variable progress_step
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    variable progress_total_steps
</span> 
     set files [list]
     set baksuffix .mp_[clock seconds]
     set location [$port location]
     set imagefiles [$port imagefiles]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    set num_imagefiles [llength $imagefiles]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set progress_total_steps [expr {$num_imagefiles * 3}]
</span>     set extracted_dir [extract_archive_to_tmpdir $location]
     set replaced_by_re "(?i)^[$port name]\$"
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -550,7 +582,11 @@ proc _activate_contents {port {rename_list {}}} {
</span>     set todeactivate [list]
     try {
         registry::write {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            # extract phase complete, assume 1/3 is done
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set progress_step $num_imagefiles
</span>             foreach file $imagefiles {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                incr progress_step
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                _progress update $progress_step $progress_total_steps
</span>                 set srcfile "${extracted_dir}${file}"
 
                 # To be able to install links, we test if we can lstat the file to
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -580,6 +616,7 @@ proc _activate_contents {port {rename_list {}}} {
</span>                         # registry
                         if { ![catch {::file type $file}] } {
                             set bakfile "${file}${baksuffix}"
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                            _progress intermission
</span>                             ui_warn "File $file already exists.  Moving to: $bakfile."
                             ::file rename -force -- $file $bakfile
                             lappend backups $file
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -617,6 +654,13 @@ proc _activate_contents {port {rename_list {}}} {
</span>                 set directory [::file dirname $file]
                 while {$directory ni $files} {
                     lappend files $directory
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # Any add here will mean an additional step in the second
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # phase of activation. We could just update this once after
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # this foreach loop is complete, but that could make the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # progress bar jump from 66 % down to 65. Doing it
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # incrementally here will hopefully hide the increase in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # noise.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    incr progress_total_steps
</span>                     set directory [::file dirname $directory]
                 }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -627,6 +671,7 @@ proc _activate_contents {port {rename_list {}}} {
</span> 
         # deactivate ports replaced_by this one
         foreach owner $todeactivate {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            _progress intermission
</span>             if {$noexec || ![registry::run_target $owner deactivate [list ports_nodepcheck 1]]} {
                 deactivate [$owner name] "" "" 0 [list ports_nodepcheck 1]
             }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -651,12 +696,16 @@ proc _activate_contents {port {rename_list {}}} {
</span> 
         registry::write {
             # Activate it, and catch errors so we can roll-back
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>             try {
                 $port activate $imagefiles
                 foreach file $files {
                     if {[_activate_file "${extracted_dir}${file}" $file] == 1} {
                         lappend rollback_filelist $file
                     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    _progress update $progress_step $progress_total_steps
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    incr progress_step
</span>                 }
                 foreach {src dest} $confirmed_rename_list {
                     $port deactivate [list $src]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -670,15 +719,19 @@ proc _activate_contents {port {rename_list {}}} {
</span>                 # here so that this information cannot be inconsistent with the
                 # state of the files on disk.
                 $port state installed
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                _progress finish
</span>             } trap {POSIX SIG SIGINT} {_ eOptions} {
                 # Pressing ^C will (often?) print "^C" to the terminal; send
                 # a linebreak so our message appears after that.
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                _progress intermission
</span>                 ui_msg ""
                 ui_msg "Control-C pressed, rolling back, please wait."
                 # can't do it here since we're already inside a transaction
                 set deactivate_this yes
                 throw [dict get $eOptions -errorcode] [dict get $eOptions -errorinfo]
             } trap {POSIX SIG SIGTERM} {_ eOptions} {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                _progress intermission
</span>                 ui_msg "SIGTERM received, rolling back, please wait."
                 # can't do it here since we're already inside a transaction
                 set deactivate_this yes
</pre><pre style='margin:0'>

</pre>