首页 文章

如何将问题从Google Code移至Phabricator

提问于
浏览
1

Google代码是shutting down所以我想将my 2500 issues移至Phabricator(托管于Phoreplay) .

虽然Github和其他人都有移动程序,但我没有找到Phabricator的类似工具 .

如何将问题从Google Code移至Phabricator?
只有问题,而不是维基/代码/下载/等 .

注意:我使用Phabricator而不是Github,因为它更适合my requirements .

1 回答

  • 2

    Preliminary note if you wish to keep tasks IDs

    如果我们可以临时编辑Maniphest应用程序代码,那么可以促进迁移项目,因为当您无法控制安装时,很难提供一个干净的解决方案来获得一致的ID . 因此,首先,您应该控制您的安装 .

    这样的迁移代码由Blender项目编写:here their repository在导入时刻 .

    The steps

    • 以CSV或JSON格式导出Google代码任务

    • 运行Phabricator脚本以导入它们,或调用API管道

    Export

    Google提供some tools to perform the migration . 这些工具包括用于解析Google代码问题的issues.py脚本 .

    有了它,您可以以可行的格式转储问题,例如JSON来存储注释数组 .

    Import through API (best for smallest tasks, without comments)

    您可以使用API并通过管道maniphest.createtask进行调用 . 但这不是很方便,因为它不是添加注释,关闭问题等的最简单方法 .

    Import through a script

    这可能是导入任务最有趣的方式,这是提供最大灵活性的解决方案 .

    这里是我从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 .

    它效果最好 .

    询问您的核心开发人员和顶级记者是否有任何创建帐户,尝试将其用户以及其他所有人的属性问题和评论归因于为迁移创建的机器人帐户 .

相关问题