@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
1<?php
2
3abstract class DifferentialChangesetTestRenderer
4 extends DifferentialChangesetRenderer {
5
6 protected function renderChangeTypeHeader($force) {
7 $changeset = $this->getChangeset();
8
9 $old = nonempty($changeset->getOldFile(), '-');
10 $current = nonempty($changeset->getFilename(), '-');
11 $away = nonempty(implode(', ', $changeset->getAwayPaths()), '-');
12
13 $ctype = $changeset->getChangeType();
14 $ftype = $changeset->getFileType();
15 $force = ($force ? '(forced)' : '(unforced)');
16
17 return "CTYPE {$ctype} {$ftype} {$force}\n".
18 "{$old}\n".
19 "{$current}\n".
20 "{$away}\n";
21 }
22
23 protected function renderUndershieldHeader() {
24 return null;
25 }
26
27 public function renderShield($message, $force = 'default') {
28 return "SHIELD ({$force}) {$message}\n";
29 }
30
31 protected function renderPropertyChangeHeader() {
32 $changeset = $this->getChangeset();
33 list($old, $new) = $this->getChangesetProperties($changeset);
34
35 foreach (array_keys($old) as $key) {
36 if ($old[$key] === idx($new, $key)) {
37 unset($old[$key]);
38 unset($new[$key]);
39 }
40 }
41
42 if (!$old && !$new) {
43 return null;
44 }
45
46 $props = '';
47 foreach ($old as $key => $value) {
48 $props .= "P - {$key} {$value}~\n";
49 }
50 foreach ($new as $key => $value) {
51 $props .= "P + {$key} {$value}~\n";
52 }
53
54 return "PROPERTIES\n".$props;
55 }
56
57 public function renderTextChange(
58 $range_start,
59 $range_len,
60 $rows) {
61
62 $out = array();
63
64 $any_old = false;
65 $any_new = false;
66 $primitives = $this->buildPrimitives($range_start, $range_len);
67 foreach ($primitives as $p) {
68 $type = $p['type'];
69 switch ($type) {
70 case 'old':
71 case 'new':
72 if ($type == 'old') {
73 $any_old = true;
74 }
75 if ($type == 'new') {
76 $any_new = true;
77 }
78 $num = nonempty($p['line'], '-');
79 $render = (string)$p['render'];
80 $htype = nonempty($p['htype'], '.');
81
82 // TODO: This should probably happen earlier, whenever we deal with
83 // \r and \t normalization?
84 $render = str_replace(
85 array(
86 "\r",
87 "\n",
88 ),
89 array(
90 '\\r',
91 '\\n',
92 ),
93 $render);
94
95 $render = str_replace(
96 array(
97 '<span class="bright">',
98 '</span>',
99 '<span class="depth-out">',
100 '<span class="depth-in">',
101 ),
102 array(
103 '{(',
104 ')}',
105 '{<',
106 '{>',
107 ),
108 $render);
109
110 $render = html_entity_decode($render, ENT_QUOTES);
111
112 $t = ($type == 'old') ? 'O' : 'N';
113
114 $out[] = "{$t} {$num} {$htype} {$render}~";
115 break;
116 case 'no-context':
117 $out[] = 'X <MISSING-CONTEXT>';
118 break;
119 default:
120 $out[] = $type;
121 break;
122 }
123 }
124
125 if (!$any_old) {
126 $out[] = 'O X <EMPTY>';
127 }
128
129 if (!$any_new) {
130 $out[] = 'N X <EMPTY>';
131 }
132
133 $out = implode("\n", $out)."\n";
134 return phutil_safe_html($out);
135 }
136
137}