<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/46bc1af4c830b63440f10d1743d99a3092392061">https://github.com/macports/macports-base/commit/46bc1af4c830b63440f10d1743d99a3092392061</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 46bc1af4c830b63440f10d1743d99a3092392061
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Sat Mar 9 11:23:05 2024 +1100

<span style='display:block; white-space:pre;color:#404040;'>    Cache xcodecltversion
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Also refresh cached xcodeversion if OS major version changes.
</span>---
 src/macports1.0/macports.tcl | 91 +++++++++++++++++++++++++++++++++++---------
 1 file changed, 72 insertions(+), 19 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/macports.tcl b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index e479274cb..f88e31f46 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -540,6 +540,7 @@ proc macports::save_cache {filename cache} {
</span> proc macports::setxcodeinfo {name1 name2 op} {
     variable xcodeversion; variable xcodebuildcmd
     variable developer_dir; variable portdbpath
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    variable os_major
</span> 
     trace remove variable xcodeversion read macports::setxcodeinfo
     trace remove variable xcodebuildcmd read macports::setxcodeinfo
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -551,6 +552,17 @@ proc macports::setxcodeinfo {name1 name2 op} {
</span>     set xcodeversion {}
     # First try the cache
     set xcodeinfo_cache [load_cache xcodeinfo]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Refresh everything if the OS major version changed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $xcodeinfo_cache os_major]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         && [dict get $xcodeinfo_cache os_major] != $os_major
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set xcodeinfo_cache [dict create]
</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;'>+    # The same cache file is used for xcodecltversion
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set clt_refreshed [set_xcodecltversion xcodeinfo_cache]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>     # Figure out which file to check to see if Xcode was updated
     if {[file extension [file dirname [file dirname $developer_dir]]] eq ".app"} {
         # New style, Developer dir inside Xcode.app
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -560,6 +572,7 @@ proc macports::setxcodeinfo {name1 name2 op} {
</span>         set checkfile ${developer_dir}/Applications/Xcode.app/Contents/Info.plist
     }
     set checkfile_found [file isfile $checkfile]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    set xcode_refresh 1
</span>     if {$checkfile_found && [dict exists $xcodeinfo_cache $checkfile mtime]
             && [dict exists $xcodeinfo_cache $checkfile xcodeversion]
             && [dict exists $xcodeinfo_cache $checkfile xcodebuildcmd]} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -570,12 +583,16 @@ proc macports::setxcodeinfo {name1 name2 op} {
</span>             if {!${xcodebuildcmd_overridden}} {
                 set xcodebuildcmd [dict get $xcodeinfo_cache $checkfile xcodebuildcmd]
             }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {!$clt_refreshed} {
</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;'>+            set xcode_refresh 0
</span>         } else {
             ui_debug "Xcode mtime has changed, refreshing version info"
         }
     }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$xcode_refresh} {
</span>     macports_try -pass_signal {
         set xcodebuild [findBinary xcodebuild $macports::autoconf::xcodebuild_path]
         if {!${xcodeversion_overridden}} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -644,6 +661,7 @@ proc macports::setxcodeinfo {name1 name2 op} {
</span>             set xcodebuildcmd none
         }
     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span> 
     if {[file writable $portdbpath]} {
         if {$checkfile_found} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -656,9 +674,10 @@ proc macports::setxcodeinfo {name1 name2 op} {
</span>             }
         }
         # Remove any entries for Xcode installations that no longer exist
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set xcodeinfo_cache [dict filter $xcodeinfo_cache script {filename info} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            file isfile $filename
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set xcodeinfo_cache [dict filter $xcodeinfo_cache script {key info} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            expr {[string index $key 0] ne "/" || [file isfile $key]}
</span>         }]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict set xcodeinfo_cache os_major $os_major
</span>         save_cache xcodeinfo $xcodeinfo_cache
     }
 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -777,13 +796,27 @@ proc macports::_is_valid_developer_dir {dir} {
</span> }
 
 # deferred calculation of xcodecltversion
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc macports::set_xcodecltversion {name1 name2 op} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# @return 1 if cachevar has been updated, 0 otherwise
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc macports::set_xcodecltversion {cachevar} {
</span>     variable xcodecltversion
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    trace remove variable xcodecltversion read macports::set_xcodecltversion
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    trace remove variable xcodecltversion read macports::setxcodeinfo
</span> 
     if {[info exists xcodecltversion]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Same test as used to set the default for use_xcode
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![file executable /Library/Developer/CommandLineTools/usr/bin/make]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set xcodecltversion none
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return 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;'>+    upvar $cachevar cache
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $cache clt version] && [dict exists $cache clt mtime]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            && [dict exists $cache clt checkfile]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            && [file mtime [dict get $cache clt checkfile]] == [dict get $cache clt mtime]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set xcodecltversion [dict get $cache clt version]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return 0
</span>     }
 
     # Potential names for the CLTs pkg on different OS versions.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -791,9 +824,10 @@ proc macports::set_xcodecltversion {name1 name2 op} {
</span> 
     if {[catch {exec -ignorestderr /usr/sbin/pkgutil --pkgs=com\\.apple\\.pkg\\.([join $pkgnames |]) 2> /dev/null} result]} {
         set xcodecltversion none
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return 0
</span>     }
     set pkgs [split $result \n]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    set found_pkgname {}
</span>     # Check in order from newest to oldest, just in case something
     # stuck around from an older OS version.
     foreach pkgname $pkgnames {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -804,16 +838,34 @@ proc macports::set_xcodecltversion {name1 name2 op} {
</span>                     lassign [split $line] name val
                     if {$name eq "version:"} {
                         set xcodecltversion $val
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        set found_pkgname $fullpkgname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        break
</span>                     }
                 }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {$found_pkgname ne {}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span>             } else {
                 ui_debug "set_xcodecltversion: Failed to get info for installed pkg ${fullpkgname}: $result"
             }
         }
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set xcodecltversion none
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$found_pkgname ne {}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # TODO: See if there are more possible locations.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach dir {/Library/Apple/System/Library/Receipts /private/var/db/receipts} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set checkfile ${dir}/${found_pkgname}.plist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[file exists $checkfile]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set cache clt checkfile $checkfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set cache clt mtime [file mtime $checkfile]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set cache clt version $xcodecltversion
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                return 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;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set xcodecltversion none
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return 0
</span> }
 
 proc macports::set_xcode_license_unaccepted {name1 name2 op} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1553,18 +1605,19 @@ match macports.conf.default."
</span>         }
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {![info exists xcodeversion] || ![info exists xcodebuildcmd]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # We'll resolve these later (if needed)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        trace add variable xcodeversion read macports::setxcodeinfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        trace add variable xcodebuildcmd read macports::setxcodeinfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {![info exists xcodecltversion]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {$os_platform eq "darwin"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            trace add variable xcodecltversion read macports::set_xcodecltversion
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set xcodecltversion {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$os_platform eq "darwin"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {![info exists xcodeversion] || ![info exists xcodebuildcmd] || ![info exists xcodecltversion]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # We'll resolve these later (if needed)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            trace add variable xcodeversion read macports::setxcodeinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            trace add variable xcodebuildcmd read macports::setxcodeinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            trace add variable xcodecltversion read macports::setxcodeinfo
</span>         }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set xcodeversion none
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set xcodebuildcmd none
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set xcodecltversion none
</span>     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>     if {![info exists xcode_license_unaccepted]} {
         if {$os_platform eq "darwin"} {
             trace add variable xcode_license_unaccepted read macports::set_xcode_license_unaccepted
</pre><pre style='margin:0'>

</pre>