<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch release-2.10
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/b5d9896b10b100c8adc28e235b0ccedb47aa3cb7">https://github.com/macports/macports-base/commit/b5d9896b10b100c8adc28e235b0ccedb47aa3cb7</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit b5d9896b10b100c8adc28e235b0ccedb47aa3cb7
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Sat Mar 8 17:53:11 2025 +1100

<span style='display:block; white-space:pre;color:#404040;'>    Add fetch_credentials macports.conf option
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Allows specifying a username and password to use with any number of
</span><span style='display:block; white-space:pre;color:#404040;'>    base URLs. Mostly useful in conjunction with *_site_local.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    (cherry picked from commit 3a42f0a81c4784340a51e2eb81bd2222318dbb97)
</span>---
 src/macports1.0/macports.tcl        | 23 ++++++++++++++++++++++-
 src/package1.0/portarchivefetch.tcl |  9 +++++----
 src/port1.0/portfetch.tcl           |  6 +++---
 3 files changed, 30 insertions(+), 8 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 5d50e2506..4f7c3dd7a 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;'>@@ -58,7 +58,7 @@ namespace eval macports {
</span>         configureccache ccache_size configuredistcc configurepipe buildnicevalue buildmakejobs \
         universal_archs build_arch macosx_sdk_version macosx_deployment_target \
         macportsuser proxy_override_env proxy_http proxy_https proxy_ftp proxy_rsync proxy_skip \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        master_site_local patch_site_local archive_site_local buildfromsource \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        master_site_local patch_site_local archive_site_local fetch_credentials buildfromsource \
</span>         revupgrade_autorun revupgrade_mode revupgrade_check_id_loadcmds \
         host_blacklist preferred_hosts sandbox_enable sandbox_network delete_la_files cxx_stdlib \
         default_compilers pkg_post_unarchive_deletions ui_interactive] {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -949,6 +949,7 @@ proc mportinit {{up_ui_options {}} {up_options {}} {up_variations {}}} {
</span>         macports::buildmakejobs \
         macports::host_blacklist \
         macports::preferred_hosts \
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        macports::fetch_credentials \
</span>         macports::keeplogs \
         macports::place_worksymlink \
         macports::revupgrade_autorun \
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1752,6 +1753,14 @@ match macports.conf.default."
</span>     if {[info exists archive_site_local] && ![info exists env(ARCHIVE_SITE_LOCAL)]} {
         set env(ARCHIVE_SITE_LOCAL) $archive_site_local
     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[info exists fetch_credentials]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[llength $fetch_credentials] % 2 != 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_error "fetch_credentials must have an even number of elements"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set fetch_credentials {}
</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 fetch_credentials {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span> 
     # Proxy handling (done this late since Pextlib is needed)
     if {![info exists proxy_override_env] || ![string is true -strict $proxy_override_env]} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2022,6 +2031,8 @@ proc macports::worker_init {workername portpath porturl portbuildpath options va
</span> 
     $workername alias get_compatible_xcode_versions macports::get_compatible_xcode_versions
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    $workername alias curlwrap macports::curlwrap
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>     foreach opt $portinterp_options {
         if {![info exists $opt]} {
             variable $opt
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2113,6 +2124,16 @@ proc macports::get_tar_flags {suffix} {
</span>     }
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+# Wrapper for curl command to add credentials if configured
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc macports::curlwrap {action site credentials args} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    variable fetch_credentials
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $fetch_credentials $site]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set credentials [dict get $fetch_credentials $site]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set credential_args [expr {$credentials ne {} ? [list -u $credentials] : {}}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    curl $action {*}$credential_args {*}$args
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> ##
 # Extracts a Portfile from a tarball pointed to by the given \a url to a path
 # in \c $portdbpath and returns its path.
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/package1.0/portarchivefetch.tcl b/src/package1.0/portarchivefetch.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 9917078a1..5da0ad702 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/package1.0/portarchivefetch.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/package1.0/portarchivefetch.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -190,9 +190,9 @@ proc portarchivefetch::fetchfiles {args} {
</span>     }
 
     set fetch_options [list]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    set credentials {}
</span>     if {[string length ${archivefetch.user}] || [string length ${archivefetch.password}]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        lappend fetch_options -u
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        lappend fetch_options "${archivefetch.user}:${archivefetch.password}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set credentials ${archivefetch.user}:${archivefetch.password}
</span>     }
     if {${archivefetch.use_epsv} ne "yes"} {
         lappend fetch_options "--disable-epsv"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -239,6 +239,7 @@ proc portarchivefetch::fetchfiles {args} {
</span>             set signature ${incoming_path}/${archive}.rmd160
             set sig_fetched 0
             foreach site $urlmap($url_var) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                set orig_site $site
</span>                 if {[string index $site end] ne "/"} {
                     append site /
                 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -248,7 +249,7 @@ proc portarchivefetch::fetchfiles {args} {
</span>                 if {!$archive_fetched} {
                     ui_msg "$UI_PREFIX [format [msgcat::mc "Attempting to fetch %s from %s"] $archive ${site}]"
                     try {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        curl fetch {*}$fetch_options $file_url ${incoming_path}/${archive}.TMP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        curlwrap fetch $orig_site $credentials {*}$fetch_options $file_url ${incoming_path}/${archive}.TMP
</span>                         set archive_fetched 1
                     } trap {POSIX SIG SIGINT} {_ eOptions} {
                         ui_debug [msgcat::mc "Aborted fetching archive due to SIGINT"]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -272,7 +273,7 @@ proc portarchivefetch::fetchfiles {args} {
</span>                 if {$archive_fetched} {
                     ui_msg "$UI_PREFIX [format [msgcat::mc "Attempting to fetch %s from %s"] ${archive}.rmd160 $site]"
                     try {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        curl fetch {*}$fetch_options ${file_url}.rmd160 $signature
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        curlwrap fetch $orig_site $credentials {*}$fetch_options ${file_url}.rmd160 $signature
</span>                         set sig_fetched 1
                         break
                     } trap {POSIX SIG SIGINT} {_ eOptions} {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portfetch.tcl b/src/port1.0/portfetch.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 4d7256a7e..ae1eaa18d 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portfetch.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portfetch.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -501,9 +501,9 @@ proc portfetch::fetchfiles {args} {
</span>     variable urlmap
 
     set fetch_options [list]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    set credentials {}
</span>     if {[string length ${fetch.user}] || [string length ${fetch.password}]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        lappend fetch_options -u
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        lappend fetch_options "${fetch.user}:${fetch.password}"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set credentials ${fetch.user}:${fetch.password}
</span>     }
     if {${fetch.use_epsv} ne "yes"} {
         lappend fetch_options "--disable-epsv"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -547,7 +547,7 @@ proc portfetch::fetchfiles {args} {
</span>                 ui_notice "$UI_PREFIX [format [msgcat::mc "Attempting to fetch %s from %s"] $distfile $site]"
                 set file_url [portfetch::assemble_url $site $distfile]
                 macports_try -pass_signal {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    curl fetch {*}$fetch_options $file_url "${distpath}/${distfile}.TMP"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    curlwrap fetch $site $credentials {*}$fetch_options $file_url ${distpath}/${distfile}.TMP
</span>                     file rename -force "${distpath}/${distfile}.TMP" "${distpath}/${distfile}"
                     set fetched 1
                     break
</pre><pre style='margin:0'>

</pre>