<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>