Page MenuHomePhorge

D25772.1734830657.diff
No OneTemporary

D25772.1734830657.diff

diff --git a/src/applications/project/editor/PhabricatorProjectTransactionEditor.php b/src/applications/project/editor/PhabricatorProjectTransactionEditor.php
--- a/src/applications/project/editor/PhabricatorProjectTransactionEditor.php
+++ b/src/applications/project/editor/PhabricatorProjectTransactionEditor.php
@@ -234,6 +234,9 @@
$editor->save();
}
}
+
+ // See also PhabricatorProject#destroyObjectPermanently() where we must
+ // restore the original situation after the last child is deleted.
}
// TODO: We should dump an informational transaction onto the parent
diff --git a/src/applications/project/storage/PhabricatorProject.php b/src/applications/project/storage/PhabricatorProject.php
--- a/src/applications/project/storage/PhabricatorProject.php
+++ b/src/applications/project/storage/PhabricatorProject.php
@@ -734,6 +734,16 @@
PhabricatorDestructionEngine $engine) {
$this->openTransaction();
+
+ // My milestones cannot live without me. Drop them as well early.
+ $child_milestones = id(new self())
+ ->loadAllWhere('milestoneNumber IS NOT NULL AND parentProjectPHID = %s',
+ $this->getPHID());
+ foreach ($child_milestones as $child_milestone) {
+ $child_milestone->attachParentProject($this);
+ $engine->destroyObject($child_milestone);
+ }
+
$this->delete();
$columns = id(new PhabricatorProjectColumn())
@@ -748,9 +758,88 @@
$slug->delete();
}
+ // Update my parent, since it may be childless now.
+ $this->onDestroyTouchChildlessParent();
+
+ // Update my "fatherless children", since they have broken depth now.
+ $this->onDestroyTouchFatherlessChildren();
+
$this->saveTransaction();
}
+ /**
+ * On destroy, eventually touch our childless parent.
+ *
+ * @see PhabricatorProjectTransactionEditor#applyFinalEffects()
+ */
+ private function onDestroyTouchChildlessParent() {
+ // Do nothing special if I'm a simple root-project.
+ $parent = $this->getParentProject();
+ if (!$parent) {
+ return;
+ }
+
+ // Do nothing special if our parent has more children projects.
+ $sisters = id(new self())->loadAllWhere(
+ 'parentProjectPHID = %s AND '.
+ 'milestoneNumber IS NULL AND '.
+ 'phid != %s LIMIT 1',
+ $parent->getPHID(),
+ $this->getPHID());
+ if ($sisters) {
+ return;
+ }
+
+ // Get direct project memberships.
+ $member_type = PhabricatorProjectProjectHasMemberEdgeType::EDGECONST;
+ $project_members = PhabricatorEdgeQuery::loadDestinationPHIDs(
+ $this->getPHID(),
+ $member_type);
+
+ // We were the last subproject of our parent.
+ // So, copy all of the real members to the parent.
+ if ($project_members) {
+ $editor = new PhabricatorEdgeEditor();
+ foreach ($project_members as $member_phid) {
+ $editor->addEdge($parent->getPHID(), $member_type, $member_phid);
+ }
+ $editor->save();
+
+ id(new PhabricatorProjectsMembershipIndexEngineExtension())
+ ->rematerialize($parent);
+ }
+
+ // Set our parent as childless.
+ $parent
+ ->setHasSubprojects(0)
+ ->save();
+ }
+
+ /**
+ * On destroy, eventually touch our childless parent.
+ *
+ * @see PhabricatorProjectTransactionEditor#applyFinalEffects()
+ */
+ private function onDestroyTouchFatherlessChildren() {
+ // Get all children milestones and sub-projects.
+ // This query must use the Query builder to make save() happy.
+ $children = id(new PhabricatorProjectQuery())
+ ->withParentProjectPHIDs(array($this->getPHID()))
+ ->setViewer(PhabricatorUser::getOmnipotentUser())
+ ->execute();
+
+ // Consolidate children debth, bubbling up them.
+ $parent_phid = $this->getParentProjectPHID();
+ $parent = $this->getParentProject();
+ foreach ($children as $child) {
+ $child->setParentProjectPHID($parent_phid);
+ $child->setParentProject($parent);
+ $child->attachParentProject($parent);
+ $child->save();
+ $child->onDestroyTouchFatherlessChildren();
+ }
+ }
+
/* -( PhabricatorFulltextInterface )--------------------------------------- */

File Metadata

Mime Type
text/plain
Expires
Sun, Dec 22, 01:24 (11 h, 3 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1025203
Default Alt Text
D25772.1734830657.diff (4 KB)

Event Timeline