1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-11-26 00:32:41 +01:00
phorge-arcanist/src/workingcopy/ArcanistWorkingCopyPath.php
epriestley c471983697 Collapse Arcanist toolsets from "wilds" into "master", as an overlay layer
Summary:
Depends on D20988. Ref T13395. Ref T13098. Ref T13203.

This brings all the "toolsets" code into "master". We try to run commands as toolsets commands first, then fall back to older code.

Since the "toolsets" class tree is mostly parallel to the older class tree, this isn't completely broken. Currently, all commands fall back.

Test Plan: Created this diff, ran various other commands. But this is probably a long shot from finished.

Maniphest Tasks: T13395, T13203, T13098

Differential Revision: https://secure.phabricator.com/D20990
2020-02-13 14:10:46 -08:00

129 lines
2.6 KiB
PHP

<?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);
}
}