<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch master
in repository mpbb.

</pre>
<p><a href="https://github.com/macports/mpbb/commit/8f12db95ced35509c22c7d9919220600bf190743">https://github.com/macports/mpbb/commit/8f12db95ced35509c22c7d9919220600bf190743</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 8f12db9  cleanup: delete stuff until there's enough space
</span>8f12db9 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 8f12db95ced35509c22c7d9919220600bf190743
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Wed Sep 14 00:20:34 2022 +1000

<span style='display:block; white-space:pre;color:#404040;'>    cleanup: delete stuff until there's enough space
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    See: https://trac.macports.org/ticket/57464
</span><span style='display:block; white-space:pre;color:#404040;'>    See: https://trac.macports.org/ticket/57869
</span>---
 mpbb-cleanup            | 12 +++++++
 tools/reclaim-space.tcl | 86 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 98 insertions(+)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/mpbb-cleanup b/mpbb-cleanup
</span><span style='display:block; white-space:pre;color:#808080;'>index 859e19f..c3fc4b2 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/mpbb-cleanup
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/mpbb-cleanup
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -117,5 +117,17 @@ cleanup() {
</span>     # shellcheck disable=SC2154
     disk_free_after=$(disk_free "$option_prefix")
     echo "----> Free disk space after cleanup: $(format_size "$disk_free_after")"
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if [[ "$disk_free_after" -lt "$DISK_FREE_THRESHOLD" ]]; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        echo "----> Trying to free more disk space"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # $thisdir is set by mpbb and points to the directory in which this script resides
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # shellcheck disable=SC2154
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        "$(readlink "${option_prefix}/bin/port-tclsh")" "${thisdir}/tools/reclaim-space.tcl" "$disk_free_after" "$DISK_FREE_THRESHOLD"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # $option_prefix is set in mpbb
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # shellcheck disable=SC2154
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        disk_free_after=$(disk_free "$option_prefix")
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        echo "----> Free disk space after extra cleanup: $(format_size "$disk_free_after")"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>     echo "----> Disk space saved by cleanup: $(format_size $((disk_free_after - disk_free_before)))"
   }
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/tools/reclaim-space.tcl b/tools/reclaim-space.tcl
</span>new file mode 100755
<span style='display:block; white-space:pre;color:#808080;'>index 0000000..768cca1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/tools/reclaim-space.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,86 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#!/usr/bin/env port-tclsh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# -*- coding: utf-8; mode: tcl; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:ft=tcl:et:sw=4:ts=4:sts=4
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {[llength $::argv] < 2 || ([lindex $::argv 0] eq "-y" && [llength $::argv] < 3)} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts stderr "Usage: $::argv0 \[-y\] cur_free target"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    exit 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set dryrun no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {[lindex $::argv 0] eq "-y"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set dryrun yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# given in KiB, convert to bytes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set cur_free [expr {[lindex $::argv end-1] * 1024}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set target [expr {[lindex $::argv end] * 1024}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+package require macports
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# for random
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+package require Tclx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+mportinit
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+random seed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+array set candidates {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+fs-traverse -ignoreErrors -- f [list ${macports::portdbpath}/distfiles] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[file type $f] eq "file"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # 0 for distfile, 1 for port
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set candidates($f) 0
</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;'>+foreach port [registry::entry imaged] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[$port dependents] eq ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set candidates($port) 1
</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 active_files_size {port} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set total 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach f [$port files] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {![catch {file type $f} type] && $type eq "file"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            incr total [file size $f]
</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 $total
</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;'>+set candidate_list [array names candidates]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# It is tempting to sort by size and delete the largest things first,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# but picking randomly greatly reduces the chance that we will just
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# uninstall one huge port that will immediately be reinstalled as a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# dependency of whatever we build next.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+while {$cur_free < $target && [llength $candidate_list] > 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set i [random [llength $candidate_list]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set chosen [lindex $candidate_list $i]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set candidate_list [lreplace ${candidate_list}[set candidate_list {}] $i $i]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$candidates($chosen) == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set size [file size $chosen]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        incr cur_free $size
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts "Deleting $chosen ($size bytes)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {!$dryrun} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            file delete -force $chosen
</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;'>+        set size [file size [$chosen location]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[$chosen state] eq "installed"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            incr size [active_files_size $chosen]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        incr cur_free $size
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set deps [$chosen dependencies]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts "Uninstalling [$chosen name] @[$chosen version]_[$chosen revision][$chosen variants] ($size bytes)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {!$dryrun} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![registry::run_target $chosen uninstall [list]]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # Portfile failed, use the registry directly
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                registry_uninstall::uninstall [$chosen name] [$chosen version] [$chosen revision] [$chosen variants] [list]
</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;'>+        foreach dep $deps {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![info exists candidates($dep)] && [$dep dependents] eq ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set candidates($dep) 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                lappend candidate_list $dep
</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;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+exit 0
</span></pre><pre style='margin:0'>

</pre>