On 14/7/2025 21:21, Chris Jones wrote:

I think this is effectively the only fix, find a way to have something slightly less random than we have now. Maybe some sort of string hash of meta-data related to the port that results in a 'random' string but one that doesn't change if the port is rebuilt with no portfile changes, or just small ones (that don't e.g. change the port version or things like that).
Try this.

- Josh
diff --git a/src/port1.0/portutil.tcl b/src/port1.0/portutil.tcl
index 4b52d019e..4b096005d 100644
--- a/src/port1.0/portutil.tcl
+++ b/src/port1.0/portutil.tcl
@@ -1737,9 +1737,17 @@ proc portutil::create_workpath {} {
     file mkdir $portbuildpath
     # Create and link build dir if link or link target are missing or wrong 
type.
     if {[catch {file type $subbuildpath} ftype] || $ftype eq "directory" || 
![file isdirectory $subbuildpath]} {
-        # This doesn't need to be unguessable, just unique (and short). Four
-        # random characters is enough for ~1.7M build dirs. Posix calls for 6.
-        set shortpath [mkdtemp [file dirname $portbuildpath]/[string range 
$subport 0 3]XXXXXX]
+        # First try a deterministic short name based on subbuildpath
+        package require sha1
+        set shortpath [file dirname $portbuildpath]/[string range $subport 0 
3][string range [::sha1::sha1 -hex -- $subbuildpath] 0 5]
+        # If the name is already taken, generate a random unique one with 
mkdtemp.
+        if {[file exists $shortpath]} {
+            # This doesn't need to be unguessable, just unique (and short). 
Four
+            # random characters is enough for ~1.7M build dirs. Posix calls 
for 6.
+            set shortpath [mkdtemp [file dirname $portbuildpath]/[string range 
$subport 0 3]XXXXXX]
+        } else {
+            file mkdir $shortpath
+        }
         if {$ftype eq "directory"} {
             delete $shortpath
             file rename $subbuildpath $shortpath

Reply via email to