Как перенести задачи из Google Code в Phabricator

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

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

Как перенести задачи из Google Code в Phabricator?
Только задачи, а не wiki / code / downloads / и т. Д.

Примечание. Я использую Phabricator вместо Github, потому что он подходит для мои требования лучше.


person Nicolas Raoul    schedule 16.03.2015    source источник


Ответы (1)


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

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

Такой код миграции был написан проектом Blender: здесь их репозиторий на момент импорта.

Шаги

  1. Экспорт задач кода Google в формате CSV или JSON
  2. Запустите сценарий Phabricator, чтобы импортировать их, или вызовите API-канал

Экспорт

Google предоставляет некоторые инструменты для выполнения миграции . Эти инструменты включают скрипт issues.py для анализа проблем в коде Google.

При этом вы можете записывать свои проблемы в работоспособном формате, например JSON для хранения массива комментариев.

Импорт через API (лучше всего для самых мелких задач, без комментариев)

Вы можете использовать API и вызывать через канал manifest.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);
    }
}

Статус закрытия задокументирован здесь.

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

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

person Dereckson    schedule 26.04.2015