06d473692425fe85d92aac2b87a114e04f3158b1 galt Tue Oct 28 09:40:08 2025 -0700 It would of course be better to actually check these than skip them, however that could take a long time to do, so just tweaking hubCheck to skip the complex settings like was already done tdbQuery. Users at least will not be nagged about new settings being reported as invalid. fixes #28113 diff --git src/hg/utils/hubCheck/hubCheck.c src/hg/utils/hubCheck/hubCheck.c index fb0d06cdea2..1edc6147b6f 100644 --- src/hg/utils/hubCheck/hubCheck.c +++ src/hg/utils/hubCheck/hubCheck.c @@ -407,48 +407,108 @@ slNameAddHead(&options->suggest, hel->name); } slNameSort(&options->suggest); verbose(3, "Suggest list has %d settings\n", slCount(options->suggest)); } errCatchEnd(errCatch); if (errCatch->gotError) { retVal = 1; dyStringPrintf(errors, "%s", errCatch->message->string); } errCatchFree(&errCatch); return retVal; } +static boolean isComplex(char *name) +/* Check to see if this is one of the filter variables that have arbitrary initial strings. + * This routine copied from tdbQuery. */ +{ +if (startsWith("yAxisLabel.", name)) + return TRUE; +if (startsWith("filter.", name)) + return TRUE; +if (startsWith("filterValues.", name)) + return TRUE; +if (startsWith("filterValuesDefault.", name)) + return TRUE; +if (startsWith("filterType.", name)) + return TRUE; +if (startsWith("filterLimits.", name)) + return TRUE; +if (startsWith("filterLabel.", name)) + return TRUE; +if (startsWith("filterByRange.", name)) + return TRUE; +if (startsWith("filterText.", name)) + return TRUE; +if (endsWith(name, "Filter")) + return TRUE; +if (endsWith(name, "FilterValues")) + return TRUE; +if (endsWith(name, "FilterType")) + return TRUE; +if (endsWith(name, "FilterLimits")) + return TRUE; +if (endsWith(name, "FilterText")) + return TRUE; +if (startsWith("highlight.", name)) + return TRUE; +if (startsWith("highlightValues.", name)) + return TRUE; +if (startsWith("highlightValuesDefault.", name)) + return TRUE; +if (startsWith("highlightType.", name)) + return TRUE; +if (startsWith("highlightLimits.", name)) + return TRUE; +if (startsWith("highlightLabel.", name)) + return TRUE; +if (startsWith("highlightByRange.", name)) + return TRUE; +if (startsWith("highlightText.", name)) + return TRUE; +return FALSE; +} + + int hubCheckTrackSetting(struct trackHub *hub, struct trackDb *tdb, char *setting, struct trackHubCheckOptions *options, struct dyString *errors) /* Check trackDb setting to spec (by version and level). Returns non-zero if error, msg in errors */ { int retVal = 0; verbose(4, " Check setting '%s'\n", setting); /* skip internally added/used settings */ if (sameString(setting, "polished") || sameString(setting, "group")) return 0; /* check setting is in extra file of supported settings */ if (options->extra && hashLookup(options->extra, setting)) return 0; /* check setting is supported in this version */ struct trackHubSettingSpec *hubSetting = hashFindVal(options->settings, setting); + +boolean isComplexSetting = isComplex(setting); +if (isComplexSetting) + { + verbose(5, "skipping validation for complex setting=%s.", setting); + return 1; + } + if (hubSetting == NULL) { dyStringPrintf(errors, "Setting '%s' is unknown/unsupported", setting); char *suggest = suggestSetting(setting, options); if (suggest != NULL) dyStringPrintf(errors, " (did you mean '%s' ?)", suggest); dyStringPrintf(errors, "\n"); retVal = 1; } else if (sameString(hubSetting->level, "deprecated")) { dyStringPrintf(errors, "Setting '%s' is deprecated\n", setting); retVal = 1; } else