1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-25 16:22:43 +01:00
Commit graph

17650 commits

Author SHA1 Message Date
Andre Klapper
3fbb0309b5 Update external timezone information to IANA TZDB 2024a
Summary:
Update the list of timezones by pulling from CLDR upstream (revision `9d96f34` from 2024-02-08) located here:

https://github.com/unicode-org/cldr/blob/main/common/supplemental/windowsZones.xml

Permalink:

9d96f340ab/common/supplemental/windowsZones.xml

Closes T15876

Test Plan:
* As an admin, go to http://phorge.localhost/config/edit/phabricator.timezone/ and change the default value.
* As a user, go to http://phorge.localhost/settings/panel/datetime/ and change the value in the `Timezone` dropdown.
* Run the `diff` command against

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: revi, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15876

Differential Revision: https://we.phorge.it/D25722
2024-07-10 13:33:42 +02:00
Andre Klapper
d9592e0348 Removed unused validateNavigationMenuItem() from PhabricatorProfileMenuEngine
Summary:
The commit rP7bde92b9c9806c5967df617fb4e843dea315ecf7 (2016) introduced `private function validateNavigationMenuItem()`.
The only call to this method was removed in rP950e9d085b482bc3484e2066591ac07c20154c9a.
Thus remove this unused method.

Test Plan:
Read/grep the code in `PhabricatorProfileMenuEngine`.

Run also `grep -RF 'validateNavigationMenuItem' --include="*.php" .` to verify that this is an orphan method.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25719
2024-07-10 13:32:53 +02:00
Andre Klapper
ff7be2cf14 Fix invalid logic in PhabricatorEmailPreferencesSettingsPanel::processRequest()
Summary:
The expression `$all_tags[$tag]['count']` does not do anything. Reading the surrounding code, intention is to display a "Common" section on `/settings/panel/emailpreferences/` listing MailTags defined by at least two different applications. (This is currently not the case anyway as Phorge prefixes all MailTags with their corresponding application but might be a future use case.)
This change fixes the logic accordingly.

Closes T15874

Test Plan: Apply the patch; replace the value of a random `const MAILTAG_*` line in the codebase with the value of another random `const MAILTAG_*` line in the codebase to make it "common", now see that `/settings/panel/emailpreferences/` displays this MailTag in a "Common" section on top of the options.

Reviewers: O1 Blessed Committers, speck

Reviewed By: O1 Blessed Committers, speck

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15874

Differential Revision: https://we.phorge.it/D25727
2024-07-10 08:38:33 +02:00
Andre Klapper
290883b2a9 Set specific timeline title for form creation
Summary:
The timeline for an EditEngine form says `created this object`. It should say `created this form`.

Closes T15880

Test Plan: Go to http://phorge.localhost/transactions/editengine/maniphest.task/ and create an EditEngine form, scroll down to its timeline.

Reviewers: O1 Blessed Committers, speck

Reviewed By: O1 Blessed Committers, speck

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15880

Differential Revision: https://we.phorge.it/D25726
2024-07-10 08:18:37 +02:00
Andre Klapper
1b5d2f83c3 Fix property name typo in DrydockResource
Summary: `$capbilities` has a typo.

Test Plan: Slowly spell the word "capabilities"; compare with the top of the file.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25714
2024-07-07 15:52:42 +02:00
Merula Turdus
136091ecd0 Fix missing file attachment in Conpherence
Summary:
When you drag and drop a file in a Conpherence chat,
the file was only visible by the author.

Now the file is also attached to that chat, making it visible.

This is a follow-up from:

https://we.phorge.it/D25705?id=2178

Refs T15106

Test Plan:
1) open a Conpherence chat or create a new one
2) drag and drop file in it and send the message
3) verify file is attached to the chat

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: avivey, Cigaryno, Matthew, valerio.bozzolan, tobiaswiese

Maniphest Tasks: T15106

Differential Revision: https://we.phorge.it/D25709
2024-07-05 18:20:40 +02:00
Andre Klapper
b0bba4d142 Remove unused methods in PhabricatorEditorExtension
Summary:
The methods `newRequiredTransasctionError()` [sic!] and `newInvalidTransactionError()` are not called anywhere in the codebase. Both are `final protected`, thus remove them.

Incidentally, speedup Diviner generation by at least 0.000000000000000000000001 milliseconds.

Test Plan: Grep the code.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25643
2024-07-02 17:55:25 +02:00
Andre Klapper
9a44a81e79 Remove unused save() method in PhabricatorUserCache
Summary: Seems to be unused. Plus it calls `Filesystem::digestForIndex()` which does not exist. So if this method was ever called then it would through an exception and not reach the `parent::save()` call either in the line after.

Test Plan:
Grep and read the codebase.

Tried things that may use cache and they still work, including:

- running `./bin/cache purge --caches user` successfully shows `Purging "user" cache...`
- the button "Purge cache" in /config/cache/ still work.
- editing a user
- changing user picture using default one
- uploading new user picture
- creating Calendar event and inviting yourself
- visiting user settings
- changing a user setting, including Timezone, Display preferences

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25645
2024-07-02 12:12:43 +02:00
Valerio Bozzolan
118f989366 Fix missing file attachment in Phriction
Summary:
When you drag and drop a file in the Phriction editor and then save the
corresponding wiki document, the file was only visible by the author.

Now the file is also attached to that document, making it visible.

Refs T15106

Test Plan:
1) open the Phriction editor to edit an existing or create a new wiki document
2) drag and drop file in it
3) save wiki document
4) verify file is attached to wiki document (other user can see file in wiki page)

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15106

Differential Revision: https://we.phorge.it/D25705
2024-07-01 18:41:55 +02:00
Andre Klapper
30257515eb Fix typo in CSS definition
Summary: Replace `-webkit-trasform` with `-webkit-transform`.

Test Plan: Read the entire CSS spec at your fireplace.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25707
2024-07-01 13:11:50 +02:00
Andre Klapper
91815cefc5 Fix broken URIs on "Rendering HTML" Diviner page
Summary: Remove incorrect book scope from numerous `find` URIs on the "Rendering HTML" Diviner page in order to get results instead of 404 pages.

Test Plan:
Refresh Diviner documentation from Phorge directory:

    ./bin/diviner generate

Go to https://we.phorge.it/book/contrib/article/rendering_html/ and click random links on that page.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25688
2024-06-28 14:39:43 +02:00
Andre Klapper
43d3fd9eac Fix exception awarding empty badge to user
Summary:
When awarding a badge to a user without having actually selected a batch to award, do not fail on running a database query with no parameter. Instead, silently fail without an error and reload the page, similar to the behavior of `Add Recipients` on `/badges/recipients/1/` in this case.
Do not throw an Aphront404Response as it would make the `Award Badge` button in the dialog inaccessible and keep the dysfunctional overlay dialog displayed.

```
EXCEPTION: (AphrontParameterQueryException) Array for %Ls conversion is empty. Query: badges.phid IN (%Ls) at [<phorge>/src/infrastructure/storage/xsprintf/qsprintf.php:383]
```

Closes T15825

Test Plan: Go to a user's badges, click the `Award Badge` button, in the dialog do not select any Badge and click the `Award` button.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: avivey, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15825

Differential Revision: https://we.phorge.it/D25636
2024-06-28 14:37:55 +02:00
Andre Klapper
899abf7a2b Redirect back to object after clicking "Log In to Comment" and login
Summary:
`PhabricatorApplicationTransactionCommentView` performs `$uri = id(new PhutilURI('/login/'))->replaceQueryParam('next', (string)$this->getRequestURI())` but the constructor call in `PhabricatorEditEngine` does not set any `RequestURI` so the `Log In to Comment` button at the bottom of an object view does not redirect back to the object URI after login.

Thus pass a `RequestURI` to `PhabricatorApplicationTransactionCommentView` in the constructor call in `PhabricatorEditEngine`.

Closes T15837

Test Plan: As a Phorge admin, set `policy.allow-public` to true and create a Maniphest task with `Public` view policy.  As an anonymous user, visit the task and click the `Log In to Comment` button at the bottom of the single task view, log in, and see that you get redirected to the task.

Reviewers: O1 Blessed Committers, avivey

Reviewed By: O1 Blessed Committers, avivey

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15837

Differential Revision: https://we.phorge.it/D25667
2024-06-27 10:14:43 +02:00
Andre Klapper
c769125e90 Correct rendering of workboard column move feed stories when a single transaction performs moves on multiple boards
Summary:
If a single transaction performs column moves on multiple different boards (which is permitted in the API), the rendering logic in the feed currently fails. Make it render properly.

Same fix as rPa3f4cbd7484b591425e83bbfc7642bccb04d0d57 for `getTitle()` which left out also fixing `getTitleForFeed()`.

Test Plan: Carefully read the if/else logic.

Reviewers: O1 Blessed Committers, avivey

Reviewed By: O1 Blessed Committers, avivey

Subscribers: avivey, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25646
2024-06-27 10:12:18 +02:00
Andre Klapper
290f3d63c5 Do not link "here" but use a descriptive link text
Summary: See https://www.w3.org/TR/WCAG20-TECHS/F84.html and https://www.w3.org/QA/Tips/noClickHere

Test Plan: Click click click.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25702
2024-06-27 09:37:47 +02:00
Valerio Bozzolan
8825a09f67 Fix legacy crash when visiting Motivator backend as anon
Summary:
Now anonymous people can visit this page:

http://phorge.localhost/home/menu/new/custom/motivator/

And you do not see anymore this crash:

    Undefined variable $custom_phid
    phorge	applications/search/engine/PhabricatorProfileMenuEngine.php : 61	PhutilErrorHandler::handleError()
    phorge	applications/search/engine/PhabricatorProfileMenuEngine.php : 916	PhabricatorProfileMenuEngine::getEditModeCustomPHID()
    phorge	applications/search/engine/PhabricatorProfileMenuEngine.php : 269	PhabricatorProfileMenuEngine::buildItemNewContent()
    phorge	applications/home/controller/PhabricatorHomeMenuItemController.php : 39	PhabricatorProfileMenuEngine::buildResponse()
    phorge	aphront/configuration/AphrontApplicationConfiguration.php : 284	PhabricatorHomeMenuItemController::handleRequest()
    phorge	aphront/configuration/AphrontApplicationConfiguration.php : 203	AphrontApplicationConfiguration::processRequest()

Closes T15867

Test Plan:
Visit the mentioned page as logged-in. It still works.

Visit the mentioned page as logged-out. No crash anymore. You are redirected to the login page.

Reviewers: O1 Blessed Committers, aklapper

Reviewed By: O1 Blessed Committers, aklapper

Subscribers: aklapper, tobiaswiese, Matthew, Cigaryno

Maniphest Tasks: T15867

Differential Revision: https://we.phorge.it/D25700
2024-06-26 23:22:51 +02:00
Merula Turdus
f52bc07321 Make the Remarkup Help Page Extensible
Summary:
The Remarkup Help page is currently pointing to a HTML page on we.phorge.it.
Because of this it can not be customized/extended by custom extensions.
This diff allows you to implement a `RemarkupSyntaxDocumentationProvider` interface
to your custom class, which will implement a getDocumentation method.
This getDocumentation should return the custom help text in Remarkup format.
This diff also contains some extra help for the cowsay and figlet interpreters.
The local URLs for the local references are:
* /reference/remarkup/
* /reference/cowsay/
* /reference/figlet/

Closes T15401

Test Plan: Open the Phriction wiki editor and click on the Book (Remarkup Reference) icon in the toolbar and validate URL afterwards

Reviewers: O1 Blessed Committers, avivey

Reviewed By: O1 Blessed Committers, avivey

Subscribers: avivey, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15401

Differential Revision: https://we.phorge.it/D25698
2024-06-26 22:11:44 +02:00
Andre Klapper
5a9cf81ae5 Fix PHP 8.1 "strlen(null)" exceptions handling empty comment metadata in PhabricatorEditEngine
Summary:
`strlen()` was used in Phabricator to check if a generic value is a non-empty string.
This behavior is deprecated since PHP 8.1. Phorge adopts `phutil_nonempty_string()` as a replacement.

Note: this may highlight other absurd input values that might be worth correcting
instead of just ignoring. If phutil_nonempty_string() throws an exception in your
instance, report it to Phorge to evaluate and fix that specific corner case.

```
ERROR 8192: strlen(): Passing null to parameter #1 ($string) of type string is deprecated at [/var/www/html/phorge/phorge/src/applications/transactions/editengine/PhabricatorEditEngine.php:1923]
```

```
ERROR 8192: strlen(): Passing null to parameter #1 ($string) of type string is deprecated at [/var/www/html/phorge/phorge/src/applications/transactions/editengine/PhabricatorEditEngine.php:2023]
```

Closes T15864

Test Plan: See steps in https://we.phorge.it/T15864

Reviewers: O1 Blessed Committers, speck

Reviewed By: O1 Blessed Committers, speck

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15864

Differential Revision: https://we.phorge.it/D25699
2024-06-25 10:13:12 +02:00
Valerio Bozzolan
68762e8204 Drydock and Almanac: add welcome pages
Summary:
Premising that I still consider Almanac, Drydock and Harbormaster as dark magic, and premising that all my knowledge about these components is here:

https://en.wikibooks.org/wiki/Phabricator_Administrator%27s_Handbook/Continuous_integration

(Above guide linked from [[Community Resources]])

Hoping to be useful, I've added some welcome pages, precious to newcomers, with the goal to lower a bit the learning barrier to these tricky components.

## Drydock Blueprints

Screenshot of the new welcome page in {nav Drydock > Blueprints}:

{F2243109}

Since Drydock Blueprints are deeply dependent to {nav Almanac}, we added an extra blue button to see its homepage.

So, you are then 2-clicks away from...

## Almanac Services

Screenshot of the new welcome page in {nav Almanac > Services}:

{F2243110}

Since Almanac Services are deeply dependent to {nav Almanac > Devices}, we added an extra blue button to see them.

So, you are then 1-click away from...

## Almanac Devices

Screenshot of the new welcome page in {nav Almanac > Devices}:

{F2243112}

Since Almanac Devices are deeply dependent to {nav Almanac > Networks}, we added an extra blue button to see them.

So, you are then 1-click away from...

## Almanac Networks

Screenshot of the new welcome page in {nav Almanac Networks}:

{F2243111}

And, that's it.

## Notes

Ref T15018

----

After this change, at least 1 newcomer will love Phorge at the maximum level. and they will never again be able to use the proprietary GitHub.

bwahaha

Test Plan:
Visit all the following pages, forcing the welcome "new user interface" mode:

http://phorge.localhost/drydock/blueprint/?nux=1

http://phorge.localhost/almanac/service/?nux=1

http://phorge.localhost/almanac/device/?nux=1

http://phorge.localhost/almanac/network/?nux=1

Test all action buttons.

Write a comment with "yesyes" or "bwahaha" or "chadyes" in production too.

Reviewers: O1 Blessed Committers, aklapper

Reviewed By: O1 Blessed Committers, aklapper

Subscribers: aklapper, tobiaswiese, Matthew, Cigaryno

Maniphest Tasks: T15018

Differential Revision: https://we.phorge.it/D25675
2024-06-25 09:37:01 +02:00
Andre Klapper
f8b8d8876d Fix call to non-existing newEmptyValue() in PhabricatorDashboardPortalProfileMenuEngine
Summary:
`PhabricatorDashboardPortalProfileMenuEngine` calls `$this->newEmptyValue()` but neither `PhabricatorDashboardPortalProfileMenuEngine` nor its parent `PhabricatorProfileMenuEngine` define a `newEmptyValue()` method.
Thus use existing `newNoContentView()` in parent `PhabricatorProfileMenuEngine` (which according to its string output is supposed to cover this case).

Test Plan:
Go to a Portal with no content. Before applying the patch, Phorge shows the message defined in the parent class `PhabricatorProfileMenuEngine`: `No Content`; `No visible menu items can render content.`
After applying this change, it correctly shows the message defined in `PhabricatorDashboardPortalProfileMenuEngine`: `No Portal Content`; `None of the visible menu items in this portal can render any content.`

Reviewers: O1 Blessed Committers, speck

Reviewed By: O1 Blessed Committers, speck

Subscribers: speck, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25648
2024-06-24 08:56:02 +02:00
Andre Klapper
ed9d212013 Warn in comment field if task is closed as duplicate
Summary:
Display a placeholder text in the text comment field of a Maniphest task if the task status has been set to Duplicate.
This makes it clearer to users (who may have not checked the task status at the top of the page) not to fragment conversations.

Closes T15749

Test Plan:
* Be logged in and go to a task which is closed as a duplicate and see the placeholder text in the field to add a comment.
* Be logged in and go to tasks which are not closed as a duplicate and see no placeholder text in the field to add a comment.
* Go to other places whose code calls a `PhabricatorApplicationTransactionCommentView` constructor and check that it still renders correctly, for example Ponder in http://phorge.localhost/Q1, Slowvote in http://phorge.localhost/V1, Differential in http://phorge.localhost/D1

Reviewers: O1 Blessed Committers, valerio.bozzolan, avivey

Reviewed By: O1 Blessed Committers, valerio.bozzolan, avivey

Subscribers: avivey, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15749

Differential Revision: https://we.phorge.it/D25546
2024-06-23 15:29:17 +02:00
Andre Klapper
eda7a608e5 Run celerity map after rP1fa8c79b1ef86a9edda575b582b18fa24d60ea1f
Summary: I obviously failed to run `./bin/celerity map` one more time before running `arc diff`. Sorry for that.

Test Plan: Run `./bin/celerity map` and see differences.

Reviewers: O1 Blessed Committers, 20after4, chris

Reviewed By: O1 Blessed Committers, 20after4, chris

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25697
2024-06-22 23:20:41 +02:00
Andre Klapper
1fa8c79b1e Update d3 from version 5.9.2 to 6.7.0
Summary:
Update the d3 library to its last 6.x version available on https://github.com/d3/d3/releases

This also requires updating the tooltip event handling of dots in `Chart.js` to avoid an `Uncaught TypeError: d3.event is undefined` per https://observablehq.com/@d3/d3v6-migration-guide#event-management linked from https://github.com/d3/d3/releases/tag/v6.0.0

Closes T15820

Test Plan:
* Enable the Facts application, go to the Reports of a Project with task changes over time, look at charts, hover over data points, read the tooltip - e.g. on http://phorge.localhost/project/reports/1/ or http://phorge.localhost/maniphest/report/burn/
* Check HTML source of above URIs for the `<script type="text/javascript">` loading `d3.min.js` and open the JS file to verify the d3 version number bump.
* Check Console of web browser's developer tools for no errors.

Reviewers: O1 Blessed Committers, speck

Reviewed By: O1 Blessed Committers, speck

Subscribers: speck, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15820

Differential Revision: https://we.phorge.it/D25631
2024-06-22 22:42:37 +02:00
Andre Klapper
ddcdd6eaf2 Fix "Undefined offset: 1" exception in Diviner when @task value in PHPDoc is a single word
Summary:
The PHPDoc in https://we.phorge.it/source/phorge/browse/master/src/infrastructure/storage/lisk/LiskMigrationIterator.php$14 defines `* @task storage`.
That means the value of `$task` in the DivinerAtomController class is the single string `storage` and there is no whitespace to `explode` on and there is no second key in the array to set as `$title`.
Thus only call `explode` when `$task` contains a whitespace.

```
EXCEPTION: (RuntimeException) Undefined array key 1 at [<arcanist>/src/error/PhutilErrorHandler.php:273]
  #0 <#2> PhutilErrorHandler::handleError(integer, string, string, integer) called at [<phorge>/src/applications/diviner/controller/DivinerAtomController.php:450]
```

Closes T15854

Test Plan: Go to https://we.phorge.it/book/contrib/article/database/#primary-keys and click the `LiskMigrationIterator` link pointing to https://we.phorge.it/book/dev/class/LiskMigrationIterator/

Reviewers: O1 Blessed Committers, speck

Reviewed By: O1 Blessed Committers, speck

Subscribers: speck, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15854

Differential Revision: https://we.phorge.it/D25690
2024-06-22 18:10:23 +02:00
Merula Turdus
1f5c54c35a Conduit API: allow phriction.edit to modify viewPolicy and editPolicy
Summary: Closes T15858

Test Plan: See T15858

Reviewers: O1 Blessed Committers, avivey

Reviewed By: O1 Blessed Committers, avivey

Subscribers: avivey, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15858

Differential Revision: https://we.phorge.it/D25693
2024-06-21 18:10:30 +02:00
Aviv Eyal
587530a9bf Add Standard Custom Fields to Item List
Summary:
Allow "Standard" (config-based") custom fields to be displayed in search-results.

Depends on D25548. Ref T15750.

Test Plan: Set `maniphest.custom-field-definitions` to the value of P32, and start playing with custom values on tasks.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: 20after4, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15750

Differential Revision: https://we.phorge.it/D25549
2024-06-21 12:43:18 +03:00
Andre Klapper
5d479556c3 Display same items in mobile menu on User Profile page as on desktop
Summary:
Display same items in mobile menu on User Profile page as on desktop. (The code did not make too much sense anyway here?)

Also remove special but dysfunctional "Calendar" item in mobile view: The resulting URI does not work even if the calendar application is installed. If it ever worked, it should be moved to the default desktop sidebar anyway and not be a mobile-only menu item.

Closes T15224

Test Plan: Open http://phorge.localhost/people/ and http://phorge.localhost/p/username and http://phorge.localhost/people/manage/1/, change screen width to less and more than 920px, check at menu items in left bar (>920px) and right upper corner (<920px).

Reviewers: O1 Blessed Committers, speck

Reviewed By: O1 Blessed Committers, speck

Subscribers: speck, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15224

Differential Revision: https://we.phorge.it/D25687
2024-06-18 20:00:53 +02:00
Merula Turdus
000bccf8e4 Fix PHP 8.1 "strlen(null)" exception in PhabricatorMailSMTPAdapter when sending email
Summary:
`strlen()` was used in Phabricator to check if a generic value is a non-empty string.
This behavior is deprecated since PHP 8.1. Phorge adopts `phutil_nonempty_string()` as a replacement.

```
ERROR 8192: strlen(): Passing null to parameter #1 ($string) of type string is deprecated at [/var/www/htdocs/phorge/phorge/src/applications/metamta/adapter/PhabricatorMailSMTPAdapter.php:65]
```

Closes T15857

Test Plan: Send Welcome email via 'Manage' user screen and Run `./bin/phd log` afterwards to validate email action

Reviewers: O1 Blessed Committers, speck

Reviewed By: O1 Blessed Committers, speck

Subscribers: speck, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15857

Differential Revision: https://we.phorge.it/D25692
2024-06-15 15:14:40 +02:00
Pppery
1bb7422662 Reword joke password reset email message
Summary: Closes T15840

Test Plan: Send an I forgot my password email with serious business mode off and see the updated email

Reviewers: O1 Blessed Committers, valerio.bozzolan, aklapper

Reviewed By: O1 Blessed Committers, valerio.bozzolan, aklapper

Subscribers: sirocyl, aklapper, speck, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15840

Differential Revision: https://we.phorge.it/D25671
2024-06-11 23:59:44 -04:00
Andre Klapper
8f36181073 Fix PHP 8.1 "strlen(null)" exception in Diviner when PHPDoc has no @task block
Summary:
`strlen()` was used in Phabricator to check if a generic value is a non-empty string.
This behavior is deprecated since PHP 8.1. Phorge adopts `phutil_nonempty_string()` as a replacement.

Note: this may highlight other absurd input values that might be worth correcting
instead of just ignoring. If phutil_nonempty_string() throws an exception in your
instance, report it to Phorge to evaluate and fix that specific corner case.

```
ERROR 8192: strlen(): Passing null to parameter #1 ($string) of type string is deprecated at [/var/www/html/phorge/phorge/src/applications/diviner/controller/DivinerAtomController.php:440]
```

Closes T15853

Test Plan: Run `./bin/diviner generate` and visit a Diviner page about a class which has no PHPDoc `@task` block, for example access http://phorge.localhost/diviner/find/?name=PhutilSafeHTML&type=class&jump=1

Reviewers: O1 Blessed Committers, speck

Reviewed By: O1 Blessed Committers, speck

Subscribers: speck, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15853

Differential Revision: https://we.phorge.it/D25689
2024-06-11 22:52:12 +02:00
Merula Turdus
214988fafd T15774: Celerity: javascript minification issue with template literals (backticked strings)
Test Plan:
This archive contains a small demo: {F2142567}
When installed, an application named D25571 appears under "More Applications".
When you start it, you will see 2 messageboxes: one should be a single lined text, the other a multilined text.

Steps:
1) unpack archive in some directory
2) add ext-D25571/src/ path to load-libraries in local.json
3) bin/arc liberate
4) bin/cache purge --all
5) bin/celerity map
6) restart httpd
7) start D25571 application from More Applications

Also:

    arc unit ./src/applications/celerity/__tests__/CelerityResourceTransformerTestCase.php

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: avivey, aklapper, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15774

Differential Revision: https://we.phorge.it/D25571
2024-06-11 17:09:47 +02:00
Andre Klapper
c1d86da5b2 Initialize $cache_key variable in CelerityResourceController.php
Summary:
`$cache_key` is unconditionally called in `$cache->setKey($cache_key, $data)` but is only defined if the previous condition `if ($is_cacheable && $is_locally_cacheable && !$dev_mode)` was true.
Thus initialize the variable to avoid a theoretical exception. (No additional null check is needed as `$cache` gets defined in the same condition.)

Test Plan: Carefully read the code.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25642
2024-06-11 13:54:58 +02:00
Andre Klapper
10cb252163 Fix PHP 8.1 exceptions importing ICS file without attendee names
Summary:
`strlen()` was used in Phabricator to check if a generic value is a non-empty string.
This behavior is deprecated since PHP 8.1. Phorge adopts `phutil_nonempty_string()` as a replacement.

Passing `null` to `preg_match()` is deprecated behavior since PHP 8.1.
Thus only call `preg_match()` when the value is set.

Note: this may highlight other absurd input values that might be worth correcting
instead of just ignoring. If phutil_nonempty_string() throws an exception in your
instance, report it to Phorge to evaluate and fix that specific corner case.

```
ERROR 8192: preg_match(): Passing null to parameter #2 ($subject) of type string is deprecated at [/var/www/html/phorge/phorge/src/applications/calendar/import/PhabricatorCalendarImportEngine.php:238]
```

```
ERROR 8192: strlen(): Passing null to parameter #1 ($string) of type string is deprecated at [/var/www/html/phorge/phorge/src/applications/calendar/import/PhabricatorCalendarImportEngine.php:245]
```

Closes T15852

Test Plan: Import an ICS file which lists attendees without a name but only with an email address into the calendar via http://phorge.localhost/calendar/import/ > "Import Events" > "Import .ics File"

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15852

Differential Revision: https://we.phorge.it/D25686
2024-06-11 00:54:38 +02:00
Andre Klapper
a83ba95445 Only display "Calendar" entry in user profile page menu on mobile when Calendar application is installed
Summary:
https://we.phorge.it/source/phorge/browse/master/src/view/page/PhabricatorStandardPageView.php$908 tries to "find some navigational menu items to create a mobile navigation menu from" but does not succeed too much it seems:
On a user profile page, that very code calls `buildApplicationMenu()` in `PhabricatorPeopleController` which calls `buildSideNavView()` in the same class.
This code unconditionally displays a "Calendar" menu item, no matter if the Calendar application is installed or not. Thus check first to avoid offering a link ending up in a 404.

For the time being this change renders the menu empty (apart from a link to the page we are already on) but that's more acceptable than all those tears shed by devastated users after clicking the Calendar menu item while being excited and full of anticipation, just to end up on a 404 page instead.

Related: T15224

Test Plan:
* As an admin, install/uninstall Calendar prototype application via http://phorge.localhost/applications/view/PhabricatorCalendarApplication/
* Go to a user profile page like http://phorge.localhost/username/ on a screen with 920px or less width and click the hamburger menu item in the upper right corner. Check/click the "Calendar" entry.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25683
2024-06-08 10:02:07 +02:00
Andre Klapper
d2bca2f32d Fix call to non-existing getTransactionCommentForSave() in PhabricatorInlineComment
Summary:
rPb48a22bf50a32895566e9aa66c1d7aff87a492b8 moved the call `$this->getTransactionCommentForSave()->save()` from within `PhabricatorAuditInlineComment` to the new (parent) class `PhabricatorInlineComment.php`, however the later does not define this function.

As the two child classes which extend `PhabricatorInlineComment` both implement `getTransactionCommentForSave()`, declare an abstract function in their parent class.

Test Plan: Carefully read the code.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25644
2024-06-07 19:28:31 +02:00
Andre Klapper
17b568b94f Fix PHP 8.1 "strlen(null)" exceptions editing existing Dashboard query panel with no query defined
Summary:
`strlen()` was used in Phabricator to check if a generic value is a non-empty string.
This behavior is deprecated since PHP 8.1. Phorge adopts `phutil_nonempty_string()` as a replacement.

Note: this may highlight other absurd input values that might be worth correcting
instead of just ignoring. If phutil_nonempty_string() throws an exception in your
instance, report it to Phorge to evaluate and fix that specific corner case.

```
ERROR 8192: strlen(): Passing null to parameter #1 ($string) of type string is deprecated at [/var/www/html/phorge/phorge/src/applications/dashboard/editfield/PhabricatorDashboardQueryPanelQueryEditField.php:41]
```

```
ERROR 8192: strlen(): Passing null to parameter #1 ($string) of type string is deprecated at [/var/www/html/phorge/phorge/src/applications/dashboard/editfield/PhabricatorDashboardQueryPanelQueryEditField.php:59]
```

Closes T15791

Test Plan: Successfully create a Dashboard query panel searching for "Diffusion Raw Commits" (which has no Query defined per T15790) and try to edit it afterwards under PHP 8.1 or later.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15791

Differential Revision: https://we.phorge.it/D25596
2024-06-07 13:32:33 +02:00
Andre Klapper
3349c3be17 Fix call to non-existing newWorkCommands() in NuanceItemType
Summary:
rPe1b8532e2478395bd1f36baecb998adeef5bea3d introduced an implementation of `newWorkCommands()` in the child class `NuanceFormItemType` which is called in parent `NuanceItemType::buildWorkCommands()` without being defined in that parent class.
Thus define `newWorkCommands()` as an abstract class in parent class `NuanceItemType` and add an implementation returning null in the other child class `NuanceGitHubEventItemType` to make static code analyzers happy.

Test Plan: Carefully read the code.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25655
2024-06-07 13:30:49 +02:00
Andre Klapper
cb5a72b5e6 Fix call to non-existing getDisplayName() in DiffusionRepositoryClusterEngine.php
Summary:
`DiffusionRepositoryClusterEngine` calls `$this->getDisplayName()` which is not defined in this class or its parent class.
Looking at the variable use in the companying error message, getting the name of the `$repository` was intended instead.

Test Plan: Carefully read the code and check available methods in its parent classes.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25653
2024-06-07 13:30:15 +02:00
Pppery
d8cd959622 Fix a leftover misspelled "Phabricator" reference
Summary: Closes T15850

Test Plan: Read the code and see that there isn't a typo anymore

Reviewers: O1 Blessed Committers, avivey

Reviewed By: O1 Blessed Committers, avivey

Subscribers: avivey, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15850

Differential Revision: https://we.phorge.it/D25682
2024-06-06 10:36:51 -04:00
Andre Klapper
cb934602c2 Fix PHP 8.1 "strlen(null)" exception creating a Portal
Summary:
`strlen()` was used in Phabricator to check if a generic value is a non-empty string.
This behavior is deprecated since PHP 8.1. Phorge adopts `phutil_nonempty_string()` as a replacement.

Note: this may highlight other absurd input values that might be worth correcting
instead of just ignoring. If phutil_nonempty_string() throws an exception in your
instance, report it to Phorge to evaluate and fix that specific corner case.

```
ERROR 8192: strlen(): Passing null to parameter #1 ($string) of type string is deprecated at [/var/www/html/phorge/phorge/src/applications/dashboard/menuitem/PhabricatorDashboardPortalMenuItem.php:34]
```

Closes T15847

Test Plan: Go to `/portal/edit/form/default/`, set a name and click `Create Portal`.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15847

Differential Revision: https://we.phorge.it/D25681
2024-06-05 17:18:17 +02:00
Andre Klapper
5f565e2ab6 Correct PHPDoc return value for loadObject() in PhabricatorObjectMailReceiver
Summary:
The PHPDoc for the abstract function `loadObject()` defines `@return void`, however the function's return value is used twice in `PhabricatorObjectMailReceiver` and all 17 `loadObject()` implementations in child classes return an object provided by some type of `PhabricatorCursorPagedPolicyAwareQuery`.
Thus correct the PHPDoc to make static code analyzers happier.

Test Plan: Carefully read and compare the code.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25654
2024-06-05 17:17:35 +02:00
Andre Klapper
98884f758a Fix call to non-existing newIcons() in PhabricatorIconSet
Summary:
`PhabricatorIconSet::getIcons()` calls `$this->newIcons()` which is undefined.

As all six child classes which extend `PhabricatorIconSet` implement `newIcons()`, declare an abstract function in their parent class.

Test Plan: Carefully read the code.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25647
2024-06-05 17:15:45 +02:00
Andre Klapper
a8af0c6e51 Remove unused variable from HeraldEngine
Summary: `$activeRule` is not used anywhere.

Test Plan: Grep the code.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25679
2024-06-05 10:30:05 +02:00
Pppery
8dd90edd3a Remove broken link to PhutilHighIntensityIntervalDaemon docs
Summary: Closes T15845

Test Plan: Read the code - this changes nothing other than comments

Reviewers: O1 Blessed Committers, aklapper

Reviewed By: O1 Blessed Committers, aklapper

Subscribers: aklapper, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15845

Differential Revision: https://we.phorge.it/D25680
2024-06-04 17:31:38 -04:00
Valerio Bozzolan
5a40739451 Show login page if a search token requires a valid viewer
Summary:
A saved query can have tokens that require a valid current viewer. For example, this token:

    viewer()

Before this change, visiting such saved queries would cause this:

    This datasource ("PhabricatorPeopleUserFunctionDatasource") can not evaluate the function "viewer(...)".

After this change, instead of that, you are just redirected to the login page,
so, after you do the login, you are redirected back to that saved query and it works.

This fix was boosted during the Wikimedia Hackaton (wmhack) in Tallinn. Thanks Tallinn!

https://phabricator.wikimedia.org/T356384

Fixes T15704

Test Plan:
Go to Maniphest > Advanced Search > Assigned to > "Viewer". It still works.

Visit the same page in a new anonymous tab: now it redirects to the login page. You login,
and that page works again.

Do the same specific test for all these cases:

- Maniphest
    - Assigned To: viewer
    - Tags: current Viewer's Projects
    - Authors: viewer
    - Subscribers: ...
    - Closed by
- Badges
    - Subscribers
- Differential
    - Responsible Users
    - Authors
    - Reviewers
    - Subscribers
    - Tags
- Dashboards
    - Authored By
    - Tags
- Dashboard Panels
    - Authored By
- Dashboard Portals
    - Tags
- Calendar:
    - Hosts
    - Invited
    - Subscribers
    - Tags
- Countdown
    - Authors
- Diffusion
    - Tags
    - Subscribers
    - Tags
- Diffusion commit
    - Responsible Users
    - Authors
    - Subscribers
    - Tags
- Diffusion identities
    - Matching Users
- Feed
    - Include Users
    - Include Projects (interestingly it does not support "current Viewer's Projects")
- Files
    - Authors
- Herald
    - Authors
    - Subscribers
- Legalpad
    - Subscribers
- Nuance (none of their entity support search by token)
- Passphrase
    - Subscribers
- Paste
    - Authors
    - Subscribers
    - Tags
- Phame
    - Subscribers
    - Tags
- Pholio
    - Authors
    - Subscribers
    - Tags
- Phrequent
    - Users (interestingly it does not support "viewer")
- Ponder
    - Authors
    - Answered By
- Projects
    - Members
    - Watchers
- Transactions - /feed/transactions/
    - Authors
- General search at /search/query/
    - Authors
    - Owners
    - Subscribers
    - Tags

All the above fields were tested in a clean search, one at a time, both logged-in and logged-out, with the function "viewer" or anything similar like "current Viewer's Projects":

For all cases, the login page appeared successfully where needed, instead of a crash.

Reviewers: O1 Blessed Committers, aklapper

Reviewed By: O1 Blessed Committers, aklapper

Subscribers: aklapper, avivey, tobiaswiese, Matthew, Cigaryno

Maniphest Tasks: T15704

Differential Revision: https://we.phorge.it/D25621
2024-06-04 16:10:50 +02:00
Valerio Bozzolan
89dcbe125c Panels list: fix missing welcome page
Summary:
The method getNewUserBody() was never designed for a list controller.
The method was just orphan. Now, instead, it's non-orphan, and it works
as expected.

This bug was highlighted by Andre Klapper, since their linter was screaming
about inconsistences in the current nonsense usage of getNewUserBody():

D25649

The code was just moved from the list controller, to the search engine.

- PhabricatorDashboardPanelListController (from)
- PhabricatorDashboardPanelSearchEngine (to)

Bonus point:

Adjusted the icon and the title to talk about "Panels" and not "Dashboards".

Added also some inline documentation with an hint about `?nux=1`.
So now we can easily remember how to test this kind of things.

Closes T15844

Test Plan:
In both these pages, you finally see a welcome message, not just in Maniphest:

- http://phorge.localhost/dashboard/panel/?nux=1
- http://phorge.localhost/maniphest/?nux=1

In both these pages, if you have no elements, you finally see a welcome message,
and not just in Maniphest:

- http://phorge.localhost/dashboard/panel/
- http://phorge.localhost/maniphest/

Check that the welcome message helps you in creating a new Panel, and that
talks about Panels, and that have the lovely icon of a Panel.

Reviewers: aklapper, O1 Blessed Committers

Reviewed By: aklapper, O1 Blessed Committers

Subscribers: tobiaswiese, Matthew, Cigaryno

Maniphest Tasks: T15844

Differential Revision: https://we.phorge.it/D25674
2024-06-04 01:45:17 +02:00
Andre Klapper
40720ab83d Expose initially set values of Maniphest custom date field and point values when removing them
Summary:
After removing or resetting a custom date field value or points value initially set at task creation there is no way to find and restore the previous value.
As Phorge adds a transaction entry anyway, include the previous value in the transaction title.
This makes it easier to revert an accidental removal of such data and is also more aligned with the behavior of other custom field types.

Closes T15846

Test Plan:
* Define a custom date field in Maniphest via http://phorge.localhost/config/edit/maniphest.custom-field-definitions/ and also enable http://phorge.localhost/config/edit/maniphest.points/
* Create a task with those fields set to non-custom values via a create task form which allows editing/changing these values
* Edit the task and remove/reset the values of these custom fields
* Look at the task and its transaction entries

Reviewers: O1 Blessed Committers, avivey

Reviewed By: O1 Blessed Committers, avivey

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15846

Differential Revision: https://we.phorge.it/D25678
2024-06-03 15:43:27 +02:00
Andre Klapper
1500a57090 Remove unused method shouldCopyWhenCreatingSimilarTask()
Summary:
Nothing in the codebase calls or reads this function.

If it was ever used in some implementation of a custom field, then it was likely in context of the `Similar Task` functionality removed in 52f7446eea.

Test Plan: Grep the codebase.

Reviewers: O1 Blessed Committers, avivey

Reviewed By: O1 Blessed Committers, avivey

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Differential Revision: https://we.phorge.it/D25677
2024-06-03 15:39:23 +02:00
Andre Klapper
d9e543ba97 PHPMailer: Set defaults for required parameters followed by optional parameters in Authorise() method signature
Summary:
Required parameters $password and $username follow the optional parameter $tval.
This is deprecated since PHP 8.0 per https://www.php.net/manual/en/migration80.deprecated.php
Define defaults for those required parameters to fix the issue - https://github.com/PHPMailer/PHPMailer/blob/master/src/POP3.php#L199 seems to also have survived so far without complaints by PHP 8 users (and PHPStan also does not complain anymore after this change).

Closes T15834

Test Plan: Carefully read the code.

Reviewers: O1 Blessed Committers, valerio.bozzolan

Reviewed By: O1 Blessed Committers, valerio.bozzolan

Subscribers: tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15834

Differential Revision: https://we.phorge.it/D25660
2024-05-30 15:40:35 +02:00
Andre Klapper
4bf5c452eb Improve error passing task IDs as URL parameter in invalid format
Summary:
Maniphest expects the values of the `ids` URL parameter to be integers. Example: http://phorge.localhost/maniphest/?ids=1,2,3,4 to show a list of tasks with those IDs.
When passing monograms instead (`T` prefix, like `T123` instead of `123`), a cryptic message `Expected a numeric scalar or null for %Ld conversion` is shown.

Thus check if `$this->taskIDs` consists of integers only; if not throw a `PhutilSearchQueryCompilerSyntaxException` with an explanatory error message.

Closes T15838

Test Plan: Go to http://phorge.localhost/maniphest/?ids=T1,T2,T3,T4 before and after applying the patch.

Reviewers: O1 Blessed Committers, avivey

Reviewed By: O1 Blessed Committers, avivey

Subscribers: avivey, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno

Maniphest Tasks: T15838

Differential Revision: https://we.phorge.it/D25669
2024-05-29 12:11:10 +02:00