Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/paste/xaction/PhabricatorPasteContentTransaction.php
12242 views
1
<?php
2
3
final 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
}
139
140