From d952dd591266e3e44d50f45ec9646effc2b6d72e Mon Sep 17 00:00:00 2001 From: epriestley Date: Fri, 26 Aug 2016 05:21:06 -0700 Subject: [PATCH] When importing Git repositories, treat out-of-range timestamps as the current time Summary: Fixes T11537. See that task for discussion. Although we could accommodate these faithfully, it requires a huge migration and affects one repository on one install which was written with buggy tools. At least for now, just replace out-of-32-bit-range epoch values with the current time, which is often somewhat close to the real value. Test Plan: - Following the instructions in T11537, created commits in 40,000 AD. - Tried to import them, reproducing the "epoch" database issue. - Applied the patch. - Successfully imported future-commits, with some liberties around commit dates. Note that author date (not stored in an `epoch` column) is still shown faithfully: {F1789302} Reviewers: chad, avivey Reviewed By: avivey Maniphest Tasks: T11537 Differential Revision: https://secure.phabricator.com/D16456 --- .../engine/PhabricatorRepositoryDiscoveryEngine.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php b/src/applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php index a4f697da0c..9ccc72b8de 100644 --- a/src/applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php +++ b/src/applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php @@ -406,9 +406,17 @@ final class PhabricatorRepositoryDiscoveryEngine $refs = array(); foreach ($commits as $commit) { + $epoch = $stream->getCommitDate($commit); + + // If the epoch doesn't fit into a uint32, treat it as though it stores + // the current time. For discussion, see T11537. + if ($epoch > 0xFFFFFFFF) { + $epoch = PhabricatorTime::getNow(); + } + $refs[] = id(new PhabricatorRepositoryCommitRef()) ->setIdentifier($commit) - ->setEpoch($stream->getCommitDate($commit)) + ->setEpoch($epoch) ->setCanCloseImmediately($close_immediately) ->setParents($stream->getParents($commit)); }