From 28fcb5711bc8b48e760edbf234af852c88e500c7 Mon Sep 17 00:00:00 2001 From: Richard van Velzen Date: Thu, 30 Jan 2014 08:36:40 -0800 Subject: [PATCH] Add basic support for mirroring Mercurial repositories Summary: Ref T4338. Mercurial exits with exit code 1 and "no changes found" in stdout when there's no changes. I've split up the `pushRepositoryToMirror` to make the code a tad more readable. It isn't perfect, but it works for me. Test Plan: pushed some changes to my hosted repo. Saw them appearing in the mirrored repo Reviewers: epriestley, #blessed_reviewers Reviewed By: epriestley CC: Korvin, epriestley, aran Maniphest Tasks: T4338 Differential Revision: https://secure.phabricator.com/D8107 --- .../PhabricatorRepositoryMirrorEngine.php | 30 ++++++++++++++++++- .../storage/PhabricatorRepository.php | 2 +- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/src/applications/repository/engine/PhabricatorRepositoryMirrorEngine.php b/src/applications/repository/engine/PhabricatorRepositoryMirrorEngine.php index 5d69644e7b..d73b2bed0f 100644 --- a/src/applications/repository/engine/PhabricatorRepositoryMirrorEngine.php +++ b/src/applications/repository/engine/PhabricatorRepositoryMirrorEngine.php @@ -55,9 +55,17 @@ final class PhabricatorRepositoryMirrorEngine $this->log(pht('Pushing to remote "%s"...', $mirror->getRemoteURI())); - if (!$proxy->isGit()) { + if ($proxy->isGit()) { + $this->pushToGitRepository($proxy); + } else if ($proxy->isHg()) { + $this->pushToHgRepository($proxy); + } else { throw new Exception(pht('Unsupported VCS!')); } + } + + private function pushToGitRepository( + PhabricatorRepository $proxy) { $future = $proxy->getRemoteCommandFuture( 'push --verbose --mirror -- %P', @@ -68,4 +76,24 @@ final class PhabricatorRepositoryMirrorEngine ->resolvex(); } + private function pushToHgRepository( + PhabricatorRepository $proxy) { + + $future = $proxy->getRemoteCommandFuture( + 'push --verbose --rev tip -- %P', + $proxy->getRemoteURIEnvelope()); + + try { + $future + ->setCWD($proxy->getLocalPath()) + ->resolvex(); + } catch (CommandException $ex) { + if (preg_match('/no changes found/', $ex->getStdOut())) { + // mercurial says nothing changed, but that's good + } else { + throw $ex; + } + } + } + } diff --git a/src/applications/repository/storage/PhabricatorRepository.php b/src/applications/repository/storage/PhabricatorRepository.php index db4bb001b5..d7e229eb1e 100644 --- a/src/applications/repository/storage/PhabricatorRepository.php +++ b/src/applications/repository/storage/PhabricatorRepository.php @@ -1038,7 +1038,7 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO } public function canMirror() { - if ($this->isGit()) { + if ($this->isGit() || $this->isHg()) { return true; } -- 2.51.2