Index: gm/gmmain.cpp |
=================================================================== |
--- gm/gmmain.cpp (revision 8838) |
+++ gm/gmmain.cpp (working copy) |
@@ -1171,10 +1171,14 @@ |
#endif // SK_SUPPORT_PDF |
}; |
+static const char kDefaultsConfigStr[] = "defaults"; |
+static const char kExcludeConfigChar = '~'; |
+ |
static SkString configUsage() { |
SkString result; |
result.appendf("Space delimited list of which configs to run. Possible options: ["); |
for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { |
+ SkASSERT(gRec[i].fName != kDefaultsConfigStr); |
if (i > 0) { |
result.append("|"); |
} |
@@ -1182,16 +1186,39 @@ |
} |
result.append("]\n"); |
result.appendf("The default value is: \""); |
+ SkString firstDefault; |
+ SkString allButFirstDefaults; |
+ SkString nonDefault; |
for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { |
if (gRec[i].fRunByDefault) { |
if (i > 0) { |
result.append(" "); |
} |
- result.appendf("%s", gRec[i].fName); |
+ result.append(gRec[i].fName); |
+ if (firstDefault.isEmpty()) { |
+ firstDefault = gRec[i].fName; |
+ } else { |
+ if (!allButFirstDefaults.isEmpty()) { |
+ allButFirstDefaults.append(" "); |
+ } |
+ allButFirstDefaults.append(gRec[i].fName); |
+ } |
+ } else { |
+ nonDefault = gRec[i].fName; |
} |
} |
- result.appendf("\""); |
- |
+ result.append("\"\n"); |
+ result.appendf("\"%s\" evaluates to the default set of configs.\n", kDefaultsConfigStr); |
+ result.appendf("Prepending \"%c\" on a config name excludes it from the set of configs to run.\n" |
+ "Exclusions always override inclusions regardless of order.\n", |
+ kExcludeConfigChar); |
+ result.appendf("E.g. \"--config %s %c%s %s\" will run these configs:\n\t%s %s", |
+ kDefaultsConfigStr, |
+ kExcludeConfigChar, |
+ firstDefault.c_str(), |
+ nonDefault.c_str(), |
+ allButFirstDefaults.c_str(), |
+ nonDefault.c_str()); |
return result; |
} |
@@ -1654,12 +1681,34 @@ |
} |
for (int i = 0; i < FLAGS_config.count(); i++) { |
- int index = findConfig(FLAGS_config[i]); |
+ const char* config = FLAGS_config[i]; |
+ userConfig = true; |
+ bool exclude = false; |
+ if (*config == kExcludeConfigChar) { |
+ exclude = true; |
+ config += 1; |
+ } |
+ int index = findConfig(config); |
if (index >= 0) { |
- appendUnique<size_t>(&configs, index); |
- userConfig = true; |
+ if (exclude) { |
+ *excludeConfigs.append() = index; |
+ } else { |
+ appendUnique<size_t>(&configs, index); |
+ } |
+ } else if (0 == strcmp(kDefaultsConfigStr, config)) { |
+ for (size_t c = 0; c < SK_ARRAY_COUNT(gRec); ++c) { |
+ if (gRec[c].fRunByDefault) { |
+ if (exclude) { |
+ gm_fprintf(stderr, "%c%s is not allowed.\n", |
+ kExcludeConfigChar, kDefaultsConfigStr); |
+ return -1; |
+ } else { |
+ appendUnique<size_t>(&configs, c); |
+ } |
+ } |
+ } |
} else { |
- gm_fprintf(stderr, "unrecognized config %s\n", FLAGS_config[i]); |
+ gm_fprintf(stderr, "unrecognized config %s\n", config); |
return -1; |
} |
} |
@@ -1773,6 +1822,19 @@ |
GrContextFactory* grFactory = NULL; |
#endif |
+ if (configs.isEmpty()) { |
+ gm_fprintf(stderr, "No configs to run."); |
+ return -1; |
+ } |
+ |
+ // now show the user the set of configs that will be run. |
+ SkString configStr("These configs will be run: "); |
+ // show the user the config that will run. |
+ for (int i = 0; i < configs.count(); ++i) { |
+ configStr.appendf("%s%s", gRec[configs[i]].fName, (i == configs.count() - 1) ? "\n" : " "); |
+ } |
+ gm_fprintf(stdout, "%s", configStr.c_str()); |
+ |
if (FLAGS_resourcePath.count() == 1) { |
GM::SetResourcePath(FLAGS_resourcePath[0]); |
} |