|
20 | 20 | $root = dirname(dirname(dirname(__FILE__))); |
21 | 21 | require_once $root.'/scripts/__init_script__.php'; |
22 | 22 |
|
23 | | -$is_all = false; |
24 | | -$reparse_message = false; |
25 | | -$reparse_change = false; |
26 | | -$reparse_herald = false; |
27 | | -$reparse_owners = false; |
28 | | -$reparse_what = false; |
29 | | -$force = false; |
30 | | - |
31 | | -$args = array_slice($argv, 1); |
32 | | -foreach ($args as $arg) { |
33 | | - if (!strncmp($arg, '--', 2)) { |
34 | | - $flag = substr($arg, 2); |
35 | | - switch ($flag) { |
36 | | - case 'all': |
37 | | - $is_all = true; |
38 | | - break; |
39 | | - case 'message': |
40 | | - case 'messages': |
41 | | - $reparse_message = true; |
42 | | - break; |
43 | | - case 'change': |
44 | | - case 'changes': |
45 | | - $reparse_change = true; |
46 | | - break; |
47 | | - case 'herald': |
48 | | - $reparse_herald = true; |
49 | | - break; |
50 | | - case 'owners': |
51 | | - $reparse_owners = true; |
52 | | - break; |
53 | | - case 'force': |
54 | | - $force = true; |
55 | | - break; |
56 | | - case 'trace': |
57 | | - PhutilServiceProfiler::installEchoListener(); |
58 | | - break; |
59 | | - case 'help': |
60 | | - help(); |
61 | | - break; |
62 | | - default: |
63 | | - usage("Unknown flag '{$arg}'."); |
64 | | - break; |
65 | | - } |
66 | | - } else { |
67 | | - if ($reparse_what) { |
68 | | - usage("Specify exactly one thing to reparse."); |
69 | | - } |
70 | | - $reparse_what = $arg; |
71 | | - } |
| 23 | +$args = new PhutilArgumentParser($argv); |
| 24 | +$args->setSynopsis(<<<EOHELP |
| 25 | +**reparse.php** __what__ __which_parts__ [--trace] [--force] |
| 26 | +
|
| 27 | +Rerun the Diffusion parser on specific commits and repositories. Mostly |
| 28 | +useful for debugging changes to Diffusion. |
| 29 | +EOHELP |
| 30 | +); |
| 31 | + |
| 32 | +$args->parseStandardArguments(); |
| 33 | +$args->parse( |
| 34 | + array( |
| 35 | + // what |
| 36 | + array( |
| 37 | + 'name' => 'revision', |
| 38 | + 'wildcard' => true, |
| 39 | + ), |
| 40 | + array( |
| 41 | + 'name' => 'all', |
| 42 | + 'param' => 'callsign or phid', |
| 43 | + 'help' => 'Reparse all commits in the specified repository. This '. |
| 44 | + 'mode queues parsers into the task queue; you must run '. |
| 45 | + 'taskmasters to actually do the parses. Use with '. |
| 46 | + '__--force-local__ to run the tasks locally instead of '. |
| 47 | + 'with taskmasters.', |
| 48 | + ), |
| 49 | + array( |
| 50 | + 'name' => 'min-date', |
| 51 | + 'param' => 'date', |
| 52 | + 'help' => 'When used with __--all__, this will restrict to '. |
| 53 | + 'reparsing only the commits that are newer than __date__.', |
| 54 | + ), |
| 55 | + // which parts |
| 56 | + array( |
| 57 | + 'name' => 'message', |
| 58 | + 'help' => 'Reparse commit messages.', |
| 59 | + ), |
| 60 | + array( |
| 61 | + 'name' => 'change', |
| 62 | + 'help' => 'Reparse changes.', |
| 63 | + ), |
| 64 | + array( |
| 65 | + 'name' => 'herald', |
| 66 | + 'help' => 'Reevaluate Herald rules (may send huge amounts of email!)', |
| 67 | + ), |
| 68 | + array( |
| 69 | + 'name' => 'owners', |
| 70 | + 'help' => 'Reevaluate related commits for owners packages (may '. |
| 71 | + 'delete existing relationship entries between your '. |
| 72 | + 'package and some old commits!)', |
| 73 | + ), |
| 74 | + // misc options |
| 75 | + array( |
| 76 | + 'name' => 'force', |
| 77 | + 'short' => 'f', |
| 78 | + 'help' => 'Act noninteractively, without prompting.', |
| 79 | + ), |
| 80 | + array( |
| 81 | + 'name' => 'force-local', |
| 82 | + 'help' => 'Only used with __--all__, use this to run the tasks '. |
| 83 | + 'locally instead of deferring them to taskmaster daemons.', |
| 84 | + ), |
| 85 | + )); |
| 86 | + |
| 87 | +$all_from_repo = $args->getArg('all'); |
| 88 | +$reparse_message = $args->getArg('message'); |
| 89 | +$reparse_change = $args->getArg('change'); |
| 90 | +$reparse_herald = $args->getArg('herald'); |
| 91 | +$reparse_owners = $args->getArg('owners'); |
| 92 | +$reparse_what = $args->getArg('revision'); |
| 93 | +$force = $args->getArg('force'); |
| 94 | +$force_local = $args->getArg('force-local'); |
| 95 | +$min_date = $args->getArg('min-date'); |
| 96 | + |
| 97 | +if (count($reparse_what) > 1 || !($all_from_repo xor count($reparse_what))) { |
| 98 | + usage("Specify a commit or repository to reparse."); |
72 | 99 | } |
73 | 100 |
|
74 | | -if (!$reparse_what) { |
75 | | - usage("Specify a commit or repository to reparse."); |
| 101 | +if ($args->getArg('trace')) { |
| 102 | + PhutilServiceProfiler::installEchoListener(); |
76 | 103 | } |
| 104 | + |
77 | 105 | if (!$reparse_message && !$reparse_change && !$reparse_herald && |
78 | 106 | !$reparse_owners) { |
79 | 107 | usage("Specify what information to reparse with --message, --change, ". |
|
92 | 120 | } |
93 | 121 |
|
94 | 122 | $commits = array(); |
95 | | -if ($is_all) { |
| 123 | +if ($all_from_repo) { |
96 | 124 | $repository = id(new PhabricatorRepository())->loadOneWhere( |
97 | 125 | 'callsign = %s OR phid = %s', |
98 | | - $reparse_what, |
99 | | - $reparse_what); |
| 126 | + $all_from_repo, |
| 127 | + $all_from_repo); |
100 | 128 | if (!$repository) { |
101 | | - throw new Exception("Unknown repository '{$reparse_what}'!"); |
| 129 | + throw new Exception("Unknown repository {$all_from_repo}!"); |
| 130 | + } |
| 131 | + $constraint = ''; |
| 132 | + if ($min_date) { |
| 133 | + $table = new PhabricatorRepositoryCommit(); |
| 134 | + $conn_r = $table->establishConnection('r'); |
| 135 | + $constraint = qsprintf( |
| 136 | + $conn_r, |
| 137 | + 'AND epoch > unix_timestamp(%s)', |
| 138 | + $min_date); |
102 | 139 | } |
103 | 140 | $commits = id(new PhabricatorRepositoryCommit())->loadAllWhere( |
104 | | - 'repositoryID = %d', |
105 | | - $repository->getID()); |
| 141 | + 'repositoryID = %d %Q', |
| 142 | + $repository->getID(), |
| 143 | + $constraint); |
106 | 144 | if (!$commits) { |
107 | 145 | throw new Exception("No commits have been discovered in that repository!"); |
108 | 146 | } |
|
133 | 171 | $commits = array($commit); |
134 | 172 | } |
135 | 173 |
|
136 | | -if ($is_all) { |
| 174 | +if ($all_from_repo && !$force_local) { |
137 | 175 | echo phutil_console_format( |
138 | 176 | '**NOTE**: This script will queue tasks to reparse the data. Once the '. |
139 | 177 | 'tasks have been queued, you need to run Taskmaster daemons to execute '. |
|
185 | 223 | 'only' => true, |
186 | 224 | ); |
187 | 225 |
|
188 | | - if ($is_all) { |
| 226 | + if ($all_from_repo && !$force_local) { |
189 | 227 | foreach ($classes as $class) { |
190 | 228 | $task = new PhabricatorWorkerTask(); |
191 | 229 | $task->setTaskClass($class); |
|
207 | 245 | echo "\nDone.\n"; |
208 | 246 |
|
209 | 247 | function usage($message) { |
210 | | - echo "Usage Error: {$message}"; |
211 | | - echo "\n\n"; |
212 | | - echo "Run 'reparse.php --help' for detailed help.\n"; |
213 | | - exit(1); |
214 | | -} |
215 | | - |
216 | | -function help() { |
217 | | - $help = <<<EOHELP |
218 | | -**SUMMARY** |
219 | | -
|
220 | | - **reparse.php** __what__ __which_parts__ [--trace] [--force] |
221 | | -
|
222 | | - Rerun the Diffusion parser on specific commits and repositories. Mostly |
223 | | - useful for debugging changes to Diffusion. |
224 | | -
|
225 | | - __what__: what to reparse |
226 | | -
|
227 | | - __commit__ |
228 | | - Reparse one commit. This mode will reparse the commit in-process. |
229 | | -
|
230 | | - --all __repository_callsign__ |
231 | | - --all __repository_phid__ |
232 | | - Reparse all commits in the specified repository. These modes queue |
233 | | - parsers into the task queue, you must run taskmasters to actually |
234 | | - do the parses. |
235 | | -
|
236 | | - __which_parts__: which parts of the thing to reparse |
237 | | -
|
238 | | - __--message__ |
239 | | - Reparse commit messages. |
240 | | -
|
241 | | - __--change__ |
242 | | - Reparse changes. |
243 | | -
|
244 | | - __--herald__ |
245 | | - Reevaluate Herald rules (may send huge amounts of email!) |
246 | | -
|
247 | | - __--owners__ |
248 | | - Reevaluate related commits for owners packages (may delete existing |
249 | | - relationship entries between your package and some old commits!) |
250 | | -
|
251 | | - __--force__: act noninteractively, without prompting |
252 | | - __--trace__: run with debug tracing |
253 | | - __--help__: show this help |
254 | | -
|
255 | | -**EXAMPLES** |
256 | | -
|
257 | | - reparse.php rX123 --change # Reparse change for "rX123". |
258 | | - reparse.php --all E --message # Reparse all messages in "E" repository. |
259 | | -
|
260 | | -EOHELP; |
261 | | - echo phutil_console_format($help); |
| 248 | + echo phutil_console_format( |
| 249 | + '**Usage Exception:** '.$message."\n"); |
262 | 250 | exit(1); |
263 | 251 | } |
0 commit comments