Provide wiki pages for projects
Summary:
Provide tighter integration between Projects and Phriction. Partly, I have most
of a rewrite for the Projects homepage ready but it's not currently possible to
publish feed stories about a project so all the feeds are empty/boring. This
partly makes them more useful and partly just provides a tool integration point.
- When you create a project, all the wiki pages in projects/<project_name>/*
are associated with it.
- Publish updates to those pages as being related to the project so they'll
show up in project feeds.
- Show a project link on those pages.
This is very "convention over configuration" but I think it's the right
approach. We could provide some sort of, like, "@project=derp" tag to let you
associated arbitrary pages to projects later, but just letting you move pages is
probably far better.
Test Plan:
- Ran upgrade scripts against stupidly named projects ("der", " der", " der
", "der (2)", " der (2) (2)", etc). Ended up with uniquely named projects.
- Ran unit tests.
- Created /projects/ wiki documents and made sure they displayed correctly.
- Verified feed stories publish as project-related.
- Edited projects, including perfomring a name-colliding edit.
- Created projects, including performing a name-colliding create.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T681
Differential Revision: 1231
2011-12-17 20:58:55 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
echo "Ensuring project names are unique enough...\n";
|
2013-01-17 02:55:39 +01:00
|
|
|
$table = new PhabricatorProject();
|
|
|
|
$table->openTransaction();
|
|
|
|
$table->beginReadLocking();
|
|
|
|
|
|
|
|
$projects = $table->loadAll();
|
Provide wiki pages for projects
Summary:
Provide tighter integration between Projects and Phriction. Partly, I have most
of a rewrite for the Projects homepage ready but it's not currently possible to
publish feed stories about a project so all the feeds are empty/boring. This
partly makes them more useful and partly just provides a tool integration point.
- When you create a project, all the wiki pages in projects/<project_name>/*
are associated with it.
- Publish updates to those pages as being related to the project so they'll
show up in project feeds.
- Show a project link on those pages.
This is very "convention over configuration" but I think it's the right
approach. We could provide some sort of, like, "@project=derp" tag to let you
associated arbitrary pages to projects later, but just letting you move pages is
probably far better.
Test Plan:
- Ran upgrade scripts against stupidly named projects ("der", " der", " der
", "der (2)", " der (2) (2)", etc). Ended up with uniquely named projects.
- Ran unit tests.
- Created /projects/ wiki documents and made sure they displayed correctly.
- Verified feed stories publish as project-related.
- Edited projects, including perfomring a name-colliding edit.
- Created projects, including performing a name-colliding create.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T681
Differential Revision: 1231
2011-12-17 20:58:55 +01:00
|
|
|
|
|
|
|
$slug_map = array();
|
|
|
|
|
|
|
|
foreach ($projects as $project) {
|
|
|
|
$project->setPhrictionSlug($project->getName());
|
|
|
|
$slug = $project->getPhrictionSlug();
|
|
|
|
if ($slug == '/') {
|
|
|
|
$project_id = $project->getID();
|
|
|
|
echo "Project #{$project_id} doesn't have a meaningful name...\n";
|
|
|
|
$project->setName(trim('Unnamed Project '.$project->getName()));
|
|
|
|
}
|
|
|
|
$slug_map[$slug][] = $project->getID();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach ($slug_map as $slug => $similar) {
|
|
|
|
if (count($similar) <= 1) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
echo "Too many projects are similar to '{$slug}'...\n";
|
|
|
|
|
|
|
|
foreach (array_slice($similar, 1, null, true) as $key => $project_id) {
|
|
|
|
$project = $projects[$project_id];
|
|
|
|
$old_name = $project->getName();
|
|
|
|
$new_name = rename_project($project, $projects);
|
|
|
|
|
|
|
|
echo "Renaming project #{$project_id} ".
|
|
|
|
"from '{$old_name}' to '{$new_name}'.\n";
|
|
|
|
$project->setName($new_name);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$update = $projects;
|
|
|
|
while ($update) {
|
|
|
|
$size = count($update);
|
|
|
|
foreach ($update as $key => $project) {
|
|
|
|
$id = $project->getID();
|
|
|
|
$name = $project->getName();
|
|
|
|
$project->setPhrictionSlug($name);
|
|
|
|
$slug = $project->getPhrictionSlug();
|
|
|
|
|
|
|
|
echo "Updating project #{$id} '{$name}' ({$slug})...";
|
|
|
|
try {
|
|
|
|
queryfx(
|
|
|
|
$project->establishConnection('w'),
|
|
|
|
'UPDATE %T SET name = %s, phrictionSlug = %s WHERE id = %d',
|
|
|
|
$project->getTableName(),
|
|
|
|
$name,
|
|
|
|
$slug,
|
|
|
|
$project->getID());
|
|
|
|
unset($update[$key]);
|
|
|
|
echo "okay.\n";
|
2014-08-05 23:51:21 +02:00
|
|
|
} catch (AphrontDuplicateKeyQueryException $ex) {
|
Provide wiki pages for projects
Summary:
Provide tighter integration between Projects and Phriction. Partly, I have most
of a rewrite for the Projects homepage ready but it's not currently possible to
publish feed stories about a project so all the feeds are empty/boring. This
partly makes them more useful and partly just provides a tool integration point.
- When you create a project, all the wiki pages in projects/<project_name>/*
are associated with it.
- Publish updates to those pages as being related to the project so they'll
show up in project feeds.
- Show a project link on those pages.
This is very "convention over configuration" but I think it's the right
approach. We could provide some sort of, like, "@project=derp" tag to let you
associated arbitrary pages to projects later, but just letting you move pages is
probably far better.
Test Plan:
- Ran upgrade scripts against stupidly named projects ("der", " der", " der
", "der (2)", " der (2) (2)", etc). Ended up with uniquely named projects.
- Ran unit tests.
- Created /projects/ wiki documents and made sure they displayed correctly.
- Verified feed stories publish as project-related.
- Edited projects, including perfomring a name-colliding edit.
- Created projects, including performing a name-colliding create.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T681
Differential Revision: 1231
2011-12-17 20:58:55 +01:00
|
|
|
echo "failed, will retry.\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (count($update) == $size) {
|
|
|
|
throw new Exception(
|
2014-06-09 20:36:49 +02:00
|
|
|
'Failed to make any progress while updating projects. Schema upgrade '.
|
|
|
|
'has failed. Go manually fix your project names to be unique (they are '.
|
|
|
|
'probably ridiculous?) and then try again.');
|
Provide wiki pages for projects
Summary:
Provide tighter integration between Projects and Phriction. Partly, I have most
of a rewrite for the Projects homepage ready but it's not currently possible to
publish feed stories about a project so all the feeds are empty/boring. This
partly makes them more useful and partly just provides a tool integration point.
- When you create a project, all the wiki pages in projects/<project_name>/*
are associated with it.
- Publish updates to those pages as being related to the project so they'll
show up in project feeds.
- Show a project link on those pages.
This is very "convention over configuration" but I think it's the right
approach. We could provide some sort of, like, "@project=derp" tag to let you
associated arbitrary pages to projects later, but just letting you move pages is
probably far better.
Test Plan:
- Ran upgrade scripts against stupidly named projects ("der", " der", " der
", "der (2)", " der (2) (2)", etc). Ended up with uniquely named projects.
- Ran unit tests.
- Created /projects/ wiki documents and made sure they displayed correctly.
- Verified feed stories publish as project-related.
- Edited projects, including perfomring a name-colliding edit.
- Created projects, including performing a name-colliding create.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T681
Differential Revision: 1231
2011-12-17 20:58:55 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-01-17 02:55:39 +01:00
|
|
|
$table->endReadLocking();
|
|
|
|
$table->saveTransaction();
|
Provide wiki pages for projects
Summary:
Provide tighter integration between Projects and Phriction. Partly, I have most
of a rewrite for the Projects homepage ready but it's not currently possible to
publish feed stories about a project so all the feeds are empty/boring. This
partly makes them more useful and partly just provides a tool integration point.
- When you create a project, all the wiki pages in projects/<project_name>/*
are associated with it.
- Publish updates to those pages as being related to the project so they'll
show up in project feeds.
- Show a project link on those pages.
This is very "convention over configuration" but I think it's the right
approach. We could provide some sort of, like, "@project=derp" tag to let you
associated arbitrary pages to projects later, but just letting you move pages is
probably far better.
Test Plan:
- Ran upgrade scripts against stupidly named projects ("der", " der", " der
", "der (2)", " der (2) (2)", etc). Ended up with uniquely named projects.
- Ran unit tests.
- Created /projects/ wiki documents and made sure they displayed correctly.
- Verified feed stories publish as project-related.
- Edited projects, including perfomring a name-colliding edit.
- Created projects, including performing a name-colliding create.
Reviewers: btrahan, jungejason
Reviewed By: btrahan
CC: aran, epriestley, btrahan
Maniphest Tasks: T681
Differential Revision: 1231
2011-12-17 20:58:55 +01:00
|
|
|
echo "Done.\n";
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Rename the project so that it has a unique slug, by appending (2), (3), etc.
|
|
|
|
* to its name.
|
|
|
|
*/
|
|
|
|
function rename_project($project, $projects) {
|
|
|
|
$suffix = 2;
|
|
|
|
while (true) {
|
|
|
|
$new_name = $project->getName().' ('.$suffix.')';
|
|
|
|
$project->setPhrictionSlug($new_name);
|
|
|
|
$new_slug = $project->getPhrictionSlug();
|
|
|
|
|
|
|
|
$okay = true;
|
|
|
|
foreach ($projects as $other) {
|
|
|
|
if ($other->getID() == $project->getID()) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if ($other->getPhrictionSlug() == $new_slug) {
|
|
|
|
$okay = false;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($okay) {
|
|
|
|
break;
|
|
|
|
} else {
|
|
|
|
$suffix++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $new_name;
|
|
|
|
}
|