Предварительного замечание, если вы хотите сохранить идентификаторы задач
Миграция проект может быть облегчен, если мы можем временно изменить Maniphest кода приложения, так как вы не в состоянии контролировать вашу установку, это трудно предложить чистое решение для получения согласованного идентификатора. Итак, во-первых, вы должны контролировать свою установку.
Такой код миграции был написан проектом Blender: here their repository в момент импорта.
шаги
- задач код Экспорт Google в CSV или JSON формате
- Запуск Phabricator скрипт, чтобы импортировать их, или, вызовите API канал
Экспорт
Google предоставляет some tools to perform the migration. Эти инструменты включают скрипт issues.py для анализа проблем в коде Google.
С этим вы можете сбросить свои проблемы в работоспособном формате, например, JSON для хранения массива комментариев.
Импорт через API (лучше всего подходит для маленьких задач, без комментариев)
Вы можете использовать API и вызвать через трубопровод maniphest.createtask. Но это не очень удобно, так как это не самый простой способ, чтобы добавлять комментарии, закрывает вопрос и т.д.
Импорт через скрипт
Это, пожалуй, самый интересный способ для импорта задач, и это решение, предлагающее максимальную гибкость.
Вот скелет такого сценария я разработка из кода Blender и некоторые из моих внутренних кодов:
#!/usr/bin/env php
<?php
$root = dirname(dirname(__FILE__));
require_once $root . '/scripts/__init_script__.php';
/**
* Represents a task importable into Phabricator
*/
class LegacyTask {
private $id;
private $title;
//... other tasks properties, depending the Google Code fields
public function importIntoPhabricator() {
$projects = ......... // we need an array with one or more PHIDs, according what you created
$task = ManiphestTask::initializeNewTask($reporter);
$task->setTitle($title);
$task->attachProjectPHIDs($projects);
$task->setDescription($this->description);
$task->setPriority($this->priority);
$task->setOverrideID($this->id); //This is the method you want to borrow to the Blender migration code
$task->save();
//Initial transaction
$changes = [
ManiphestTransaction::TYPE_STATUS => ManiphestTaskStatus::STATUS_OPEN,
PhabricatorTransactions::TYPE_VIEW_POLICY => 'public'
];
self::applyTransactionsForChanges($task, $changes);
//Closes task
if ($this->closed) {
$status = ... //ManiphestTaskStatus::STATUS_CLOSED_RESOLVED
self::closeTask($task, $status);
}
//Project transaction
self::associateTaskToProject($task, $projects);
//Adds comments
//...
}
static public function getTransactions ($changes) {
$transactions = [];
$template = new ManiphestTransaction();
foreach ($changes as $type => $value) {
$transaction = clone $template;
$transaction->setTransactionType($type);
if ($type == PhabricatorTransactions::TYPE_EDGE) {
$transaction->setMetadataValue('edge:type', PhabricatorProjectObjectHasProjectEdgeType::EDGECONST);
}
$transaction->setNewValue($value);
$transactions[] = $transaction;
}
return $transactions;
}
static public function applyTransactionsForChanges ($task, $changes) {
$transactions = self::getTransactions($changes);
self::applyTransactions($task, $transactions);
}
static public function applyTransactions ($task, $transactions) {
$editor = id(new ManiphestTransactionEditor())
->setActor(self::getReporterUser())
->setContentSource(self::getContentSource())
->setContinueOnNoEffect(true)
->applyTransactions($task, $transactions);
}
static function associateTaskToProject($task, $projects) {
$project_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST;
$transactions = [
id(new ManiphestTransaction())
->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
->setMetadataValue('edge:type', $project_type)
->setNewValue([
'=' => array_fuse($projects)
])
];
self::applyTransactions($task, $transactions);
}
/**
* Closes the task
*/
static public function closeTask ($task, $status) {
$changes = [
ManiphestTransaction::TYPE_STATUS => $status
];
self::applyTransactionsForChanges($task, $changes);
}
}
Закрыть статус задокументирован here.
Он работает лучше всего.
Спросите своих основных разработчиков и ведущих журналистов, если они есть, чтобы создать учетную запись, попытайтесь сопоставить своих пользователей и всех остальных, проблемы с атрибутами и комментарии к учетной записи бота, созданной для миграции.