Changeset View
Changeset View
Standalone View
Standalone View
src/workingcopy/ArcanistWorkingCopyPath.php
- This file was added.
| <?php | |||||
| final class ArcanistWorkingCopyPath | |||||
| extends Phobject { | |||||
| private $path; | |||||
| private $mode; | |||||
| private $data; | |||||
| private $binary; | |||||
| private $dataAsLines; | |||||
| private $charMap; | |||||
| private $lineMap; | |||||
| public function setPath($path) { | |||||
| $this->path = $path; | |||||
| return $this; | |||||
| } | |||||
| public function getPath() { | |||||
| return $this->path; | |||||
| } | |||||
| public function setData($data) { | |||||
| $this->data = $data; | |||||
| return $this; | |||||
| } | |||||
| public function getData() { | |||||
| if ($this->data === null) { | |||||
| throw new Exception( | |||||
| pht( | |||||
| 'No data provided for path "%s".', | |||||
| $this->getDescription())); | |||||
| } | |||||
| return $this->data; | |||||
| } | |||||
| public function getDataAsLines() { | |||||
| if ($this->dataAsLines === null) { | |||||
| $lines = phutil_split_lines($this->getData()); | |||||
| $this->dataAsLines = $lines; | |||||
| } | |||||
| return $this->dataAsLines; | |||||
| } | |||||
| public function setMode($mode) { | |||||
| $this->mode = $mode; | |||||
| return $this; | |||||
| } | |||||
| public function getMode() { | |||||
| if ($this->mode === null) { | |||||
| throw new Exception( | |||||
| pht( | |||||
| 'No mode provided for path "%s".', | |||||
| $this->getDescription())); | |||||
| } | |||||
| return $this->mode; | |||||
| } | |||||
| public function isExecutable() { | |||||
| $mode = $this->getMode(); | |||||
| return (bool)($mode & 0111); | |||||
| } | |||||
| public function isBinary() { | |||||
| if ($this->binary === null) { | |||||
| $data = $this->getData(); | |||||
| $is_binary = ArcanistDiffUtils::isHeuristicBinaryFile($data); | |||||
| $this->binary = $is_binary; | |||||
| } | |||||
| return $this->binary; | |||||
| } | |||||
| public function getMimeType() { | |||||
| if ($this->mimeType === null) { | |||||
| // TOOLSETS: This is not terribly efficient on real repositories since | |||||
| // it re-writes files which are often already on disk, but is good for | |||||
| // unit tests. | |||||
| $tmp = new TempFile(); | |||||
| Filesystem::writeFile($tmp, $this->getData()); | |||||
| $mime = Filesystem::getMimeType($tmp); | |||||
| $this->mimeType = $mime; | |||||
| } | |||||
| return $this->mimeType; | |||||
| } | |||||
| public function getBasename() { | |||||
| return basename($this->getPath()); | |||||
| } | |||||
| public function getLineAndCharFromOffset($offset) { | |||||
| if ($this->charMap === null) { | |||||
| $char_map = array(); | |||||
| $line_map = array(); | |||||
| $lines = $this->getDataAsLines(); | |||||
| $line_number = 0; | |||||
| $line_start = 0; | |||||
| foreach ($lines as $line) { | |||||
| $len = strlen($line); | |||||
| $line_map[] = $line_start; | |||||
| $line_start += $len; | |||||
| for ($ii = 0; $ii < $len; $ii++) { | |||||
| $char_map[] = $line_number; | |||||
| } | |||||
| $line_number++; | |||||
| } | |||||
| $this->charMap = $char_map; | |||||
| $this->lineMap = $line_map; | |||||
| } | |||||
| $line = $this->charMap[$offset]; | |||||
| $char = $offset - $this->lineMap[$line]; | |||||
| return array($line, $char); | |||||
| } | |||||
| } | |||||