Path: blob/master/src/applications/harbormaster/management/HarbormasterManagementArchiveLogsWorkflow.php
12256 views
<?php12final class HarbormasterManagementArchiveLogsWorkflow3extends HarbormasterManagementWorkflow {45protected function didConstruct() {6$this7->setName('archive-logs')8->setExamples('**archive-logs** [__options__] --mode __mode__')9->setSynopsis(pht('Compress, decompress, store or destroy build logs.'))10->setArguments(11array(12array(13'name' => 'mode',14'param' => 'mode',15'help' => pht(16'Use "plain" to remove encoding, or "compress" to compress '.17'logs.'),18),19array(20'name' => 'details',21'help' => pht(22'Show more details about operations as they are performed. '.23'Slow! But also very reassuring!'),24),25));26}2728public function execute(PhutilArgumentParser $args) {29$viewer = $this->getViewer();3031$mode = $args->getArg('mode');32if (!$mode) {33throw new PhutilArgumentUsageException(34pht('Choose an archival mode with --mode.'));35}3637$valid_modes = array(38'plain',39'compress',40);4142$valid_modes = array_fuse($valid_modes);43if (empty($valid_modes[$mode])) {44throw new PhutilArgumentUsageException(45pht(46'Unknown mode "%s". Valid modes are: %s.',47$mode,48implode(', ', $valid_modes)));49}5051$log_table = new HarbormasterBuildLog();52$logs = new LiskMigrationIterator($log_table);5354$show_details = $args->getArg('details');5556if ($show_details) {57$total_old = 0;58$total_new = 0;59}6061foreach ($logs as $log) {62echo tsprintf(63"%s\n",64pht('Processing Harbormaster build log #%d...', $log->getID()));6566if ($show_details) {67$old_stats = $this->computeDetails($log);68}6970switch ($mode) {71case 'plain':72$log->decompressLog();73break;74case 'compress':75$log->compressLog();76break;77}7879if ($show_details) {80$new_stats = $this->computeDetails($log);81$this->printStats($old_stats, $new_stats);8283$total_old += $old_stats['bytes'];84$total_new += $new_stats['bytes'];85}86}8788if ($show_details) {89echo tsprintf(90"%s\n",91pht(92'Done. Total byte size of affected logs: %s -> %s.',93new PhutilNumber($total_old),94new PhutilNumber($total_new)));95}9697return 0;98}99100private function computeDetails(HarbormasterBuildLog $log) {101$bytes = 0;102$chunks = 0;103$hash = hash_init('sha1');104105foreach ($log->newChunkIterator() as $chunk) {106$bytes += strlen($chunk->getChunk());107$chunks++;108hash_update($hash, $chunk->getChunkDisplayText());109}110111return array(112'bytes' => $bytes,113'chunks' => $chunks,114'hash' => hash_final($hash),115);116}117118private function printStats(array $old_stats, array $new_stats) {119echo tsprintf(120" %s\n",121pht(122'%s: %s -> %s',123pht('Stored Bytes'),124new PhutilNumber($old_stats['bytes']),125new PhutilNumber($new_stats['bytes'])));126127echo tsprintf(128" %s\n",129pht(130'%s: %s -> %s',131pht('Stored Chunks'),132new PhutilNumber($old_stats['chunks']),133new PhutilNumber($new_stats['chunks'])));134135echo tsprintf(136" %s\n",137pht(138'%s: %s -> %s',139pht('Data Hash'),140$old_stats['hash'],141$new_stats['hash']));142143if ($old_stats['hash'] !== $new_stats['hash']) {144throw new Exception(145pht('Log data hashes differ! Something is tragically wrong!'));146}147}148149}150151152