mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-01 03:02:43 +01:00
b20884a842
Summary: Ref T5179. Ref T4045. Ref T832. We can now write non-utf8 hunks into the database, so try to do more reasonable things with them in the UI. Test Plan: (See screenshots...) Reviewers: btrahan Reviewed By: btrahan Subscribers: epriestley Maniphest Tasks: T832, T4045, T5179 Differential Revision: https://secure.phabricator.com/D9294
109 lines
2.6 KiB
PHP
109 lines
2.6 KiB
PHP
<?php
|
|
|
|
final class DifferentialHunkModern extends DifferentialHunk {
|
|
|
|
const DATATYPE_TEXT = 'text';
|
|
const DATATYPE_FILE = 'file';
|
|
|
|
const DATAFORMAT_RAW = 'byte';
|
|
const DATAFORMAT_DEFLATED = 'gzde';
|
|
|
|
protected $dataType;
|
|
protected $dataEncoding;
|
|
protected $dataFormat;
|
|
protected $data;
|
|
|
|
private $rawData;
|
|
private $forcedEncoding;
|
|
|
|
public function getTableName() {
|
|
return 'differential_hunk_modern';
|
|
}
|
|
|
|
public function getConfiguration() {
|
|
return array(
|
|
self::CONFIG_BINARY => array(
|
|
'data' => true,
|
|
),
|
|
) + parent::getConfiguration();
|
|
}
|
|
|
|
public function setChanges($text) {
|
|
$this->rawData = $text;
|
|
|
|
$this->dataEncoding = $this->detectEncodingForStorage($text);
|
|
$this->dataType = self::DATATYPE_TEXT;
|
|
$this->dataFormat = self::DATAFORMAT_RAW;
|
|
$this->data = $text;
|
|
|
|
return $this;
|
|
}
|
|
|
|
public function getChanges() {
|
|
return $this->getUTF8StringFromStorage(
|
|
$this->getRawData(),
|
|
nonempty($this->forcedEncoding, $this->getDataEncoding()));
|
|
}
|
|
|
|
public function forceEncoding($encoding) {
|
|
$this->forcedEncoding = $encoding;
|
|
return $this;
|
|
}
|
|
|
|
public function save() {
|
|
|
|
$type = $this->getDataType();
|
|
$format = $this->getDataFormat();
|
|
|
|
// Before saving the data, attempt to compress it.
|
|
if ($type == self::DATATYPE_TEXT) {
|
|
if ($format == self::DATAFORMAT_RAW) {
|
|
$data = $this->getData();
|
|
$deflated = PhabricatorCaches::maybeDeflateData($data);
|
|
if ($deflated !== null) {
|
|
$this->data = $deflated;
|
|
$this->dataFormat = self::DATAFORMAT_DEFLATED;
|
|
}
|
|
}
|
|
}
|
|
|
|
return parent::save();
|
|
}
|
|
|
|
private function getRawData() {
|
|
if ($this->rawData === null) {
|
|
$type = $this->getDataType();
|
|
$data = $this->getData();
|
|
|
|
switch ($type) {
|
|
case self::DATATYPE_TEXT:
|
|
// In this storage type, the changes are stored on the object.
|
|
$data = $data;
|
|
break;
|
|
case self::DATATYPE_FILE:
|
|
default:
|
|
throw new Exception(
|
|
pht('Hunk has unsupported data type "%s"!', $type));
|
|
}
|
|
|
|
$format = $this->getDataFormat();
|
|
switch ($format) {
|
|
case self::DATAFORMAT_RAW:
|
|
// In this format, the changes are stored as-is.
|
|
$data = $data;
|
|
break;
|
|
case self::DATAFORMAT_DEFLATED:
|
|
$data = PhabricatorCaches::inflateData($data);
|
|
break;
|
|
default:
|
|
throw new Exception(
|
|
pht('Hunk has unsupported data encoding "%s"!', $type));
|
|
}
|
|
|
|
$this->rawData = $data;
|
|
}
|
|
|
|
return $this->rawData;
|
|
}
|
|
|
|
}
|