From 0c53b514f9df9e667523e0048f22a0b0be08d23b Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 24 Jul 2024 12:18:20 +0300 Subject: [PATCH] Queue repository revision scan after a commit was made. --- CHANGELOG.md | 1 + src/SVNBuddy/Command/CommitCommand.php | 3 ++ src/SVNBuddy/Container.php | 3 +- .../Repository/RevisionLog/RevisionLog.php | 43 +++++++++++++++++++ .../RevisionLog/RevisionLogFactory.php | 20 ++++++++- .../RevisionLog/RevisionLogFactoryTest.php | 3 +- .../RevisionLog/RevisionLogTest.php | 1 + 7 files changed, 70 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9540051..d01e79c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - Show update notifications only, when SVN-Buddy is being used from a PHAR file. - The cache delete/set commands were displayed as "cache hit"/"cache miss" operations during verbose output. - When there was a cache miss, then explain why (absent, invalidated, expired) during verbose output. +- Queue SVN-Buddy new repository commit discovery, after a new commit in SVN-Buddy was made. ## [0.7.0] - 2024-04-12 ### Added diff --git a/src/SVNBuddy/Command/CommitCommand.php b/src/SVNBuddy/Command/CommitCommand.php index 377d75c..a648a93 100644 --- a/src/SVNBuddy/Command/CommitCommand.php +++ b/src/SVNBuddy/Command/CommitCommand.php @@ -196,6 +196,9 @@ protected function execute(InputInterface $input, OutputInterface $output) $this->_workingCopyConflictTracker->erase($wc_path); unlink($tmp_file); + // Make committed revision instantly available for merging. + $this->getRevisionLog($this->getWorkingCopyUrl())->setForceRefreshFlag(true); + $this->io->writeln('Done'); } diff --git a/src/SVNBuddy/Container.php b/src/SVNBuddy/Container.php index 30dd8d8..38db758 100644 --- a/src/SVNBuddy/Container.php +++ b/src/SVNBuddy/Container.php @@ -169,7 +169,8 @@ public function __construct(array $values = array()) return new RevisionLogFactory( $c['repository_connector'], $c['db_manager'], - $c['log_message_parser_factory'] + $c['log_message_parser_factory'], + $c['working_directory'] ); }; diff --git a/src/SVNBuddy/Repository/RevisionLog/RevisionLog.php b/src/SVNBuddy/Repository/RevisionLog/RevisionLog.php index ea95e0e..6852d77 100644 --- a/src/SVNBuddy/Repository/RevisionLog/RevisionLog.php +++ b/src/SVNBuddy/Repository/RevisionLog/RevisionLog.php @@ -75,18 +75,27 @@ class RevisionLog */ private $_revisionUrlBuilder; + /** + * Force refresh flag filename. + * + * @var string + */ + private $_forceRefreshFlagFilename; + /** * Create revision log. * * @param string $repository_url Repository url. * @param RevisionUrlBuilder $revision_url_builder Revision URL builder. * @param Connector $repository_connector Repository connector. + * @param string $working_directory Working directory. * @param ConsoleIO $io Console IO. */ public function __construct( $repository_url, RevisionUrlBuilder $revision_url_builder, Connector $repository_connector, + $working_directory, ConsoleIO $io = null ) { $this->_io = $io; @@ -98,6 +107,7 @@ public function __construct( $this->_projectPath = $repository_connector->getProjectUrl($relative_path) . '/'; $this->_refName = $repository_connector->getRefByPath($relative_path); $this->_revisionUrlBuilder = $revision_url_builder; + $this->_forceRefreshFlagFilename = $working_directory . '/' . md5($this->_repositoryRootUrl) . '.force-refresh'; } /** @@ -134,6 +144,12 @@ public function refresh($is_migration) else { // Import all data for new commits only. $from_revision = $this->_getAggregateRevision('min'); + + if ( $this->getForceRefreshFlag() ) { + $this->_repositoryConnector->withCacheOverwrite(true); + $this->setForceRefreshFlag(false); + } + $to_revision = $this->_repositoryConnector->getLastRevision($this->_repositoryRootUrl); } @@ -142,6 +158,33 @@ public function refresh($is_migration) } } + /** + * Sets force refresh flag. + * + * @param boolean $flag Flag. + * + * @return void + */ + public function setForceRefreshFlag($flag) + { + if ( $flag ) { + touch($this->_forceRefreshFlagFilename); + } + else { + unlink($this->_forceRefreshFlagFilename); + } + } + + /** + * Gets force refresh flag. + * + * @return boolean + */ + protected function getForceRefreshFlag() + { + return file_exists($this->_forceRefreshFlagFilename); + } + /** * Reparses a revision. * diff --git a/src/SVNBuddy/Repository/RevisionLog/RevisionLogFactory.php b/src/SVNBuddy/Repository/RevisionLog/RevisionLogFactory.php index 9d28d28..e83071a 100644 --- a/src/SVNBuddy/Repository/RevisionLog/RevisionLogFactory.php +++ b/src/SVNBuddy/Repository/RevisionLog/RevisionLogFactory.php @@ -48,6 +48,13 @@ class RevisionLogFactory */ private $_logMessageParserFactory; + /** + * Working directory. + * + * @var string + */ + private $_workingDirectory; + /** * Revision logs by url * @@ -61,15 +68,18 @@ class RevisionLogFactory * @param Connector $repository_connector Repository connector. * @param DatabaseManager $database_manager Database manager. * @param LogMessageParserFactory $log_message_parser_factory Log message parser factory. + * @param string $working_directory Working directory. */ public function __construct( Connector $repository_connector, DatabaseManager $database_manager, - LogMessageParserFactory $log_message_parser_factory + LogMessageParserFactory $log_message_parser_factory, + $working_directory ) { $this->_repositoryConnector = $repository_connector; $this->_databaseManager = $database_manager; $this->_logMessageParserFactory = $log_message_parser_factory; + $this->_workingDirectory = $working_directory; } /** @@ -112,7 +122,13 @@ protected function createRevisionLog($repository_url, ConsoleIO $io = null) $revision_url_builder = new RevisionUrlBuilder($this->_repositoryConnector, $repository_url); // Create blank revision log. - $revision_log = new RevisionLog($repository_url, $revision_url_builder, $this->_repositoryConnector, $io); + $revision_log = new RevisionLog( + $repository_url, + $revision_url_builder, + $this->_repositoryConnector, + $this->_workingDirectory, + $io + ); // Add plugins to revision log. $revision_log->registerPlugin(new SummaryPlugin($database, $repository_filler)); diff --git a/tests/SVNBuddy/Repository/RevisionLog/RevisionLogFactoryTest.php b/tests/SVNBuddy/Repository/RevisionLog/RevisionLogFactoryTest.php index 57c7224..3239a1e 100644 --- a/tests/SVNBuddy/Repository/RevisionLog/RevisionLogFactoryTest.php +++ b/tests/SVNBuddy/Repository/RevisionLog/RevisionLogFactoryTest.php @@ -43,7 +43,8 @@ public function testGetRevisionLog() $factory = new RevisionLogFactory( $repository_connector->reveal(), $database_manager->reveal(), - $log_message_parser_factory->reveal() + $log_message_parser_factory->reveal(), + sys_get_temp_dir() // TODO: Test with fake working directory class. ); $this->assertInstanceOf( RevisionLog::class, diff --git a/tests/SVNBuddy/Repository/RevisionLog/RevisionLogTest.php b/tests/SVNBuddy/Repository/RevisionLog/RevisionLogTest.php index 2b3a4b0..14c82d1 100644 --- a/tests/SVNBuddy/Repository/RevisionLog/RevisionLogTest.php +++ b/tests/SVNBuddy/Repository/RevisionLog/RevisionLogTest.php @@ -483,6 +483,7 @@ protected function createRevisionLog($repository_url, ConsoleIO $io = null) $repository_url, $this->revisionUrlBuilder->reveal(), $this->repositoryConnector->reveal(), + sys_get_temp_dir(), // TODO: Test with fake working directory class. $io );