OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. |
| 4 |
| 5 import 'dart:async'; |
| 6 |
| 7 import 'package:gardening/src/luci_api.dart'; |
| 8 import 'package:gardening/src/luci_services.dart'; |
| 9 import 'package:gardening/src/logger.dart'; |
| 10 import 'package:gardening/src/cache_new.dart'; |
| 11 import 'package:args/args.dart'; |
| 12 |
| 13 ArgParser setupArgs() { |
| 14 return new ArgParser() |
| 15 ..addOption("client", |
| 16 abbr: "c", defaultsTo: 'client.dart', help: "Set which client to use.") |
| 17 ..addFlag("verbose", |
| 18 abbr: "v", negatable: false, help: "Print debugging information.") |
| 19 ..addFlag("no-cache", |
| 20 negatable: false, |
| 21 defaultsTo: false, |
| 22 help: "Use this flag to bypass caching. This may be slower.") |
| 23 ..addFlag("help", |
| 24 negatable: false, |
| 25 help: "Shows information on how to use the luci_api tool.") |
| 26 ..addFlag("build-bots", |
| 27 negatable: false, |
| 28 help: "Use this flag to see the primary build bots for --client.") |
| 29 ..addFlag("build-bots-all", |
| 30 negatable: false, |
| 31 help: "Use this flag to see all build bots for --client.") |
| 32 ..addFlag("build-bot-details", |
| 33 negatable: false, |
| 34 help: "Use this flag as `--build-bot-details <name>` where " |
| 35 "<name> is the name of the build bot, to see details of " |
| 36 "a specific build bot.") |
| 37 ..addFlag("build-details", |
| 38 negatable: false, |
| 39 help: "use this option as `--build-details <name> <buildNo>` where " |
| 40 "<name> is the name of the bot and " |
| 41 "<buildNo> is the number of the build.") |
| 42 ..addFlag("commit-builds", |
| 43 negatable: false, |
| 44 help: "Fetches all builds for a specific commit. Use this flag as " |
| 45 "`--commit-builds <commit-hash>` where the <commit-hash> is the " |
| 46 "hash of the commit"); |
| 47 } |
| 48 |
| 49 void printHelp(ArgParser parser) { |
| 50 print("This tool calls different pages on Luci and aggregate the information " |
| 51 "found. Below is stated information about flags and options:"); |
| 52 print(""); |
| 53 print(parser.usage); |
| 54 } |
| 55 |
| 56 main(List<String> args) async { |
| 57 var parser = setupArgs(); |
| 58 var results = parser.parse(args); |
| 59 |
| 60 if (results["help"]) { |
| 61 printHelp(parser); |
| 62 return; |
| 63 } |
| 64 |
| 65 var luciApi = new LuciApi(); |
| 66 Logger logger = |
| 67 new StdOutLogger(results['verbose'] ? Level.debug : Level.info); |
| 68 CreateCacheFunction createCache = results['no-cache'] |
| 69 ? noCache() |
| 70 : initCache(Uri.base.resolve('temp/gardening-cache/'), logger); |
| 71 |
| 72 if (results["build-bots"]) { |
| 73 await performBuildBotsPrimary(luciApi, createCache, results); |
| 74 } else if (results["build-bots-all"]) { |
| 75 await performBuildBotsAll(luciApi, createCache, results); |
| 76 } else if (results["build-bot-details"]) { |
| 77 await performBuildBotDetails(luciApi, createCache, results); |
| 78 } else if (results["build-details"]) { |
| 79 await performBuildDetails(luciApi, createCache, results); |
| 80 } else if (results["commit-builds"]) { |
| 81 await performFindBuildsForCommit(luciApi, createCache, logger, results); |
| 82 } else { |
| 83 printHelp(parser); |
| 84 } |
| 85 |
| 86 luciApi.close(); |
| 87 } |
| 88 |
| 89 Future performBuildBotsPrimary( |
| 90 LuciApi api, CreateCacheFunction createCache, ArgResults results) async { |
| 91 var res = await api.getPrimaryBuilders( |
| 92 results['client'], createCache(duration: new Duration(hours: 1))); |
| 93 res.fold((ex, stackTrace) { |
| 94 print(ex); |
| 95 print(stackTrace); |
| 96 }, (bots) => bots.forEach(print)); |
| 97 } |
| 98 |
| 99 Future performBuildBotsAll( |
| 100 LuciApi api, CreateCacheFunction cache, ArgResults results) async { |
| 101 var res = await api.getAllBuildBots( |
| 102 results['client'], cache(duration: new Duration(hours: 1))); |
| 103 res.fold((ex, stackTrace) { |
| 104 print(ex); |
| 105 print(stackTrace); |
| 106 }, (bots) => bots.forEach(print)); |
| 107 } |
| 108 |
| 109 Future performBuildBotDetails( |
| 110 LuciApi api, CreateCacheFunction cache, ArgResults results) async { |
| 111 if (results.rest.length == 0) { |
| 112 print("No argument given for <name>. To see help, use --help"); |
| 113 return; |
| 114 } |
| 115 var result = await api.getBuildBotDetails(results['client'], results.rest[0], |
| 116 cache(duration: new Duration(minutes: 15))); |
| 117 result.fold((ex, stackTrace) { |
| 118 print(ex); |
| 119 print(stackTrace); |
| 120 }, (detail) => print(detail)); |
| 121 } |
| 122 |
| 123 Future performBuildDetails( |
| 124 LuciApi api, CreateCacheFunction createCache, ArgResults results) async { |
| 125 if (results.rest.length < 2) { |
| 126 print("Missing argument for <name> or <buildNo>. To see help, use --help"); |
| 127 return; |
| 128 } |
| 129 int buildNumber = int.parse(results.rest[1], onError: (source) => 0); |
| 130 if (buildNumber <= 0) { |
| 131 print("The buildnumber ${results['build-details']} must be a integer " |
| 132 "greater than zero"); |
| 133 return; |
| 134 } |
| 135 |
| 136 var result = await api.getBuildBotBuildDetails( |
| 137 results['client'], |
| 138 results.rest[0], |
| 139 buildNumber, |
| 140 createCache(duration: new Duration(minutes: 15))); |
| 141 result.fold((ex, stackTrace) { |
| 142 print(ex); |
| 143 print(stackTrace); |
| 144 }, (detail) => print(detail)); |
| 145 } |
| 146 |
| 147 Future performFindBuildsForCommit(LuciApi api, CreateCacheFunction createCache, |
| 148 Logger logger, ArgResults results) async { |
| 149 if (results.rest.length == 0) { |
| 150 print("Missing argument for <commit>. To see help, use --help"); |
| 151 return; |
| 152 } |
| 153 |
| 154 int amount = 25; |
| 155 logger.info( |
| 156 "Sorry - this is going to take some time, since we have to look into all " |
| 157 "$amount latest builds for all bots for client ${results['client']}.\n" |
| 158 "Subsequent queries run faster if caching is not turned off..."); |
| 159 |
| 160 var result = await fetchBuildsForCommmit( |
| 161 api, logger, results['client'], results.rest[0], createCache, amount); |
| 162 result.fold((ex, st) { |
| 163 print(ex); |
| 164 print(st); |
| 165 }, (List<BuildDetail> details) { |
| 166 print("The commit '${results.rest[0]} is used in the following builds:"); |
| 167 details.forEach((detail) { |
| 168 String url = "https://luci-milo.appspot.com/buildbot/" |
| 169 "${detail.client}/${detail.botName}/${detail.buildNumber}"; |
| 170 print("${detail.botName}: #${detail.buildNumber}\t$url"); |
| 171 }); |
| 172 }); |
| 173 } |
OLD | NEW |