3ada7f009d11ce5c390942bc207b40ec538c5279 kate Sun May 17 23:42:43 2015 -0700 Add checkSettings option to hubCheck instead of having setting check be default. This is to maintain current behavior for initial release. Also hide version options for now (they are in additional -help). refs #10015 diff --git src/hg/lib/trackHubCheck.c src/hg/lib/trackHubCheck.c index 802c20e..18e808c 100644 --- src/hg/lib/trackHubCheck.c +++ src/hg/lib/trackHubCheck.c @@ -89,61 +89,66 @@ if (bestCount == 1 && bestScore > 15) { verbose(3, "suggest %s score: %d\n", best, bestScore); return best; } return NULL; } static 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 */ { verbose(4, " Check setting '%s'\n", setting); +int retVal = 0; /* 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; +struct errCatch *errCatch = errCatchNew(); +if (errCatchStart(errCatch)) + { /* check setting is supported in this version */ struct trackHubSetting *hubSetting = hashFindVal(options->settings, setting); if (hubSetting == NULL) { - dyStringPrintf(errors, "Setting '%s' is unknown/unsupported", setting); + struct dyString *ds = dyStringNew(0); + dyStringPrintf(ds, "Setting '%s' is unknown/unsupported", setting); char *suggest = suggestSetting(setting, options); if (suggest != NULL) - dyStringPrintf(errors, " (did you mean '%s' ?) ", suggest); - dyStringPrintf(errors, "\n"); - return 1; + dyStringPrintf(ds, " (did you mean '%s' ?) ", suggest); + errAbort("%s\n", dyStringCannibalize(&ds)); } -if (!options->strict) - return 0; - // check level -if (differentString(hubSetting->level, "core")) + if (options->strict && differentString(hubSetting->level, "core")) + errAbort( "Setting '%s' is level '%s'\n", setting, hubSetting->level); + } +errCatchEnd(errCatch); +if (errCatch->gotError) { - dyStringPrintf(errors, - "Setting '%s' is level '%s'\n", setting, hubSetting->level); - return 1; + dyStringPrintf(errors, "%s", errCatch->message->string); + retVal = 1; } -return 0; +errCatchFree(&errCatch); +return retVal; } static void hubCheckTrackFile(struct trackHub *hub, struct trackHubGenome *genome, struct trackDb *tdb) /* Check remote file exists and is of correct type. Wrap this in error catcher */ { char *relativeUrl = trackDbSetting(tdb, "bigDataUrl"); if (relativeUrl != NULL) { char *type = trackDbRequiredSetting(tdb, "type"); char *bigDataUrl = trackHubRelativeUrl(genome->trackDbFile, relativeUrl); verbose(2, "checking %s.%s type %s at %s\n", genome->name, tdb->track, type, bigDataUrl); if (startsWithWord("bigWig", type)) { /* Just open and close to verify file exists and is correct type. */ @@ -191,50 +196,51 @@ } #endif else errAbort("unrecognized type %s in genome %s track %s", type, genome->name, tdb->track); freez(&bigDataUrl); } } static int hubCheckTrack(struct trackHub *hub, struct trackHubGenome *genome, struct trackDb *tdb, struct trackHubCheckOptions *options, struct dyString *errors) /* Check track settings and optionally, files */ { int retVal = 0; -if (options->settings) +if (options->checkSettings && options->settings) { //verbose(3, "Found %d settings to check to spec\n", slCount(settings)); verbose(3, "Checking track: %s\n", tdb->shortLabel); verbose(3, "Found %d settings to check to spec\n", hashNumEntries(tdb->settingsHash)); struct hashEl *hel; struct hashCookie cookie = hashFirst(tdb->settingsHash); while ((hel = hashNext(&cookie)) != NULL) retVal |= hubCheckTrackSetting(hub, tdb, hel->name, options, errors); /* TODO: ? also need to check settings not in this list (other tdb fields) */ } if (!options->checkFiles) return retVal; struct errCatch *errCatch = errCatchNew(); if (errCatchStart(errCatch)) { hubCheckTrackFile(hub, genome, tdb); } +errCatchEnd(errCatch); if (errCatch->gotError) { retVal = 1; dyStringPrintf(errors, "%s", errCatch->message->string); } errCatchFree(&errCatch); return retVal; } static int hubCheckGenome(struct trackHub *hub, struct trackHubGenome *genome, struct trackHubCheckOptions *options, struct dyString *errors) /* Check out genome within hub. */ { @@ -396,75 +402,52 @@ struct trackHubSetting *specs = NULL; int coreCt = 0; for (el = list; el != NULL; el = el->next) { if (sameString(((struct trackHubSetting *)el->val)->level, "core")) coreCt++; slAddHead(&specs, el->val); } slReverse(&specs); verbose(3, "Found %d supported settings for this version (%d core)\n", slCount(specs), coreCt); return specs; } -int trackHubCheck(char *hubUrl, struct trackHubCheckOptions *options, struct dyString *errors) -/* hubCheck - Check a track data hub for integrity. Put errors in dyString. - * return 0 if hub has no errors, 1 otherwise - * if options->checkTracks is TRUE, check remote files of individual tracks - */ +static int hubSettingsCheckInit(struct trackHub *hub, struct trackHubCheckOptions *options, struct dyString *errors) { -struct errCatch *errCatch = errCatchNew(); -struct trackHub *hub = NULL; int retVal = 0; - -if (errCatchStart(errCatch)) - { - hub = trackHubOpen(hubUrl, "hub_0"); - } -errCatchEnd(errCatch); -if (errCatch->gotError) - { - retVal = 1; - dyStringPrintf(errors, "%s", errCatch->message->string); - } -errCatchFree(&errCatch); - -if (hub == NULL) - return 1; - - if (hub->version != NULL) options->version = hub->version; else if (options->version == NULL) options->version = trackHubVersionDefault(); if (options->strict == FALSE && hub->level != NULL) { if (sameString(hub->level, "core")) options->strict = TRUE; else if (differentString(hub->level, "all")) { dyStringPrintf(errors, "Unknown hub support level: %s (expecting 'core' or 'all'). Defaulting to 'all'.\n", hub->level); retVal = 1; } } verbose(2, "Checking hub '%s'%s\n", hub->longLabel, options->strict ? " for compliance to 'core' (use -settings to view)": ""); -errCatch = errCatchNew(); +struct errCatch *errCatch = errCatchNew(); if (errCatchStart(errCatch)) { /* make hash of settings for this version, saving in options */ struct trackHubSetting *setting, *settings = trackHubSettingsForVersion(options->version); options->settings = newHash(0); options->suggest = NULL; for (setting = settings; setting != NULL; setting = setting->next) { hashAdd(options->settings, setting->name, setting); slNameAddHead(&options->suggest, setting->name); } /* TODO: ? also need to check settings not in this list (other tdb fields) */ // TODO: move extra file handling here (out of hubCheck) if (options->extra != NULL) @@ -472,24 +455,55 @@ struct hashCookie cookie = hashFirst(options->extra); struct hashEl *hel; while ((hel = hashNext(&cookie)) != NULL) 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; +} + + +int trackHubCheck(char *hubUrl, struct trackHubCheckOptions *options, struct dyString *errors) +/* hubCheck - Check a track data hub for integrity. Put errors in dyString. + * return 0 if hub has no errors, 1 otherwise + * if options->checkTracks is TRUE, check remote files of individual tracks + */ +{ +struct errCatch *errCatch = errCatchNew(); +struct trackHub *hub = NULL; +int retVal = 0; + +if (errCatchStart(errCatch)) + { + hub = trackHubOpen(hubUrl, "hub_0"); + } +errCatchEnd(errCatch); +if (errCatch->gotError) + { + retVal = 1; + dyStringPrintf(errors, "%s", errCatch->message->string); + } +errCatchFree(&errCatch); + +if (hub == NULL) + return 1; + +if (options->checkSettings) + retVal |= hubSettingsCheckInit(hub, options, errors); struct trackHubGenome *genome; for (genome = hub->genomeList; genome != NULL; genome = genome->next) { retVal |= hubCheckGenome(hub, genome, options, errors); } trackHubClose(&hub); return retVal; }