diff --git a/module/gitlab/config.php b/module/gitlab/config.php index b3b54f5ebe..4f3117f015 100644 --- a/module/gitlab/config.php +++ b/module/gitlab/config.php @@ -37,6 +37,7 @@ $config->gitlab->maps->task['lastEditedDate'] = 'updated_at|field|'; $config->gitlab->maps->task['deadline'] = 'due_date|field|'; $config->gitlab->maps->task['status'] = 'state|configItems|taskStateMap'; $config->gitlab->maps->task['pri'] = 'weight|configItems|taskWeightMap'; +$config->gitlab->maps->task['lastEditedBy'] = 'updated_by_id|userPairs|'; $config->gitlab->maps->story = array(); $config->gitlab->maps->story['title'] = 'title|field|'; @@ -51,6 +52,7 @@ $config->gitlab->maps->bug['title'] = 'title|field|'; $config->gitlab->maps->bug['steps'] = 'description|field|'; $config->gitlab->maps->bug['openedDate'] = 'created_at|field|'; $config->gitlab->maps->bug['assignedTo'] = 'assignee_id|userPairs|'; +$config->gitlab->maps->bug['status'] = 'state|configItems|bugStateMap'; $config->gitlab->maps->bug['pri'] = 'weight|configItems|bugWeightMap'; $config->gitlab->taskWeightMap = array(); @@ -59,11 +61,11 @@ $config->gitlab->taskWeightMap['2'] = '2'; $config->gitlab->taskWeightMap['3'] = '3'; $config->gitlab->taskStateMap = array(); -$config->gitlab->taskStateMap['doing'] = 'reopen'; -$config->gitlab->taskStateMap['wait'] = 'reopen'; -$config->gitlab->taskStateMap['done'] = 'close'; -$config->gitlab->taskStateMap['cancel'] = 'close'; -$config->gitlab->taskStateMap['closed'] = 'close'; +$config->gitlab->taskStateMap['doing'] = 'opened'; +$config->gitlab->taskStateMap['wait'] = 'opened'; +$config->gitlab->taskStateMap['closed'] = 'closed'; +$config->gitlab->taskStateMap['done'] = 'closed'; +$config->gitlab->taskStateMap['cancel'] = 'closed'; $config->gitlab->taskTypesToSync = 'design,devel,request,discuss,ui,affair,misc'; @@ -79,9 +81,9 @@ $config->gitlab->bugWeightMap['3'] = '3'; $config->gitlab->bugWeightMap['4'] = '4'; $config->gitlab->bugStateMap = array(); -$config->gitlab->bugStateMap['active'] = 'reopen'; -$config->gitlab->bugStateMap['resolved'] = 'reopen'; -$config->gitlab->bugStateMap['closed'] = 'close'; +$config->gitlab->bugStateMap['active'] = 'opened'; +$config->gitlab->bugStateMap['resolved'] = 'closed'; +$config->gitlab->bugStateMap['closed'] = 'closed'; $config->gitlab->objectTables = new stdclass; $config->gitlab->objectTables->story = TABLE_STORY; diff --git a/module/gitlab/model.php b/module/gitlab/model.php index 568d05c41f..1c91b29c8a 100644 --- a/module/gitlab/model.php +++ b/module/gitlab/model.php @@ -550,7 +550,7 @@ class gitlabModel extends model } /** - * Sync task to gitlab issue. + * Push task to gitlab issue. * * @param int $taskID * @param int $gitlab @@ -558,20 +558,32 @@ class gitlabModel extends model * @access public * @return void */ - public function syncTask($taskID, $gitlab, $gitlabProject) + public function pushTask($taskID, $gitlab, $gitlabProject) { $task = $this->loadModel('task')->getByID($taskID); + + if(!$gitlabID or !$projectID) + { + $result = $this->getGitlabIDprojectID('task', $taskID); + $gitlabID = $result->gitlabID; + $projectID = $result->projectID; + } + $syncedIssue = $this->getSyncedIssue($objectType = 'task', $objectID = $taskID, $gitlab); $issue = $this->taskToIssue($gitlab, $gitlabProject, $task); - $this->createZentaoObjectLabel($gitlab, $gitlabProject, 'task', $taskID); - $issue->labels = sprintf($this->config->gitlab->zentaoObjectLabel->name, 'task', $taskID); - - if($syncedIssue) $issue = $this->apiUpdateIssue($gitlab, $gitlabProject, $syncedIssue, $issue); - $issue = $this->apiCreateIssue($gitlab, $gitlabProject, $issue); - - $this->saveSyncedIssue('task', $task, $gitlab, $issue); + if($syncedIssue) + { + $issue = $this->apiUpdateIssue($gitlab, $gitlabProject, $syncedIssue, $issue); + } + else + { + $this->createZentaoObjectLabel($gitlab, $gitlabProject, 'task', $taskID); + $issue->labels = sprintf($this->config->gitlab->zentaoObjectLabel->name, 'task', $taskID); + $issue = $this->apiCreateIssue($gitlab, $gitlabProject, $issue); + $this->saveSyncedIssue('task', $task, $gitlab, $issue); + } } /** @@ -612,7 +624,7 @@ class gitlabModel extends model } /** - * Sync bug to gitlab issue. + * Push bug to gitlab issue. * * @param int $bugID * @param int $gitlab @@ -620,19 +632,31 @@ class gitlabModel extends model * @access public * @return void */ - public function syncBug($bugID, $gitlab, $gitlabProject) + public function pushBug($bugID, $gitlab, $gitlabProject) { $bug = $this->loadModel('bug')->getByID($bugID); + if(!$gitlabID or !$projectID) + { + $result = $this->getGitlabIDprojectID('bug', $bugID); + $gitlabID = $result->gitlabID; + $projectID = $result->projectID; + } + $syncedIssue = $this->getSyncedIssue($objectType = 'bug', $objectID = $bugID, $gitlab); $issue = $this->bugToIssue($gitlab, $gitlabProject, $bug); - $this->createZentaoObjectLabel($gitlab, $gitlabProject, 'bug', $bugID); - $issue->labels = sprintf($this->config->gitlab->zentaoObjectLabel->name, 'bug', $bugID); - - if($syncedIssue) $issue = $this->apiUpdateIssue($gitlab, $gitlabProject, $syncedIssue, $issue); - $issue = $this->apiCreateIssue($gitlab, $gitlabProject, $issue); - if($issue) $this->saveSyncedIssue('bug', $bug, $gitlab, $issue); + if($syncedIssue) + { + $issue = $this->apiUpdateIssue($gitlab, $gitlabProject, $syncedIssue, $issue); + } + else + { + $this->createZentaoObjectLabel($gitlab, $gitlabProject, 'bug', $bugID); + $issue->labels = sprintf($this->config->gitlab->zentaoObjectLabel->name, 'bug', $bugID); + $issue = $this->apiCreateIssue($gitlab, $gitlabProject, $issue); + if($issue) $this->saveSyncedIssue('bug', $bug, $gitlab, $issue); + } } /** @@ -911,20 +935,6 @@ class gitlabModel extends model commonModel::http($url, $options = array(CURLOPT_CUSTOMREQUEST => 'DELETE')); } - public function pushTask($gitlabID, $projectID, $task) - { - $task->label = $this->config->gitlab->taskLabel->name; - $response = $this->apiCreateIssue($gitlabID, $projectID, $task); - return $response; - } - - public function pushBug($gitlabID, $projectID, $bug) - { - $bug->label = $this->config->gitlab->bugLabel->name; - $response = $this->apiCreateIssue($gitlabID, $projectID, $bug); - return $response; - } - /** * webhook check token. * @@ -973,12 +983,12 @@ class gitlabModel extends model $issue->issue->objectType = $object->type; $issue->issue->objectID = $object->id; - + /* Parse markdown description to html. */ $issue->issue->description = $this->app->loadClass('hyperdown')->makeHtml($issue->issue->description); if(!isset($this->config->gitlab->maps->{$object->type})) return false; - $issue->object = $this->issueToZentaoObject($issue->issue, $gitlabID); + $issue->object = $this->issueToZentaoObject($issue->issue, $gitlabID, $body->changes); return $issue; } @@ -1025,7 +1035,6 @@ class gitlabModel extends model { $tableName = zget($this->config->gitlab->objectTables, $issue->objectType, ''); if($tableName) $this->dao->update($tableName)->data($issue->object)->where('id')->eq($issue->objectID)->exec(); - a($this->dao->get());exit; return !dao::isError(); } @@ -1053,6 +1062,51 @@ class gitlabModel extends model return $object; } + /** + * Process webhook issue assign option. + * + * @param int $gitlabID + * @param object $issue + * @access public + * @return void + */ + public function webhookIssueAssign($gitlabID, $issue) + { + $gitlabUsers = $this->getUserIdAccountPairs($gitlabID); + if($issue->objectType == 'task') + { + $oldTask = $this->loadModel('task')->getByID($issue->objectID); + $_POST['left'] = $oldTask->left; + $_POST['lastEditedBy'] = $issue->object->lastEditedBy; + $_POST['lastEditedDate'] = $issue->object->lastEditedDate; + $_POST['assignedDate'] = $issue->object->lastEditedDate; + $_POST['assignedBy'] = $issue->object->lastEditedBy; + $this->task->assign($issue->objectID); + } + + if($issue->objectType == 'bug') + { + $oldBug = $this->loadModel('bug')->getByID($issue->objectID); + $_POST['lastEditedBy'] = $issue->object->lastEditedBy; + $_POST['lastEditedDate'] = $issue->object->lastEditedDate; + $_POST['assignedDate'] = $issue->object->lastEditedDate; + $_POST['assignedBy'] = $issue->object->lastEditedBy; + $this->bug->assign($issue->objectID); + } + + if($issue->objectType == 'story') + { + $oldBug = $this->loadModel('story')->getByID($issue->objectID); + $_POST['lastEditedBy'] = $issue->object->lastEditedBy; + $_POST['lastEditedDate'] = $issue->object->lastEditedDate; + $_POST['assignedDate'] = $issue->object->lastEditedDate; + $_POST['assignedBy'] = $issue->object->lastEditedBy; + $this->story->assign($issue->objectID); + } + + + } + /** * Parse issue to zentao object. * @@ -1061,7 +1115,7 @@ class gitlabModel extends model * @access public * @return object */ - public function issueToZentaoObject($issue, $gitlabID) + public function issueToZentaoObject($issue, $gitlabID, $changes = null) { if(!isset($this->config->gitlab->maps->{$issue->objectType})) return null; @@ -1074,6 +1128,7 @@ class gitlabModel extends model { $value = ''; list($gitlabField, $optionType, $options) = explode('|', $config); + if(!isset($changes->gitlabField)) continue; if($optionType == 'field') $value = $issue->$gitlabField; if($optionType == 'field') $value = $issue->$gitlabField; if($optionType == 'userPairs') $value = zget($gitlabUsers, $issue->$gitlabField); diff --git a/module/task/model.php b/module/task/model.php index 153047c1e0..300d3e3c68 100644 --- a/module/task/model.php +++ b/module/task/model.php @@ -122,7 +122,7 @@ class taskModel extends model $taskID = $this->dao->lastInsertID(); /* Sync this task to gitlab issue. */ - $this->loadModel('gitlab')->syncTask($taskID, $this->post->gitlab, $this->post->gitlabProject); + $this->loadModel('gitlab')->pushTask($taskID, $this->post->gitlab, $this->post->gitlabProject); /* Mark design version.*/ if(isset($task->design) && !empty($task->design))