public function renderPropertyViewValue(array $handles)
 {
     $diff = $this->getObject()->getActiveDiff();
     $path_changesets = mpull($diff->loadChangesets(), 'getID', 'getFilename');
     $lstar = DifferentialRevisionUpdateHistoryView::renderDiffLintStar($diff);
     $lmsg = DifferentialRevisionUpdateHistoryView::getDiffLintMessage($diff);
     $ldata = $diff->getProperty('arc:lint');
     $ltail = null;
     $rows = array();
     $rows[] = array('style' => 'star', 'name' => $lstar, 'value' => $lmsg, 'show' => true);
     $excuse = $diff->getProperty('arc:lint-excuse');
     if ($excuse) {
         $rows[] = array('style' => 'excuse', 'name' => 'Excuse', 'value' => phutil_escape_html_newlines($excuse), 'show' => true);
     }
     $show_limit = 10;
     $hidden = array();
     if ($ldata) {
         $ldata = igroup($ldata, 'path');
         foreach ($ldata as $path => $messages) {
             $rows[] = array('style' => 'section', 'name' => $path, 'show' => $show_limit);
             foreach ($messages as $message) {
                 $path = idx($message, 'path');
                 $line = idx($message, 'line');
                 $code = idx($message, 'code');
                 $severity = idx($message, 'severity');
                 $name = idx($message, 'name');
                 $description = idx($message, 'description');
                 $line_link = 'line ' . intval($line);
                 if (isset($path_changesets[$path])) {
                     $href = '#C' . $path_changesets[$path] . 'NL' . max(1, $line);
                     // TODO: We are always showing the active diff
                     // if ($diff->getID() != $this->getDiff()->getID()) {
                     //  $href = '/D'.$diff->getRevisionID().'?id='.$diff->getID().$href;
                     // }
                     $line_link = phutil_tag('a', array('href' => $href), $line_link);
                 }
                 if ($show_limit) {
                     --$show_limit;
                     $show = true;
                 } else {
                     $show = false;
                     if (empty($hidden[$severity])) {
                         $hidden[$severity] = 0;
                     }
                     $hidden[$severity]++;
                 }
                 $rows[] = array('style' => $this->getSeverityStyle($severity), 'name' => ucwords($severity), 'value' => hsprintf('(%s) %s at %s', $code, $name, $line_link), 'show' => $show);
                 if (!empty($message['locations'])) {
                     $locations = array();
                     foreach ($message['locations'] as $location) {
                         $other_line = idx($location, 'line');
                         $locations[] = idx($location, 'path', $path) . ($other_line ? ":{$other_line}" : '');
                     }
                     $description .= "\nOther locations: " . implode(', ', $locations);
                 }
                 if (strlen($description)) {
                     $rows[] = array('style' => 'details', 'value' => phutil_escape_html_newlines($description), 'show' => false);
                     if (empty($hidden['details'])) {
                         $hidden['details'] = 0;
                     }
                     $hidden['details']++;
                 }
             }
         }
     }
     $postponed = $diff->getProperty('arc:lint-postponed');
     if ($postponed) {
         foreach ($postponed as $linter) {
             $rows[] = array('style' => $this->getPostponedStyle(), 'name' => 'Postponed', 'value' => $linter, 'show' => false);
             if (empty($hidden['postponed'])) {
                 $hidden['postponed'] = 0;
             }
             $hidden['postponed']++;
         }
     }
     $show_string = $this->renderShowString($hidden);
     $view = new DifferentialResultsTableView();
     $view->setRows($rows);
     $view->setShowMoreString($show_string);
     return $view->render();
 }
 public function renderValueForRevisionView()
 {
     $diff = $this->getDiff();
     $path_changesets = mpull($diff->loadChangesets(), 'getID', 'getFilename');
     $lstar = DifferentialRevisionUpdateHistoryView::renderDiffLintStar($diff);
     $lmsg = DifferentialRevisionUpdateHistoryView::getDiffLintMessage($diff);
     $ldata = $this->getDiffProperty('arc:lint');
     $ltail = null;
     $rows = array();
     $rows[] = array('style' => 'star', 'name' => $lstar, 'value' => $lmsg, 'show' => true);
     $excuse = $this->getLintExcuse();
     if ($excuse) {
         $rows[] = array('style' => 'excuse', 'name' => 'Excuse', 'value' => nl2br(phutil_escape_html($excuse)), 'show' => true);
     }
     $show_limit = 10;
     $hidden = array();
     if ($ldata) {
         $ldata = igroup($ldata, 'path');
         foreach ($ldata as $path => $messages) {
             $rows[] = array('style' => 'section', 'name' => phutil_escape_html($path), 'show' => $show_limit);
             foreach ($messages as $message) {
                 $path = idx($message, 'path');
                 $line = idx($message, 'line');
                 $code = idx($message, 'code');
                 $severity = idx($message, 'severity');
                 $name = idx($message, 'name');
                 $description = idx($message, 'description');
                 $line_link = 'line ' . intval($line);
                 if (isset($path_changesets[$path])) {
                     $line_link = phutil_render_tag('a', array('href' => '#C' . $path_changesets[$path] . 'NL' . max(1, $line)), $line_link);
                 }
                 if ($show_limit) {
                     --$show_limit;
                     $show = true;
                 } else {
                     $show = false;
                     if (empty($hidden[$severity])) {
                         $hidden[$severity] = 0;
                     }
                     $hidden[$severity]++;
                 }
                 $rows[] = array('style' => $this->getSeverityStyle($severity), 'name' => phutil_escape_html(ucwords($severity)), 'value' => hsprintf("(%s) %s at {$line_link}", $code, $name), 'show' => $show);
                 if (strlen($description)) {
                     $rows[] = array('style' => 'details', 'value' => nl2br(phutil_escape_html($description)), 'show' => false);
                     if (empty($hidden['details'])) {
                         $hidden['details'] = 0;
                     }
                     $hidden['details']++;
                 }
             }
         }
     }
     $postponed = $this->getPostponedLinters();
     if ($postponed) {
         foreach ($postponed as $linter) {
             $rows[] = array('style' => $this->getPostponedStyle(), 'name' => 'Postponed', 'value' => phutil_escape_html($linter), 'show' => false);
             if (empty($hidden['postponed'])) {
                 $hidden['postponed'] = 0;
             }
             $hidden['postponed']++;
         }
     }
     $show_string = $this->renderShowString($hidden);
     $view = new DifferentialResultsTableView();
     $view->setRows($rows);
     $view->setShowMoreString($show_string);
     return $view->render();
 }
 public function renderPropertyViewValue(array $handles)
 {
     $diff = $this->getObject()->getActiveDiff();
     $ustar = DifferentialRevisionUpdateHistoryView::renderDiffUnitStar($diff);
     $umsg = DifferentialRevisionUpdateHistoryView::getDiffUnitMessage($diff);
     $rows = array();
     $rows[] = array('style' => 'star', 'name' => $ustar, 'value' => $umsg, 'show' => true);
     $excuse = $diff->getProperty('arc:unit-excuse');
     if ($excuse) {
         $rows[] = array('style' => 'excuse', 'name' => 'Excuse', 'value' => phutil_escape_html_newlines($excuse), 'show' => true);
     }
     $show_limit = 10;
     $hidden = array();
     $udata = $diff->getProperty('arc:unit');
     if ($udata) {
         $sort_map = array(ArcanistUnitTestResult::RESULT_BROKEN => 0, ArcanistUnitTestResult::RESULT_FAIL => 1, ArcanistUnitTestResult::RESULT_UNSOUND => 2, ArcanistUnitTestResult::RESULT_SKIP => 3, ArcanistUnitTestResult::RESULT_POSTPONED => 4, ArcanistUnitTestResult::RESULT_PASS => 5);
         foreach ($udata as $key => $test) {
             $udata[$key]['sort'] = idx($sort_map, idx($test, 'result'));
         }
         $udata = isort($udata, 'sort');
         $engine = new PhabricatorMarkupEngine();
         $engine->setViewer($this->getViewer());
         $markup_objects = array();
         foreach ($udata as $key => $test) {
             $userdata = idx($test, 'userdata');
             if ($userdata) {
                 if ($userdata !== false) {
                     $userdata = str_replace("", '', $userdata);
                 }
                 $markup_object = id(new PhabricatorMarkupOneOff())->setContent($userdata)->setPreserveLinebreaks(true);
                 $engine->addObject($markup_object, 'default');
                 $markup_objects[$key] = $markup_object;
             }
         }
         $engine->process();
         foreach ($udata as $key => $test) {
             $result = idx($test, 'result');
             $default_hide = false;
             switch ($result) {
                 case ArcanistUnitTestResult::RESULT_POSTPONED:
                 case ArcanistUnitTestResult::RESULT_PASS:
                     $default_hide = true;
                     break;
             }
             if ($show_limit && !$default_hide) {
                 --$show_limit;
                 $show = true;
             } else {
                 $show = false;
                 if (empty($hidden[$result])) {
                     $hidden[$result] = 0;
                 }
                 $hidden[$result]++;
             }
             $value = idx($test, 'name');
             if (!empty($test['link'])) {
                 $value = phutil_tag('a', array('href' => $test['link'], 'target' => '_blank'), $value);
             }
             $rows[] = array('style' => $this->getResultStyle($result), 'name' => ucwords($result), 'value' => $value, 'show' => $show);
             if (isset($markup_objects[$key])) {
                 $rows[] = array('style' => 'details', 'value' => $engine->getOutput($markup_objects[$key], 'default'), 'show' => false);
                 if (empty($hidden['details'])) {
                     $hidden['details'] = 0;
                 }
                 $hidden['details']++;
             }
         }
     }
     $show_string = $this->renderShowString($hidden);
     $view = new DifferentialResultsTableView();
     $view->setRows($rows);
     $view->setShowMoreString($show_string);
     return $view->render();
 }
 public function renderValueForRevisionView()
 {
     $diff = $this->getManualDiff();
     $ustar = DifferentialRevisionUpdateHistoryView::renderDiffUnitStar($diff);
     $umsg = DifferentialRevisionUpdateHistoryView::getDiffUnitMessage($diff);
     $rows = array();
     $rows[] = array('style' => 'star', 'name' => $ustar, 'value' => $umsg, 'show' => true);
     $excuse = $this->getUnitExcuse();
     if ($excuse) {
         $rows[] = array('style' => 'excuse', 'name' => 'Excuse', 'value' => nl2br(phutil_escape_html($excuse)), 'show' => true);
     }
     $show_limit = 10;
     $hidden = array();
     $udata = $this->getDiffProperty('arc:unit');
     if ($udata) {
         $sort_map = array(ArcanistUnitTestResult::RESULT_BROKEN => 0, ArcanistUnitTestResult::RESULT_FAIL => 1, ArcanistUnitTestResult::RESULT_UNSOUND => 2, ArcanistUnitTestResult::RESULT_SKIP => 3, ArcanistUnitTestResult::RESULT_POSTPONED => 4, ArcanistUnitTestResult::RESULT_PASS => 5);
         foreach ($udata as $key => $test) {
             $udata[$key]['sort'] = idx($sort_map, idx($test, 'result'));
         }
         $udata = isort($udata, 'sort');
         foreach ($udata as $test) {
             $result = idx($test, 'result');
             $default_hide = false;
             switch ($result) {
                 case ArcanistUnitTestResult::RESULT_POSTPONED:
                 case ArcanistUnitTestResult::RESULT_PASS:
                     $default_hide = true;
                     break;
             }
             if ($show_limit && !$default_hide) {
                 --$show_limit;
                 $show = true;
             } else {
                 $show = false;
                 if (empty($hidden[$result])) {
                     $hidden[$result] = 0;
                 }
                 $hidden[$result]++;
             }
             $value = phutil_escape_html(idx($test, 'name'));
             if (!empty($test['link'])) {
                 $value = phutil_render_tag('a', array('href' => $test['link'], 'target' => '_blank'), $value);
             }
             $rows[] = array('style' => $this->getResultStyle($result), 'name' => phutil_escape_html(ucwords($result)), 'value' => $value, 'show' => $show);
             $userdata = idx($test, 'userdata');
             if ($userdata) {
                 $engine = PhabricatorMarkupEngine::newDifferentialMarkupEngine();
                 $userdata = $engine->markupText($userdata);
                 $rows[] = array('style' => 'details', 'value' => $userdata, 'show' => false);
                 if (empty($hidden['details'])) {
                     $hidden['details'] = 0;
                 }
                 $hidden['details']++;
             }
         }
     }
     $show_string = $this->renderShowString($hidden);
     $view = new DifferentialResultsTableView();
     $view->setRows($rows);
     $view->setShowMoreString($show_string);
     return $view->render();
 }