public function renderTransactionDescription(ManiphestTransaction $transaction, $target)
 {
     $label = $this->getLabel();
     $old = $transaction->getOldValue();
     $new = $transaction->getNewValue();
     switch ($this->getFieldType()) {
         case self::TYPE_BOOL:
             if ($new) {
                 $desc = "set field '{$label}' true";
             } else {
                 $desc = "set field '{$label}' false";
             }
             break;
         case self::TYPE_SELECT:
             $old_display = idx($this->getSelectOptions(), $old);
             $new_display = idx($this->getSelectOptions(), $new);
             if ($old === null) {
                 $desc = "set field '{$label}' to '{$new_display}'";
             } else {
                 $desc = "changed field '{$label}' " . "from '{$old_display}' to '{$new_display}'";
             }
             break;
         default:
             if (!strlen($old)) {
                 if (!strlen($new)) {
                     return null;
                 }
                 $desc = "set field '{$label}' to '{$new}'";
             } else {
                 $desc = "updated '{$label}' " . "from '{$old}' to '{$new}'";
             }
             break;
     }
     if ($target == self::RENDER_TARGET_HTML) {
         $desc = phutil_escape_html($desc);
     }
     return $desc;
 }