@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
3final class PhabricatorPasteContentTransaction
4 extends PhabricatorPasteTransactionType {
5
6 const TRANSACTIONTYPE = 'paste.create';
7
8 private $filePHID;
9
10 public function generateOldValue($object) {
11 return $object->getFilePHID();
12 }
13
14 public function applyInternalEffects($object, $value) {
15 $object->setFilePHID($value);
16 }
17
18 public function extractFilePHIDs($object, $value) {
19 $file_phid = $this->getFilePHID($object, $value);
20 return array($file_phid);
21 }
22
23 public function validateTransactions($object, array $xactions) {
24 if ($object->getFilePHID() || $xactions) {
25 return array();
26 }
27
28 $error = $this->newError(
29 pht('Required'),
30 pht('You must provide content to create a paste.'));
31 $error->setIsMissingFieldError(true);
32
33 return array($error);
34 }
35
36 public function generateNewValue($object, $value) {
37 return $this->getFilePHID($object, $value);
38 }
39
40 private function getFilePHID($object, $value) {
41 if ($this->filePHID === null) {
42 $this->filePHID = $this->newFilePHID($object, $value);
43 }
44
45 return $this->filePHID;
46 }
47
48 private function newFilePHID($object, $value) {
49 // If this transaction does not really change the paste content, return
50 // the current file PHID so this transaction no-ops.
51 $old_content = $object->getRawContent();
52 if ($value === $old_content) {
53 $file_phid = $object->getFilePHID();
54 if ($file_phid) {
55 return $file_phid;
56 }
57 }
58
59 $editor = $this->getEditor();
60 $actor = $editor->getActor();
61
62 $file = $this->newFileForPaste($actor, $value);
63
64 return $file->getPHID();
65 }
66
67 private function newFileForPaste(PhabricatorUser $actor, $data) {
68 $editor = $this->getEditor();
69
70 $file_name = $editor->getNewPasteTitle();
71 if (!strlen($file_name)) {
72 $file_name = 'raw-paste-data.txt';
73 }
74
75 return PhabricatorFile::newFromFileData(
76 $data,
77 array(
78 'name' => $file_name,
79 'mime-type' => 'text/plain; charset=utf-8',
80 'authorPHID' => $actor->getPHID(),
81 'viewPolicy' => PhabricatorPolicies::POLICY_NOONE,
82 ));
83 }
84
85 public function getIcon() {
86 return 'fa-plus';
87 }
88
89 public function getTitle() {
90 return pht(
91 '%s edited the content of this paste.',
92 $this->renderAuthor());
93 }
94
95 public function getTitleForFeed() {
96 return pht(
97 '%s edited %s.',
98 $this->renderAuthor(),
99 $this->renderObject());
100 }
101
102 public function hasChangeDetailView() {
103 return true;
104 }
105
106 public function getMailDiffSectionHeader() {
107 return pht('CHANGES TO PASTE CONTENT');
108 }
109
110 public function newChangeDetailView() {
111 $viewer = $this->getViewer();
112
113 $old = $this->getOldValue();
114 $new = $this->getNewValue();
115
116 $files = id(new PhabricatorFileQuery())
117 ->setViewer($viewer)
118 ->withPHIDs(array($old, $new))
119 ->execute();
120 $files = mpull($files, null, 'getPHID');
121
122 $old_text = '';
123 if (idx($files, $old)) {
124 $old_text = $files[$old]->loadFileData();
125 }
126
127 $new_text = '';
128 if (idx($files, $new)) {
129 $new_text = $files[$new]->loadFileData();
130 }
131
132 return id(new PhabricatorApplicationTransactionTextDiffDetailView())
133 ->setViewer($viewer)
134 ->setOldText($old_text)
135 ->setNewText($new_text);
136 }
137
138}