public static function renderLastModifiedColumns(PhabricatorRepository $repository, array $handles, PhabricatorRepositoryCommit $commit = null, PhabricatorRepositoryCommitData $data = null) { if ($commit) { $epoch = $commit->getEpoch(); $modified = DiffusionView::linkCommit($repository, $commit->getCommitIdentifier()); $date = date('M j, Y', $epoch); $time = date('g:i A', $epoch); } else { $modified = ''; $date = ''; $time = ''; } if ($data) { $author_phid = $data->getCommitDetail('authorPHID'); if ($author_phid && isset($handles[$author_phid])) { $author = $handles[$author_phid]->renderLink(); } else { $author = phutil_escape_html($data->getAuthorName()); } $details = AphrontTableView::renderSingleDisplayLine(phutil_escape_html($data->getSummary())); } else { $author = ''; $details = ''; } return array('commit' => $modified, 'date' => $date, 'time' => $time, 'author' => $author, 'details' => $details); }
public function renderForDisplay(PhabricatorUser $viewer) { $suffix = parent::renderForDisplay($viewer); $commit = id(new DiffusionCommitQuery())->setViewer($viewer)->withIDs(array(idx($this->getTaskData(), 'commitID')))->executeOne(); if (!$commit) { return $suffix; } $link = DiffusionView::linkCommit($commit->getRepository(), $commit->getCommitIdentifier()); return array($link, $suffix); }
private function renderColumns(DiffusionRequest $drequest, array $handles, PhabricatorRepositoryCommit $commit = null, $lint = null) { assert_instances_of($handles, 'PhabricatorObjectHandle'); $viewer = $this->getRequest()->getUser(); if ($commit) { $epoch = $commit->getEpoch(); $modified = DiffusionView::linkCommit($drequest->getRepository(), $commit->getCommitIdentifier()); $date = phabricator_date($epoch, $viewer); $time = phabricator_time($epoch, $viewer); } else { $modified = ''; $date = ''; $time = ''; } $data = $commit->getCommitData(); if ($data) { $author_phid = $data->getCommitDetail('authorPHID'); if ($author_phid && isset($handles[$author_phid])) { $author = $handles[$author_phid]->renderLink(); } else { $author = DiffusionView::renderName($data->getAuthorName()); } $committer = $data->getCommitDetail('committer'); if ($committer) { $committer_phid = $data->getCommitDetail('committerPHID'); if ($committer_phid && isset($handles[$committer_phid])) { $committer = $handles[$committer_phid]->renderLink(); } else { $committer = DiffusionView::renderName($committer); } if ($author != $committer) { $author = hsprintf('%s/%s', $author, $committer); } } $details = AphrontTableView::renderSingleDisplayLine($data->getSummary()); } else { $author = ''; $details = ''; } $return = array('commit' => $modified, 'date' => $date, 'time' => $time, 'author' => $author, 'details' => $details); if ($lint !== null) { $return['lint'] = phutil_tag('a', array('href' => $drequest->generateURI(array('action' => 'lint', 'lint' => null))), number_format($lint)); } // The client treats these results as markup, so make sure they have been // escaped correctly. foreach ($return as $key => $value) { $return[$key] = hsprintf('%s', $value); } return $return; }
protected function renderResultList(array $repositories, PhabricatorSavedQuery $query, array $handles) { assert_instances_of($repositories, 'PhabricatorRepository'); $viewer = $this->requireViewer(); $list = new PHUIObjectItemListView(); foreach ($repositories as $repository) { $id = $repository->getID(); $item = id(new PHUIObjectItemView())->setUser($viewer)->setHeader($repository->getName())->setObjectName('r' . $repository->getCallsign())->setHref($this->getApplicationURI($repository->getCallsign() . '/')); $commit = $repository->getMostRecentCommit(); if ($commit) { $commit_link = DiffusionView::linkCommit($repository, $commit->getCommitIdentifier(), $commit->getSummary()); $item->setSubhead($commit_link); $item->setEpoch($commit->getEpoch()); } $item->addIcon('none', PhabricatorRepositoryType::getNameForRepositoryType($repository->getVersionControlSystem())); $size = $repository->getCommitCount(); if ($size) { $history_uri = DiffusionRequest::generateDiffusionURI(array('callsign' => $repository->getCallsign(), 'action' => 'history')); $item->addAttribute(phutil_tag('a', array('href' => $history_uri), pht('%s Commit(s)', new PhutilNumber($size)))); } else { $item->addAttribute(pht('No Commits')); } $project_handles = array_select_keys($handles, $repository->getProjectPHIDs()); if ($project_handles) { $item->addAttribute(id(new PHUIHandleTagListView())->setSlim(true)->setHandles($project_handles)); } if (!$repository->isTracked()) { $item->setDisabled(true); $item->addIcon('disable-grey', pht('Inactive')); } $list->addItem($item); } return $list; }
public function processRequest() { $request = $this->getRequest(); $user = $request->getUser(); $shortcuts = id(new PhabricatorRepositoryShortcut())->loadAll(); if ($shortcuts) { $shortcuts = msort($shortcuts, 'getSequence'); $rows = array(); foreach ($shortcuts as $shortcut) { $rows[] = array(phutil_render_tag('a', array('href' => $shortcut->getHref()), phutil_escape_html($shortcut->getName())), phutil_escape_html($shortcut->getDescription())); } $shortcut_table = new AphrontTableView($rows); $shortcut_table->setHeaders(array('Link', '')); $shortcut_table->setColumnClasses(array('pri', 'wide')); $shortcut_panel = new AphrontPanelView(); $shortcut_panel->setHeader('Shortcuts'); $shortcut_panel->appendChild($shortcut_table); } else { $shortcut_panel = null; } $repository = new PhabricatorRepository(); $repositories = $repository->loadAll(); foreach ($repositories as $key => $repo) { if (!$repo->isTracked()) { unset($repositories[$key]); } } $repository_ids = mpull($repositories, 'getID'); $summaries = array(); $commits = array(); if ($repository_ids) { $summaries = queryfx_all($repository->establishConnection('r'), 'SELECT * FROM %T WHERE repositoryID IN (%Ld)', PhabricatorRepository::TABLE_SUMMARY, $repository_ids); $summaries = ipull($summaries, null, 'repositoryID'); $commit_ids = array_filter(ipull($summaries, 'lastCommitID')); if ($commit_ids) { $commit = new PhabricatorRepositoryCommit(); $commits = $commit->loadAllWhere('id IN (%Ld)', $commit_ids); $commits = mpull($commits, null, 'getRepositoryID'); } } $rows = array(); foreach ($repositories as $repository) { $id = $repository->getID(); $commit = idx($commits, $id); $size = idx(idx($summaries, $id, array()), 'size', 0); $date = '-'; $time = '-'; if ($commit) { $date = phabricator_date($commit->getEpoch(), $user); $time = phabricator_time($commit->getEpoch(), $user); } $rows[] = array(phutil_render_tag('a', array('href' => '/diffusion/' . $repository->getCallsign() . '/'), phutil_escape_html($repository->getName())), phutil_escape_html($repository->getDetail('description')), PhabricatorRepositoryType::getNameForRepositoryType($repository->getVersionControlSystem()), $size ? number_format($size) : '-', $commit ? DiffusionView::linkCommit($repository, $commit->getCommitIdentifier()) : '-', $date, $time); } $repository_tool_uri = PhabricatorEnv::getProductionURI('/repository/'); $repository_tool = phutil_render_tag('a', array('href' => $repository_tool_uri), 'repository tool'); $no_repositories_txt = 'This instance of Phabricator does not have any ' . 'configured repositories. '; if ($user->getIsAdmin()) { $no_repositories_txt .= 'To setup one or more repositories, visit the ' . $repository_tool . '.'; } else { $no_repositories_txt .= 'Ask an administrator to setup one or more ' . 'repositories via the ' . $repository_tool . '.'; } $table = new AphrontTableView($rows); $table->setNoDataString($no_repositories_txt); $table->setHeaders(array('Repository', 'Description', 'VCS', 'Commits', 'Last', 'Date', 'Time')); $table->setColumnClasses(array('pri', 'wide', '', 'n', 'n', '', 'right')); $panel = new AphrontPanelView(); $panel->setHeader('Browse Repositories'); $panel->appendChild($table); $crumbs = $this->buildCrumbs(); return $this->buildStandardPageResponse(array($crumbs, $shortcut_panel, $panel), array('title' => 'Diffusion')); }
private function buildCrumbList(array $spec = array()) { $spec = $spec + array('commit' => null, 'tags' => null, 'branches' => null, 'view' => null); $crumb_list = array(); // On the home page, we don't have a DiffusionRequest. if ($this->diffusionRequest) { $drequest = $this->getDiffusionRequest(); $repository = $drequest->getRepository(); } else { $drequest = null; $repository = null; } if ($repository) { $crumb_list[] = phutil_render_tag('a', array('href' => '/diffusion/'), 'Diffusion'); } else { $crumb_list[] = 'Diffusion'; return $crumb_list; } $callsign = $repository->getCallsign(); $repository_name = phutil_escape_html($repository->getName()) . ' Repository'; if (!$spec['commit'] && !$spec['tags'] && !$spec['branches']) { $branch_name = $drequest->getBranch(); if ($branch_name) { $repository_name .= ' (' . phutil_escape_html($branch_name) . ')'; } } if (!$spec['view'] && !$spec['commit'] && !$spec['tags'] && !$spec['branches']) { $crumb_list[] = $repository_name; return $crumb_list; } $crumb_list[] = phutil_render_tag('a', array('href' => "/diffusion/{$callsign}/"), $repository_name); $raw_commit = $drequest->getRawCommit(); if ($spec['tags']) { if ($spec['commit']) { $crumb_list[] = "Tags for " . phutil_render_tag('a', array('href' => $drequest->generateURI(array('action' => 'commit', 'commit' => $raw_commit))), phutil_escape_html("r{$callsign}{$raw_commit}")); } else { $crumb_list[] = 'Tags'; } return $crumb_list; } if ($spec['branches']) { $crumb_list[] = 'Branches'; return $crumb_list; } if ($spec['commit']) { $crumb_list[] = "r{$callsign}{$raw_commit}"; return $crumb_list; } $view = $spec['view']; $path = null; if (isset($spec['path'])) { $path = $drequest->getPath(); } if ($raw_commit) { $commit_link = DiffusionView::linkCommit($repository, $raw_commit); } else { $commit_link = ''; } switch ($view) { case 'history': $view_name = 'History'; break; case 'browse': $view_name = 'Browse'; break; case 'change': $view_name = 'Change'; $crumb_list[] = phutil_escape_html($path) . ' (' . $commit_link . ')'; return $crumb_list; } $uri_params = array('action' => $view); if (!strlen($path)) { $crumb_list[] = $view_name; } else { $crumb_list[] = phutil_render_tag('a', array('href' => $drequest->generateURI(array('path' => '') + $uri_params)), $view_name); $path_parts = explode('/', $path); do { $last = array_pop($path_parts); } while ($last == ''); $path_sections = array(); $thus_far = ''; foreach ($path_parts as $path_part) { $thus_far .= $path_part . '/'; $path_sections[] = phutil_render_tag('a', array('href' => $drequest->generateURI(array('path' => $thus_far) + $uri_params)), phutil_escape_html($path_part)); } $path_sections[] = phutil_escape_html($last); $path_sections = '/' . implode('/', $path_sections); $crumb_list[] = $path_sections; } $last_crumb = array_pop($crumb_list); if ($raw_commit) { $jump_link = phutil_render_tag('a', array('href' => $drequest->generateURI(array('commit' => '') + $uri_params)), 'Jump to HEAD'); $last_crumb .= " @ {$commit_link} ({$jump_link})"; } else { $last_crumb .= " @ HEAD"; } $crumb_list[] = $last_crumb; return $crumb_list; }
private function buildCrumbList(array $spec = array()) { $drequest = $this->getDiffusionRequest(); $crumb_list = array(); $repository = $drequest->getRepository(); if ($repository) { $crumb_list[] = phutil_render_tag('a', array('href' => '/diffusion/'), 'Diffusion'); } else { $crumb_list[] = 'Diffusion'; return $crumb_list; } $callsign = $repository->getCallsign(); $repository_name = phutil_escape_html($repository->getName()) . ' Repository'; $branch_name = $drequest->getBranch(); if ($branch_name) { $repository_name .= ' (' . phutil_escape_html($branch_name) . ')'; } $branch_uri = $drequest->getBranchURIComponent($drequest->getBranch()); if (empty($spec['view']) && empty($spec['commit'])) { $crumb_list[] = $repository_name; return $crumb_list; } $crumb_list[] = phutil_render_tag('a', array('href' => "/diffusion/{$callsign}/"), $repository_name); $raw_commit = $drequest->getRawCommit(); if (isset($spec['commit'])) { $crumb_list[] = "r{$callsign}{$raw_commit}"; return $crumb_list; } $view = $spec['view']; $path = null; if (isset($spec['path'])) { $path = $drequest->getPath(); } if ($raw_commit) { $commit_link = DiffusionView::linkCommit($repository, $raw_commit); } else { $commit_link = ''; } switch ($view) { case 'history': $view_name = 'History'; break; case 'browse': $view_name = 'Browse'; break; case 'change': $view_name = 'Change'; $crumb_list[] = phutil_escape_html($path) . ' (' . $commit_link . ')'; return $crumb_list; } $view_root_uri = "/diffusion/{$callsign}/{$view}/{$branch_uri}"; $jump_href = $view_root_uri; $view_tail_uri = null; if ($raw_commit) { $view_tail_uri = ';' . $drequest->getCommitURIComponent($raw_commit); } if (!strlen($path)) { $crumb_list[] = $view_name; } else { $crumb_list[] = phutil_render_tag('a', array('href' => $view_root_uri . $view_tail_uri), $view_name); $path_parts = explode('/', $path); do { $last = array_pop($path_parts); } while ($last == ''); $path_sections = array(); $thus_far = ''; foreach ($path_parts as $path_part) { $thus_far .= $path_part . '/'; $path_sections[] = phutil_render_tag('a', array('href' => $view_root_uri . $thus_far . $view_tail_uri), phutil_escape_html($path_part)); } $path_sections[] = phutil_escape_html($last); $path_sections = '/' . implode('/', $path_sections); $jump_href = $view_root_uri . $thus_far . $last; $crumb_list[] = $path_sections; } $last_crumb = array_pop($crumb_list); if ($raw_commit) { $jump_link = phutil_render_tag('a', array('href' => $jump_href), 'Jump to HEAD'); $last_crumb .= " @ {$commit_link} ({$jump_link})"; } else { $last_crumb .= " @ HEAD"; } $crumb_list[] = $last_crumb; return $crumb_list; }
protected function processDiffusionRequest(AphrontRequest $request) { $viewer = $this->getViewer(); $drequest = $this->getDiffusionRequest(); $repository = $drequest->getRepository(); if (!$drequest->supportsBranches()) { return $this->newDialog()->setTitle(pht('No Ref Support'))->appendParagraph(pht('The version control system this repository uses does not ' . 'support named references, so you can not resolve or list ' . 'repository refs in this repository.'))->addCancelButton($repository->getURI()); } $ref_name = $drequest->getBranch(); $cache_query = id(new DiffusionCachedResolveRefsQuery())->setRepository($repository); if ($ref_name !== null) { $cache_query->withRefs(array($ref_name)); } $cache_refs = $cache_query->execute(); $vcs_refs = DiffusionQuery::callConduitWithDiffusionRequest($viewer, $drequest, 'diffusion.resolverefs', array('refs' => array($ref_name))); $all = array(); foreach ($cache_refs as $ref => $results) { foreach ($results as $result) { $id = $result['type'] . '/' . $result['identifier']; $all[$ref][$id]['cache'] = $result; } } foreach ($vcs_refs as $ref => $results) { foreach ($results as $result) { $id = $result['type'] . '/' . $result['identifier']; $all[$ref][$id]['vcs'] = $result; } } $rows = array(); foreach ($all as $ref => $results) { foreach ($results as $info) { $cache = idx($info, 'cache', array()); $vcs = idx($info, 'vcs', array()); $type = idx($vcs, 'type'); if (!$type) { $type = idx($cache, 'type'); } $hash = idx($vcs, 'identifier'); if ($hash !== null) { $hash = DiffusionView::linkCommit($repository, $hash); } $cached_hash = idx($cache, 'identifier'); if ($cached_hash !== null) { $cached_hash = DiffusionView::linkCommit($repository, $cached_hash); } $closed = idx($vcs, 'closed', false); if (!$vcs) { $state = null; } else { $state = $closed ? pht('Closed') : pht('Open'); } $cached_closed = idx($cache, 'closed', false); if (!$cache) { $cached_state = null; } else { $cached_state = $cached_closed ? pht('Closed') : pht('Open'); } $alternate = idx($vcs, 'alternate'); if ($alternate !== null) { $alternate = DiffusionView::linkCommit($repository, $alternate); } $rows[] = array($ref, $type, $hash, $cached_hash, $state, $cached_state, $alternate); } } $table = id(new AphrontTableView($rows))->setHeaders(array(pht('Ref'), pht('Type'), pht('Hash'), pht('Cached Hash'), pht('State'), pht('Cached State'), pht('Alternate'))); $content = id(new PHUIObjectBoxView())->setHeaderText(pht('Ref "%s"', $ref_name))->setTable($table); $crumbs = $this->buildCrumbs(array()); $crumbs->addTextCrumb(pht('Refs')); return $this->buildApplicationPage(array($crumbs, $content), array('title' => array(pht('Refs'), $repository->getMonogram(), $ref_name))); }