Page MenuHomePhabricator

D18313.diff
No OneTemporary

D18313.diff

diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -2642,6 +2642,8 @@
'PhabricatorDefaultSyntaxStyle' => 'infrastructure/syntax/PhabricatorDefaultSyntaxStyle.php',
'PhabricatorDesktopNotificationsSetting' => 'applications/settings/setting/PhabricatorDesktopNotificationsSetting.php',
'PhabricatorDesktopNotificationsSettingsPanel' => 'applications/settings/panel/PhabricatorDesktopNotificationsSettingsPanel.php',
+ 'PhabricatorDestructibleCodex' => 'applications/system/codex/PhabricatorDestructibleCodex.php',
+ 'PhabricatorDestructibleCodexInterface' => 'applications/system/interface/PhabricatorDestructibleCodexInterface.php',
'PhabricatorDestructibleInterface' => 'applications/system/interface/PhabricatorDestructibleInterface.php',
'PhabricatorDestructionEngine' => 'applications/system/engine/PhabricatorDestructionEngine.php',
'PhabricatorDestructionEngineExtension' => 'applications/system/engine/PhabricatorDestructionEngineExtension.php',
@@ -3780,6 +3782,7 @@
'PhabricatorRepositoryCommitTestCase' => 'applications/repository/storage/__tests__/PhabricatorRepositoryCommitTestCase.php',
'PhabricatorRepositoryConfigOptions' => 'applications/repository/config/PhabricatorRepositoryConfigOptions.php',
'PhabricatorRepositoryDAO' => 'applications/repository/storage/PhabricatorRepositoryDAO.php',
+ 'PhabricatorRepositoryDestructibleCodex' => 'applications/repository/codex/PhabricatorRepositoryDestructibleCodex.php',
'PhabricatorRepositoryDiscoveryEngine' => 'applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php',
'PhabricatorRepositoryEditor' => 'applications/repository/editor/PhabricatorRepositoryEditor.php',
'PhabricatorRepositoryEngine' => 'applications/repository/engine/PhabricatorRepositoryEngine.php',
@@ -7937,6 +7940,7 @@
'PhabricatorDefaultSyntaxStyle' => 'PhabricatorSyntaxStyle',
'PhabricatorDesktopNotificationsSetting' => 'PhabricatorInternalSetting',
'PhabricatorDesktopNotificationsSettingsPanel' => 'PhabricatorSettingsPanel',
+ 'PhabricatorDestructibleCodex' => 'Phobject',
'PhabricatorDestructionEngine' => 'Phobject',
'PhabricatorDestructionEngineExtension' => 'Phobject',
'PhabricatorDestructionEngineExtensionModule' => 'PhabricatorConfigModule',
@@ -9241,6 +9245,7 @@
'PhabricatorFlaggableInterface',
'PhabricatorMarkupInterface',
'PhabricatorDestructibleInterface',
+ 'PhabricatorDestructibleCodexInterface',
'PhabricatorProjectInterface',
'PhabricatorSpacesInterface',
'PhabricatorConduitResultInterface',
@@ -9283,6 +9288,7 @@
'PhabricatorRepositoryCommitTestCase' => 'PhabricatorTestCase',
'PhabricatorRepositoryConfigOptions' => 'PhabricatorApplicationConfigOptions',
'PhabricatorRepositoryDAO' => 'PhabricatorLiskDAO',
+ 'PhabricatorRepositoryDestructibleCodex' => 'PhabricatorDestructibleCodex',
'PhabricatorRepositoryDiscoveryEngine' => 'PhabricatorRepositoryEngine',
'PhabricatorRepositoryEditor' => 'PhabricatorApplicationTransactionEditor',
'PhabricatorRepositoryEngine' => 'Phobject',
diff --git a/src/applications/repository/codex/PhabricatorRepositoryDestructibleCodex.php b/src/applications/repository/codex/PhabricatorRepositoryDestructibleCodex.php
new file mode 100644
--- /dev/null
+++ b/src/applications/repository/codex/PhabricatorRepositoryDestructibleCodex.php
@@ -0,0 +1,23 @@
+<?php
+
+final class PhabricatorRepositoryDestructibleCodex
+ extends PhabricatorDestructibleCodex {
+
+ public function getDestructionNotes() {
+ $repository = $this->getObject();
+
+ $notes = array();
+
+ if ($repository->hasLocalWorkingCopy()) {
+ $notes[] = pht(
+ 'Database records for repository "%s" were destroyed, but this '.
+ 'script does not remove working copies on disk. If you also want to '.
+ 'destroy the repository working copy, manually remove "%s".',
+ $repository->getDisplayName(),
+ $repository->getLocalPath());
+ }
+
+ return $notes;
+ }
+
+}
diff --git a/src/applications/repository/storage/PhabricatorRepository.php b/src/applications/repository/storage/PhabricatorRepository.php
--- a/src/applications/repository/storage/PhabricatorRepository.php
+++ b/src/applications/repository/storage/PhabricatorRepository.php
@@ -12,6 +12,7 @@
PhabricatorFlaggableInterface,
PhabricatorMarkupInterface,
PhabricatorDestructibleInterface,
+ PhabricatorDestructibleCodexInterface,
PhabricatorProjectInterface,
PhabricatorSpacesInterface,
PhabricatorConduitResultInterface,
@@ -2557,6 +2558,14 @@
}
+/* -( PhabricatorDestructibleCodexInterface )------------------------------ */
+
+
+ public function newDestructibleCodex() {
+ return new PhabricatorRepositoryDestructibleCodex();
+ }
+
+
/* -( PhabricatorSpacesInterface )----------------------------------------- */
diff --git a/src/applications/system/codex/PhabricatorDestructibleCodex.php b/src/applications/system/codex/PhabricatorDestructibleCodex.php
new file mode 100644
--- /dev/null
+++ b/src/applications/system/codex/PhabricatorDestructibleCodex.php
@@ -0,0 +1,66 @@
+<?php
+
+abstract class PhabricatorDestructibleCodex
+ extends Phobject {
+
+ private $viewer;
+ private $object;
+
+ public function getDestructionNotes() {
+ return array();
+ }
+
+ final public function setViewer(PhabricatorUser $viewer) {
+ $this->viewer = $viewer;
+ return $this;
+ }
+
+ final public function getViewer() {
+ return $this->viewer;
+ }
+
+ final public function setObject(
+ PhabricatorDestructibleCodexInterface $object) {
+ $this->object = $object;
+ return $this;
+ }
+
+ final public function getObject() {
+ return $this->object;
+ }
+
+ final public static function newFromObject(
+ PhabricatorDestructibleCodexInterface $object,
+ PhabricatorUser $viewer) {
+
+ if (!($object instanceof PhabricatorDestructibleInterface)) {
+ throw new Exception(
+ pht(
+ 'Object (of class "%s") implements interface "%s", but must also '.
+ 'implement interface "%s".',
+ get_class($object),
+ 'PhabricatorDestructibleCodexInterface',
+ 'PhabricatorDestructibleInterface'));
+ }
+
+ $codex = $object->newDestructibleCodex();
+ if (!($codex instanceof PhabricatorDestructibleCodex)) {
+ throw new Exception(
+ pht(
+ 'Object (of class "%s") implements interface "%s", but defines '.
+ 'method "%s" incorrectly: this method must return an object of '.
+ 'class "%s".',
+ get_class($object),
+ 'PhabricatorDestructibleCodexInterface',
+ 'newDestructibleCodex()',
+ __CLASS__));
+ }
+
+ $codex
+ ->setObject($object)
+ ->setViewer($viewer);
+
+ return $codex;
+ }
+
+}
diff --git a/src/applications/system/engine/PhabricatorDestructionEngine.php b/src/applications/system/engine/PhabricatorDestructionEngine.php
--- a/src/applications/system/engine/PhabricatorDestructionEngine.php
+++ b/src/applications/system/engine/PhabricatorDestructionEngine.php
@@ -3,6 +3,17 @@
final class PhabricatorDestructionEngine extends Phobject {
private $rootLogID;
+ private $collectNotes;
+ private $notes = array();
+
+ public function setCollectNotes($collect_notes) {
+ $this->collectNotes = $collect_notes;
+ return $this;
+ }
+
+ public function getNotes() {
+ return $this->notes;
+ }
public function getViewer() {
return PhabricatorUser::getOmnipotentUser();
@@ -36,6 +47,18 @@
$this->rootLogID = $log->getID();
}
+ if ($this->collectNotes) {
+ if ($object instanceof PhabricatorDestructibleCodexInterface) {
+ $codex = PhabricatorDestructibleCodex::newFromObject(
+ $object,
+ $this->getViewer());
+
+ foreach ($codex->getDestructionNotes() as $note) {
+ $this->notes[] = $note;
+ }
+ }
+ }
+
$object->destroyObjectPermanently($this);
if ($object_phid) {
diff --git a/src/applications/system/interface/PhabricatorDestructibleCodexInterface.php b/src/applications/system/interface/PhabricatorDestructibleCodexInterface.php
new file mode 100644
--- /dev/null
+++ b/src/applications/system/interface/PhabricatorDestructibleCodexInterface.php
@@ -0,0 +1,18 @@
+<?php
+
+interface PhabricatorDestructibleCodexInterface {
+
+ public function newDestructibleCodex();
+
+}
+
+// TEMPLATE IMPLEMENTATION /////////////////////////////////////////////////////
+
+/* -( PhabricatorDestructibleCodexInterface )------------------------------ */
+/*
+
+ public function newDestructibleCodex() {
+ return new <<...>>DestructibleCodex();
+ }
+
+*/
diff --git a/src/applications/system/management/PhabricatorSystemRemoveDestroyWorkflow.php b/src/applications/system/management/PhabricatorSystemRemoveDestroyWorkflow.php
--- a/src/applications/system/management/PhabricatorSystemRemoveDestroyWorkflow.php
+++ b/src/applications/system/management/PhabricatorSystemRemoveDestroyWorkflow.php
@@ -145,6 +145,7 @@
$console->writeOut("%s\n", pht('Destroying objects...'));
+ $notes = array();
foreach ($named_objects as $object_name => $object) {
$console->writeOut(
pht(
@@ -152,8 +153,14 @@
get_class($object),
$object_name));
- id(new PhabricatorDestructionEngine())
- ->destroyObject($object);
+ $engine = id(new PhabricatorDestructionEngine())
+ ->setCollectNotes(true);
+
+ $engine->destroyObject($object);
+
+ foreach ($engine->getNotes() as $note) {
+ $notes[] = $note;
+ }
}
$console->writeOut(
@@ -162,6 +169,12 @@
'Permanently destroyed %s object(s).',
phutil_count($named_objects)));
+ if ($notes) {
+ id(new PhutilConsoleList())
+ ->addItems($notes)
+ ->draw();
+ }
+
return 0;
}

File Metadata

Mime Type
text/plain
Expires
Fri, Feb 20, 12:07 PM (2 w, 3 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
8503614
Default Alt Text
D18313.diff (9 KB)

Event Timeline