Steps to reproduce:
- Phorge at 81653abb5440109eb82c734d1671753a738dec3a, PHP 8.3.6 (DateMalformedStringException was introduced in 8.3)
- Make sure Calendar prototype application is installed at http://phorge.localhost/applications/view/PhabricatorCalendarApplication/
- Install translations extension via git clone https://gerrit.wikimedia.org/r/phabricator/translations, make sure to use revision 8907cd5c6ad807732e5c5dc81a096f5114922d4d (as the offending strings were removed in https://gerrit.wikimedia.org/r/plugins/gitiles/phabricator/translations/+/094f99069cbae82366a9902ca5865b78cda02f78 ), and follow https://we.phorge.it/w/docs/extensions/install/
- Enable http://phorge.localhost/config/edit/phabricator.developer-mode/
- Set up calendar event E9 called abcdefgh on some day from 11:00 AM to 5:00 PM
- Keep Time Format as Default on http://phorge.localhost/settings/panel/datetime/
- Set Translation to Finnish (which translates AM to epp.) on http://phorge.localhost/settings/panel/language/
- Go to http://phorge.localhost/search/query/advanced/ , enter abcdefgh as the search term, set Document Types to Event and click Search button
Expected outcome:
Search results
Actual outcome:
[2024-05-04 11:56:09] EXCEPTION: (PhutilAggregateException) All of the configured Fulltext Search services failed. - DateMalformedStringException: Failed to parse time string (2024-05-04 12:00 epp.) at position 17 (e): The timezone could not be found in the database at [<phorge>/src/infrastructure/cluster/search/PhabricatorSearchService.php:276] arcanist(head=master, ref.master=ef73b12b580e), phorge(head=amPmCalExplode, ref.master=81653abb5440, ref.amPmCalExplode=81653abb5440), translations(head=wmf/stable, ref.master=09fe573a932a, ref.wmf/stable=e45c643766c8) #0 <#3> DateTime::__construct(string, DateTimeZone) called at [<phorge>/src/view/form/control/AphrontFormDateControlValue.php:267] #1 <#3> AphrontFormDateControlValue::getFormattedDateFromParts(string, string, string, string) called at [<phorge>/src/view/form/control/AphrontFormDateControlValue.php:109] #2 <#3> AphrontFormDateControlValue::newFromEpoch(PhabricatorUser, string) called at [<phorge>/src/applications/calendar/query/PhabricatorCalendarEventSearchEngine.php:567] #3 <#3> PhabricatorCalendarEventSearchEngine::getSafeDate(NULL) called at [<phorge>/src/applications/calendar/query/PhabricatorCalendarEventSearchEngine.php:155] #4 <#3> PhabricatorCalendarEventSearchEngine::getQueryDateRange(NULL, NULL, string, boolean) called at [<phorge>/src/applications/calendar/query/PhabricatorCalendarEventSearchEngine.php:119] #5 <#3> PhabricatorCalendarEventSearchEngine::buildQueryFromParameters(array) called at [<phorge>/src/applications/search/engine/PhabricatorApplicationSearchEngine.php:168] #6 <#3> PhabricatorApplicationSearchEngine::buildQueryFromSavedQuery(PhabricatorSavedQuery) called at [<phorge>/src/applications/calendar/query/PhabricatorCalendarEventSearchEngine.php:86] #7 <#3> PhabricatorCalendarEventSearchEngine::buildQueryFromSavedQuery(PhabricatorSavedQuery) called at [<phorge>/src/applications/search/fulltextstorage/PhabricatorFerretFulltextStorageEngine.php:76] #8 <#3> PhabricatorFerretFulltextStorageEngine::executeSearch(PhabricatorSavedQuery) called at [<phorge>/src/infrastructure/cluster/search/PhabricatorSearchService.php:262] #9 <#2> PhabricatorSearchService::newResultSet(PhabricatorSavedQuery, PhabricatorSearchDocumentQuery) called at [<phorge>/src/applications/search/query/PhabricatorSearchDocumentQuery.php:52] #10 <#2> PhabricatorSearchDocumentQuery::loadPage() called at [<phorge>/src/infrastructure/query/policy/PhabricatorPolicyAwareQuery.php:251] #11 <#2> PhabricatorPolicyAwareQuery::execute() called at [<phorge>/src/infrastructure/query/PhabricatorOffsetPagedQuery.php:46] #12 <#2> PhabricatorOffsetPagedQuery::executeWithOffsetPager(PHUIPagerView) called at [<phorge>/src/applications/search/engine/PhabricatorApplicationSearchEngine.php:1038] #13 <#2> PhabricatorApplicationSearchEngine::executeQuery(PhabricatorSearchDocumentQuery, PHUIPagerView) called at [<phorge>/src/applications/search/controller/PhabricatorApplicationSearchController.php:256] #14 <#2> PhabricatorApplicationSearchController::processSearchRequest() called at [<phorge>/src/applications/search/controller/PhabricatorApplicationSearchController.php:91] #15 <#2> PhabricatorApplicationSearchController::processRequest() called at [<phorge>/src/aphront/AphrontController.php:29] #16 <#2> AphrontController::handleRequest(AphrontRequest) called at [<phorge>/src/aphront/AphrontController.php:71] #17 <#2> AphrontController::delegateToController(PhabricatorApplicationSearchController) called at [<phorge>/src/applications/search/controller/PhabricatorSearchController.php:96] #18 <#2> PhabricatorSearchController::handleRequest(AphrontRequest) called at [<phorge>/src/aphront/configuration/AphrontApplicationConfiguration.php:284] #19 phlog(PhutilAggregateException) called at [<phorge>/src/aphront/handler/PhabricatorDefaultRequestExceptionHandler.php:41] #20 PhabricatorDefaultRequestExceptionHandler::handleRequestThrowable(AphrontRequest, PhutilAggregateException) called at [<phorge>/src/aphront/configuration/AphrontApplicationConfiguration.php:751] #21 AphrontApplicationConfiguration::handleThrowable(PhutilAggregateException) called at [<phorge>/src/aphront/configuration/AphrontApplicationConfiguration.php:296] #22 AphrontApplicationConfiguration::processRequest(AphrontRequest, PhutilDeferredLog, AphrontPHPHTTPSink, MultimeterControl) called at [<phorge>/src/aphront/configuration/AphrontApplicationConfiguration.php:203] #23 AphrontApplicationConfiguration::runHTTPRequest(AphrontPHPHTTPSink) called at [<phorge>/webroot/index.php:35]
Other comments:
- Phorge uses the localized AM/PM string for time format / comparison. The code should be made more robust by avoiding that.
- See https://phabricator.wikimedia.org/T363215#9741670 for gory details.