Page MenuHomePhabricator

Stabilize sort order for Remarkup block rules
ClosedPublic

Authored by epriestley on Apr 23 2017, 12:50 PM.
Tags
None
Referenced Files
F14080345: D17771.diff
Fri, Nov 22, 12:55 PM
Unknown Object (File)
Tue, Nov 19, 5:49 AM
Unknown Object (File)
Fri, Nov 15, 5:02 AM
Unknown Object (File)
Mon, Nov 11, 12:22 PM
Unknown Object (File)
Thu, Nov 7, 11:03 AM
Unknown Object (File)
Oct 19 2024, 2:07 PM
Unknown Object (File)
Oct 18 2024, 10:42 PM
Unknown Object (File)
Oct 17 2024, 3:27 AM
Subscribers
None

Details

Summary

Fixes T10929. Currently, the ordering of Remarkup block rules is ambiguous (multiple rules may have the same priority number) and depends on sort stability (if elements with the same value have their ordered retained by the sort).

Sort stability changed between PHP5 and PHP7, so the result of functions like asort() changed too if some of the values are the same.

Currently, some tests fail and some edge-case beahviors differ under PHP7 because of this. Particularly, the Remarkup literal test case fails under PHP 7.1 locally, because <space><space>%%% gets interpreted as a code block instead of a literal block.

To fix this:

  • Use msortv() with PhutilSortVector, which is a stable sort.
  • Sort on <priority, ClassName>. The class name is guaranteed unique so this ordering is unambiguous.
Test Plan

Previously, a literal block test case failed on PHP7.1 locally:

Screen Shot 2017-04-23 at 4.55.29 AM.png (214×1 px, 47 KB)

This test now passes.

Diff Detail

Repository
rPHU libphutil
Branch
literal1
Lint
Lint Passed
Unit
Tests Passed
Build Status
Buildable 16663
Build 22222: Run Core Tests
Build 22221: arc lint + arc unit

Event Timeline

This revision is now accepted and ready to land.Apr 23 2017, 5:39 PM
This revision was automatically updated to reflect the committed changes.