getRepositoryAPI(); $paths = $repository_api->getWorkingCopyStatus(); foreach ($paths as $path => $status) { if (is_dir($path)) { unset($paths[$path]); } if ($status & ArcanistRepositoryAPI::FLAG_UNTRACKED) { unset($paths[$path]); } if ($status & ArcanistRepositoryAPI::FLAG_ADDED) { unset($paths[$path]); } } $paths = array_keys($paths); if (!$paths) { throw new ArcanistNoEffectException( "You're covered, you didn't change anything."); } $covers = array(); foreach ($paths as $path) { $lines = $this->getChangedLines($path, 'cover'); if (!$lines) { continue; } $blame = $repository_api->getBlame($path); foreach ($lines as $line) { list($author, $revision) = idx($blame, $line, array(null, null)); if (!$author) { continue; } if (!isset($covers[$author])) { $covers[$author] = array(); } if (!isset($covers[$author][$path])) { $covers[$author][$path] = array( 'lines' => array(), 'revisions' => array(), ); } $covers[$author][$path]['lines'][] = $line; $covers[$author][$path]['revisions'][] = $revision; } } if (count($covers)) { foreach ($covers as $author => $files) { echo phutil_console_format( "**%s**\n", $author); foreach ($files as $file => $info) { $line_noun = count($info['lines']) == 1 ? 'line' : 'lines'; $lines = $this->readableSequenceFromLineNumbers($info['lines']); echo " {$file}: {$line_noun} {$lines}\n"; } } } else { echo "You're covered, your changes didn't touch anyone else's code.\n"; } return 0; } private function readableSequenceFromLineNumbers(array $array) { $sequence = array(); $last = null; $seq = null; $array = array_unique(array_map('intval', $array)); sort($array); foreach ($array as $element) { if ($seq !== null && $element == ($seq + 1)) { $seq++; continue; } if ($seq === null) { $last = $element; $seq = $element; continue; } if ($seq > $last) { $sequence[] = $last.'-'.$seq; } else { $sequence[] = $last; } $last = $element; $seq = $element; } if ($last !== null && $seq > $last) { $sequence[] = $last.'-'.$seq; } else if ($last !== null) { $sequence[] = $element; } return implode(', ', $sequence); } }