Skip to content

Commit a8be733

Browse files
author
epriestley
committed
Fix an issue with tail parsing in object embeds in remarkup
Summary: Fixes T6619. In `{Xnnn key=value, key=value}` we did not require a separator between the object and the key-value part. This could lead to `{rX11aaa}` being parsed as `{rX11 aaa}`, i.e. a reference to `rX11` with parameter `aaa` set. Instead, require a space or comma before we'll parse key-value parts of embedded objects. Test Plan: Added and executed unit tests. {F242002} Reviewers: chad, btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T6619 Differential Revision: https://secure.phabricator.com/D10915
1 parent 1716861 commit a8be733

File tree

3 files changed

+63
-1
lines changed

3 files changed

+63
-1
lines changed

src/__phutil_library_map__.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -454,6 +454,7 @@
454454
'DiffusionCommitQuery' => 'applications/diffusion/query/DiffusionCommitQuery.php',
455455
'DiffusionCommitRef' => 'applications/diffusion/data/DiffusionCommitRef.php',
456456
'DiffusionCommitRemarkupRule' => 'applications/diffusion/remarkup/DiffusionCommitRemarkupRule.php',
457+
'DiffusionCommitRemarkupRuleTestCase' => 'applications/diffusion/remarkup/__tests__/DiffusionCommitRemarkupRuleTestCase.php',
457458
'DiffusionCommitTagsController' => 'applications/diffusion/controller/DiffusionCommitTagsController.php',
458459
'DiffusionConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionConduitAPIMethod.php',
459460
'DiffusionController' => 'applications/diffusion/controller/DiffusionController.php',
@@ -3458,6 +3459,7 @@
34583459
'DiffusionCommitQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
34593460
'DiffusionCommitRef' => 'Phobject',
34603461
'DiffusionCommitRemarkupRule' => 'PhabricatorObjectRemarkupRule',
3462+
'DiffusionCommitRemarkupRuleTestCase' => 'PhabricatorTestCase',
34613463
'DiffusionCommitTagsController' => 'DiffusionController',
34623464
'DiffusionConduitAPIMethod' => 'ConduitAPIMethod',
34633465
'DiffusionController' => 'PhabricatorController',
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
<?php
2+
3+
final class DiffusionCommitRemarkupRuleTestCase extends PhabricatorTestCase {
4+
5+
public function testProjectObjectRemarkup() {
6+
$cases = array(
7+
'{rP12f3f6d3a9ef9c7731051815846810cb3c4cd248}' => array(
8+
'embed' => array(
9+
array(
10+
'offset' => 1,
11+
'id' => 'rP12f3f6d3a9ef9c7731051815846810cb3c4cd248',
12+
),
13+
),
14+
'ref' => array(
15+
array(
16+
'offset' => 1,
17+
'id' => 'rP12f3f6d3a9ef9c7731051815846810cb3c4cd248',
18+
),
19+
),
20+
),
21+
'{rP1234, key=value}' => array(
22+
'embed' => array(
23+
array(
24+
'offset' => 1,
25+
'id' => 'rP1234',
26+
'tail' => ', key=value',
27+
),
28+
),
29+
'ref' => array(
30+
array(
31+
'offset' => 1,
32+
'id' => 'rP1234',
33+
),
34+
),
35+
),
36+
'{rP1234 key=value}' => array(
37+
'embed' => array(
38+
array(
39+
'offset' => 1,
40+
'id' => 'rP1234',
41+
'tail' => ' key=value',
42+
),
43+
),
44+
'ref' => array(
45+
array(
46+
'offset' => 1,
47+
'id' => 'rP1234',
48+
),
49+
),
50+
),
51+
);
52+
53+
foreach ($cases as $input => $expect) {
54+
$rule = new DiffusionCommitRemarkupRule();
55+
$matches = $rule->extractReferences($input);
56+
$this->assertEqual($expect, $matches, $input);
57+
}
58+
}
59+
60+
}

src/infrastructure/markup/rule/PhabricatorObjectRemarkupRule.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ private function getObjectEmbedPattern() {
166166
$prefix = preg_quote($prefix);
167167
$id = $this->getObjectIDPattern();
168168

169-
return '(\B{'.$prefix.'('.$id.')((?:[^}\\\\]|\\\\.)*)}\B)u';
169+
return '(\B{'.$prefix.'('.$id.')([,\s](?:[^}\\\\]|\\\\.)*)?}\B)u';
170170
}
171171

172172
private function getObjectReferencePattern() {

0 commit comments

Comments
 (0)