diff --git a/src/applications/diffusion/controller/DiffusionHomeController.php b/src/applications/diffusion/controller/DiffusionHomeController.php index 96436d8c33..d59504f69a 100644 --- a/src/applications/diffusion/controller/DiffusionHomeController.php +++ b/src/applications/diffusion/controller/DiffusionHomeController.php @@ -1,221 +1,222 @@ 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; } $repositories = id(new PhabricatorRepositoryQuery()) ->setViewer($user) ->execute(); foreach ($repositories as $key => $repo) { if (!$repo->isTracked()) { unset($repositories[$key]); } } + $repositories = msort($repositories, 'getName'); $repository_ids = mpull($repositories, 'getID'); $summaries = array(); $commits = array(); if ($repository_ids) { $summaries = queryfx_all( id(new PhabricatorRepository())->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'); } } $branch = new PhabricatorRepositoryBranch(); $lint_messages = queryfx_all( $branch->establishConnection('r'), 'SELECT b.repositoryID, b.name, COUNT(lm.id) AS n FROM %T b LEFT JOIN %T lm ON b.id = lm.branchID GROUP BY b.id', $branch->getTableName(), PhabricatorRepository::TABLE_LINTMESSAGE); $lint_messages = igroup($lint_messages, 'repositoryID'); $rows = array(); $show_lint = false; foreach ($repositories as $repository) { $id = $repository->getID(); $commit = idx($commits, $id); $size = idx(idx($summaries, $id, array()), 'size', '-'); if ($size != '-') { $size = hsprintf( '%s', DiffusionRequest::generateDiffusionURI(array( 'callsign' => $repository->getCallsign(), 'action' => 'history', )), number_format($size)); } $lint_count = ''; $lint_branches = ipull(idx($lint_messages, $id, array()), 'n', 'name'); $branch = $repository->getDefaultArcanistBranch(); if (isset($lint_branches[$branch])) { $show_lint = true; $lint_count = phutil_render_tag( 'a', array( 'href' => DiffusionRequest::generateDiffusionURI(array( 'callsign' => $repository->getCallsign(), 'action' => 'lint', )), ), number_format($lint_branches[$branch])); } $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, $lint_count, $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', 'Lint', 'Last', 'Date', 'Time', )); $table->setColumnClasses( array( 'pri', 'wide', '', 'n', 'n', 'n', '', 'right', )); $table->setColumnVisibility( array( true, true, true, true, $show_lint, true, true, true, )); $panel = new AphrontPanelView(); $panel->setHeader('Browse Repositories'); $panel->appendChild($table); $panel->setNoBackground(); $crumbs = $this->buildCrumbs(); $crumbs->addCrumb( id(new PhabricatorCrumbView()) ->setName(pht('All Repositories')) ->setHref($this->getApplicationURI())); return $this->buildStandardPageResponse( array( $crumbs, $shortcut_panel, $panel, ), array( 'title' => 'Diffusion', )); } } diff --git a/src/applications/repository/controller/PhabricatorRepositoryListController.php b/src/applications/repository/controller/PhabricatorRepositoryListController.php index 484bda28b8..56921bd089 100644 --- a/src/applications/repository/controller/PhabricatorRepositoryListController.php +++ b/src/applications/repository/controller/PhabricatorRepositoryListController.php @@ -1,167 +1,168 @@ getRequest(); $user = $request->getUser(); $is_admin = $user->getIsAdmin(); $repos = id(new PhabricatorRepository())->loadAll(); + $repos = msort($repos, 'getName'); $rows = array(); foreach ($repos as $repo) { if ($repo->isTracked()) { $diffusion_link = phutil_render_tag( 'a', array( 'href' => '/diffusion/'.$repo->getCallsign().'/', ), 'View in Diffusion'); } else { $diffusion_link = 'Not Tracked'; } $rows[] = array( phutil_escape_html($repo->getCallsign()), phutil_escape_html($repo->getName()), PhabricatorRepositoryType::getNameForRepositoryType( $repo->getVersionControlSystem()), $diffusion_link, phutil_render_tag( 'a', array( 'class' => 'button small grey', 'href' => '/repository/edit/'.$repo->getID().'/', ), 'Edit'), javelin_render_tag( 'a', array( 'class' => 'button small grey', 'href' => '/repository/delete/'.$repo->getID().'/', 'sigil' => 'workflow', ), 'Delete'), ); } $table = new AphrontTableView($rows); $table->setHeaders( array( 'Callsign', 'Repository', 'Type', 'Diffusion', '', '' )); $table->setColumnClasses( array( null, 'wide', null, null, 'action', 'action', )); $table->setColumnVisibility( array( true, true, true, true, $is_admin, $is_admin, )); $panel = new AphrontPanelView(); $panel->setHeader('Repositories'); if ($is_admin) { $panel->setCreateButton('Create New Repository', '/repository/create/'); } $panel->appendChild($table); $panel->setNoBackground(); $projects = id(new PhabricatorRepositoryArcanistProject())->loadAll(); $rows = array(); foreach ($projects as $project) { $repo = idx($repos, $project->getRepositoryID()); if ($repo) { $repo_name = phutil_escape_html($repo->getName()); } else { $repo_name = '-'; } $rows[] = array( phutil_escape_html($project->getName()), $repo_name, phutil_render_tag( 'a', array( 'href' => '/repository/project/edit/'.$project->getID().'/', 'class' => 'button grey small', ), 'Edit'), javelin_render_tag( 'a', array( 'href' => '/repository/project/delete/'.$project->getID().'/', 'class' => 'button grey small', 'sigil' => 'workflow', ), 'Delete'), ); } $project_table = new AphrontTableView($rows); $project_table->setHeaders( array( 'Project ID', 'Repository', '', '', )); $project_table->setColumnClasses( array( '', 'wide', 'action', 'action', )); $project_table->setColumnVisibility( array( true, true, $is_admin, $is_admin, )); $project_panel = new AphrontPanelView(); $project_panel->setHeader('Arcanist Projects'); $project_panel->appendChild($project_table); $project_panel->setNoBackground(); return $this->buildStandardPageResponse( array( $this->renderDaemonNotice(), $panel, $project_panel, ), array( 'title' => 'Repository List', )); } }