#!/usr/bin/env php<?php // See <https://secure.phabricator.com/T10350> for discussion.require_once'scripts/__init_script__.php';$args =newPhutilArgumentParser($argv);$args->parseStandardArguments();$args->parse(array(array('name'=>'field','param'=>'key','help'=>pht('Field to migrate.'), ) ));$task =newManiphestTask();$fields =PhabricatorCustomField::getObjectFields( $task,PhabricatorCustomField::ROLE_EDIT);$field_map = $fields->getFields();$field_list =implode(', ', array_keys($field_map));if (!$field_map) {thrownewPhutilArgumentUsageException(pht('You do not have any custom fields defined in Maniphest, so there is '.'nowhere that points can be copied from.'));}$field_key = $args->getArg('field');if (!strlen($field_key)) {thrownewPhutilArgumentUsageException(pht('Use --field to specify which field to copy points from. Available '.'fields are: %s.', $field_list));}$field =idx($field_map, $field_key);if (!$field) {thrownewPhutilArgumentUsageException(pht('Field "%s" is not a valid field. Available fields are: %s.', $field_key, $field_list));}$proxy = $field->getProxy();if (!$proxy) {thrownewPhutilArgumentUsageException(pht('Field "%s" is not a standard custom field, and can not be migrated.', $field_key, $field_list));}if (!($proxy instanceofPhabricatorStandardCustomFieldInt)) {thrownewPhutilArgumentUsageException(pht('Field "%s" is not an "int" field, and can not be migrated.', $field_key, $field_list));}$storage = $field->newStorageObject();$conn_r = $storage->establishConnection('r');$value_rows =queryfx_all( $conn_r,'SELECT objectPHID, fieldValue FROM %T WHERE fieldIndex = %sAND fieldValue IS NOT NULL', $storage->getTableName(), $field->getFieldIndex());$value_map =ipull($value_rows,'fieldValue','objectPHID');$id_rows =queryfx_all( $conn_r,'SELECT phid, id, points FROM %T', $task->getTableName());$id_map =ipull($id_rows,null,'phid');foreach ($value_map as $phid => $value) { $dict =idx($id_map, $phid, array()); $id =idx($dict,'id'); $current_points =idx($dict,'points');if (!$id) {continue; }if ($current_points !==null) {continue; }if ($value ===null) {continue; } $sql =qsprintf( $conn_r,'UPDATE %T.%T SET points = %f WHERE id = %d;','phabricator_maniphest', $task->getTableName(), $value, $id);echo $sql."\n";}
更改權限
chmod+xcopy_points.php
執行
必須要去套件原始檔去看原始的 story point 欄位是什麼,我查到的結果是 isdc:sprint:storypoints,所以修改如下。
另外要注意自己之前輸入 story points 時是否有用到非數字的字元,有的話會出錯,得先去修改。可以在 default_maniphest.maniphest_customfieldstorage 這張資料表去查看。
./copy_points.php--fieldisdc:sprint:storypoints>points.sqlcatpoints.sql# Look at the results and sanity check them.catpoints.sql|mysql-uroot