Page MenuHomePhabricator

D19768.diff
No OneTemporary

D19768.diff

diff --git a/resources/sql/autopatches/20181031.board.01.queryreset.php b/resources/sql/autopatches/20181031.board.01.queryreset.php
new file mode 100644
--- /dev/null
+++ b/resources/sql/autopatches/20181031.board.01.queryreset.php
@@ -0,0 +1,50 @@
+<?php
+
+// See T13208. It was previously possible to replace a saved query with another
+// saved query, causing loss of the first query. Find projects which have their
+// default query set to an invalid query and throw the setting away.
+
+$viewer = PhabricatorUser::getOmnipotentUser();
+
+$table = new PhabricatorProject();
+$conn = $table->establishConnection('w');
+
+$iterator = new LiskMigrationIterator($table);
+$search_engine = id(new ManiphestTaskSearchEngine())
+ ->setViewer($viewer);
+
+foreach ($iterator as $project) {
+ $default_filter = $project->getDefaultWorkboardFilter();
+ if (!strlen($default_filter)) {
+ continue;
+ }
+
+ if ($search_engine->isBuiltinQuery($default_filter)) {
+ continue;
+ }
+
+ $saved = id(new PhabricatorSavedQueryQuery())
+ ->setViewer($viewer)
+ ->withQueryKeys(array($default_filter))
+ ->executeOne();
+ if ($saved) {
+ continue;
+ }
+
+ $properties = $project->getProperties();
+ unset($properties['workboard.filter.default']);
+
+ queryfx(
+ $conn,
+ 'UPDATE %T SET properties = %s WHERE id = %d',
+ $table->getTableName(),
+ phutil_json_encode($properties),
+ $project->getID());
+
+ echo tsprintf(
+ "%s\n",
+ pht(
+ 'Project ("%s") had an invalid query saved as a default workboard '.
+ 'query. The query has been reset. See T13208.',
+ $project->getDisplayName()));
+}
diff --git a/src/applications/project/controller/PhabricatorProjectBoardViewController.php b/src/applications/project/controller/PhabricatorProjectBoardViewController.php
--- a/src/applications/project/controller/PhabricatorProjectBoardViewController.php
+++ b/src/applications/project/controller/PhabricatorProjectBoardViewController.php
@@ -203,7 +203,7 @@
// with the column filter. If the user currently has constraints on the
// board, we want to add a new column or project constraint, not
// completely replace the constraints.
- $saved_query = clone $saved;
+ $saved_query = $saved->newCopy();
if ($query_column->getProxyPHID()) {
$project_phids = $saved_query->getParameter('projectPHIDs');
diff --git a/src/applications/search/engine/PhabricatorApplicationSearchEngine.php b/src/applications/search/engine/PhabricatorApplicationSearchEngine.php
--- a/src/applications/search/engine/PhabricatorApplicationSearchEngine.php
+++ b/src/applications/search/engine/PhabricatorApplicationSearchEngine.php
@@ -103,6 +103,14 @@
}
public function saveQuery(PhabricatorSavedQuery $query) {
+ if ($query->getID()) {
+ throw new Exception(
+ pht(
+ 'Query (with ID "%s") has already been saved. Queries are '.
+ 'immutable once saved.',
+ $query->getID()));
+ }
+
$query->setEngineClassName(get_class($this));
$unguarded = AphrontWriteGuard::beginScopedUnguardedWrites();
diff --git a/src/applications/search/storage/PhabricatorSavedQuery.php b/src/applications/search/storage/PhabricatorSavedQuery.php
--- a/src/applications/search/storage/PhabricatorSavedQuery.php
+++ b/src/applications/search/storage/PhabricatorSavedQuery.php
@@ -63,6 +63,13 @@
return $this->assertAttachedKey($this->parameterMap, $key);
}
+ public function newCopy() {
+ return id(new self())
+ ->setParameters($this->getParameters())
+ ->setQueryKey(null)
+ ->setEngineClassName($this->getEngineClassName());
+ }
+
/* -( PhabricatorPolicyInterface )----------------------------------------- */

File Metadata

Mime Type
text/plain
Expires
Fri, Mar 21, 2:41 PM (1 d, 15 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7657547
Default Alt Text
D19768.diff (3 KB)

Event Timeline