private function loadAuxiliaryFields(DifferentialRevision $revision)
 {
     $aux_fields = DifferentialFieldSelector::newSelector()->getFieldSpecifications();
     foreach ($aux_fields as $key => $aux_field) {
         if (!$aux_field->shouldAppearOnConduitView()) {
             unset($aux_fields[$key]);
         }
     }
     $aux_fields = DifferentialAuxiliaryField::loadFromStorage($revision, $aux_fields);
     return mpull($aux_fields, 'getValueForConduit', 'getKeyForConduit');
 }
 private function loadAuxiliaryFields(DifferentialRevision $revision)
 {
     $user = $this->getRequest()->getUser();
     $aux_fields = DifferentialFieldSelector::newSelector()->getFieldSpecifications();
     foreach ($aux_fields as $key => $aux_field) {
         $aux_field->setRevision($revision);
         if (!$aux_field->shouldAppearOnEdit()) {
             unset($aux_fields[$key]);
         } else {
             $aux_field->setUser($user);
         }
     }
     return DifferentialAuxiliaryField::loadFromStorage($revision, $aux_fields);
 }
 private function updateAuxiliaryFields()
 {
     $aux_map = array();
     foreach ($this->auxiliaryFields as $aux_field) {
         $key = $aux_field->getStorageKey();
         if ($key !== null) {
             $val = $aux_field->getValueForStorage();
             $aux_map[$key] = $val;
         }
     }
     if (!$aux_map) {
         return;
     }
     $revision = $this->revision;
     $fields = id(new DifferentialAuxiliaryField())->loadAllWhere('revisionPHID = %s AND name IN (%Ls)', $revision->getPHID(), array_keys($aux_map));
     $fields = mpull($fields, null, 'getName');
     foreach ($aux_map as $key => $val) {
         $obj = idx($fields, $key);
         if (!strlen($val)) {
             // If the new value is empty, just delete the old row if one exists and
             // don't add a new row if it doesn't.
             if ($obj) {
                 $obj->delete();
             }
         } else {
             if (!$obj) {
                 $obj = new DifferentialAuxiliaryField();
                 $obj->setRevisionPHID($revision->getPHID());
                 $obj->setName($key);
             }
             if ($obj->getValue() !== $val) {
                 $obj->setValue($val);
                 $obj->save();
             }
         }
     }
 }
 private function loadAuxiliaryFieldsAndProperties(DifferentialRevision $revision, DifferentialDiff $diff, array $special_properties)
 {
     $aux_fields = DifferentialFieldSelector::newSelector()->getFieldSpecifications();
     foreach ($aux_fields as $key => $aux_field) {
         if (!$aux_field->shouldAppearOnRevisionView()) {
             unset($aux_fields[$key]);
         } else {
             $aux_field->setUser($this->getRequest()->getUser());
         }
     }
     $aux_fields = DifferentialAuxiliaryField::loadFromStorage($revision, $aux_fields);
     $aux_props = array();
     foreach ($aux_fields as $key => $aux_field) {
         $aux_field->setDiff($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)', $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));
 }
 protected function execute(ConduitAPIRequest $request)
 {
     $id = $request->getValue('revision_id');
     $revision = id(new DifferentialRevision())->load($id);
     if (!$revision) {
         throw new ConduitException('ERR_NOT_FOUND');
     }
     $revision->loadRelationships();
     $is_edit = $request->getValue('edit');
     $aux_fields = DifferentialFieldSelector::newSelector()->getFieldSpecifications();
     foreach ($aux_fields as $key => $aux_field) {
         $aux_field->setRevision($revision);
         if (!$aux_field->shouldAppearOnCommitMessage()) {
             unset($aux_fields[$key]);
         }
     }
     $aux_fields = DifferentialAuxiliaryField::loadFromStorage($revision, $aux_fields);
     $aux_fields = mpull($aux_fields, null, 'getCommitMessageKey');
     if ($is_edit) {
         $fields = $request->getValue('fields');
         foreach ($fields as $field => $value) {
             $aux_field = idx($aux_fields, $field);
             if (!$aux_field) {
                 throw new Exception("Commit message includes field '{$field}' which does not " . "correspond to any configured field.");
             }
             if ($aux_field->shouldOverwriteWhenCommitMessageIsEdited()) {
                 $aux_field->setValueFromParsedCommitMessage($value);
             }
         }
     }
     $aux_phids = array();
     foreach ($aux_fields as $field_key => $field) {
         $aux_phids[$field_key] = $field->getRequiredHandlePHIDsForCommitMessage();
     }
     $phids = array_unique(array_mergev($aux_phids));
     $handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
     foreach ($aux_fields as $field_key => $field) {
         $field->setHandles(array_select_keys($handles, $aux_phids[$field_key]));
     }
     $commit_message = array();
     foreach ($aux_fields as $field_key => $field) {
         $value = $field->renderValueForCommitMessage($is_edit);
         $label = $field->renderLabelForCommitMessage();
         if ($value === null || !strlen($value)) {
             if ($field_key === 'title') {
                 $commit_message[] = '<<Enter Revision Title>>';
             } else {
                 if ($field->shouldAppearOnCommitMessageTemplate() && $is_edit) {
                     $commit_message[] = $label . ': ';
                 }
             }
         } else {
             if ($field_key === 'title') {
                 $commit_message[] = $value;
             } else {
                 $value = str_replace(array("\r\n", "\r"), array("\n", "\n"), $value);
                 if (strpos($value, "\n") !== false) {
                     $commit_message[] = "{$label}:\n{$value}";
                 } else {
                     $commit_message[] = "{$label}: {$value}";
                 }
             }
         }
     }
     $commit_message = implode("\n\n", $commit_message);
     return wordwrap($commit_message, 80);
 }