mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-15 01:50:55 +01:00
(stable) Promote 2017 Week 50
This commit is contained in:
commit
25536d0d47
20 changed files with 303 additions and 21 deletions
|
@ -80,7 +80,7 @@ return array(
|
|||
'rsrc/css/application/flag/flag.css' => 'bba8f811',
|
||||
'rsrc/css/application/harbormaster/harbormaster.css' => 'f491c9f4',
|
||||
'rsrc/css/application/herald/herald-test.css' => 'a52e323e',
|
||||
'rsrc/css/application/herald/herald.css' => 'dc31f6e9',
|
||||
'rsrc/css/application/herald/herald.css' => 'cd8d0134',
|
||||
'rsrc/css/application/maniphest/batch-editor.css' => 'b0f0b6d5',
|
||||
'rsrc/css/application/maniphest/report.css' => '9b9580b7',
|
||||
'rsrc/css/application/maniphest/task-edit.css' => 'fda62a9b',
|
||||
|
@ -416,7 +416,7 @@ return array(
|
|||
'rsrc/js/application/drydock/drydock-live-operation-status.js' => '901935ef',
|
||||
'rsrc/js/application/files/behavior-icon-composer.js' => '8499b6ab',
|
||||
'rsrc/js/application/files/behavior-launch-icon-composer.js' => '48086888',
|
||||
'rsrc/js/application/herald/HeraldRuleEditor.js' => 'd6a7e717',
|
||||
'rsrc/js/application/herald/HeraldRuleEditor.js' => '2dff5579',
|
||||
'rsrc/js/application/herald/PathTypeahead.js' => 'f7fc67ec',
|
||||
'rsrc/js/application/herald/herald-rule-editor.js' => '7ebaeed3',
|
||||
'rsrc/js/application/maniphest/behavior-batch-editor.js' => '782ab6e7',
|
||||
|
@ -578,8 +578,8 @@ return array(
|
|||
'font-lato' => 'c7ccd872',
|
||||
'global-drag-and-drop-css' => 'b556a948',
|
||||
'harbormaster-css' => 'f491c9f4',
|
||||
'herald-css' => 'dc31f6e9',
|
||||
'herald-rule-editor' => 'd6a7e717',
|
||||
'herald-css' => 'cd8d0134',
|
||||
'herald-rule-editor' => '2dff5579',
|
||||
'herald-test-css' => 'a52e323e',
|
||||
'inline-comment-summary-css' => 'f23d4e8f',
|
||||
'javelin-aphlict' => 'e1d4b11a',
|
||||
|
@ -1106,6 +1106,15 @@ return array(
|
|||
'javelin-install',
|
||||
'javelin-event',
|
||||
),
|
||||
'2dff5579' => array(
|
||||
'multirow-row-manager',
|
||||
'javelin-install',
|
||||
'javelin-util',
|
||||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
'javelin-json',
|
||||
'phabricator-prefab',
|
||||
),
|
||||
'2ee659ce' => array(
|
||||
'javelin-install',
|
||||
),
|
||||
|
@ -2001,15 +2010,6 @@ return array(
|
|||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
),
|
||||
'd6a7e717' => array(
|
||||
'multirow-row-manager',
|
||||
'javelin-install',
|
||||
'javelin-util',
|
||||
'javelin-dom',
|
||||
'javelin-stratcom',
|
||||
'javelin-json',
|
||||
'phabricator-prefab',
|
||||
),
|
||||
'd7a74243' => array(
|
||||
'javelin-behavior',
|
||||
'javelin-stratcom',
|
||||
|
|
|
@ -821,6 +821,7 @@ phutil_register_library_map(array(
|
|||
'DiffusionPreCommitRefRepositoryHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefRepositoryHeraldField.php',
|
||||
'DiffusionPreCommitRefRepositoryProjectsHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefRepositoryProjectsHeraldField.php',
|
||||
'DiffusionPreCommitRefTypeHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitRefTypeHeraldField.php',
|
||||
'DiffusionPreCommitUsesGitLFSHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitUsesGitLFSHeraldField.php',
|
||||
'DiffusionPullEventGarbageCollector' => 'applications/diffusion/garbagecollector/DiffusionPullEventGarbageCollector.php',
|
||||
'DiffusionPushCapability' => 'applications/diffusion/capability/DiffusionPushCapability.php',
|
||||
'DiffusionPushEventViewController' => 'applications/diffusion/controller/DiffusionPushEventViewController.php',
|
||||
|
@ -1337,6 +1338,7 @@ phutil_register_library_map(array(
|
|||
'HeraldApplyTranscript' => 'applications/herald/storage/transcript/HeraldApplyTranscript.php',
|
||||
'HeraldBasicFieldGroup' => 'applications/herald/field/HeraldBasicFieldGroup.php',
|
||||
'HeraldBuildableState' => 'applications/herald/state/HeraldBuildableState.php',
|
||||
'HeraldCommentAction' => 'applications/herald/action/HeraldCommentAction.php',
|
||||
'HeraldCommitAdapter' => 'applications/diffusion/herald/HeraldCommitAdapter.php',
|
||||
'HeraldCondition' => 'applications/herald/storage/HeraldCondition.php',
|
||||
'HeraldConditionTranscript' => 'applications/herald/storage/transcript/HeraldConditionTranscript.php',
|
||||
|
@ -1378,6 +1380,7 @@ phutil_register_library_map(array(
|
|||
'HeraldProjectsField' => 'applications/project/herald/HeraldProjectsField.php',
|
||||
'HeraldRecursiveConditionsException' => 'applications/herald/engine/exception/HeraldRecursiveConditionsException.php',
|
||||
'HeraldRelatedFieldGroup' => 'applications/herald/field/HeraldRelatedFieldGroup.php',
|
||||
'HeraldRemarkupFieldValue' => 'applications/herald/value/HeraldRemarkupFieldValue.php',
|
||||
'HeraldRemarkupRule' => 'applications/herald/remarkup/HeraldRemarkupRule.php',
|
||||
'HeraldRepetitionPolicyConfig' => 'applications/herald/config/HeraldRepetitionPolicyConfig.php',
|
||||
'HeraldRule' => 'applications/herald/storage/HeraldRule.php',
|
||||
|
@ -5879,6 +5882,7 @@ phutil_register_library_map(array(
|
|||
'DiffusionPreCommitRefRepositoryHeraldField' => 'DiffusionPreCommitRefHeraldField',
|
||||
'DiffusionPreCommitRefRepositoryProjectsHeraldField' => 'DiffusionPreCommitRefHeraldField',
|
||||
'DiffusionPreCommitRefTypeHeraldField' => 'DiffusionPreCommitRefHeraldField',
|
||||
'DiffusionPreCommitUsesGitLFSHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
||||
'DiffusionPullEventGarbageCollector' => 'PhabricatorGarbageCollector',
|
||||
'DiffusionPushCapability' => 'PhabricatorPolicyCapability',
|
||||
'DiffusionPushEventViewController' => 'DiffusionPushLogController',
|
||||
|
@ -6488,6 +6492,7 @@ phutil_register_library_map(array(
|
|||
'HeraldApplyTranscript' => 'Phobject',
|
||||
'HeraldBasicFieldGroup' => 'HeraldFieldGroup',
|
||||
'HeraldBuildableState' => 'HeraldState',
|
||||
'HeraldCommentAction' => 'HeraldAction',
|
||||
'HeraldCommitAdapter' => array(
|
||||
'HeraldAdapter',
|
||||
'HarbormasterBuildableAdapterInterface',
|
||||
|
@ -6535,6 +6540,7 @@ phutil_register_library_map(array(
|
|||
'HeraldProjectsField' => 'HeraldField',
|
||||
'HeraldRecursiveConditionsException' => 'Exception',
|
||||
'HeraldRelatedFieldGroup' => 'HeraldFieldGroup',
|
||||
'HeraldRemarkupFieldValue' => 'HeraldFieldValue',
|
||||
'HeraldRemarkupRule' => 'PhabricatorObjectRemarkupRule',
|
||||
'HeraldRepetitionPolicyConfig' => 'Phobject',
|
||||
'HeraldRule' => array(
|
||||
|
|
|
@ -132,12 +132,14 @@ final class DifferentialTransactionEditor
|
|||
|
||||
$diff = $this->requireDiff($xaction->getNewValue());
|
||||
|
||||
$object->setLineCount($diff->getLineCount());
|
||||
$this->updateRevisionLineCounts($object, $diff);
|
||||
|
||||
if ($this->repositoryPHIDOverride !== false) {
|
||||
$object->setRepositoryPHID($this->repositoryPHIDOverride);
|
||||
} else {
|
||||
$object->setRepositoryPHID($diff->getRepositoryPHID());
|
||||
}
|
||||
|
||||
$object->attachActiveDiff($diff);
|
||||
$object->setActiveDiffPHID($diff->getPHID());
|
||||
return;
|
||||
|
@ -1645,5 +1647,25 @@ final class DifferentialTransactionEditor
|
|||
return true;
|
||||
}
|
||||
|
||||
private function updateRevisionLineCounts(
|
||||
DifferentialRevision $revision,
|
||||
DifferentialDiff $diff) {
|
||||
|
||||
$revision->setLineCount($diff->getLineCount());
|
||||
|
||||
$conn = $revision->establishConnection('r');
|
||||
|
||||
$row = queryfx_one(
|
||||
$conn,
|
||||
'SELECT SUM(addLines) A, SUM(delLines) D FROM %T
|
||||
WHERE diffID = %d',
|
||||
id(new DifferentialChangeset())->getTableName(),
|
||||
$diff->getID());
|
||||
|
||||
if ($row) {
|
||||
$revision->setAddedLineCount((int)$row['A']);
|
||||
$revision->setRemovedLineCount((int)$row['D']);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -61,6 +61,8 @@ final class DifferentialRevision extends DifferentialDAO
|
|||
const PROPERTY_CLOSED_FROM_ACCEPTED = 'wasAcceptedBeforeClose';
|
||||
const PROPERTY_DRAFT_HOLD = 'draft.hold';
|
||||
const PROPERTY_HAS_BROADCAST = 'draft.broadcast';
|
||||
const PROPERTY_LINES_ADDED = 'lines.added';
|
||||
const PROPERTY_LINES_REMOVED = 'lines.removed';
|
||||
|
||||
public static function initializeNewRevision(PhabricatorUser $actor) {
|
||||
$app = id(new PhabricatorApplicationQuery())
|
||||
|
@ -728,6 +730,21 @@ final class DifferentialRevision extends DifferentialDAO
|
|||
return $this->setProperty(self::PROPERTY_HAS_BROADCAST, $has_broadcast);
|
||||
}
|
||||
|
||||
public function setAddedLineCount($count) {
|
||||
return $this->setProperty(self::PROPERTY_LINES_ADDED, $count);
|
||||
}
|
||||
|
||||
public function getAddedLineCount() {
|
||||
return $this->getProperty(self::PROPERTY_LINES_ADDED);
|
||||
}
|
||||
|
||||
public function setRemovedLineCount($count) {
|
||||
return $this->setProperty(self::PROPERTY_LINES_REMOVED, $count);
|
||||
}
|
||||
|
||||
public function getRemovedLineCount() {
|
||||
return $this->getProperty(self::PROPERTY_LINES_REMOVED);
|
||||
}
|
||||
|
||||
public function loadActiveBuilds(PhabricatorUser $viewer) {
|
||||
$diff = $this->getActiveDiff();
|
||||
|
|
|
@ -52,6 +52,36 @@ final class DiffusionBrowseQueryConduitAPIMethod
|
|||
$commit,
|
||||
$path);
|
||||
} catch (CommandException $e) {
|
||||
// The "cat-file" command may fail if the path legitimately does not
|
||||
// exist, but it may also fail if the path is a submodule. This can
|
||||
// produce either "Not a valid object name" or "could not get object
|
||||
// info".
|
||||
|
||||
// To detect if we have a submodule, use `git ls-tree`. If the path
|
||||
// is a submodule, we'll get a "160000" mode mask with type "commit".
|
||||
|
||||
list($sub_err, $sub_stdout) = $repository->execLocalCommand(
|
||||
'ls-tree %s -- %s',
|
||||
$commit,
|
||||
$path);
|
||||
if (!$sub_err) {
|
||||
// If the path failed "cat-file" but "ls-tree" worked, we assume it
|
||||
// must be a submodule. If it is, the output will look something
|
||||
// like this:
|
||||
//
|
||||
// 160000 commit <hash> <path>
|
||||
//
|
||||
// We make sure it has the 160000 mode mask to confirm that it's
|
||||
// definitely a submodule.
|
||||
$mode = (int)$sub_stdout;
|
||||
if ($mode & 160000) {
|
||||
$submodule_reason = DiffusionBrowseResultSet::REASON_IS_SUBMODULE;
|
||||
$result
|
||||
->setReasonForEmptyResultSet($submodule_reason);
|
||||
return $result;
|
||||
}
|
||||
}
|
||||
|
||||
$stderr = $e->getStderr();
|
||||
if (preg_match('/^fatal: Not a valid object name/', $stderr)) {
|
||||
// Grab two logs, since the first one is when the object was deleted.
|
||||
|
|
|
@ -101,7 +101,7 @@ final class PhabricatorDiffusionConfigOptions
|
|||
->setBoolOptions(
|
||||
array(
|
||||
pht('Allow HTTP Basic Auth'),
|
||||
pht('Disable HTTP Basic Auth'),
|
||||
pht('Disallow HTTP Basic Auth'),
|
||||
))
|
||||
->setSummary(pht('Enable HTTP Basic Auth for repositories.'))
|
||||
->setDescription(
|
||||
|
@ -115,6 +115,19 @@ final class PhabricatorDiffusionConfigOptions
|
|||
"barrier to attackers than SSH does.\n\n".
|
||||
"Consider using SSH for authenticated access to repositories ".
|
||||
"instead of HTTP.")),
|
||||
$this->newOption('diffusion.allow-git-lfs', 'bool', false)
|
||||
->setBoolOptions(
|
||||
array(
|
||||
pht('Allow Git LFS'),
|
||||
pht('Disallow Git LFS'),
|
||||
))
|
||||
->setLocked(true)
|
||||
->setSummary(pht('Allow Git Large File Storage (LFS).'))
|
||||
->setDescription(
|
||||
pht(
|
||||
'Phabricator supports Git LFS, a Git extension for storing large '.
|
||||
'files alongside a repository. Activate this setting to allow '.
|
||||
'the extension to store file data in Phabricator.')),
|
||||
$this->newOption('diffusion.ssh-user', 'string', null)
|
||||
->setLocked(true)
|
||||
->setSummary(pht('Login username for SSH connections to repositories.'))
|
||||
|
|
|
@ -916,7 +916,8 @@ final class DiffusionBrowseController extends DiffusionController {
|
|||
->setTag('a')
|
||||
->setText($text)
|
||||
->setHref($href)
|
||||
->setIcon($icon);
|
||||
->setIcon($icon)
|
||||
->setColor(PHUIButtonView::GREY);
|
||||
}
|
||||
|
||||
private function buildDisplayRows(
|
||||
|
@ -1924,7 +1925,7 @@ final class DiffusionBrowseController extends DiffusionController {
|
|||
|
||||
try {
|
||||
$file = $this->loadGitLFSFile($ref);
|
||||
$data = $this->renderGitLFSButton();
|
||||
$this->corpusButtons[] = $this->renderGitLFSButton();
|
||||
} catch (Exception $ex) {
|
||||
$severity = PHUIInfoView::SEVERITY_ERROR;
|
||||
$messages[] = pht('The data for this file could not be loaded.');
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
final class DiffusionBrowseResultSet extends Phobject {
|
||||
|
||||
const REASON_IS_FILE = 'is-file';
|
||||
const REASON_IS_SUBMODULE = 'is-submodule';
|
||||
const REASON_IS_DELETED = 'is-deleted';
|
||||
const REASON_IS_NONEXISTENT = 'nonexistent';
|
||||
const REASON_BAD_COMMIT = 'bad-commit';
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
<?php
|
||||
|
||||
final class DiffusionPreCommitUsesGitLFSHeraldField
|
||||
extends DiffusionPreCommitContentHeraldField {
|
||||
|
||||
const FIELDCONST = 'diffusion.pre.commit.git-lfs';
|
||||
|
||||
public function getHeraldFieldName() {
|
||||
return pht('Commit uses Git LFS');
|
||||
}
|
||||
|
||||
public function getFieldGroupKey() {
|
||||
return DiffusionChangeHeraldFieldGroup::FIELDGROUPKEY;
|
||||
}
|
||||
|
||||
public function getHeraldFieldValue($object) {
|
||||
$map = $this->getAdapter()->getDiffContent('+');
|
||||
|
||||
// At the time of writing, all current Git LFS files begin with this
|
||||
// line, verbatim:
|
||||
//
|
||||
// version https://git-lfs.github.com/spec/v1
|
||||
//
|
||||
// ...but we don't try to match the specific version here, in the hopes
|
||||
// that this might also detect future versions.
|
||||
$pattern = '(^version\s*https://git-lfs.github.com/spec/)i';
|
||||
|
||||
foreach ($map as $path => $content) {
|
||||
if (preg_match($pattern, $content)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
protected function getHeraldFieldStandardType() {
|
||||
return self::STANDARD_BOOL;
|
||||
}
|
||||
|
||||
}
|
|
@ -40,6 +40,13 @@ final class DiffusionEmptyResultView extends DiffusionView {
|
|||
$body = pht('This path was an empty directory at %s.', $commit);
|
||||
$severity = PHUIInfoView::SEVERITY_NOTICE;
|
||||
break;
|
||||
case DiffusionBrowseResultSet::REASON_IS_SUBMODULE:
|
||||
$title = pht('Submodule');
|
||||
// TODO: We could improve this, but it is normally difficult to
|
||||
// reach this page for a submodule.
|
||||
$body = pht('This path was a submodule at %s.', $commit);
|
||||
$severity = PHUIInfoView::SEVERITY_NOTICE;
|
||||
break;
|
||||
case DiffusionBrowseResultSet::REASON_IS_DELETED:
|
||||
$deleted = $this->browseResultSet->getDeletedAtCommit();
|
||||
$existed = $this->browseResultSet->getExistedAtCommit();
|
||||
|
|
|
@ -64,6 +64,7 @@ final class FileUploadChunkConduitAPIMethod
|
|||
$params = array(
|
||||
'name' => $file->getMonogram().'.chunk-'.$chunk->getID(),
|
||||
'viewPolicy' => PhabricatorPolicies::POLICY_NOONE,
|
||||
'chunk' => true,
|
||||
);
|
||||
|
||||
if ($mime_type !== null) {
|
||||
|
|
|
@ -40,6 +40,7 @@ final class PhabricatorFile extends PhabricatorFileDAO
|
|||
const METADATA_PROFILE = 'profile';
|
||||
const METADATA_STORAGE = 'storage';
|
||||
const METADATA_INTEGRITY = 'integrity';
|
||||
const METADATA_CHUNK = 'chunk';
|
||||
|
||||
const STATUS_ACTIVE = 'active';
|
||||
const STATUS_DELETED = 'deleted';
|
||||
|
@ -410,7 +411,7 @@ final class PhabricatorFile extends PhabricatorFileDAO
|
|||
try {
|
||||
$file->updateDimensions(false);
|
||||
} catch (Exception $ex) {
|
||||
// Do nothing
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
$file->saveAndIndex();
|
||||
|
@ -1057,9 +1058,20 @@ final class PhabricatorFile extends PhabricatorFileDAO
|
|||
throw new Exception(pht('Cannot retrieve image information.'));
|
||||
}
|
||||
|
||||
if ($this->getIsChunk()) {
|
||||
throw new Exception(
|
||||
pht('Refusing to assess image dimensions of file chunk.'));
|
||||
}
|
||||
|
||||
$engine = $this->instantiateStorageEngine();
|
||||
if ($engine->isChunkEngine()) {
|
||||
throw new Exception(
|
||||
pht('Refusing to assess image dimensions of chunked file.'));
|
||||
}
|
||||
|
||||
$data = $this->loadFileData();
|
||||
|
||||
$img = imagecreatefromstring($data);
|
||||
$img = @imagecreatefromstring($data);
|
||||
if ($img === false) {
|
||||
throw new Exception(pht('Error when decoding image.'));
|
||||
}
|
||||
|
@ -1255,6 +1267,15 @@ final class PhabricatorFile extends PhabricatorFileDAO
|
|||
return $this;
|
||||
}
|
||||
|
||||
public function getIsChunk() {
|
||||
return idx($this->metadata, self::METADATA_CHUNK);
|
||||
}
|
||||
|
||||
public function setIsChunk($value) {
|
||||
$this->metadata[self::METADATA_CHUNK] = $value;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setIntegrityHash($integrity_hash) {
|
||||
$this->metadata[self::METADATA_INTEGRITY] = $integrity_hash;
|
||||
return $this;
|
||||
|
@ -1339,6 +1360,7 @@ final class PhabricatorFile extends PhabricatorFileDAO
|
|||
'mime-type' => 'optional string',
|
||||
'builtin' => 'optional string',
|
||||
'storageEngines' => 'optional list<PhabricatorFileStorageEngine>',
|
||||
'chunk' => 'optional bool',
|
||||
));
|
||||
|
||||
$file_name = idx($params, 'name');
|
||||
|
@ -1416,6 +1438,11 @@ final class PhabricatorFile extends PhabricatorFileDAO
|
|||
$this->setMimeType($mime_type);
|
||||
}
|
||||
|
||||
$is_chunk = idx($params, 'chunk');
|
||||
if ($is_chunk) {
|
||||
$this->setIsChunk(true);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
|
|
@ -189,6 +189,7 @@ abstract class PhabricatorFileUploadSource
|
|||
$params = array(
|
||||
'name' => $file->getMonogram().'.chunk-'.$offset,
|
||||
'viewPolicy' => PhabricatorPolicies::POLICY_NOONE,
|
||||
'chunk' => true,
|
||||
);
|
||||
|
||||
// If this isn't the initial chunk, provide a dummy MIME type so we do not
|
||||
|
|
|
@ -9,6 +9,7 @@ abstract class HeraldAction extends Phobject {
|
|||
const STANDARD_NONE = 'standard.none';
|
||||
const STANDARD_PHID_LIST = 'standard.phid.list';
|
||||
const STANDARD_TEXT = 'standard.text';
|
||||
const STANDARD_REMARKUP = 'standard.remarkup';
|
||||
|
||||
const DO_STANDARD_EMPTY = 'do.standard.empty';
|
||||
const DO_STANDARD_NO_EFFECT = 'do.standard.no-effect';
|
||||
|
@ -60,6 +61,8 @@ abstract class HeraldAction extends Phobject {
|
|||
return new HeraldEmptyFieldValue();
|
||||
case self::STANDARD_TEXT:
|
||||
return new HeraldTextFieldValue();
|
||||
case self::STANDARD_REMARKUP:
|
||||
return new HeraldRemarkupFieldValue();
|
||||
case self::STANDARD_PHID_LIST:
|
||||
$tokenizer = id(new HeraldTokenizerFieldValue())
|
||||
->setKey($this->getHeraldActionName())
|
||||
|
|
79
src/applications/herald/action/HeraldCommentAction.php
Normal file
79
src/applications/herald/action/HeraldCommentAction.php
Normal file
|
@ -0,0 +1,79 @@
|
|||
<?php
|
||||
|
||||
final class HeraldCommentAction extends HeraldAction {
|
||||
|
||||
const ACTIONCONST = 'comment';
|
||||
const DO_COMMENT = 'do.comment';
|
||||
|
||||
public function getHeraldActionName() {
|
||||
return pht('Add comment');
|
||||
}
|
||||
|
||||
public function getActionGroupKey() {
|
||||
return HeraldUtilityActionGroup::ACTIONGROUPKEY;
|
||||
}
|
||||
|
||||
public function supportsObject($object) {
|
||||
if (!($object instanceof PhabricatorApplicationTransactionInterface)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$xaction = $object->getApplicationTransactionTemplate();
|
||||
try {
|
||||
$comment = $xaction->getApplicationTransactionCommentObject();
|
||||
if (!$comment) {
|
||||
return false;
|
||||
}
|
||||
} catch (PhutilMethodNotImplementedException $ex) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public function supportsRuleType($rule_type) {
|
||||
return ($rule_type != HeraldRuleTypeConfig::RULE_TYPE_PERSONAL);
|
||||
}
|
||||
|
||||
public function applyEffect($object, HeraldEffect $effect) {
|
||||
$adapter = $this->getAdapter();
|
||||
$comment_text = $effect->getTarget();
|
||||
|
||||
$xaction = $adapter->newTransaction()
|
||||
->setTransactionType(PhabricatorTransactions::TYPE_COMMENT);
|
||||
|
||||
$comment = $xaction->getApplicationTransactionCommentObject()
|
||||
->setContent($comment_text);
|
||||
|
||||
$xaction->attachComment($comment);
|
||||
|
||||
$adapter->queueTransaction($xaction);
|
||||
|
||||
$this->logEffect(self::DO_COMMENT, $comment_text);
|
||||
}
|
||||
|
||||
public function getHeraldActionStandardType() {
|
||||
return self::STANDARD_REMARKUP;
|
||||
}
|
||||
|
||||
protected function getActionEffectMap() {
|
||||
return array(
|
||||
self::DO_COMMENT => array(
|
||||
'icon' => 'fa-comment',
|
||||
'color' => 'blue',
|
||||
'name' => pht('Added Comment'),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
public function renderActionDescription($value) {
|
||||
$summary = PhabricatorMarkupEngine::summarize($value);
|
||||
return pht('Add comment: %s', $summary);
|
||||
}
|
||||
|
||||
protected function renderActionEffectDescription($type, $data) {
|
||||
$summary = PhabricatorMarkupEngine::summarize($data);
|
||||
return pht('Added a comment: %s', $summary);
|
||||
}
|
||||
|
||||
}
|
|
@ -8,6 +8,7 @@ abstract class HeraldFieldValue extends Phobject {
|
|||
const CONTROL_TEXT = 'herald.control.text';
|
||||
const CONTROL_SELECT = 'herald.control.select';
|
||||
const CONTROL_TOKENIZER = 'herald.control.tokenizer';
|
||||
const CONTROL_REMARKUP = 'herald.control.remarkup';
|
||||
|
||||
abstract public function getFieldValueKey();
|
||||
abstract public function getControlType();
|
||||
|
|
22
src/applications/herald/value/HeraldRemarkupFieldValue.php
Normal file
22
src/applications/herald/value/HeraldRemarkupFieldValue.php
Normal file
|
@ -0,0 +1,22 @@
|
|||
<?php
|
||||
|
||||
final class HeraldRemarkupFieldValue
|
||||
extends HeraldFieldValue {
|
||||
|
||||
public function getFieldValueKey() {
|
||||
return 'remarkup';
|
||||
}
|
||||
|
||||
public function getControlType() {
|
||||
return self::CONTROL_REMARKUP;
|
||||
}
|
||||
|
||||
public function renderFieldValue($value) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
public function renderEditorValue($value) {
|
||||
return $value;
|
||||
}
|
||||
|
||||
}
|
|
@ -1627,8 +1627,7 @@ final class PhabricatorRepository extends PhabricatorRepositoryDAO
|
|||
return false;
|
||||
}
|
||||
|
||||
// TODO: Unprototype this feature.
|
||||
if (!PhabricatorEnv::getEnvConfig('phabricator.show-prototypes')) {
|
||||
if (!PhabricatorEnv::getEnvConfig('diffusion.allow-git-lfs')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -37,6 +37,12 @@
|
|||
padding: 2px 4px;
|
||||
}
|
||||
|
||||
.herald-action-table td textarea {
|
||||
width: 95%;
|
||||
height: 8em;
|
||||
padding: 2px 4px;
|
||||
}
|
||||
|
||||
.herald-action-table td.target {
|
||||
width: 100%;
|
||||
}
|
||||
|
|
|
@ -217,6 +217,11 @@ JX.install('HeraldRuleEditor', {
|
|||
get_fn = function() { return input.value; };
|
||||
set_fn = function(v) { input.value = v; };
|
||||
break;
|
||||
case 'herald.control.remarkup':
|
||||
input = JX.$N('textarea');
|
||||
get_fn = function() { return input.value; };
|
||||
set_fn = function(v) { input.value = v; };
|
||||
break;
|
||||
case 'herald.control.select':
|
||||
var options;
|
||||
|
||||
|
|
Loading…
Reference in a new issue