From afe00798195515ead8c4b6a7651c7486ca818b7b Mon Sep 17 00:00:00 2001 From: epriestley Date: Sun, 20 Mar 2011 17:46:02 -0700 Subject: [PATCH] Improve awkward Diffusion query plans. --- .../daemon/phabricator_daemon_launcher.php | 4 +- scripts/repository/rebuild_summaries.php | 74 +++++++++++++++++++ src/__phutil_library_map__.php | 5 +- .../home/DiffusionHomeController.php | 59 ++++++--------- .../branch/git/DiffusionGitBranchQuery.php | 43 +++++++---- .../browse/svn/DiffusionSvnBrowseQuery.php | 32 +++++--- .../diffusion/query/browse/svn/__init__.php | 3 +- .../pathid/base/DiffusionGitPathIDQuery.php | 56 ++++++++++++++ .../diffusion/query/pathid/base/__init__.php | 15 ++++ ...ricatorRepositoryCommitDiscoveryDaemon.php | 16 +++- .../daemon/commitdiscovery/base/__init__.php | 2 + ...atorRepositoryGitCommitDiscoveryDaemon.php | 23 +++--- .../daemon/commitdiscovery/git/__init__.php | 1 + .../PhabricatorRepositoryGitFetchDaemon.php} | 4 +- .../daemon/{gitpull => gitfetch}/__init__.php | 2 +- .../repository/PhabricatorRepository.php | 1 + 16 files changed, 262 insertions(+), 78 deletions(-) create mode 100755 scripts/repository/rebuild_summaries.php create mode 100644 src/applications/diffusion/query/pathid/base/DiffusionGitPathIDQuery.php create mode 100644 src/applications/diffusion/query/pathid/base/__init__.php rename src/applications/repository/daemon/{gitpull/PhabricatorRepositoryGitPullDaemon.php => gitfetch/PhabricatorRepositoryGitFetchDaemon.php} (94%) rename src/applications/repository/daemon/{gitpull => gitfetch}/__init__.php (80%) diff --git a/scripts/daemon/phabricator_daemon_launcher.php b/scripts/daemon/phabricator_daemon_launcher.php index e6c21b255a..6a6549af3d 100755 --- a/scripts/daemon/phabricator_daemon_launcher.php +++ b/scripts/daemon/phabricator_daemon_launcher.php @@ -53,7 +53,7 @@ switch (isset($argv[1]) ? $argv[1] : 'help') { echo "Launching 'git pull' daemon on the {$desc} repository...\n"; $control->launchDaemon( - 'PhabricatorRepositoryGitPullDaemon', + 'PhabricatorRepositoryGitFetchDaemon', array( $phid, )); @@ -74,7 +74,7 @@ switch (isset($argv[1]) ? $argv[1] : 'help') { switch ($repository->getVersionControlSystem()) { case 'git': - echo "Launching 'git pull' daemon on the {$desc} repository...\n"; + echo "Launching 'git fetch' daemon on the {$desc} repository...\n"; $control->launchDaemon( 'PhabricatorRepositoryGitPullDaemon', array( diff --git a/scripts/repository/rebuild_summaries.php b/scripts/repository/rebuild_summaries.php new file mode 100755 index 0000000000..524979aeb8 --- /dev/null +++ b/scripts/repository/rebuild_summaries.php @@ -0,0 +1,74 @@ +#!/usr/bin/env php +establishConnection('r'); +$sizes = queryfx_all( + $conn_w, + 'SELECT repositoryID, count(*) N FROM %T GROUP BY repositoryID', + $commit->getTableName()); +$sizes = ipull($sizes, 'N', 'repositoryID'); + +$maxes = queryfx_all( + $conn_w, + 'SELECT repositoryID, max(epoch) maxEpoch FROM %T GROUP BY repositoryID', + $commit->getTableName()); +$maxes = ipull($maxes, 'maxEpoch', 'repositoryID'); + + +$repository_ids = array_keys($sizes + $maxes); + +echo "Updating ".count($repository_ids)." repositories"; + +foreach ($repository_ids as $repository_id) { + $last_commit = queryfx_one( + $conn_w, + 'SELECT id FROM %T WHERE repositoryID = %d AND epoch = %d LIMIT 1', + $commit->getTableName(), + $repository_id, + idx($maxes, $repository_id, 0)); + if ($last_commit) { + $last_commit = $last_commit['id']; + } else { + $last_commit = 0; + } + queryfx( + $conn_w, + 'INSERT INTO %T (repositoryID, lastCommitID, size, epoch) + VALUES (%d, %d, %d, %d) ON DUPLICATE KEY UPDATE + lastCommitID = VALUES(lastCommitID), + size = VALUES(size), + epoch = VALUES(epoch)', + PhabricatorRepository::TABLE_SUMMARY, + $repository_id, + $last_commit, + idx($sizes, $repository_id, 0), + idx($maxes, $repository_id, 0)); + echo "."; +} +echo "\ndone.\n"; diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 2893870a0e..2c0b26cad4 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -162,6 +162,7 @@ phutil_register_library_map(array( 'DiffusionGitBrowseQuery' => 'applications/diffusion/query/browse/git', 'DiffusionGitFileContentQuery' => 'applications/diffusion/query/filecontent/git', 'DiffusionGitHistoryQuery' => 'applications/diffusion/query/history/git', + 'DiffusionGitPathIDQuery' => 'applications/diffusion/query/pathid/base', 'DiffusionGitRequest' => 'applications/diffusion/request/git', 'DiffusionHistoryController' => 'applications/diffusion/controller/history', 'DiffusionHistoryQuery' => 'applications/diffusion/query/history/base', @@ -312,9 +313,9 @@ phutil_register_library_map(array( 'PhabricatorRepositoryGitCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/git', 'PhabricatorRepositoryGitCommitDiscoveryDaemon' => 'applications/repository/daemon/commitdiscovery/git', 'PhabricatorRepositoryGitCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/git', + 'PhabricatorRepositoryGitFetchDaemon' => 'applications/repository/daemon/gitfetch', 'PhabricatorRepositoryGitHubNotification' => 'applications/repository/storage/githubnotification', 'PhabricatorRepositoryGitHubPostReceiveController' => 'applications/repository/controller/github-post-receive', - 'PhabricatorRepositoryGitPullDaemon' => 'applications/repository/daemon/gitpull', 'PhabricatorRepositoryListController' => 'applications/repository/controller/list', 'PhabricatorRepositorySvnCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/svn', 'PhabricatorRepositorySvnCommitDiscoveryDaemon' => 'applications/repository/daemon/commitdiscovery/svn', @@ -622,9 +623,9 @@ phutil_register_library_map(array( 'PhabricatorRepositoryGitCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker', 'PhabricatorRepositoryGitCommitDiscoveryDaemon' => 'PhabricatorRepositoryCommitDiscoveryDaemon', 'PhabricatorRepositoryGitCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker', + 'PhabricatorRepositoryGitFetchDaemon' => 'PhabricatorRepositoryDaemon', 'PhabricatorRepositoryGitHubNotification' => 'PhabricatorRepositoryDAO', 'PhabricatorRepositoryGitHubPostReceiveController' => 'PhabricatorRepositoryController', - 'PhabricatorRepositoryGitPullDaemon' => 'PhabricatorRepositoryDaemon', 'PhabricatorRepositoryListController' => 'PhabricatorRepositoryController', 'PhabricatorRepositorySvnCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker', 'PhabricatorRepositorySvnCommitDiscoveryDaemon' => 'PhabricatorRepositoryCommitDiscoveryDaemon', diff --git a/src/applications/diffusion/controller/home/DiffusionHomeController.php b/src/applications/diffusion/controller/home/DiffusionHomeController.php index bbe230b58f..80e0d7ee38 100644 --- a/src/applications/diffusion/controller/home/DiffusionHomeController.php +++ b/src/applications/diffusion/controller/home/DiffusionHomeController.php @@ -22,54 +22,43 @@ class DiffusionHomeController extends DiffusionController { // TODO: Restore "shortcuts" feature. - $repositories = id(new PhabricatorRepository())->loadAll(); + $repository = new PhabricatorRepository(); + + $repositories = $repository->loadAll(); foreach ($repositories as $key => $repository) { if (!$repository->getDetail('tracking-enabled')) { unset($repositories[$key]); } } - $commit = new PhabricatorRepositoryCommit(); - $conn_r = $commit->establishConnection('r'); - - // TODO: These queries are pretty bogus. - + $repository_ids = mpull($repositories, 'getID'); + $summaries = array(); $commits = array(); - $commit_counts = 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'); - $max_epoch = queryfx_all( - $commit->establishConnection('r'), - 'SELECT repositoryID, MAX(epoch) maxEpoch FROM %T GROUP BY repositoryID', - $commit->getTableName()); - - if ($max_epoch) { - $sql = array(); - foreach ($max_epoch as $head) { - $sql[] = '('.(int)$head['repositoryID'].', '.(int)$head['maxEpoch'].')'; + $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'); } - - // NOTE: It's possible we'll pull multiple commits for some repository - // here but it reduces query cost around 3x to unique them in PHP rather - // than apply GROUP BY in MySQL. - $commits = $commit->loadAllWhere( - '(repositoryID, epoch) IN (%Q)', - implode(', ', $sql)); - $commits = mpull($commits, null, 'getRepositoryID'); - - $commit_counts = queryfx_all( - $conn_r, - 'SELECT repositoryID, count(*) N FROM %T - GROUP BY repositoryID', - $commit->getTableName()); - $commit_counts = ipull($commit_counts, 'N', 'repositoryID'); } $rows = array(); foreach ($repositories as $repository) { $id = $repository->getID(); $commit = idx($commits, $id); - $date = null; - $time = null; + + $size = idx(idx($summaries, $id, array()), 'size', 0); + + $date = '-'; + $time = '-'; if ($commit) { $date = date('M j, Y', $commit->getEpoch()); $time = date('g:i A', $commit->getEpoch()); @@ -84,12 +73,12 @@ class DiffusionHomeController extends DiffusionController { phutil_escape_html($repository->getName())), PhabricatorRepositoryType::getNameForRepositoryType( $repository->getVersionControlSystem()), - idx($commit_counts, $id, 0), + $size ? number_format($size) : '-', $commit ? DiffusionView::linkCommit( $repository, $commit->getCommitIdentifier()) - : null, + : '-', $date, $time, ); diff --git a/src/applications/diffusion/query/branch/git/DiffusionGitBranchQuery.php b/src/applications/diffusion/query/branch/git/DiffusionGitBranchQuery.php index 4db38420b5..f9306577b9 100644 --- a/src/applications/diffusion/query/branch/git/DiffusionGitBranchQuery.php +++ b/src/applications/diffusion/query/branch/git/DiffusionGitBranchQuery.php @@ -22,31 +22,46 @@ final class DiffusionGitBranchQuery extends DiffusionBranchQuery { $drequest = $this->getRequest(); $repository = $drequest->getRepository(); - $path = $drequest->getPath(); - $commit = $drequest->getCommit(); - $local_path = $repository->getDetail('local-path'); list($stdout) = execx( - '(cd %s && git branch --verbose --no-abbrev)', + '(cd %s && git branch -r --verbose --no-abbrev)', $local_path); $branches = array(); - - $lines = array_filter(explode("\n", $stdout)); - foreach ($lines as $line) { - $matches = null; - if (!preg_match('/^[ *] (\S+)\s+([a-z0-9]{40}) /', $line, $matches)) { - throw new Exception("Failed to parse {$line}!"); - } + foreach (self::parseGitRemoteBranchOutput($stdout) as $name => $head) { $branch = new DiffusionBranchInformation(); - $branch->setName($matches[1]); - $branch->setHeadCommitIdentifier($matches[2]); - + $branch->setName($name); + $branch->setHeadCommitIdentifier($head); $branches[] = $branch; } return $branches; } + public static function parseGitRemoteBranchOutput($stdout) { + $map = array(); + + $lines = array_filter(explode("\n", $stdout)); + foreach ($lines as $line) { + $matches = null; + if (preg_match('/^ (\S+)\s+-> (\S+)$/', $line, $matches)) { + // This is a line like: + // + // origin/HEAD -> origin/master + // + // ...which we don't currently do anything interesting with, although + // in theory we could use it to automatically choose the default + // branch. + continue; + } + if (!preg_match('/^[ *] (\S+)\s+([a-z0-9]{40}) /', $line, $matches)) { + throw new Exception("Failed to parse {$line}!"); + } + $map[$matches[1]] = $matches[2]; + } + + return $map; + } + } diff --git a/src/applications/diffusion/query/browse/svn/DiffusionSvnBrowseQuery.php b/src/applications/diffusion/query/browse/svn/DiffusionSvnBrowseQuery.php index 7710362646..fc6f080966 100644 --- a/src/applications/diffusion/query/browse/svn/DiffusionSvnBrowseQuery.php +++ b/src/applications/diffusion/query/browse/svn/DiffusionSvnBrowseQuery.php @@ -25,17 +25,18 @@ final class DiffusionSvnBrowseQuery extends DiffusionBrowseQuery { $path = $drequest->getPath(); $commit = $drequest->getCommit(); - $path_normal = '/'.trim($path, '/'); - $conn_r = $repository->establishConnection('r'); - $paths = queryfx_all( - $conn_r, - 'SELECT id, path FROM %T WHERE path IN (%Ls)', - PhabricatorRepository::TABLE_PATH, - array($path_normal)); - $paths = ipull($paths, 'id', 'path'); - $path_id = idx($paths, $path_normal); + $parent_path = dirname($path); + $path_query = new DiffusionGitPathIDQuery( + array( + $path, + $parent_path, + )); + $path_map = $path_query->loadPathIDs(); + + $path_id = $path_map[$path]; + $parent_path_id = $path_map[$parent_path]; if (empty($path_id)) { $this->reason = self::REASON_IS_NONEXISTENT; @@ -62,12 +63,21 @@ final class DiffusionSvnBrowseQuery extends DiffusionBrowseQuery { if ($path == '/') { $this->reason = self::REASON_IS_EMPTY; } else { + + // NOTE: The parent path ID is included so this query can take + // advantage of the table's primary key; it is uniquely determined by + // the pathID but if we don't do the lookup ourselves MySQL doesn't have + // the information it needs to avoid a table scan. + $reasons = queryfx_all( $conn_r, - 'SELECT * FROM %T WHERE repositoryID = %d AND pathID = %d + 'SELECT * FROM %T WHERE repositoryID = %d + AND parentID = %d + AND pathID = %d %Q ORDER BY svnCommit DESC LIMIT 2', PhabricatorRepository::TABLE_FILESYSTEM, $repository->getID(), + $parent_path_id, $path_id, $slice_clause); @@ -113,6 +123,8 @@ final class DiffusionSvnBrowseQuery extends DiffusionBrowseQuery { $path_id, implode(', ', $sql)); + $path_normal = DiffusionGitPathIDQuery::normalizePath($path); + $results = array(); foreach ($browse as $file) { diff --git a/src/applications/diffusion/query/browse/svn/__init__.php b/src/applications/diffusion/query/browse/svn/__init__.php index 5d529ccb9d..021f807b5d 100644 --- a/src/applications/diffusion/query/browse/svn/__init__.php +++ b/src/applications/diffusion/query/browse/svn/__init__.php @@ -9,10 +9,9 @@ phutil_require_module('phabricator', 'applications/differential/constants/changetype'); phutil_require_module('phabricator', 'applications/diffusion/data/repositorypath'); phutil_require_module('phabricator', 'applications/diffusion/query/browse/base'); +phutil_require_module('phabricator', 'applications/diffusion/query/pathid/base'); phutil_require_module('phabricator', 'applications/repository/storage/repository'); phutil_require_module('phabricator', 'storage/queryfx'); -phutil_require_module('phutil', 'utils'); - phutil_require_source('DiffusionSvnBrowseQuery.php'); diff --git a/src/applications/diffusion/query/pathid/base/DiffusionGitPathIDQuery.php b/src/applications/diffusion/query/pathid/base/DiffusionGitPathIDQuery.php new file mode 100644 index 0000000000..fe8d49995a --- /dev/null +++ b/src/applications/diffusion/query/pathid/base/DiffusionGitPathIDQuery.php @@ -0,0 +1,56 @@ +paths = $paths; + } + + public function loadPathIDs() { + $repository = new PhabricatorRepository(); + + $path_normal_map = array(); + foreach ($this->paths as $path) { + $normal = self::normalizePath($path); + $path_normal_map[$normal][] = $path; + } + + $paths = queryfx_all( + $repository->establishConnection('r'), + 'SELECT * FROM %T WHERE path IN (%Ls)', + PhabricatorRepository::TABLE_PATH, + array_keys($path_normal_map)); + $paths = ipull($paths, 'id', 'path'); + + $result = array(); + + foreach ($path_normal_map as $normal => $originals) { + foreach ($originals as $original) { + $result[$original] = idx($paths, $normal); + } + } + + return $result; + } + + public static function normalizePath($path) { + return '/'.trim($path, '/'); + } + +} diff --git a/src/applications/diffusion/query/pathid/base/__init__.php b/src/applications/diffusion/query/pathid/base/__init__.php new file mode 100644 index 0000000000..08ea1f8cbd --- /dev/null +++ b/src/applications/diffusion/query/pathid/base/__init__.php @@ -0,0 +1,15 @@ +commitCache[$target] = true; - while (count($this->commitCache) > 16) { + while (count($this->commitCache) > 64) { array_shift($this->commitCache); } @@ -80,6 +80,20 @@ abstract class PhabricatorRepositoryCommitDiscoveryDaemon )); $event->recordEvent(); + queryfx( + $repository->establishConnection('r'), + 'INSERT INTO %T (repositoryID, size, lastCommitID, epoch) + VALUES (%d, 1, %d, %d) + ON DUPLICATE KEY UPDATE + size = size + 1, + lastCommitID = + IF(VALUES(epoch) > epoch, VALUES(lastCommitID), lastCommitID), + epoch = IF(VALUES(epoch) > epoch, VALUES(epoch), epoch)', + PhabricatorRepository::TABLE_SUMMARY, + $repository->getID(), + $commit->getID(), + $epoch); + $this->commitCache[$commit_identifier] = true; } catch (AphrontQueryDuplicateKeyException $ex) { // Ignore. This can happen because we discover the same new commit diff --git a/src/applications/repository/daemon/commitdiscovery/base/__init__.php b/src/applications/repository/daemon/commitdiscovery/base/__init__.php index cde21de298..d26ee49b18 100644 --- a/src/applications/repository/daemon/commitdiscovery/base/__init__.php +++ b/src/applications/repository/daemon/commitdiscovery/base/__init__.php @@ -8,7 +8,9 @@ phutil_require_module('phabricator', 'applications/repository/daemon/base'); phutil_require_module('phabricator', 'applications/repository/storage/commit'); +phutil_require_module('phabricator', 'applications/repository/storage/repository'); phutil_require_module('phabricator', 'infrastructure/daemon/timeline/storage/event'); +phutil_require_module('phabricator', 'storage/queryfx'); phutil_require_module('phutil', 'utils'); diff --git a/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php b/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php index 67b0bb5562..9ad82fdb28 100644 --- a/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php +++ b/src/applications/repository/daemon/commitdiscovery/git/PhabricatorRepositoryGitCommitDiscoveryDaemon.php @@ -20,7 +20,7 @@ class PhabricatorRepositoryGitCommitDiscoveryDaemon extends PhabricatorRepositoryCommitDiscoveryDaemon { protected function discoverCommits() { - // NOTE: PhabricatorRepositoryGitPullDaemon does the actual pulls, this + // NOTE: PhabricatorRepositoryGitFetchDaemon does the actual pulls, this // just parses HEAD. $repository = $this->getRepository(); @@ -33,18 +33,23 @@ class PhabricatorRepositoryGitCommitDiscoveryDaemon $repository_phid = $repository->getPHID(); $repo_base = $repository->getDetail('local-path'); - list($commit) = execx( - '(cd %s && git log -n1 --pretty="%%H")', + list($stdout) = execx( + '(cd %s && git branch -r --verbose --no-abbrev)', $repo_base); - $commit = trim($commit); - if ($this->isKnownCommit($commit)) { - return false; + $branches = DiffusionGitBranchQuery::parseGitRemoteBranchOutput($stdout); + + $got_something = false; + foreach ($branches as $name => $commit) { + if ($this->isKnownCommit($commit)) { + continue; + } else { + $this->discoverCommit($commit); + $got_something = true; + } } - $this->discoverCommit($commit); - - return true; + return $got_something; } private function discoverCommit($commit) { diff --git a/src/applications/repository/daemon/commitdiscovery/git/__init__.php b/src/applications/repository/daemon/commitdiscovery/git/__init__.php index 4404f788e1..8fc9566ada 100644 --- a/src/applications/repository/daemon/commitdiscovery/git/__init__.php +++ b/src/applications/repository/daemon/commitdiscovery/git/__init__.php @@ -6,6 +6,7 @@ +phutil_require_module('phabricator', 'applications/diffusion/query/branch/git'); phutil_require_module('phabricator', 'applications/repository/constants/repositorytype'); phutil_require_module('phabricator', 'applications/repository/daemon/commitdiscovery/base'); diff --git a/src/applications/repository/daemon/gitpull/PhabricatorRepositoryGitPullDaemon.php b/src/applications/repository/daemon/gitfetch/PhabricatorRepositoryGitFetchDaemon.php similarity index 94% rename from src/applications/repository/daemon/gitpull/PhabricatorRepositoryGitPullDaemon.php rename to src/applications/repository/daemon/gitfetch/PhabricatorRepositoryGitFetchDaemon.php index 279e77fc29..e16a811994 100644 --- a/src/applications/repository/daemon/gitpull/PhabricatorRepositoryGitPullDaemon.php +++ b/src/applications/repository/daemon/gitfetch/PhabricatorRepositoryGitFetchDaemon.php @@ -16,7 +16,7 @@ * limitations under the License. */ -class PhabricatorRepositoryGitPullDaemon +class PhabricatorRepositoryGitFetchDaemon extends PhabricatorRepositoryDaemon { public function run() { @@ -46,7 +46,7 @@ class PhabricatorRepositoryGitPullDaemon execx('mkdir -p %s', dirname($local_path)); execx('git clone %s %s', $remote_uri, rtrim($local_path, '/')); } else { - execx('(cd %s && git pull)', $local_path); + execx('(cd %s && git fetch --all)', $local_path); } $this->sleep($repository->getDetail('pull-frequency', 15)); } diff --git a/src/applications/repository/daemon/gitpull/__init__.php b/src/applications/repository/daemon/gitfetch/__init__.php similarity index 80% rename from src/applications/repository/daemon/gitpull/__init__.php rename to src/applications/repository/daemon/gitfetch/__init__.php index 19e3eb4519..0fed3d00fb 100644 --- a/src/applications/repository/daemon/gitpull/__init__.php +++ b/src/applications/repository/daemon/gitfetch/__init__.php @@ -12,4 +12,4 @@ phutil_require_module('phutil', 'filesystem'); phutil_require_module('phutil', 'future/exec'); -phutil_require_source('PhabricatorRepositoryGitPullDaemon.php'); +phutil_require_source('PhabricatorRepositoryGitFetchDaemon.php'); diff --git a/src/applications/repository/storage/repository/PhabricatorRepository.php b/src/applications/repository/storage/repository/PhabricatorRepository.php index 71f21bedee..8212b4bff0 100644 --- a/src/applications/repository/storage/repository/PhabricatorRepository.php +++ b/src/applications/repository/storage/repository/PhabricatorRepository.php @@ -21,6 +21,7 @@ class PhabricatorRepository extends PhabricatorRepositoryDAO { const TABLE_PATH = 'repository_path'; const TABLE_PATHCHANGE = 'repository_pathchange'; const TABLE_FILESYSTEM = 'repository_filesystem'; + const TABLE_SUMMARY = 'repository_summary'; protected $phid; protected $name;