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