<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/9911d29f31840e23c6f827475ac0b91800013b5e">https://github.com/macports/macports-base/commit/9911d29f31840e23c6f827475ac0b91800013b5e</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 9911d29f3 Use shorter build paths
</span>9911d29f3 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 9911d29f31840e23c6f827475ac0b91800013b5e
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Tue Apr 22 07:00:28 2025 +1000

<span style='display:block; white-space:pre;color:#404040;'>    Use shorter build paths
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Now creating an 8-character build dir for each subport directly under
</span><span style='display:block; white-space:pre;color:#404040;'>    ${portdbpath}/build, using mkdtemp to ensure uniqueness, and creating a
</span><span style='display:block; white-space:pre;color:#404040;'>    symlink from the traditional location based on the full path to the
</span><span style='display:block; white-space:pre;color:#404040;'>    portdir.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Closes: https://trac.macports.org/ticket/70539
</span>---
 src/port1.0/portclean.tcl | 26 +++++++++++++++++++-------
 src/port1.0/portutil.tcl  | 43 ++++++++++++++++++++++++++-----------------
 2 files changed, 45 insertions(+), 24 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portclean.tcl b/src/port1.0/portclean.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index c5da30425..a3a2970c6 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portclean.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portclean.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -175,21 +175,33 @@ proc portclean::clean_dist {args} {
</span> }
 
 proc portclean::clean_work {args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global portbuildpath subbuildpath worksymlink
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global portbuildpath subbuildpath worksymlink subport
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[file isdirectory $subbuildpath]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui_debug "Removing directory: ${subbuildpath}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[catch {set real_subbuildpath [realpath $subbuildpath]}]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set real_subbuildpath $subbuildpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[file isdirectory $real_subbuildpath]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_debug "Removing directory: ${real_subbuildpath}"
</span>         macports_try -pass_signal {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            delete $subbuildpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            delete $real_subbuildpath
</span>         } on error {eMessage} {
             ui_debug "$::errorInfo"
             ui_error "$eMessage"
         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        # silently fail if non-empty (other subports might be using portbuildpath)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        catch {file delete $portbuildpath}
</span>     } else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui_debug "No work directory found to remove at ${subbuildpath}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_debug "No work directory found to remove at ${real_subbuildpath}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![catch {file type $subbuildpath}]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_debug "Removing symlink: ${subbuildpath}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        macports_try -pass_signal {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            delete $subbuildpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } on error {eMessage} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_debug "$::errorInfo"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_error "$eMessage"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span>     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    # silently fail if non-empty (other subports might be using portbuildpath)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    catch {file delete $portbuildpath}
</span> 
     # Clean symlink, if necessary
     if {![catch {file type $worksymlink} result] && $result eq "link"} {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portutil.tcl b/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 172249bbe..65f9892b4 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1727,6 +1727,30 @@ proc eval_targets {target} {
</span>     return $result
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+proc portutil::create_workpath {} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global workpath portbuildpath subbuildpath subport
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[getuid] == 0 && [geteuid] != 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        elevateToRoot create_workpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    file mkdir $portbuildpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Create and link build dir if link or link target are missing or wrong type.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[catch {file type $subbuildpath} ftype] || $ftype eq "directory" || ![file isdirectory $subbuildpath]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # This doesn't need to be unguessable, just unique (and short). Four
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # random characters is enough for ~1.7M build dirs.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set shortpath [mkdtemp [file dirname $portbuildpath]/[string range $subport 0 3]XXXX]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$ftype eq "directory"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            delete $shortpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            file rename $subbuildpath $shortpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        file attributes $shortpath -permissions 0755
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        chownAsRoot $shortpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ln -sf $shortpath $subbuildpath
</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;'>+    file mkdir $workpath/.home $workpath/.tmp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    chownAsRoot $subbuildpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> # open_statefile
 # open file to store name of completed targets
 proc open_statefile {args} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1734,23 +1758,8 @@ proc open_statefile {args} {
</span>            subbuildpath
 
     if {![tbool ports_dryrun]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set need_chown 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {![file isdirectory $workpath/.home]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[getuid] == 0 && [geteuid] != 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                elevateToRoot create_workpath
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            file mkdir $workpath/.home
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set need_chown 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {![file isdirectory $workpath/.tmp]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[getuid] == 0 && [geteuid] != 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                elevateToRoot create_workpath
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            file mkdir $workpath/.tmp
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set need_chown 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {$need_chown} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            chownAsRoot $subbuildpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {![file isdirectory $workpath/.home] || ![file isdirectory $workpath/.tmp]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            portutil::create_workpath
</span>         }
         # Create a symlink to the workpath for port authors
         if {[tbool place_worksymlink] && ![file isdirectory $worksymlink]} {
</pre><pre style='margin:0'>

</pre>