From c194cd353b3673dc63d11b0767cec84850b7f806 Mon Sep 17 00:00:00 2001
From: Nicolas Dandrimont <olasd@softwareheritage.org>
Date: Tue, 14 Apr 2020 10:57:08 +0200
Subject: [PATCH 3/3] Add a parser for a custom "Related to" keyword in the
 body of Diffs

This allows us to link between tasks and diffs automatically, without changing
the status of tasks.
---
 src/__phutil_library_map__.php                |  2 ++
 .../editor/DifferentialTransactionEditor.php  |  9 ++++++
 ...DifferentialCustomFieldRelatedToParser.php | 31 +++++++++++++++++++
 3 files changed, 42 insertions(+)
 create mode 100644 src/applications/differential/parser/DifferentialCustomFieldRelatedToParser.php

--- a/phabricator/src/__phutil_library_map__.php
+++ b/phabricator/src/__phutil_library_map__.php
@@ -513,6 +513,7 @@
     'DifferentialCustomFieldDependsOnParser' => 'applications/differential/parser/DifferentialCustomFieldDependsOnParser.php',
     'DifferentialCustomFieldDependsOnParserTestCase' => 'applications/differential/parser/__tests__/DifferentialCustomFieldDependsOnParserTestCase.php',
     'DifferentialCustomFieldNumericIndex' => 'applications/differential/storage/DifferentialCustomFieldNumericIndex.php',
+    'DifferentialCustomFieldRelatedToParser' => 'applications/differential/parser/DifferentialCustomFieldRelatedToParser.php',
     'DifferentialCustomFieldRevertsParser' => 'applications/differential/parser/DifferentialCustomFieldRevertsParser.php',
     'DifferentialCustomFieldRevertsParserTestCase' => 'applications/differential/parser/__tests__/DifferentialCustomFieldRevertsParserTestCase.php',
     'DifferentialCustomFieldStorage' => 'applications/differential/storage/DifferentialCustomFieldStorage.php',
@@ -6512,6 +6513,7 @@
     'DifferentialCustomFieldDependsOnParser' => 'PhabricatorCustomFieldMonogramParser',
     'DifferentialCustomFieldDependsOnParserTestCase' => 'PhabricatorTestCase',
     'DifferentialCustomFieldNumericIndex' => 'PhabricatorCustomFieldNumericIndexStorage',
+    'DifferentialCustomFieldRelatedToParser' => 'PhabricatorCustomFieldMonogramParser',
     'DifferentialCustomFieldRevertsParser' => 'PhabricatorCustomFieldMonogramParser',
     'DifferentialCustomFieldRevertsParserTestCase' => 'PhabricatorTestCase',
     'DifferentialCustomFieldStorage' => 'PhabricatorCustomFieldStorage',
--- a/phabricator/src/applications/differential/editor/DifferentialTransactionEditor.php
+++ b/phabricator/src/applications/differential/editor/DifferentialTransactionEditor.php
@@ -834,6 +834,15 @@
       }
     }
 
+    $related_refs = id(new DifferentialCustomFieldRelatedToParser())
+                  ->parseCorpus($content_block);
+    foreach ($related_refs as $match) {
+      foreach ($match['monograms'] as $monogram) {
+        $task_id = (int)trim($monogram, 'tT');
+        $task_map[$task_id] = true;
+      }
+    }
+
     $rev_map = array();
     $rev_refs = id(new DifferentialCustomFieldDependsOnParser())
       ->parseCorpus($content_block);
--- /dev/null
+++ b/phabricator/src/applications/differential/parser/DifferentialCustomFieldRelatedToParser.php
@@ -0,0 +1,31 @@
+<?php
+
+final class DifferentialCustomFieldRelatedToParser
+  extends PhabricatorCustomFieldMonogramParser {
+
+  protected function getPrefixes() {
+    return array(
+      'related to',
+    );
+  }
+
+  protected function getInfixes() {
+    return array(
+      'task',
+      'tasks',
+      'issue',
+      'issues',
+      'bug',
+      'bugs',
+    );
+  }
+
+  protected function getSuffixes() {
+    return array();
+  }
+
+  protected function getMonogramPattern() {
+    return '[Tt]\d+';
+  }
+
+}
