<pre style='margin:0'>
Clemens Lang (neverpanic) pushed a commit to branch master
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/687a6895b686a35de63a168fdf24e32196d6609f">https://github.com/macports/macports-base/commit/687a6895b686a35de63a168fdf24e32196d6609f</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 687a6895b Add a `curl version` Tcl command to Pextlib.
</span>687a6895b is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 687a6895b686a35de63a168fdf24e32196d6609f
</span>Author: RenĂ© Bertin <rjvbertin@gmail.com>
AuthorDate: Thu Jun 20 14:20:26 2024 +0200

<span style='display:block; white-space:pre;color:#404040;'>    Add a `curl version` Tcl command to Pextlib.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    This command can be useful for debugging connectivity issues  when
</span><span style='display:block; white-space:pre;color:#404040;'>    Pextlib becomes upgradeable via a dedicated port and uses a libcurl
</span><span style='display:block; white-space:pre;color:#404040;'>    that is also installed through its own dedicated port.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    The command returns a Tcl dict containing information about the
</span><span style='display:block; white-space:pre;color:#404040;'>    libcurl version that Pextlib was built against as well as the
</span><span style='display:block; white-space:pre;color:#404040;'>    libcurl it is currently running against; a simplified equivalent
</span><span style='display:block; white-space:pre;color:#404040;'>    of `curl --version`.
</span><span style='display:block; white-space:pre;color:#404040;'>    Obtaining a list of names of available feature is possible only
</span><span style='display:block; white-space:pre;color:#404040;'>    since curl v7.87.0 so this information will probably be replaced
</span><span style='display:block; white-space:pre;color:#404040;'>    with a simple feature mask in the Pextlib build installed by the
</span><span style='display:block; white-space:pre;color:#404040;'>    MacPorts installer on most older Darwin versions.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    See trac ticket #51516
</span>---
 src/pextlib1.0/curl.c | 78 +++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 69 insertions(+), 9 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/pextlib1.0/curl.c b/src/pextlib1.0/curl.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 3292005e5..f45bcb351 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/pextlib1.0/curl.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/pextlib1.0/curl.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -91,6 +91,7 @@ int CurlFetchCmd(Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]);
</span> int CurlIsNewerCmd(Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]);
 int CurlGetSizeCmd(Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]);
 int CurlPostCmd(Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]);
<span style='display:block; white-space:pre;background:#e0ffe0;'>+int CurlVersionCmd(Tcl_Interp* interp, int objc, Tcl_Obj* const objv[]);
</span> 
 typedef struct {
        Tcl_Interp *interp;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1435,6 +1436,61 @@ CurlPostCmd(Tcl_Interp* interp, int objc, Tcl_Obj* const objv[])
</span>   return theResult;
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * curl version subcommand entry point.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param interp           current interpreter
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param objc                     number of parameters
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * @param objv                     parameters
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+CurlVersionCmd(Tcl_Interp* interp, int objc, Tcl_Obj* const objv[])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   int theResult = TCL_OK;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Tcl_Obj *tcl_result = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   curl_version_info_data *theVersionInfo = curl_version_info(CURLVERSION_NOW);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   tcl_result = Tcl_NewDictObj();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // info from the curl version we were built against:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Tcl_DictObjPut(interp, tcl_result, Tcl_NewStringObj("VERSION_NOW-build", -1), Tcl_NewIntObj(CURLVERSION_NOW));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Tcl_DictObjPut(interp, tcl_result, Tcl_NewStringObj("VERSION-build", -1), Tcl_NewStringObj(LIBCURL_VERSION, -1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // runtime info from the libcurl we are actually using:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Tcl_DictObjPut(interp, tcl_result, Tcl_NewStringObj("VERSION-runtime", -1), Tcl_NewStringObj(theVersionInfo->version, -1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Tcl_DictObjPut(interp, tcl_result, Tcl_NewStringObj("HOST", -1), Tcl_NewStringObj(theVersionInfo->host, -1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Tcl_DictObjPut(interp, tcl_result, Tcl_NewStringObj("SSL_BACKEND", -1), Tcl_NewStringObj(theVersionInfo->ssl_version, -1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Tcl_Obj *tcl_prots = Tcl_NewListObj(0, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   const char * const *prot = theVersionInfo->protocols;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   while (*prot) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           Tcl_ListObjAppendElement(interp, tcl_prots, Tcl_NewStringObj(*prot, -1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           prot++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Tcl_DictObjPut(interp, tcl_result, Tcl_NewStringObj("PROTOCOLS", -1), tcl_prots);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+// returning feature names requires a build-time and a runtime check:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#if LIBCURL_VERSION_NUM >= 0x078700
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (theVersionInfo->age >= CURLVERSION_ELEVENTH && theVersionInfo->feature_names) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           Tcl_Obj *tcl_feats = Tcl_NewListObj(0, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           const char * const *feats = theVersionInfo->feature_names;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           while (*feats) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   Tcl_ListObjAppendElement(interp, tcl_feats, Tcl_NewStringObj(*feats, -1));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   feats++;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           Tcl_DictObjPut(interp, tcl_result, Tcl_NewStringObj("FEATURES", -1), tcl_feats);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   } else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // it would be possible to generate a list of feature names from the feature mask
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // but tedious because it would involve checking for the existence of many of the 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // feature tokens; probably not justified for the intended use of the `curl version`
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           // command (primarily debugging).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           Tcl_DictObjPut(interp, tcl_result, Tcl_NewStringObj("FEATURE_MASK", -1), Tcl_NewIntObj(theVersionInfo->features));
</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;'>+   Tcl_SetObjResult(interp, tcl_result);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return theResult;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> /**
  * curl command entry point.
  *
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1454,11 +1510,12 @@ CurlCmd(
</span>           kCurlFetch,
                kCurlIsNewer,
                kCurlGetSize,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                kCurlPost
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           kCurlPost,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           kCurlVersion
</span>   } EOption;
 
        static const char *options[] = {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                "fetch", "isnewer", "getsize", "post", NULL
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           "fetch", "isnewer", "getsize", "post", "version", NULL
</span>   };
        int theResult = TCL_OK;
        EOption theOptionIndex;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1467,18 +1524,18 @@ CurlCmd(
</span>   /* TODO: use dispatch_once when we drop Leopard support */
        pthread_once(&once, CurlInit);
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if (objc < 3) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           Tcl_WrongNumArgs(interp, 1, objv, "option ?arg ...?");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           return TCL_ERROR;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-   theResult = Tcl_GetIndexFromObj(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   theResult = objc > 1 ? Tcl_GetIndexFromObj(
</span>                           interp,
                                objv[1],
                                options,
                                "option",
                                0,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                                (int*) &theOptionIndex);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           (int*) &theOptionIndex) : TCL_ERROR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (theResult != TCL_OK || (objc < 3 && theOptionIndex != kCurlVersion)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           Tcl_WrongNumArgs(interp, 1, objv, "option ?arg ...?");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return TCL_ERROR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   if (theResult == TCL_OK) {
                switch (theOptionIndex) {
                case kCurlFetch:
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1493,6 +1550,9 @@ CurlCmd(
</span>           case kCurlPost:
                        theResult = CurlPostCmd(interp, objc, objv);
                        break;
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                case kCurlVersion:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   theResult = CurlVersionCmd(interp, objc, objv);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                   break;
</span>           }
        }
 
</pre><pre style='margin:0'>

</pre>