Skip to content

Commit

Permalink
Load all diff properties in revision view
Browse files Browse the repository at this point in the history
Summary:
We need to load all properties with some prefix in one field.
We can't merge them in one property because there will be a race condition for update (we don't have API for load+update+save).

Instead of providing API for this and complicating the code even more, just load everything unconditionally.
It shouldn't waste much bandwith or memory because we use most of the properties anyway.
It also looked overengineered to me.

Test Plan: Displayed revision with fields using diff properties.

Reviewers: epriestley, royw

Reviewed By: royw

CC: aran, royw, Korvin

Differential Revision: https://secure.phabricator.com/D3676
  • Loading branch information
vrana committed Oct 10, 2012
1 parent d9c6e07 commit efed124
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 82 deletions.
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -82,16 +82,12 @@ public function processRequest() {
$repository); $repository);
} }


list($aux_fields, $props) = $this->loadAuxiliaryFieldsAndProperties( $props = id(new DifferentialDiffProperty())->loadAllWhere(
$revision, 'diffID = %d',
$target, $target_manual->getID());
$target_manual, $props = mpull($props, 'getData', 'getName');
array(
'local:commits',
'arc:lint',
'arc:unit',
));


$aux_fields = $this->loadAuxiliaryFields($revision);


$comments = $revision->loadComments(); $comments = $revision->loadComments();
$comments = array_merge( $comments = array_merge(
Expand Down Expand Up @@ -139,6 +135,9 @@ public function processRequest() {


$aux_phids = array(); $aux_phids = array();
foreach ($aux_fields as $key => $aux_field) { foreach ($aux_fields as $key => $aux_field) {
$aux_field->setDiff($target);
$aux_field->setManualDiff($target_manual);
$aux_field->setDiffProperties($props);
$aux_phids[$key] = $aux_field->getRequiredHandlePHIDsForRevisionView(); $aux_phids[$key] = $aux_field->getRequiredHandlePHIDsForRevisionView();
} }
$object_phids = array_merge($object_phids, array_mergev($aux_phids)); $object_phids = array_merge($object_phids, array_mergev($aux_phids));
Expand Down Expand Up @@ -740,11 +739,7 @@ private function loadChangesetsAndVsMap(
return array($changesets, $vs_map, $vs_changesets, $refs); return array($changesets, $vs_map, $vs_changesets, $refs);
} }


private function loadAuxiliaryFieldsAndProperties( private function loadAuxiliaryFields(DifferentialRevision $revision) {
DifferentialRevision $revision,
DifferentialDiff $diff,
DifferentialDiff $manual_diff,
array $special_properties) {


$aux_fields = DifferentialFieldSelector::newSelector() $aux_fields = DifferentialFieldSelector::newSelector()
->getFieldSpecifications(); ->getFieldSpecifications();
Expand All @@ -760,46 +755,7 @@ private function loadAuxiliaryFieldsAndProperties(
$revision, $revision,
$aux_fields); $aux_fields);


$aux_props = array(); return $aux_fields;
foreach ($aux_fields as $key => $aux_field) {
$aux_field->setDiff($diff);
$aux_field->setManualDiff($manual_diff);
$aux_props[$key] = $aux_field->getRequiredDiffProperties();
}

$required_properties = array_mergev($aux_props);
$required_properties = array_merge(
$required_properties,
$special_properties);

$property_map = array();
if ($required_properties) {
$properties = id(new DifferentialDiffProperty())->loadAllWhere(
'diffID = %d AND name IN (%Ls)',
$manual_diff->getID(),
$required_properties);
$property_map = mpull($properties, 'getData', 'getName');
}

foreach ($aux_fields as $key => $aux_field) {
// Give each field only the properties it specifically required, and
// set 'null' for each requested key which we didn't actually load a
// value for (otherwise, getDiffProperty() will throw).
if ($aux_props[$key]) {
$props = array_select_keys($property_map, $aux_props[$key]) +
array_fill_keys($aux_props[$key], null);
} else {
$props = array();
}

$aux_field->setDiffProperties($props);
}

return array(
$aux_fields,
array_select_keys(
$property_map,
$special_properties));
} }


private function buildSymbolIndexes( private function buildSymbolIndexes(
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -676,16 +676,6 @@ public function getRequiredHandlePHIDsForCommitMessage() {
return $this->getRequiredHandlePHIDs(); return $this->getRequiredHandlePHIDs();
} }


/**
* Specify which diff properties this field needs to load.
*
* @return list List of diff property keys this field requires.
* @task load
*/
public function getRequiredDiffProperties() {
return array();
}

/** /**
* Parse a list of users into a canonical PHID list. * Parse a list of users into a canonical PHID list.
* *
Expand Down Expand Up @@ -904,8 +894,7 @@ final protected function getHandle($phid) {
} }


/** /**
* Get a diff property which this field previously requested by returning * Get a property of a diff set by @{method:setManualDiff}.
* the key from @{method:getRequiredDiffProperties}.
* *
* @param string Diff property key. * @param string Diff property key.
* @return mixed|null Diff property, or null if the property does not have * @return mixed|null Diff property, or null if the property does not have
Expand All @@ -919,14 +908,7 @@ final public function getDiffProperty($key) {
// context. // context.
throw new DifferentialFieldDataNotAvailableException($this); throw new DifferentialFieldDataNotAvailableException($this);
} }
if (!array_key_exists($key, $this->diffProperties)) { return idx($this->diffProperties, $key);
$class = get_class($this);
throw new Exception(
"A differential field (of class '{$class}') is attempting to retrieve ".
"a diff property ('{$key}') which it did not request. Return all ".
"diff property keys you need from getRequiredDiffProperties().");
}
return $this->diffProperties[$key];
} }


} }
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -27,10 +27,6 @@ public function renderLabelForRevisionView() {
return 'Lint:'; return 'Lint:';
} }


public function getRequiredDiffProperties() {
return array('arc:lint', 'arc:lint-excuse', 'arc:lint-postponed');
}

private function getLintExcuse() { private function getLintExcuse() {
return $this->getDiffProperty('arc:lint-excuse'); return $this->getDiffProperty('arc:lint-excuse');
} }
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -27,10 +27,6 @@ public function renderLabelForRevisionView() {
return 'Unit:'; return 'Unit:';
} }


public function getRequiredDiffProperties() {
return array('arc:unit', 'arc:unit-excuse');
}

private function getUnitExcuse() { private function getUnitExcuse() {
return $this->getDiffProperty('arc:unit-excuse'); return $this->getDiffProperty('arc:unit-excuse');
} }
Expand Down

0 comments on commit efed124

Please sign in to comment.