2015-03-16 2 views
1

Код Google - shutting down, поэтому я хочу переместить my 2500 issues на номер Phabricator (размещен по адресу Phoreplay).Как переместить проблемы из Google Code в Phabricator

Несмотря на процедуру перемещения для Github и других, мне не удалось найти похожие инструменты для Phabricator.

Как перенести вопросы из Google Code на фабрикатор?
Только проблемы, а не wiki/code/downloads/etc.

Примечание: Я использую Фабрикатор вместо Гитуба, потому что он лучше подходит для my requirements.

ответ

2

Предварительного замечание, если вы хотите сохранить идентификаторы задач

Миграция проект может быть облегчен, если мы можем временно изменить Maniphest кода приложения, так как вы не в состоянии контролировать вашу установку, это трудно предложить чистое решение для получения согласованного идентификатора. Итак, во-первых, вы должны контролировать свою установку.

Такой код миграции был написан проектом Blender: here their repository в момент импорта.

шаги

  1. задач код Экспорт Google в CSV или JSON формате
  2. Запуск 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.

Он работает лучше всего.

Спросите своих основных разработчиков и ведущих журналистов, если они есть, чтобы создать учетную запись, попытайтесь сопоставить своих пользователей и всех остальных, проблемы с атрибутами и комментарии к учетной записи бота, созданной для миграции.

Смежные вопросы