2011-01-24 20:01:53 +01:00
|
|
|
<?php
|
|
|
|
|
2014-05-25 18:28:11 +02:00
|
|
|
abstract class DifferentialHunk extends DifferentialDAO
|
2014-04-14 21:06:26 +02:00
|
|
|
implements PhabricatorPolicyInterface {
|
2011-01-24 20:01:53 +01:00
|
|
|
|
|
|
|
protected $changesetID;
|
|
|
|
protected $oldOffset;
|
|
|
|
protected $oldLen;
|
|
|
|
protected $newOffset;
|
|
|
|
protected $newLen;
|
|
|
|
|
2014-04-14 21:06:26 +02:00
|
|
|
private $changeset;
|
|
|
|
|
2014-04-14 21:06:20 +02:00
|
|
|
const FLAG_LINES_ADDED = 1;
|
|
|
|
const FLAG_LINES_REMOVED = 2;
|
|
|
|
const FLAG_LINES_STABLE = 4;
|
|
|
|
|
2012-04-28 08:00:30 +02:00
|
|
|
public function getAddedLines() {
|
2012-06-27 19:44:29 +02:00
|
|
|
return $this->makeContent($include = '+');
|
2012-04-28 08:00:30 +02:00
|
|
|
}
|
|
|
|
|
2013-10-04 15:37:32 +02:00
|
|
|
public function getRemovedLines() {
|
|
|
|
return $this->makeContent($include = '-');
|
|
|
|
}
|
|
|
|
|
2011-01-24 20:01:53 +01:00
|
|
|
public function makeNewFile() {
|
2012-06-27 19:44:29 +02:00
|
|
|
return implode('', $this->makeContent($include = ' +'));
|
2011-01-24 20:01:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public function makeOldFile() {
|
2012-06-27 19:44:29 +02:00
|
|
|
return implode('', $this->makeContent($include = ' -'));
|
2011-01-24 20:01:53 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
public function makeChanges() {
|
2012-06-27 19:44:29 +02:00
|
|
|
return implode('', $this->makeContent($include = '-+'));
|
2011-01-24 20:01:53 +01:00
|
|
|
}
|
|
|
|
|
2014-04-14 21:06:20 +02:00
|
|
|
public function getContentWithMask($mask) {
|
|
|
|
$include = array();
|
|
|
|
|
|
|
|
if (($mask & self::FLAG_LINES_ADDED)) {
|
|
|
|
$include[] = '+';
|
|
|
|
}
|
|
|
|
|
|
|
|
if (($mask & self::FLAG_LINES_REMOVED)) {
|
|
|
|
$include[] = '-';
|
|
|
|
}
|
|
|
|
|
|
|
|
if (($mask & self::FLAG_LINES_STABLE)) {
|
|
|
|
$include[] = ' ';
|
|
|
|
}
|
|
|
|
|
|
|
|
$include = implode('', $include);
|
|
|
|
|
|
|
|
return implode('', $this->makeContent($include));
|
|
|
|
}
|
|
|
|
|
2012-06-27 19:44:29 +02:00
|
|
|
final private function makeContent($include) {
|
2011-01-24 20:01:53 +01:00
|
|
|
$results = array();
|
2014-05-25 18:54:12 +02:00
|
|
|
$lines = explode("\n", $this->getChanges());
|
2012-03-22 22:13:48 +01:00
|
|
|
|
|
|
|
// NOTE: To determine whether the recomposed file should have a trailing
|
|
|
|
// newline, we look for a "\ No newline at end of file" line which appears
|
|
|
|
// after a line which we don't exclude. For example, if we're constructing
|
|
|
|
// the "new" side of a diff (excluding "-"), we want to ignore this one:
|
|
|
|
//
|
|
|
|
// - x
|
|
|
|
// \ No newline at end of file
|
|
|
|
// + x
|
|
|
|
//
|
|
|
|
// ...since it's talking about the "old" side of the diff, but interpret
|
|
|
|
// this as meaning we should omit the newline:
|
|
|
|
//
|
|
|
|
// - x
|
|
|
|
// + x
|
|
|
|
// \ No newline at end of file
|
|
|
|
|
2012-06-27 19:44:29 +02:00
|
|
|
$n = (strpos($include, '+') !== false ?
|
|
|
|
$this->newOffset :
|
|
|
|
$this->oldOffset);
|
2012-03-22 22:13:48 +01:00
|
|
|
$use_next_newline = false;
|
2011-01-24 20:01:53 +01:00
|
|
|
foreach ($lines as $line) {
|
2012-06-27 19:44:29 +02:00
|
|
|
if (!isset($line[0])) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($line[0] == '\\') {
|
|
|
|
if ($use_next_newline) {
|
|
|
|
$results[last_key($results)] = rtrim(end($results), "\n");
|
2012-03-22 22:13:48 +01:00
|
|
|
}
|
2012-06-27 19:44:29 +02:00
|
|
|
} else if (strpos($include, $line[0]) === false) {
|
|
|
|
$use_next_newline = false;
|
|
|
|
} else {
|
|
|
|
$use_next_newline = true;
|
|
|
|
$results[$n] = substr($line, 1)."\n";
|
2011-01-24 20:01:53 +01:00
|
|
|
}
|
2012-03-22 22:13:48 +01:00
|
|
|
|
2012-06-27 19:44:29 +02:00
|
|
|
if ($line[0] == ' ' || strpos($include, $line[0]) !== false) {
|
|
|
|
$n++;
|
|
|
|
}
|
2012-03-22 22:13:48 +01:00
|
|
|
}
|
|
|
|
|
2012-06-27 19:44:29 +02:00
|
|
|
return $results;
|
2011-01-24 20:01:53 +01:00
|
|
|
}
|
|
|
|
|
2014-04-14 21:06:26 +02:00
|
|
|
public function getChangeset() {
|
|
|
|
return $this->assertAttached($this->changeset);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function attachChangeset(DifferentialChangeset $changeset) {
|
|
|
|
$this->changeset = $changeset;
|
|
|
|
return $this;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* -( PhabricatorPolicyInterface )----------------------------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
public function getCapabilities() {
|
|
|
|
return array(
|
|
|
|
PhabricatorPolicyCapability::CAN_VIEW,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getPolicy($capability) {
|
|
|
|
return $this->getChangeset()->getPolicy($capability);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function hasAutomaticCapability($capability, PhabricatorUser $viewer) {
|
|
|
|
return $this->getChangeset()->hasAutomaticCapability($capability, $viewer);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function describeAutomaticCapability($capability) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2011-01-24 20:01:53 +01:00
|
|
|
}
|