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