* Finish task #65979,65978,65977.

This commit is contained in:
liyuchun
2022-08-26 14:06:01 +08:00
parent 79c1fe014a
commit 61c88f627c
23 changed files with 176 additions and 74 deletions

View File

@@ -934,6 +934,7 @@ class bug extends control
$this->view->builds = $this->loadModel('build')->getBuildPairs($productID, 'all', ''); $this->view->builds = $this->loadModel('build')->getBuildPairs($productID, 'all', '');
$this->view->preAndNext = $this->loadModel('common')->getPreAndNextObject('bug', $bugID); $this->view->preAndNext = $this->loadModel('common')->getPreAndNextObject('bug', $bugID);
$this->view->product = $product; $this->view->product = $product;
$this->view->linkCommits = $this->loadModel('repo')->getCommitsByObject($bugID, 'bug');
$this->view->projects = array('' => '') + $projects; $this->view->projects = array('' => '') + $projects;

View File

@@ -176,6 +176,7 @@ $lang->bug->labelPostponed = 'Postponed';
$lang->bug->changed = 'Changed'; $lang->bug->changed = 'Changed';
$lang->bug->storyChanged = 'Story Changed'; $lang->bug->storyChanged = 'Story Changed';
$lang->bug->linkMR = 'Related MRs'; $lang->bug->linkMR = 'Related MRs';
$lang->bug->linkCommit = 'Related Commits';
/* Page tags. */ /* Page tags. */
$lang->bug->lblAssignedTo = 'Bearbeiter'; $lang->bug->lblAssignedTo = 'Bearbeiter';

View File

@@ -176,6 +176,7 @@ $lang->bug->labelPostponed = 'Postponed';
$lang->bug->changed = 'Changed'; $lang->bug->changed = 'Changed';
$lang->bug->storyChanged = 'Story Changed'; $lang->bug->storyChanged = 'Story Changed';
$lang->bug->linkMR = 'Related MRs'; $lang->bug->linkMR = 'Related MRs';
$lang->bug->linkCommit = 'Related Commits';
/* Page tags. */ /* Page tags. */
$lang->bug->lblAssignedTo = 'AssignTo'; $lang->bug->lblAssignedTo = 'AssignTo';

View File

@@ -176,6 +176,7 @@ $lang->bug->labelPostponed = 'Postponed';
$lang->bug->changed = 'Changed'; $lang->bug->changed = 'Changed';
$lang->bug->storyChanged = 'Story Changed'; $lang->bug->storyChanged = 'Story Changed';
$lang->bug->linkMR = 'Related MRs'; $lang->bug->linkMR = 'Related MRs';
$lang->bug->linkCommit = 'Related Commits';
/* Page tags. */ /* Page tags. */
$lang->bug->lblAssignedTo = 'Affecté à'; $lang->bug->lblAssignedTo = 'Affecté à';

View File

@@ -172,6 +172,8 @@ $lang->bug->legendComment = 'Ghi chú';
$lang->bug->legendLife = 'Toàn bộ'; $lang->bug->legendLife = 'Toàn bộ';
$lang->bug->legendMisc = 'Khác'; $lang->bug->legendMisc = 'Khác';
$lang->bug->legendRelated = 'Thông tin liên quan'; $lang->bug->legendRelated = 'Thông tin liên quan';
$lang->bug->linkMRs = 'Related MRs';
$lang->bug->linkCommit = 'Related Commits';
/* Button. */ /* Button. */
$lang->bug->buttonConfirm = 'Xác nhận'; $lang->bug->buttonConfirm = 'Xác nhận';

View File

@@ -176,6 +176,7 @@ $lang->bug->labelPostponed = '被延期';
$lang->bug->changed = '已变动'; $lang->bug->changed = '已变动';
$lang->bug->storyChanged = '需求变动'; $lang->bug->storyChanged = '需求变动';
$lang->bug->linkMR = '相关合并请求'; $lang->bug->linkMR = '相关合并请求';
$lang->bug->linkCommit = '相关代码版本';
/* 页面标签。*/ /* 页面标签。*/
$lang->bug->lblAssignedTo = '当前指派'; $lang->bug->lblAssignedTo = '当前指派';

View File

@@ -426,6 +426,19 @@
?> ?>
</td> </td>
</tr> </tr>
<tr>
<th><?php echo $lang->bug->linkCommit;?></th>
<td>
<?php
$canViewRevision = common::hasPriv('repo', 'revision');
foreach($linkCommits as $commit)
{
$revision = substr($commit->revision, 0, 10);
echo ($canViewRevision ? html::a($this->createLink('repo', 'revision', "repoID={$commit->repo}&objectID=0&revision={$commit->revision}"), "$revision {$commit->comment}") : "$revisioin {$commit->comment}") . '<br />';
}
?>
</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@@ -189,7 +189,20 @@ class gitModel extends model
' task:' . join(' ', $objects['tasks']) . ' task:' . join(' ', $objects['tasks']) .
' bug:' . join(',', $objects['bugs'])); ' bug:' . join(',', $objects['bugs']));
if($lastVersion != $version) $this->repo->saveAction2PMS($objects, $log, $this->repoRoot, $repo->encoding, 'git', $accountPairs); if($lastVersion != $version)
{
$this->repo->saveAction2PMS($objects, $log, $this->repoRoot, $repo->encoding, 'git', $accountPairs);
/* Objects link commit. */
foreach($objects as $objectType => $objectIDs)
{
$objectTypeMap = array('stories' => 'story', 'bugs' => 'bug', 'tasks' => 'task');
if(empty($objectIDs) or !isset($objectTypeMap[$objectType])) continue;
$this->post->$objectType = $objectIDs;
$this->repo->link($repo->id, $log->revision, $objectTypeMap[$objectType]);
}
}
} }
else else
{ {

View File

@@ -2539,6 +2539,96 @@ class repoModel extends model
return $output; return $output;
} }
/**
* Get relation by commit.
*
* @param int $repoID
* @param string $commit
* @param string $type story|bug|task
* @access public
* @return array
*/
public function getRelationByCommit($repoID, $commit, $type = '')
{
$relationList = $this->dao->select('t1.BID as id, t1.BType as type')->from(TABLE_RELATION)->alias('t1')
->leftJoin(TABLE_REPOHISTORY)->alias('t2')->on('t1.AID = t2.id')
->where('t2.revision')->eq($commit)
->andWhere('t2.repo')->eq($repoID)
->andWhere('t1.AType')->eq('revision')
->beginIF($type)->andWhere('t1.BType')->eq($type)->fi()
->fetchAll();
$storyIDs = array();
$bugIDs = array();
$taskIDs = array();
foreach($relationList as $relation)
{
if($relation->type == 'story')
{
$storyIDs[] = $relation->id;
}
elseif($relation->type == 'bug')
{
$bugIDs[] = $relation->id;
}
elseif($relation->type == 'task')
{
$taskIDs[] = $relation->id;
}
}
$stories = empty($storyIDs) ? array() : $this->loadModel('story')->getByList($storyIDs);
$bugs = empty($bugIDs) ? array() : $this->loadModel('bug')->getByList($bugIDs);
$tasks = empty($taskIDs) ? array() : $this->loadModel('task')->getByList($taskIDs);
$titleList = array();
foreach($relationList as $key => $relation)
{
if($type) $key = $relation->id;
$titleList[$key] = array(
'id' => $relation->id,
'type' => $relation->type,
'title' => "#$relation->id "
);
if($relation->type == 'story')
{
$story = zget($stories, $relation->id, array());
$titleList[$key]['title'] .= zget($story, 'title', '');
}
elseif($relation->type == 'bug')
{
$bug = zget($bugs, $relation->id, array());
$titleList[$key]['title'] .= zget($bug, 'title', '');
}
elseif($relation->type == 'task')
{
$task = zget($tasks, $relation->id, array());
$titleList[$key]['title'] .= zget($task, 'name', '');
}
}
return $titleList;
}
/**
* Get relation commit.
*
* @param int $objectID
* @param string $objectType story|bug|task
* @access public
* @return array
*/
public function getCommitsByObject($objectID, $objectType)
{
return $this->dao->select('t2.*')->from(TABLE_RELATION)->alias('t1')
->leftJoin(TABLE_REPOHISTORY)->alias('t2')->on('t1.AID = t2.id')
->where('t1.BID')->eq($objectID)
->andWhere('t1.BType')->eq($objectType)
->andWhere('t1.AType')->eq('revision')
->andWhere('t1.relation')->eq('commit')
->fetchAll();
}
/** /**
* Insert delete record. * Insert delete record.
* *
@@ -2621,75 +2711,4 @@ class repoModel extends model
$this->loadModel('setting')->setItem('system.repo.synced', $this->config->repo->synced . ',' . $repoID); $this->loadModel('setting')->setItem('system.repo.synced', $this->config->repo->synced . ',' . $repoID);
} }
/**
* Get relation by commit.
*
* @param int $repoID
* @param string $commit
* @param string $type story|bug|task
* @access public
* @return array
*/
public function getRelationByCommit($repoID, $commit, $type = '')
{
$relationList = $this->dao->select('t1.BID as id, t1.BType as type')->from(TABLE_RELATION)->alias('t1')
->leftJoin(TABLE_REPOHISTORY)->alias('t2')->on('t1.AID = t2.id')
->where('t2.revision')->eq($commit)
->andWhere('t2.repo')->eq($repoID)
->andWhere('t1.AType')->eq('revision')
->beginIF($type)->andWhere('t1.BType')->eq($type)->fi()
->fetchAll();
$storyIDs = array();
$bugIDs = array();
$taskIDs = array();
foreach($relationList as $relation)
{
if($relation->type == 'story')
{
$storyIDs[] = $relation->id;
}
elseif($relation->type == 'bug')
{
$bugIDs[] = $relation->id;
}
elseif($relation->type == 'task')
{
$taskIDs[] = $relation->id;
}
}
$stories = empty($storyIDs) ? array() : $this->loadModel('story')->getByList($storyIDs);
$bugs = empty($bugIDs) ? array() : $this->loadModel('bug')->getByList($bugIDs);
$tasks = empty($taskIDs) ? array() : $this->loadModel('task')->getByList($taskIDs);
$titleList = array();
foreach($relationList as $key => $relation)
{
if($type) $key = $relation->id;
$titleList[$key] = array(
'id' => $relation->id,
'type' => $relation->type,
'title' => "#$relation->id "
);
if($relation->type == 'story')
{
$story = zget($stories, $relation->id, array());
$titleList[$key]['title'] .= zget($story, 'title', '');
}
elseif($relation->type == 'bug')
{
$bug = zget($bugs, $relation->id, array());
$titleList[$key]['title'] .= zget($bug, 'title', '');
}
elseif($relation->type == 'task')
{
$task = zget($tasks, $relation->id, array());
$titleList[$key]['title'] .= zget($task, 'name', '');
}
}
return $titleList;
}
} }

View File

@@ -1248,6 +1248,7 @@ class story extends control
$fromBug = $this->dao->select('id,title')->from(TABLE_BUG)->where('toStory')->eq($storyID)->fetch(); $fromBug = $this->dao->select('id,title')->from(TABLE_BUG)->where('toStory')->eq($storyID)->fetch();
$cases = $this->dao->select('id,title,status,pri')->from(TABLE_CASE)->where('story')->eq($storyID)->andWhere('deleted')->eq(0)->fetchAll(); $cases = $this->dao->select('id,title,status,pri')->from(TABLE_CASE)->where('story')->eq($storyID)->andWhere('deleted')->eq(0)->fetchAll();
$linkedMRs = $this->loadModel('mr')->getLinkedMRPairs($storyID, 'story'); $linkedMRs = $this->loadModel('mr')->getLinkedMRPairs($storyID, 'story');
$linkedCommits = $this->loadModel('repo')->getCommitsByObject($storyID, 'story');
$modulePath = $this->tree->getParents($story->module); $modulePath = $this->tree->getParents($story->module);
$storyModule = empty($story->module) ? '' : $this->tree->getById($story->module); $storyModule = empty($story->module) ? '' : $this->tree->getById($story->module);
$linkedStories = isset($story->linkStoryTitles) ? array_keys($story->linkStoryTitles) : array(); $linkedStories = isset($story->linkStoryTitles) ? array_keys($story->linkStoryTitles) : array();
@@ -1295,6 +1296,7 @@ class story extends control
$this->view->cases = $cases; $this->view->cases = $cases;
$this->view->story = $story; $this->view->story = $story;
$this->view->linkedMRs = $linkedMRs; $this->view->linkedMRs = $linkedMRs;
$this->view->linkedCommits = $linkedCommits;
$this->view->track = $this->story->getTrackByID($story->id); $this->view->track = $this->story->getTrackByID($story->id);
$this->view->users = $this->user->getPairs('noletter'); $this->view->users = $this->user->getPairs('noletter');
$this->view->reviewers = $reviewers; $this->view->reviewers = $reviewers;

View File

@@ -172,6 +172,7 @@ $lang->story->completeRate = 'Completion Rate';
$lang->story->reviewed = 'Reviewed'; $lang->story->reviewed = 'Reviewed';
$lang->story->toBeReviewed = 'To Be Reviewed'; $lang->story->toBeReviewed = 'To Be Reviewed';
$lang->story->linkMR = 'Related MRs'; $lang->story->linkMR = 'Related MRs';
$lang->story->linkCommit = 'Related Commits';
$lang->story->ditto = 'Dito'; $lang->story->ditto = 'Dito';
$lang->story->dittoNotice = 'Die Story gehört nicht zum Projekt wie die vorherige!'; $lang->story->dittoNotice = 'Die Story gehört nicht zum Projekt wie die vorherige!';

View File

@@ -172,6 +172,7 @@ $lang->story->completeRate = 'Completion Rate';
$lang->story->reviewed = 'Reviewed'; $lang->story->reviewed = 'Reviewed';
$lang->story->toBeReviewed = 'To Be Reviewed'; $lang->story->toBeReviewed = 'To Be Reviewed';
$lang->story->linkMR = 'Related MRs'; $lang->story->linkMR = 'Related MRs';
$lang->story->linkCommit = 'Related Commits';
$lang->story->ditto = 'Ditto'; $lang->story->ditto = 'Ditto';
$lang->story->dittoNotice = 'This story is not linked to the same product as the last one is!'; $lang->story->dittoNotice = 'This story is not linked to the same product as the last one is!';

View File

@@ -172,6 +172,7 @@ $lang->story->completeRate = 'Completion Rate';
$lang->story->reviewed = 'Reviewed'; $lang->story->reviewed = 'Reviewed';
$lang->story->toBeReviewed = 'To Be Reviewed'; $lang->story->toBeReviewed = 'To Be Reviewed';
$lang->story->linkMR = 'Related MRs'; $lang->story->linkMR = 'Related MRs';
$lang->story->linkCommit = 'Related Commits';
$lang->story->ditto = 'Idem'; $lang->story->ditto = 'Idem';
$lang->story->dittoNotice = "La story n'est pas associée au même product que la précédente !"; $lang->story->dittoNotice = "La story n'est pas associée au même product que la précédente !";

View File

@@ -165,6 +165,7 @@ $lang->story->completeRate = 'Completion Rate';
$lang->story->reviewed = 'Reviewed'; $lang->story->reviewed = 'Reviewed';
$lang->story->toBeReviewed = 'To Be Reviewed'; $lang->story->toBeReviewed = 'To Be Reviewed';
$lang->story->linkMR = 'Related MRs'; $lang->story->linkMR = 'Related MRs';
$lang->story->linkCommit = 'Related Commits';
$lang->story->ditto = 'Như trên'; $lang->story->ditto = 'Như trên';
$lang->story->dittoNotice = 'Câu chuyện này chưa liên kết tới cùng sản phẩm bởi bởi vì nó là cuối cùng!'; $lang->story->dittoNotice = 'Câu chuyện này chưa liên kết tới cùng sản phẩm bởi bởi vì nó là cuối cùng!';

View File

@@ -172,6 +172,7 @@ $lang->story->completeRate = '完成率';
$lang->story->reviewed = '已评审'; $lang->story->reviewed = '已评审';
$lang->story->toBeReviewed = '待评审'; $lang->story->toBeReviewed = '待评审';
$lang->story->linkMR = '相关合并请求'; $lang->story->linkMR = '相关合并请求';
$lang->story->linkCommit = '相关代码版本';
$lang->story->ditto = '同上'; $lang->story->ditto = '同上';
$lang->story->dittoNotice = "{$lang->SRCommon}与上一{$lang->SRCommon}不属于同一产品!"; $lang->story->dittoNotice = "{$lang->SRCommon}与上一{$lang->SRCommon}不属于同一产品!";

View File

@@ -563,6 +563,29 @@
</ul> </ul>
</td> </td>
</tr> </tr>
<tr>
<th><?php echo $lang->story->linkCommit;?></th>
<td class='pd-0'>
<ul class='list-unstyled'>
<?php
$canViewRevision = common::hasPriv('repo', 'revision');
foreach($linkedCommits as $commit)
{
$revision = substr($commit->revision, 0, 10);
$commitTitle = $revision . ' ' . $commit->comment;
if($canViewRevision)
{
echo "<li title='$commitTitle'>" . html::a($this->createLink('repo', 'revision', "repoID={$commit->repo}&objectID=0&revision={$commit->revision}"), "$commitTitle") . '</li>';
}
else
{
echo "<li title='$commitTitle'>" . "$commitTitle" . '</li>';
}
}
?>
</ul>
</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>

View File

@@ -993,6 +993,7 @@ class task extends control
$this->view->product = $this->tree->getProduct($task->module); $this->view->product = $this->tree->getProduct($task->module);
$this->view->modulePath = $this->tree->getParents($task->module); $this->view->modulePath = $this->tree->getParents($task->module);
$this->view->linkMRTitles = $this->loadModel('mr')->getLinkedMRPairs($taskID, 'task'); $this->view->linkMRTitles = $this->loadModel('mr')->getLinkedMRPairs($taskID, 'task');
$this->view->linkCommits = $this->loadModel('repo')->getCommitsByObject($taskID, 'task');
$this->display(); $this->display();
} }

View File

@@ -170,6 +170,7 @@ $lang->task->noClosed = 'Niht geschlossen';
$lang->task->yesterdayFinished = 'Gestern abgeschlossen'; $lang->task->yesterdayFinished = 'Gestern abgeschlossen';
$lang->task->allTasks = 'Alle Aufgaben'; $lang->task->allTasks = 'Alle Aufgaben';
$lang->task->linkMR = 'Related MRs'; $lang->task->linkMR = 'Related MRs';
$lang->task->linkCommit = 'Related Commits';
$lang->task->statusList[''] = ''; $lang->task->statusList[''] = '';
$lang->task->statusList['wait'] = 'Wartend'; $lang->task->statusList['wait'] = 'Wartend';

View File

@@ -170,6 +170,7 @@ $lang->task->noClosed = 'Unclosed';
$lang->task->yesterdayFinished = 'Task Finished Yesterday'; $lang->task->yesterdayFinished = 'Task Finished Yesterday';
$lang->task->allTasks = 'Task'; $lang->task->allTasks = 'Task';
$lang->task->linkMR = 'Related MRs'; $lang->task->linkMR = 'Related MRs';
$lang->task->linkCommit = 'Related Commits';
$lang->task->statusList[''] = ''; $lang->task->statusList[''] = '';
$lang->task->statusList['wait'] = 'Waiting'; $lang->task->statusList['wait'] = 'Waiting';

View File

@@ -170,6 +170,7 @@ $lang->task->noClosed = 'Non Fermées';
$lang->task->yesterdayFinished = 'Tâche Terminée Hier'; $lang->task->yesterdayFinished = 'Tâche Terminée Hier';
$lang->task->allTasks = 'Tâche'; $lang->task->allTasks = 'Tâche';
$lang->task->linkMR = 'Related MRs'; $lang->task->linkMR = 'Related MRs';
$lang->task->linkCommit = 'Related Commits';
$lang->task->statusList[''] = ''; $lang->task->statusList[''] = '';
$lang->task->statusList['wait'] = 'A Faire'; $lang->task->statusList['wait'] = 'A Faire';
@@ -354,4 +355,4 @@ $lang->taskestimate = new stdclass();
$lang->taskestimate->consumed = 'Estimés'; $lang->taskestimate->consumed = 'Estimés';
$lang->task->overEsStartDate = 'The %s schedule start time has exceeded, please modify the %s schedule start time first'; $lang->task->overEsStartDate = 'The %s schedule start time has exceeded, please modify the %s schedule start time first';
$lang->task->overEsEndDate = 'The %s schedule end time has exceeded, please modify the %s schedule end time first'; $lang->task->overEsEndDate = 'The %s schedule end time has exceeded, please modify the %s schedule end time first';

View File

@@ -142,6 +142,8 @@ $lang->task->noFinished = 'Chưa kết thúc';
$lang->task->noClosed = 'Chưa đóng'; $lang->task->noClosed = 'Chưa đóng';
$lang->task->yesterdayFinished = 'Kết thúc hôm qua'; $lang->task->yesterdayFinished = 'Kết thúc hôm qua';
$lang->task->allTasks = 'Nhiệm vụ'; $lang->task->allTasks = 'Nhiệm vụ';
$lang->task->linkMR = 'Related MRs';
$lang->task->linkCommit = 'Related Commits';
$lang->task->statusList[''] = ''; $lang->task->statusList[''] = '';
$lang->task->statusList['wait'] = 'Đang đợi'; $lang->task->statusList['wait'] = 'Đang đợi';

View File

@@ -170,6 +170,7 @@ $lang->task->noClosed = '未关闭';
$lang->task->yesterdayFinished = '昨日完成任务数'; $lang->task->yesterdayFinished = '昨日完成任务数';
$lang->task->allTasks = '总任务'; $lang->task->allTasks = '总任务';
$lang->task->linkMR = '相关合并请求'; $lang->task->linkMR = '相关合并请求';
$lang->task->linkCommit = '相关代码版本';
$lang->task->statusList[''] = ''; $lang->task->statusList[''] = '';
$lang->task->statusList['wait'] = '未开始'; $lang->task->statusList['wait'] = '未开始';
@@ -354,4 +355,4 @@ $lang->taskestimate = new stdclass();
$lang->taskestimate->consumed = '工时'; $lang->taskestimate->consumed = '工时';
$lang->task->overEsStartDate = '已超出%s计划开始时间请先修改%s计划开始时间'; $lang->task->overEsStartDate = '已超出%s计划开始时间请先修改%s计划开始时间';
$lang->task->overEsEndDate = '已超出%s计划结束时间请先修改%s计划结束时间'; $lang->task->overEsEndDate = '已超出%s计划结束时间请先修改%s计划结束时间';

View File

@@ -419,6 +419,19 @@
?> ?>
</td> </td>
</tr> </tr>
<tr>
<th class='MRThWidth'><?php echo $lang->task->linkCommit;?></th>
<td>
<?php
$canViewRevision = common::hasPriv('repo', 'revision');
foreach($linkCommits as $commit)
{
$revision = substr($commit->revision, 0, 10);
echo ($canViewRevision ? html::a($this->createLink('repo', 'revision', "repoID={$commit->repo}&objectID=0&revision={$commit->revision}"), "$revision {$commit->comment}") : "$revisioin {$commit->comment}") . '<br />';
}
?>
</td>
</tr>
</table> </table>
</div> </div>
</div> </div>