This commit is contained in:
reneeteng
2020-03-12 16:16:15 +08:00
82 changed files with 2482 additions and 303 deletions
+8 -1
View File
@@ -503,7 +503,14 @@ class actionModel extends model
if(empty($actionID)) return false;
foreach($changes as $change)
{
$change['action'] = $actionID;
if(is_object($change))
{
$change->action = $actionID;
}
else
{
$change['action'] = $actionID;
}
$this->dao->insert(TABLE_HISTORY)->data($change)->exec();
}
}
+1 -1
View File
@@ -154,7 +154,7 @@ $lang->bug->lblLastEdited = '最後修改';
$lang->bug->lblResolved = '由誰解決';
$lang->bug->allUsers = '加載所有用戶';
$lang->bug->allBuilds = '所有';
$lang->bug->createBuild = '创建';
$lang->bug->createBuild = '創建';
/* legend列表。*/
$lang->bug->legendBasicInfo = '基本信息';
+6
View File
@@ -0,0 +1,6 @@
<?php
$lang->ci->common = 'CI';
$lang->ci->job = 'Construction';
$lang->ci->task = 'Task';
$lang->ci->history = 'History';
+6
View File
@@ -0,0 +1,6 @@
<?php
$lang->ci->common = 'CI';
$lang->ci->job = 'Construction';
$lang->ci->task = 'Task';
$lang->ci->history = 'History';
+6
View File
@@ -0,0 +1,6 @@
<?php
$lang->ci->common = '持續整合';
$lang->ci->job = '構建';
$lang->ci->task = '構建任務';
$lang->ci->history = '構建歷史';
+1
View File
@@ -37,6 +37,7 @@ class ciModel extends model
->leftJoin(TABLE_JENKINS)->alias('t3')->on('t2.jkHost=t3.id')
->where('t1.status')->ne('success')
->andWhere('t1.status')->ne('fail')
->andWhere('t1.status')->ne('create_fail')
->andWhere('t1.status')->ne('timeout')
->andWhere('t1.createdDate')->gt(date(DT_DATETIME1, strtotime("-1 day")))
->fetchAll();
+24 -6
View File
@@ -101,6 +101,7 @@ $lang->loading = 'Lade...';
$lang->notFound = 'Nicht gefunden!';
$lang->notPage = 'Sorry, the features you are visiting are in development!';
$lang->showAll = '[[Alle anzeigen]]';
$lang->selectedItems = 'Seleted <strong>{0}</strong> items';
$lang->future = 'Warte';
$lang->year = 'Jahr';
@@ -122,7 +123,7 @@ $lang->menu->my = '<span>Dashboard</span>|my|index';
$lang->menu->product = $lang->productCommon . '|product|index|locate=no';
$lang->menu->project = $lang->projectCommon . '|project|index|locate=no';
$lang->menu->qa = 'Test|qa|index';
$lang->menu->repo = 'Code|repo|log';
$lang->menu->ci = 'CI|repo|browse';
$lang->menu->doc = 'Dokumente|doc|index';
$lang->menu->report = 'Berichte|report|index';
$lang->menu->company = 'Unternehmen|company|index';
@@ -331,11 +332,22 @@ $lang->caselib->menu->testsuite = array('link' => 'Suite|testsuite|browse|');
$lang->caselib->menu->report = array('link' => 'Berichte|testreport|browse|');
$lang->caselib->menu->caselib = array('link' => 'Bibliothek|caselib|browse|libID=%s', 'alias' => 'create,createcase,view,edit,batchcreatecase,showimport', 'subModule' => 'tree,testcase');
$lang->repo = new stdclass();
$lang->repo->menu = new stdclass();
$lang->repo->menu->browse = array('link' =>'Browse|repo|log|repoID=%s&entry=', 'alias' => 'diff,view,revision,showsynccomment');
$lang->repo->menu->settings = 'Settings|repo|settings|repoID=%s';
$lang->repo->menu->delete = array('link' => 'Delete|repo|delete|repoID=%s', 'target' => 'hiddenwin');
$lang->ci = new stdclass();
$lang->ci->menu = new stdclass();
$lang->ci->menu->code = array('link' => 'Code|repo|browse|repoID=%s', 'alias' => 'diff,view,revision,log,blame,showsynccomment');
$lang->ci->menu->build = array('link' => 'Build|job|browse', 'subModule' => 'compile,job');
$lang->ci->menu->jenkins = array('link' => 'Jenkins|jenkins|browse', 'alias' => 'create,edit');
$lang->ci->menu->maintain = array('link' => 'Repo|repo|maintain', 'alias' => 'create,edit');
$lang->ci->menu->rules = array('link' => 'Rule|repo|setrules');
$lang->repo = new stdclass();
$lang->jenkins = new stdclass();
$lang->compile = new stdclass();
$lang->job = new stdclass();
$lang->repo->menu = $lang->ci->menu;
$lang->jenkins->menu = $lang->ci->menu;
$lang->compile->menu = $lang->ci->menu;
$lang->job->menu = $lang->ci->menu;
/* 文档视图菜单设置。*/
$lang->doc = new stdclass();
@@ -475,6 +487,11 @@ $lang->menugroup->entry = 'admin';
$lang->menugroup->webhook = 'admin';
$lang->menugroup->message = 'admin';
$lang->menugroup->repo = 'ci';
$lang->menugroup->jenkins = 'ci';
$lang->menugroup->compile = 'ci';
$lang->menugroup->job = 'ci';
/* 错误提示信息。*/
$lang->error = new stdclass();
$lang->error->companyNotFound = "The domain %s cannot be found!";
@@ -501,6 +518,7 @@ $lang->error->pasteImg = 'Image is not allowed to be pasted in your brows
$lang->error->noData = 'No Data';
$lang->error->editedByOther = 'This record might have been changed. Please refresh and try to edit again!';
$lang->error->tutorialData = 'No data can be imported in tutorial mode. Please exit tutorial first!';
$lang->error->noCurlExt = 'No Curl module installed';
/* 分页信息。*/
$lang->pager = new stdclass();
+4 -2
View File
@@ -487,8 +487,10 @@ $lang->menugroup->entry = 'admin';
$lang->menugroup->webhook = 'admin';
$lang->menugroup->message = 'admin';
$lang->menugroup->repo = 'ci';
$lang->menugroup->jenkins = 'ci';
$lang->menugroup->repo = 'ci';
$lang->menugroup->jenkins = 'ci';
$lang->menugroup->compile = 'ci';
$lang->menugroup->job = 'ci';
/* Error info. */
$lang->error = new stdclass();
+24 -6
View File
@@ -101,6 +101,7 @@ $lang->loading = 'Chargement...';
$lang->notFound = 'Not found !';
$lang->notPage = 'Désolé, la fonctionnalité que vous souhaitez utiliser est encore en développement !';
$lang->showAll = '[[Voir Tout]]';
$lang->selectedItems = 'Seleted <strong>{0}</strong> items';
$lang->future = 'En Attente';
$lang->year = 'Année';
@@ -122,7 +123,7 @@ $lang->menu->my = '<span>Dashboard</span>|my|index';
$lang->menu->product = $lang->productCommon . '|product|index|locate=no';
$lang->menu->project = $lang->projectCommon . '|project|index|locate=no';
$lang->menu->qa = 'Test|qa|index';
$lang->menu->repo = 'Code|repo|log';
$lang->menu->ci = 'CI|repo|browse';
$lang->menu->doc = 'Doc|doc|index';
$lang->menu->report = 'Rapports|report|index';
$lang->menu->company = 'Entreprise|company|index';
@@ -331,11 +332,22 @@ $lang->caselib->menu->testsuite = array('link' => 'Cahier Recette|testsuite|brow
$lang->caselib->menu->report = array('link' => 'Rapport|testreport|browse|');
$lang->caselib->menu->caselib = array('link' => 'Library Recette|caselib|browse|libID=%s', 'alias' => 'create,createcase,view,edit,batchcreatecase,showimport', 'subModule' => 'tree,testcase');
$lang->repo = new stdclass();
$lang->repo->menu = new stdclass();
$lang->repo->menu->browse = array('link' =>'Browse|repo|log|repoID=%s&entry=', 'alias' => 'diff,view,revision,showsynccomment');
$lang->repo->menu->settings = 'Settings|repo|settings|repoID=%s';
$lang->repo->menu->delete = array('link' => 'Delete|repo|delete|repoID=%s', 'target' => 'hiddenwin');
$lang->ci = new stdclass();
$lang->ci->menu = new stdclass();
$lang->ci->menu->code = array('link' => 'Code|repo|browse|repoID=%s', 'alias' => 'diff,view,revision,log,blame,showsynccomment');
$lang->ci->menu->build = array('link' => 'Build|job|browse', 'subModule' => 'compile,job');
$lang->ci->menu->jenkins = array('link' => 'Jenkins|jenkins|browse', 'alias' => 'create,edit');
$lang->ci->menu->maintain = array('link' => 'Repo|repo|maintain', 'alias' => 'create,edit');
$lang->ci->menu->rules = array('link' => 'Rule|repo|setrules');
$lang->repo = new stdclass();
$lang->jenkins = new stdclass();
$lang->compile = new stdclass();
$lang->job = new stdclass();
$lang->repo->menu = $lang->ci->menu;
$lang->jenkins->menu = $lang->ci->menu;
$lang->compile->menu = $lang->ci->menu;
$lang->job->menu = $lang->ci->menu;
/* Doc menu settings. */
$lang->doc = new stdclass();
@@ -475,6 +487,11 @@ $lang->menugroup->entry = 'admin';
$lang->menugroup->webhook = 'admin';
$lang->menugroup->message = 'admin';
$lang->menugroup->repo = 'ci';
$lang->menugroup->jenkins = 'ci';
$lang->menugroup->compile = 'ci';
$lang->menugroup->job = 'ci';
/* Error info. */
$lang->error = new stdclass();
$lang->error->companyNotFound = "The domain %s cannot be found!";
@@ -501,6 +518,7 @@ $lang->error->pasteImg = 'Images are not allowed to be pasted in your bro
$lang->error->noData = 'No data.';
$lang->error->editedByOther = 'This record might have been changed. Please refresh and try to edit again!';
$lang->error->tutorialData = 'No data can be imported in tutorial mode. Please quit tutorial first!';
$lang->error->noCurlExt = 'No Curl module installed';
/* Page info. */
$lang->pager = new stdclass();
+25 -7
View File
@@ -101,6 +101,7 @@ $lang->loading = '稍候...';
$lang->notFound = '抱歉,您訪問的對象並不存在!';
$lang->notPage = '抱歉,您訪問的功能正在開發中!';
$lang->showAll = '[[全部顯示]]';
$lang->selectedItems = '已選擇 <strong>{0}</strong> 項';
$lang->future = '未來';
$lang->year = '年';
@@ -122,7 +123,7 @@ $lang->menu->my = '<span> 我的地盤</span>|my|index';
$lang->menu->product = $lang->productCommon . '|product|index|locate=no';
$lang->menu->project = $lang->projectCommon . '|project|index|locate=no';
$lang->menu->qa = '測試|qa|index';
$lang->menu->repo = '代碼|repo|log';
$lang->menu->ci = '整合|repo|browse';
$lang->menu->doc = '文檔|doc|index';
$lang->menu->report = '統計|report|index';
$lang->menu->company = '組織|company|index';
@@ -331,11 +332,22 @@ $lang->caselib->menu->testsuite = array('link' => '套件|testsuite|browse|');
$lang->caselib->menu->report = array('link' => '報告|testreport|browse|');
$lang->caselib->menu->caselib = array('link' => '用例庫|caselib|browse|libID=%s', 'alias' => 'create,createcase,view,edit,batchcreatecase,showimport', 'subModule' => 'tree,testcase');
$lang->repo = new stdclass();
$lang->repo->menu = new stdclass();
$lang->repo->menu->browse = array('link' =>'瀏覽|repo|log|repoID=%s&entry=', 'alias' => 'diff,view,revision,showsynccomment');
$lang->repo->menu->settings = '設置|repo|settings|repoID=%s';
$lang->repo->menu->delete = array('link' => '刪除|repo|delete|repoID=%s', 'target' => 'hiddenwin');
$lang->ci = new stdclass();
$lang->ci->menu = new stdclass();
$lang->ci->menu->code = array('link' => '代碼|repo|browse|repoID=%s', 'alias' => 'diff,view,revision,log,blame,showsynccomment');
$lang->ci->menu->build = array('link' => '構建|job|browse', 'subModule' => 'compile,job');
$lang->ci->menu->jenkins = array('link' => 'Jenkins|jenkins|browse', 'alias' => 'create,edit');
$lang->ci->menu->maintain = array('link' => '版本庫|repo|maintain', 'alias' => 'create,edit');
$lang->ci->menu->rules = array('link' => '指令|repo|setrules');
$lang->repo = new stdclass();
$lang->jenkins = new stdclass();
$lang->compile = new stdclass();
$lang->job = new stdclass();
$lang->repo->menu = $lang->ci->menu;
$lang->jenkins->menu = $lang->ci->menu;
$lang->compile->menu = $lang->ci->menu;
$lang->job->menu = $lang->ci->menu;
/* 文檔視圖菜單設置。*/
$lang->doc = new stdclass();
@@ -381,7 +393,7 @@ $lang->admin->menu = new stdclass();
$lang->admin->menu->index = array('link' => '首頁|admin|index', 'alias' => 'register,certifytemail,certifyztmobile,ztcompany');
$lang->admin->menu->message = array('link' => '通知|message|index', 'subModule' => 'message,mail,webhook');
$lang->admin->menu->custom = array('link' => '自定義|custom|set', 'subModule' => 'custom');
$lang->admin->menu->sso = array('link' => '整合|admin|sso');
$lang->admin->menu->sso = array('link' => '整合|admin|sso', 'subModule' => '');
$lang->admin->menu->extension = array('link' => '插件|extension|browse', 'subModule' => 'extension');
$lang->admin->menu->dev = array('link' => '二次開發|dev|api', 'alias' => 'db', 'subModule' => 'dev,entry');
$lang->admin->menu->translate = array('link' => '翻譯|dev|translate');
@@ -475,6 +487,11 @@ $lang->menugroup->entry = 'admin';
$lang->menugroup->webhook = 'admin';
$lang->menugroup->message = 'admin';
$lang->menugroup->repo = 'ci';
$lang->menugroup->jenkins = 'ci';
$lang->menugroup->compile = 'ci';
$lang->menugroup->job = 'ci';
/* 錯誤提示信息。*/
$lang->error = new stdclass();
$lang->error->companyNotFound = "您訪問的域名 %s 沒有對應的公司。";
@@ -501,6 +518,7 @@ $lang->error->pasteImg = '您的瀏覽器不支持粘貼圖片!';
$lang->error->noData = '沒有數據';
$lang->error->editedByOther = '該記錄可能已經被改動。請刷新頁面重新編輯!';
$lang->error->tutorialData = '新手模式下不會插入數據,請退出新手模式操作';
$lang->error->noCurlExt = '伺服器未安裝Curl模組。';
/* 分頁信息。*/
$lang->pager = new stdclass();
+16
View File
@@ -0,0 +1,16 @@
<?php
$lang->compile->common = 'Build';
$lang->compile->browse = 'Build Histories';
$lang->compile->logs = 'Build Logs';
$lang->compile->id = 'ID';
$lang->compile->name = 'Name';
$lang->compile->status = 'Build Status';
$lang->compile->time = 'Build Time';
$lang->compile->statusList['success'] = 'Success';
$lang->compile->statusList['failure'] = 'Fail';
$lang->compile->statusList['created'] = 'Created';
$lang->compile->statusList['building'] = 'Building';
$lang->compile->statusList['create_fail'] = 'Fail to create';
$lang->compile->statusList['timeout'] = 'Exec Timeout';
+1
View File
@@ -1,4 +1,5 @@
<?php
$lang->compile->common = 'Build';
$lang->compile->browse = 'Build History';
$lang->compile->logs = 'Build Log';
+16
View File
@@ -0,0 +1,16 @@
<?php
$lang->compile->common = 'Build';
$lang->compile->browse = 'Build Histories';
$lang->compile->logs = 'Build Logs';
$lang->compile->id = 'ID';
$lang->compile->name = 'Name';
$lang->compile->status = 'Build Status';
$lang->compile->time = 'Build Time';
$lang->compile->statusList['success'] = 'Success';
$lang->compile->statusList['failure'] = 'Fail';
$lang->compile->statusList['created'] = 'Created';
$lang->compile->statusList['building'] = 'Building';
$lang->compile->statusList['create_fail'] = 'Fail to create';
$lang->compile->statusList['timeout'] = 'Exec Timeout';
+1
View File
@@ -1,4 +1,5 @@
<?php
$lang->compile->common = '构建';
$lang->compile->browse = '构建历史';
$lang->compile->logs = '构建日志';
+16
View File
@@ -0,0 +1,16 @@
<?php
$lang->compile->common = '構建';
$lang->compile->browse = '構建歷史';
$lang->compile->logs = '構建日誌';
$lang->compile->id = 'ID';
$lang->compile->name = '構建名稱';
$lang->compile->status = '構建狀態';
$lang->compile->time = '構建時間';
$lang->compile->statusList['success'] = '成功';
$lang->compile->statusList['failure'] = '失敗';
$lang->compile->statusList['created'] = '新建';
$lang->compile->statusList['building'] = '構建中';
$lang->compile->statusList['create_fail'] = '創建失敗';
$lang->compile->statusList['timeout'] = '執行超時';
+19 -7
View File
@@ -95,7 +95,11 @@ class gitModel extends model
$lastInDB = $this->repo->getLatestCommit($repoID);
/* Ignore unsynced branch. */
if(empty($lastInDB)) continue;
if(empty($lastInDB))
{
$this->printLog("Please init repo {$repo->name}");
continue;
}
$commits = $repo->commits;
$version = $lastInDB->commit;
@@ -115,7 +119,7 @@ class gitModel extends model
if($objects)
{
$this->printLog('extract' .
'task:' . join(' ', $objects['tasks']) .
' task:' . join(' ', $objects['tasks']) .
' bug:' . join(',', $objects['bugs']));
$this->repo->saveAction2PMS($objects, $log, $this->repoRoot, $repo->encoding, 'git');
@@ -148,14 +152,22 @@ class gitModel extends model
$jobs = zget($tagGroup, $repoID, array());
foreach($jobs as $job)
{
$tags = $this->getRepoTags($repo);
end($tags);
$lastTag = current($tags);
if($lastTag != $job->lastTag)
$tags = $this->getRepoTags($repo);
$isNew = false;
$lastTag = '';
foreach($tags as $tag)
{
if($tag == $job->lastTag)
{
$isNew = true;
continue;
}
if(!$isNew) continue;
$lastTag = $tag;
$this->compile->createByJob($job->id, $lastTag, 'tag');
$this->dao->update(TABLE_JOB)->set('lastTag')->eq($lastTag)->where('id')->eq($job->id)->exec();
}
if($lastTag) $this->dao->update(TABLE_JOB)->set('lastTag')->eq($lastTag)->where('id')->eq($job->id)->exec();
}
}
}
+47
View File
@@ -693,6 +693,53 @@ $lang->resource->repo->delete = 'delete';
$lang->resource->repo->showSyncCommit = 'showSyncCommit';
$lang->resource->repo->diff = 'diffAction';
$lang->resource->repo->download = 'download';
$lang->resource->repo->maintain = 'maintain';
$lang->resource->repo->setRules = 'setRules';
$lang->repo->methodOrder[5] = 'create';
$lang->repo->methodOrder[10] = 'edit';
$lang->repo->methodOrder[15] = 'delete';
$lang->repo->methodOrder[20] = 'showSyncCommit';
$lang->repo->methodOrder[25] = 'maintain';
$lang->repo->methodOrder[30] = 'browse';
$lang->repo->methodOrder[35] = 'view';
$lang->repo->methodOrder[40] = 'diff';
$lang->repo->methodOrder[45] = 'log';
$lang->repo->methodOrder[50] = 'revision';
$lang->repo->methodOrder[55] = 'blame';
$lang->repo->methodOrder[60] = 'download';
$lang->repo->methodOrder[65] = 'setRules';
$lang->resource->compile = new stdclass();
$lang->resource->compile->browse = 'browse';
$lang->resource->compile->logs = 'logs';
$lang->compile->methodOrder[5] = 'browse';
$lang->compile->methodOrder[10] = 'logs';
$lang->resource->jenkins = new stdclass();
$lang->resource->jenkins->browse = 'browse';
$lang->resource->jenkins->create = 'create';
$lang->resource->jenkins->edit = 'edit';
$lang->resource->jenkins->delete = 'delete';
$lang->jenkins->methodOrder[5] = 'browse';
$lang->jenkins->methodOrder[10] = 'create';
$lang->jenkins->methodOrder[15] = 'edit';
$lang->jenkins->methodOrder[20] = 'delete';
$lang->resource->job = new stdclass();
$lang->resource->job->browse = 'browse';
$lang->resource->job->create = 'create';
$lang->resource->job->edit = 'edit';
$lang->resource->job->delete = 'delete';
$lang->resource->job->exec = 'exec';
$lang->job->methodOrder[5] = 'browse';
$lang->job->methodOrder[10] = 'create';
$lang->job->methodOrder[15] = 'edit';
$lang->job->methodOrder[20] = 'delete';
$lang->job->methodOrder[25] = 'exec';
/* Doc. */
$lang->resource->doc = new stdclass();
+3
View File
@@ -165,6 +165,9 @@ $lang->install->cronList['moduleName=mail&methodName=asyncSend'] = 'Async N
$lang->install->cronList['moduleName=webhook&methodName=asyncSend'] = 'Async Webhook Sendung';
$lang->install->cronList['moduleName=admin&methodName=deleteLog'] = 'Überfällige Logs löschen';
$lang->install->cronList['moduleName=todo&methodName=createCycle'] = 'Erstelle wiederkehrende ToDos';
$lang->install->cronList['moduleName=ci&methodName=initQueue'] = 'Create recurring jenkins';
$lang->install->cronList['moduleName=ci&methodName=checkBuildStatus'] = 'Synchronize Jenkins Status';
$lang->install->cronList['moduleName=ci&methodName=exec'] = 'Execute Jenkins';
$lang->install->success = "Installiert!";
$lang->install->login = 'Login ZenTao';
+3
View File
@@ -165,6 +165,9 @@ $lang->install->cronList['moduleName=mail&methodName=asyncSend'] = 'Désync
$lang->install->cronList['moduleName=webhook&methodName=asyncSend'] = 'Désynchroniser envoi Webhooks';
$lang->install->cronList['moduleName=admin&methodName=deleteLog'] = 'Suppression Logs échus';
$lang->install->cronList['moduleName=todo&methodName=createCycle'] = 'Créer tâches récurrentes';
$lang->install->cronList['moduleName=ci&methodName=initQueue'] = 'Create recurring jenkins';
$lang->install->cronList['moduleName=ci&methodName=checkBuildStatus'] = 'Synchronize Jenkins Status';
$lang->install->cronList['moduleName=ci&methodName=exec'] = 'Execute Jenkins';
$lang->install->success = "Installé !";
$lang->install->login = 'Login ZenTao';
+3
View File
@@ -165,6 +165,9 @@ $lang->install->cronList['moduleName=mail&methodName=asyncSend'] = '非同
$lang->install->cronList['moduleName=webhook&methodName=asyncSend'] = '非同步發送Webhook';
$lang->install->cronList['moduleName=admin&methodName=deleteLog'] = '刪除過期日誌';
$lang->install->cronList['moduleName=todo&methodName=createCycle'] = '生成周期性待辦';
$lang->install->cronList['moduleName=ci&methodName=initQueue'] = '創建周期性任務';
$lang->install->cronList['moduleName=ci&methodName=checkBuildStatus'] = '同步Jenkins任務狀態';
$lang->install->cronList['moduleName=ci&methodName=exec'] = '執行Jenkins任務';
$lang->install->success = "安裝成功";
$lang->install->login = '登錄禪道管理系統';
+2 -2
View File
@@ -1,5 +1,5 @@
<?php
$config->jenkins->create = new stdclass();
$config->jenkins->edit = new stdclass();
$config->jenkins->create->requiredFields = 'name,url,credentials';
$config->jenkins->edit->requiredFields = 'name,url,credentials';
$config->jenkins->create->requiredFields = 'name,url';
$config->jenkins->edit->requiredFields = 'name,url';
+19
View File
@@ -0,0 +1,19 @@
<?php
$lang->jenkins->common = 'Jenkins';
$lang->jenkins->browse = 'Browse Jenkins';
$lang->jenkins->create = 'Create Jenkins';
$lang->jenkins->edit = 'Edit Jenkins';
$lang->jenkins->delete = 'Delete';
$lang->jenkins->confirmDelete = 'Do you want to delete this Jenkins server?';
$lang->jenkins->id = 'ID';
$lang->jenkins->name = 'Name';
$lang->jenkins->url = 'Service URL';
$lang->jenkins->token = 'Token';
$lang->jenkins->account = 'UserName';
$lang->jenkins->password = 'Password';
$lang->jenkins->lblCreate = 'Create Jenkins Server';
$lang->jenkins->desc = 'Description';
$lang->jenkins->tokenFirst = 'Use token if not empty.';
$lang->jenkins->tips = 'Cancel "Prevent Cross Site Request Forgery exploits" when using password.';
+19
View File
@@ -0,0 +1,19 @@
<?php
$lang->jenkins->common = 'Jenkins';
$lang->jenkins->browse = 'Browse Jenkins';
$lang->jenkins->create = 'Create Jenkins';
$lang->jenkins->edit = 'Edit Jenkins';
$lang->jenkins->delete = 'Delete';
$lang->jenkins->confirmDelete = 'Do you want to delete this Jenkins server?';
$lang->jenkins->id = 'ID';
$lang->jenkins->name = 'Name';
$lang->jenkins->url = 'Service URL';
$lang->jenkins->token = 'Token';
$lang->jenkins->account = 'UserName';
$lang->jenkins->password = 'Password';
$lang->jenkins->lblCreate = 'Create Jenkins Server';
$lang->jenkins->desc = 'Description';
$lang->jenkins->tokenFirst = 'Use token if not empty.';
$lang->jenkins->tips = 'Cancel "Prevent Cross Site Request Forgery exploits" when using password.';
+19
View File
@@ -0,0 +1,19 @@
<?php
$lang->jenkins->common = 'Jenkins';
$lang->jenkins->browse = '瀏覽Jenkins';
$lang->jenkins->create = '添加Jenkins';
$lang->jenkins->edit = '編輯Jenkins';
$lang->jenkins->delete = '刪除';
$lang->jenkins->confirmDelete = '確認刪除該Jenkins嗎?';
$lang->jenkins->id = 'ID';
$lang->jenkins->name = '名稱';
$lang->jenkins->url = '服務地址';
$lang->jenkins->token = 'Token';
$lang->jenkins->account = '用戶名';
$lang->jenkins->password = '密碼';
$lang->jenkins->lblCreate = '添加Jenkins伺服器';
$lang->jenkins->desc = '描述';
$lang->jenkins->tokenFirst = 'Token不為空時,優先使用Token。';
$lang->jenkins->tips = '使用密碼時,請在Jenkins全局安全設置中禁用"防止跨站點請求偽造"選項。';
+1 -1
View File
@@ -4,4 +4,4 @@
.checkbox-primary.checkbox-inline label{padding-left:5px !important;}
#jkHost_chosen .chosen-single{border-right:0px;}
#jkJobBox{width:385px;}
#svnDirBox .input-group .chosen-single{min-width:200px;}
#svnDirBox .input-group{width:unset !important}
+1 -1
View File
@@ -4,4 +4,4 @@
.checkbox-primary.checkbox-inline label{padding-left:5px !important;}
#jkHost_chosen .chosen-single{border-right:0px;}
#jkJobBox{width:385px;}
#svnDirBox .input-group .chosen-single{min-width:200px;}
#svnDirBox .input-group{width:unset !important}
+2 -1
View File
@@ -29,7 +29,7 @@ $('#repo').change(function()
}
})
$(document).on('change', '#svnDir', function()
$(document).on('change', '[name^=svnDir]', function()
{
var repoID = $('#repo').val();
var selectedTag = $(this).val();
@@ -61,6 +61,7 @@ $(document).on('change', '#svnDir', function()
$('#svnDirBox .loading').remove();
$('#svnDirBox .input-group').append(html);
$('#svnDirBox #svnDir' + length).chosen();
$('#svnDir' + length + '_chosen .chosen-single').css('border-left', '0px');
})
})
+2 -1
View File
@@ -29,7 +29,7 @@ $('#repo').change(function()
}
})
$(document).on('change', '#svnDir', function()
$(document).on('change', '[name^=svnDir]', function()
{
var repoID = $('#repo').val();
var selectedTag = $(this).val();
@@ -61,6 +61,7 @@ $(document).on('change', '#svnDir', function()
$('#svnDirBox .loading').remove();
$('#svnDirBox .input-group').append(html);
$('#svnDirBox #svnDir' + length).chosen();
$('#svnDirBox #svnDir' + length + '_chosen .chosen-single').css('border-left', '0px');
})
})
+38
View File
@@ -0,0 +1,38 @@
<?php
$lang->job->common = 'Job';
$lang->job->browse = 'Browse Job';
$lang->job->create = 'Create Job';
$lang->job->edit = 'Edit Job';
$lang->job->exec = 'Execute Job';
$lang->job->delete = 'Delete Job';
$lang->job->confirmDelete = 'Do you want to delete this job?';
$lang->job->dirChange = 'Directory Changed';
$lang->job->buildTag = 'Build Tag';
$lang->job->id = 'ID';
$lang->job->name = 'Name';
$lang->job->repo = 'Repo';
$lang->job->svnDir = 'SVN Tag Watch Path';
$lang->job->jenkins = 'Jenkins';
$lang->job->jkHost = 'Jenkins Server';
$lang->job->buildType = 'Build Type';
$lang->job->jkJob = 'Jenkins Task';
$lang->job->triggerType = 'Trigger';
$lang->job->atDay = 'Custom Days';
$lang->job->atTime = 'At Time';
$lang->job->lastStatus = 'Last Status';
$lang->job->lastExec = 'Last Executed';
$lang->job->comment = 'Match Keywords';
$lang->job->example = 'e.g.';
$lang->job->commitEx = "Used to match the keywords used to create a compile. Multiple keywords are separated by ','";
$lang->job->cronSample = 'e.g. 0 0 2 * * 2-6/1 means 2:00 a.m. every weekday.';
$lang->job->sendExec = 'Send execute request success.';
$lang->job->buildTypeList['build'] = 'Only Build';
$lang->job->buildTypeList['buildAndDeploy'] = 'Build And Deploy';
$lang->job->buildTypeList['buildAndTest'] = 'Build And Test';
$lang->job->triggerTypeList['tag'] = 'Tag';
$lang->job->triggerTypeList['commit'] = 'Code Commit';
$lang->job->triggerTypeList['schedule'] = 'Schedule';
+38
View File
@@ -0,0 +1,38 @@
<?php
$lang->job->common = 'Job';
$lang->job->browse = 'Browse Job';
$lang->job->create = 'Create Job';
$lang->job->edit = 'Edit Job';
$lang->job->exec = 'Execute Job';
$lang->job->delete = 'Delete Job';
$lang->job->confirmDelete = 'Do you want to delete this job?';
$lang->job->dirChange = 'Directory Changed';
$lang->job->buildTag = 'Build Tag';
$lang->job->id = 'ID';
$lang->job->name = 'Name';
$lang->job->repo = 'Repo';
$lang->job->svnDir = 'SVN Tag Watch Path';
$lang->job->jenkins = 'Jenkins';
$lang->job->jkHost = 'Jenkins Server';
$lang->job->buildType = 'Build Type';
$lang->job->jkJob = 'Jenkins Task';
$lang->job->triggerType = 'Trigger';
$lang->job->atDay = 'Custom Days';
$lang->job->atTime = 'At Time';
$lang->job->lastStatus = 'Last Status';
$lang->job->lastExec = 'Last Executed';
$lang->job->comment = 'Match Keywords';
$lang->job->example = 'e.g.';
$lang->job->commitEx = "Used to match the keywords used to create a compile. Multiple keywords are separated by ','";
$lang->job->cronSample = 'e.g. 0 0 2 * * 2-6/1 means 2:00 a.m. every weekday.';
$lang->job->sendExec = 'Send execute request success.';
$lang->job->buildTypeList['build'] = 'Only Build';
$lang->job->buildTypeList['buildAndDeploy'] = 'Build And Deploy';
$lang->job->buildTypeList['buildAndTest'] = 'Build And Test';
$lang->job->triggerTypeList['tag'] = 'Tag';
$lang->job->triggerTypeList['commit'] = 'Code Commit';
$lang->job->triggerTypeList['schedule'] = 'Schedule';
+38
View File
@@ -0,0 +1,38 @@
<?php
$lang->job->common = '構建任務';
$lang->job->browse = '瀏覽構建任務';
$lang->job->create = '創建構建任務';
$lang->job->edit = '編輯構建任務';
$lang->job->exec = '執行構建';
$lang->job->delete = '刪除構建任務';
$lang->job->confirmDelete = '確認刪除該構建任務';
$lang->job->dirChange = '目錄改動';
$lang->job->buildTag = '打標籤';
$lang->job->id = 'ID';
$lang->job->name = '名稱';
$lang->job->repo = '代碼庫';
$lang->job->svnDir = 'SVN監控路徑';
$lang->job->jenkins = 'Jenkins';
$lang->job->jkHost = 'Jenkins伺服器';
$lang->job->buildType = '構建類型';
$lang->job->jkJob = 'Jenkins任務';
$lang->job->triggerType = '觸發方式';
$lang->job->atDay = '自定義日期';
$lang->job->atTime = '執行時間';
$lang->job->lastStatus = '最後執行狀態';
$lang->job->lastExec = '最後執行時間';
$lang->job->comment = '匹配關鍵字';
$lang->job->example = '舉例';
$lang->job->commitEx = "用於匹配創建構建任務的關鍵字,多個關鍵字用','分割";
$lang->job->cronSample = '如 0 0 2 * * 2-6/1 表示每個工作日凌晨2點';
$lang->job->sendExec = '發送執行請求成功!執行結果:%s';
$lang->job->buildTypeList['build'] = '僅構建';
$lang->job->buildTypeList['buildAndDeploy'] = '構建部署';
$lang->job->buildTypeList['buildAndTest'] = '構建測試';
$lang->job->triggerTypeList['tag'] = '打標籤';
$lang->job->triggerTypeList['commit'] = '提交註釋包含關鍵字';
$lang->job->triggerTypeList['schedule'] = '定時計劃';
+39 -42
View File
@@ -113,25 +113,7 @@ class jobModel extends model
->exec();
$id = $this->dao->lastInsertId();
if($job->triggerType == 'schedule' and strpos($job->atDay, date('w')) !== false) $this->loadModel('compile')->createByJob($id);
if($job->triggerType == 'tag')
{
$repo = $this->loadModel('repo')->getRepoByID($job->repo);
$lastTag = '';
if($this->post->repoType != 'Subversion')
{
$dirs = $this->loadModel('svn')->getRepoTags($repo, $job->svnDir);
end($dirs);
$lastTag = current($dirs);
}
else
{
$tags = $this->loadModel('git')->getRepoTags($repo);
end($tags);
$lastTag = current($tags);
}
$this->dao->update(TABLE_JOB)->set('lastTag')->eq($lastTag)->where('id')->eq($id)->exec();
}
$this->initJob($id, $job, $this->post->repoType);
return true;
}
@@ -144,8 +126,7 @@ class jobModel extends model
*/
public function update($id)
{
$oldJob = $this->getById($id);
$job = fixer::input('post')
$job = fixer::input('post')
->setDefault('atDay', '')
->setIF($this->post->repoType != 'Subversion', 'svnDir', '')
->setIF($this->post->triggerType != 'commit', 'comment', '')
@@ -174,35 +155,51 @@ class jobModel extends model
->where('id')->eq($id)
->exec();
if($job->triggerType == 'schedule')
$this->initJob($id, $job, $this->post->repoType);
return true;
}
/**
* Init when create or update job.
*
* @param int $id
* @param object $job
* @param string $repoType
* @access public
* @return bool
*/
public function initJob($id, $job, $repoType)
{
if($job->triggerType == 'schedule' and strpos($job->atDay, date('w')) !== false)
{
$week = date('w');
if($job->triggerType != $oldJob->triggerType or strpos($oldJob->atDay, $week) === false)
$compiles = $this->dao->select('*')->from(TABLE_COMPILE)->where('job')->eq($id)->andWhere('LEFT(createdDate, 10)')->eq(date('Y-m-d'))->fetchAll();
foreach($compiles as $compile)
{
if(strpos($job->atDay, $week) !== false) $this->loadModel('compile')->createByJob($job->id);
if(!empty($compile->status)) return true;
$this->dao->delete()->from(TABLE_COMPILE)->where('id')->eq($compile->id)->exec();
}
$this->loadModel('compile')->createByJob($id);
}
elseif($job->triggerType == 'tag')
if($job->triggerType == 'tag')
{
if($job->triggerType != $oldJob->triggerType or $job->repo != $oldJob->repo)
$repo = $this->loadModel('repo')->getRepoByID($job->repo);
$lastTag = '';
if($repoType == 'Subversion')
{
$repo = $this->loadModel('repo')->getRepoByID($job->repo);
$lastTag = '';
if($this->post->repoType == 'Subversion')
{
$dirs = $this->loadModel('svn')->getRepoTags($repo, $job->svnDir);
end($dirs);
$lastTag = current($dirs);
}
else
{
$tags = $this->loadModel('git')->getRepoTags($repo);
end($tags);
$lastTag = current($tags);
}
$this->dao->update(TABLE_JOB)->set('lastTag')->eq($lastTag)->where('id')->eq($id)->exec();
$dirs = $this->loadModel('svn')->getRepoTags($repo, $job->svnDir);
end($dirs);
$lastTag = current($dirs);
}
else
{
$tags = $this->loadModel('git')->getRepoTags($repo);
end($tags);
$lastTag = current($tags);
}
$this->dao->update(TABLE_JOB)->set('lastTag')->eq($lastTag)->where('id')->eq($id)->exec();
}
return true;
}
+1 -1
View File
@@ -41,7 +41,7 @@
</tr>
<tr id='svnDirBox' class='svn-fields'>
<th><?php echo $lang->job->svnDir;?></th>
<td colspan='2'>
<td colspan='3'>
<div class='input-group'>
<?php echo html::select('svnDir[]', array('' => ''), '', "class='form-control chosen'");?>
</div>
+1 -2
View File
@@ -44,12 +44,11 @@
</tr>
<tr id='svnDirBox' class='svn-fields'>
<th><?php echo $lang->job->svnDir;?></th>
<td colspan='2'>
<td colspan='3'>
<div class='input-group'>
<?php
if($repoType == 'Subversion' and $job->svnDir)
{
$job->svnDir = '/zentaoext';
$path = '';
$svnDirs = empty(trim($job->svnDir, '/')) ? '' : $job->svnDir;
$svnDirs = explode('/', $svnDirs);
+2
View File
@@ -85,6 +85,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = 'Letzte Version';
$lang->misc->feature->detailed = 'Details';
$lang->misc->releaseDate['12.1'] = '2020-03-10';
$lang->misc->releaseDate['12.0.1'] = '2020-02-12';
$lang->misc->releaseDate['12.0'] = '2020-01-03';
$lang->misc->releaseDate['11.7'] = '2019-11-28';
@@ -123,6 +124,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
$lang->misc->feature->all['12.1'][] = array('title'=>'Add Integration.', 'desc' => '<p>Add integration, and build in Jenkins</p>');
$lang->misc->feature->all['12.0.1'][] = array('title'=>'Fix Bug.', 'desc' => '');
$lang->misc->feature->all['12.0'][] = array('title'=>'Move repo function to zentao', 'desc' => '');
+2
View File
@@ -85,6 +85,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = 'Latest Version';
$lang->misc->feature->detailed = 'Detail';
$lang->misc->releaseDate['12.1'] = '2020-03-10';
$lang->misc->releaseDate['12.0.1'] = '2020-02-12';
$lang->misc->releaseDate['12.0'] = '2020-01-03';
$lang->misc->releaseDate['11.7'] = '2019-11-28';
@@ -123,6 +124,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
$lang->misc->feature->all['12.1'][] = array('title'=>'Add Integration.', 'desc' => '<p>Add integration, and build in Jenkins</p>');
$lang->misc->feature->all['12.0.1'][] = array('title'=>'Fix Bug.', 'desc' => '');
$lang->misc->feature->all['12.0'][] = array('title'=>'Move repo function to zentao', 'desc' => '');
+2
View File
@@ -85,6 +85,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = 'Dernière Version';
$lang->misc->feature->detailed = 'Détail';
$lang->misc->releaseDate['12.1'] = '2020-03-10';
$lang->misc->releaseDate['12.0.1'] = '2020-02-12';
$lang->misc->releaseDate['12.0'] = '2020-01-03';
$lang->misc->releaseDate['11.7'] = '2019-11-28';
@@ -123,6 +124,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
$lang->misc->feature->all['12.1'][] = array('title'=>'Add Integration.', 'desc' => '<p>Add integration, and build in Jenkins</p>');
$lang->misc->feature->all['12.0.1'][] = array('title'=>'Fix Bug.', 'desc' => '');
$lang->misc->feature->all['12.0'][] = array('title'=>'Move repo function to zentao', 'desc' => '');
+2
View File
@@ -85,6 +85,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = '最新版本';
$lang->misc->feature->detailed = '详情';
$lang->misc->releaseDate['12.1'] = '2020-03-10';
$lang->misc->releaseDate['12.0.1'] = '2020-02-12';
$lang->misc->releaseDate['12.0'] = '2020-01-03';
$lang->misc->releaseDate['11.7'] = '2019-11-28';
@@ -123,6 +124,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
$lang->misc->feature->all['12.1'][] = array('title'=>'增加构建功能', 'desc' => '<p>增加构建功能,集成Jenkins进行构建</p>');
$lang->misc->feature->all['12.0.1'][] = array('title'=>'修复Bug', 'desc' => '');
$lang->misc->feature->all['12.0'][] = array('title'=>'将代码功能版本浏览功能转移到开源版', 'desc' => '');
+2
View File
@@ -85,6 +85,7 @@ $lang->misc->feature = new stdclass();
$lang->misc->feature->lastest = '最新版本';
$lang->misc->feature->detailed = '詳情';
$lang->misc->releaseDate['12.1'] = '2020-03-10';
$lang->misc->releaseDate['12.0.1'] = '2020-02-12';
$lang->misc->releaseDate['12.0'] = '2020-01-03';
$lang->misc->releaseDate['11.7'] = '2019-11-28';
@@ -123,6 +124,7 @@ $lang->misc->releaseDate['7.2.stable'] = '2015-05-22';
$lang->misc->releaseDate['7.1.stable'] = '2015-03-07';
$lang->misc->releaseDate['6.3.stable'] = '2014-11-07';
$lang->misc->feature->all['12.1'][] = array('title'=>'增加構建功能', 'desc' => '<p>增加構建功能,整合Jenkins進行構建</p>');
$lang->misc->feature->all['12.0.1'][] = array('title'=>'修復Bug', 'desc' => '');
$lang->misc->feature->all['12.0'][] = array('title'=>'將代碼功能版本瀏覽功能轉移到開源版', 'desc' => '');
+38
View File
@@ -120,6 +120,44 @@ class my extends control
$this->display();
}
/**
* My requirement.
* @param string $type
* @param int $recTotal
* @param int $recPerPage
* @param int $pageID
* @access public
* @return void
*/
public function requirement($type = 'assignedTo', $orderBy = 'id_desc', $recTotal = 0, $recPerPage = 20, $pageID = 1)
{
/* Save session. */
if($this->app->viewType != 'json') $this->session->set('storyList', $this->app->getURI(true));
/* Load pager. */
$this->app->loadClass('pager', $static = true);
if($this->app->getViewType() == 'mhtml') $recPerPage = 10;
$pager = pager::init($recTotal, $recPerPage, $pageID);
/* Append id for secend sort. */
$sort = $this->loadModel('common')->appendOrder($orderBy);
/* Assign. */
$this->view->title = $this->lang->my->common . $this->lang->colon . $this->lang->my->story;
$this->view->position[] = $this->lang->my->story;
$this->view->stories = $this->loadModel('story')->getUserStories($this->app->user->account, $type, $sort, $pager, 'requirement');
$this->view->users = $this->user->getPairs('noletter');
$this->view->type = $type;
$this->view->recTotal = $recTotal;
$this->view->recPerPage = $recPerPage;
$this->view->pageID = $pageID;
$this->view->orderBy = $orderBy;
$this->view->pager = $pager;
$this->display();
}
/**
* My stories
+1
View File
@@ -10,6 +10,7 @@ $lang->my->bug = 'My Bugs';
$lang->my->testTask = 'My Builds';
$lang->my->testCase = 'My Cases';
$lang->my->story = 'My Stories';
$lang->my->requirement = 'My Requirements';
$lang->my->myProject = "My {$lang->projectCommon}s";
$lang->my->profile = 'My Profile';
$lang->my->dynamic = 'My Dynamics';
+1
View File
@@ -10,6 +10,7 @@ $lang->my->bug = '我的Bug';
$lang->my->testTask = '我的版本';
$lang->my->testCase = '我的用例';
$lang->my->story = "我的{$lang->storyCommon}";
$lang->my->requirement = "我的用户{$lang->storyCommon}";
$lang->my->myProject = "我的{$lang->projectCommon}";
$lang->my->profile = '我的档案';
$lang->my->dynamic = '我的动态';
+1 -1
View File
@@ -72,7 +72,7 @@
<a class="btn btn-link querybox-toggle" id='bysearchTab'><i class="icon icon-search muted"></i> <?php echo $lang->product->searchStory;?></a>
</div>
<div class="btn-toolbar pull-right">
<?php common::printIcon('story', 'report', "productID=$productID&browseType=$browseType&branchID=$branch&moduleID=$moduleID", '', 'button', 'bar-chart muted'); ?>
<?php common::printIcon('story', 'report', "productID=$productID&browseType=$browseType&branchID=$branch&moduleID=$moduleID&chartType=pie&storyType=$storyType", '', 'button', 'bar-chart muted'); ?>
<div class="btn-group">
<button class="btn btn-link" data-toggle="dropdown"><i class="icon icon-export muted"></i> <span class="text"><?php echo $lang->export ?></span> <span class="caret"></span></button>
<ul class="dropdown-menu" id='exportActionMenu'>
+14 -16
View File
@@ -40,19 +40,17 @@ $config->repo->edit->requiredFields = 'SCM,name,path,encoding,client';
$config->repo->svn = new stdclass();
$config->repo->svn->requiredFields = 'account,password';
$config->repo->rules['module']['task'] = 'Task';
$config->repo->rules['module']['bug'] = 'Bug';
$config->repo->rules['task']['start'] = 'Start';
$config->repo->rules['task']['finish'] = 'Finish';
$config->repo->rules['task']['logEfforts'] = 'Effort';
$config->repo->rules['task']['consumed'] = 'Cost';
$config->repo->rules['task']['left'] = 'Left';
$config->repo->rules['bug']['resolve'] = 'Fix';
$config->repo->rules['bug']['resolvedBuild'] = 'Build';
$config->repo->rules['id']['mark'] = '#';
$config->repo->rules['id']['split'] = ',';
$config->repo->rules['mark']['consumed'] = ':';
$config->repo->rules['mark']['left'] = ':';
$config->repo->rules['mark']['resolvedBuild'] = '#';
$config->repo->rules['unit']['consumed'] = 'h';
$config->repo->rules['unit']['left'] = 'h';
$config->repo->rules['module']['task'] = 'Task';
$config->repo->rules['module']['bug'] = 'Bug';
$config->repo->rules['task']['start'] = 'Start';
$config->repo->rules['task']['finish'] = 'Finish';
$config->repo->rules['task']['logEfforts'] = 'Effort';
$config->repo->rules['task']['consumed'] = 'Cost';
$config->repo->rules['task']['left'] = 'Left';
$config->repo->rules['bug']['resolve'] = 'Fix';
$config->repo->rules['id']['mark'] = '#';
$config->repo->rules['id']['split'] = ',';
$config->repo->rules['mark']['consumed'] = ':';
$config->repo->rules['mark']['left'] = ':';
$config->repo->rules['unit']['consumed'] = 'h';
$config->repo->rules['unit']['left'] = 'h';
+4 -16
View File
@@ -165,8 +165,6 @@ function replaceExample()
var resolveBug = $('[id*=bug][id*="resolve\]"]').val().split(';');
var bugModule = $('[id*=module][id*=bug]').val().split(';');
var builds = $('[id*=bug][id*=resolvedBuild]').val().split(';');
var buildMarks = $('[id*=mark][id*=resolvedBuild]').val().split(';');
for(i in resolveBug)
{
resolve = resolveBug[i];
@@ -179,20 +177,10 @@ function replaceExample()
for(l in idSplit)
{
split = idSplit[l];
for(m in builds)
{
build = builds[m];
for(n in buildMarks)
{
buildMark = buildMarks[n];
html += '<br />' + rulesExample['bug']['resolve'].replace('%resolve%', resolve)
.replace('%bug%', bug)
.replace('%id%', id)
.replace('%split%', split)
.replace('%resolvedBuild%', build)
.replace('%buildmark%', buildMark);
}
}
html += '<br />' + rulesExample['bug']['resolve'].replace('%resolve%', resolve)
.replace('%bug%', bug)
.replace('%id%', id)
.replace('%split%', split);
}
}
}
+178
View File
@@ -0,0 +1,178 @@
<?php
$lang->repo->common = 'Repo';
$lang->repo->browse = 'View';
$lang->repo->viewRevision = 'View Revision';
$lang->repo->create = 'Create';
$lang->repo->createAction = 'Create Repo';
$lang->repo->edit = 'Edit';
$lang->repo->editAction = 'Edit Repo';
$lang->repo->delete = 'Delete Repo';
$lang->repo->showSyncCommit = 'Display Synchronization';
$lang->repo->ajaxSyncCommit = 'Interface: Ajax Sync Note';
$lang->repo->setRules = 'Set rules';
$lang->repo->download = 'Download File';
$lang->repo->downloadDiff = 'Download Diff';
$lang->repo->diffAction = 'Revision Diff';
$lang->repo->revisionAction = 'Revision Detail';
$lang->repo->blameAction = 'Repo Blame';
$lang->repo->addBug = 'Add Review';
$lang->repo->editBug = 'Edit Bug';
$lang->repo->deleteBug = 'Delete Bug';
$lang->repo->addComment = 'Add Comment';
$lang->repo->editComment = 'Edit Comment';
$lang->repo->deleteComment = 'Delete Comment';
$lang->repo->submit = 'Submit';
$lang->repo->cancel = 'Cancel';
$lang->repo->addComment = 'Add Comment';
$lang->repo->product = $lang->productCommon;
$lang->repo->module = 'Module';
$lang->repo->project = $lang->projectCommon;
$lang->repo->type = 'Type';
$lang->repo->assign = 'AssignTo';
$lang->repo->title = 'Title';
$lang->repo->detile = 'Detail';
$lang->repo->lines = 'Lines';
$lang->repo->line = 'Line';
$lang->repo->expand = 'Unfold';
$lang->repo->collapse = 'Fold';
$lang->repo->id = 'ID';
$lang->repo->SCM = 'Type';
$lang->repo->name = 'Name';
$lang->repo->path = 'Path';
$lang->repo->prefix = 'Prefix';
$lang->repo->config = 'Config';
$lang->repo->desc = 'Describe';
$lang->repo->account = 'Username';
$lang->repo->password = 'Password';
$lang->repo->encoding = 'Encoding';
$lang->repo->client = 'Client Path';
$lang->repo->size = 'Size';
$lang->repo->revision = 'Revision';
$lang->repo->revisionA = 'Revision';
$lang->repo->revisions = 'Revision';
$lang->repo->time = 'Date';
$lang->repo->committer = 'Committer';
$lang->repo->commits = 'Commits';
$lang->repo->synced = 'Initialize Sync';
$lang->repo->lastSync = 'Last Sync';
$lang->repo->deleted = 'Deleted';
$lang->repo->commit = 'Commit';
$lang->repo->comment = 'Comment';
$lang->repo->view = 'View File';
$lang->repo->viewA = 'View';
$lang->repo->log = 'Revision Log';
$lang->repo->blame = 'Blame';
$lang->repo->date = 'Date';
$lang->repo->diff = 'Diff';
$lang->repo->diffAB = 'Diff';
$lang->repo->diffAll = 'Diff All';
$lang->repo->viewDiff = 'View diff';
$lang->repo->allLog = 'All Revisions';
$lang->repo->location = 'Location';
$lang->repo->file = 'File';
$lang->repo->action = 'Action';
$lang->repo->code = 'Code';
$lang->repo->review = 'Repo Review';
$lang->repo->acl = 'Privilege';
$lang->repo->group = 'Group';
$lang->repo->user = 'User';
$lang->repo->info = 'Version Info';
$lang->repo->title = 'Title';
$lang->repo->status = 'Status';
$lang->repo->openedBy = 'CreatedBy';
$lang->repo->assignedTo = 'AssignedTo';
$lang->repo->openedDate = 'CreatedDate';
$lang->repo->latestRevision = 'Latest Revision';
$lang->repo->actionInfo = "Add by %s in %s";
$lang->repo->changes = "Change Log";
$lang->repo->reviewLocation = "File: %s@%s, line:%s - %s";
$lang->repo->commentEdit = '<i class="icon-pencil"></i>';
$lang->repo->commentDelete = '<i class="icon-remove"></i>';
$lang->repo->allChanges = "Other Changes";
$lang->repo->commitTitle = "The %sth Commit";
$lang->repo->mark = "Mark Tag";
$lang->repo->split = "Split Mark";
$lang->repo->objectRule = 'Object Rule';
$lang->repo->objectIdRule = 'Object ID Rule';
$lang->repo->actionRule = 'Action RUle';
$lang->repo->manHourRule = 'Man-hour Rule';
$lang->repo->ruleUnit = "Unit";
$lang->repo->ruleSplit = "Multiple keywords are divided by ';'. For example: task multiple keywords: Task;task";
$lang->repo->viewDiffList['inline'] = 'Inline';
$lang->repo->viewDiffList['appose'] = 'Parallel';
$lang->repo->encryptList['plain'] = 'No encryption';
$lang->repo->encryptList['base64'] = 'BASE64';
$lang->repo->logStyles['A'] = 'Add';
$lang->repo->logStyles['M'] = 'Modification';
$lang->repo->logStyles['D'] = 'Delete';
$lang->repo->encodingList['utf_8'] = 'UTF-8';
$lang->repo->encodingList['gbk'] = 'GBK';
$lang->repo->scmList['Git'] = 'Git';
$lang->repo->scmList['Subversion'] = 'Subversion';
$lang->repo->notice = new stdclass();
$lang->repo->notice->syncing = 'Synchronizing. Please wait ...';
$lang->repo->notice->syncComplete = 'Synchronized. Now redirecting ...';
$lang->repo->notice->syncedCount = 'The number of records synchronized is ';
$lang->repo->notice->delete = 'Are you sure delete this repo?';
$lang->repo->notice->successDelete = 'Repository is removed.';
$lang->repo->notice->commentContent = 'Comment';
$lang->repo->notice->deleteBug = 'Are you sure to delete this bug?';
$lang->repo->notice->deleteComment = 'Are you sure to delete this comment?';
$lang->repo->notice->lastSyncTime = 'Last Sync:';
$lang->repo->rules = new stdclass();
$lang->repo->rules->exampleLabel = "Comment Example";
$lang->repo->rules->example['task']['start'] = "%start% %task% %id%1%split%2 %cost%%consumedmark%1%cunit% %left%%leftmark%3%lunit%";
$lang->repo->rules->example['task']['finish'] = "%finish% %task% %id%1%split%2 %cost%%consumedmark%10%cunit%";
$lang->repo->rules->example['task']['effort'] = "%effort% %task% %id%1%split%2 %cost%%consumedmark%1%cunit% %left%%leftmark%3%lunit%";
$lang->repo->rules->example['bug']['resolve'] = "%resolve% %bug% %id%1%split%2";
$lang->repo->error = new stdclass();
$lang->repo->error->useless = 'Your server disabled exec and shell_exec, so it cannot be applied.';
$lang->repo->error->connect = 'Connection to the repo failed. Please enter username, password and repo address correctly!';
$lang->repo->error->version = 'Version 1.8+ of https and svn protocol is required. Please update to latest version! Go to http://subversion.apache.org/';
$lang->repo->error->path = 'Repo address is the file path, e.g. /home/test.';
$lang->repo->error->cmd = 'Client Error!';
$lang->repo->error->diff = 'Two versions must be selected.';
$lang->repo->error->product = "Please select {$lang->productCommon}!";
$lang->repo->error->commentText = 'Please enter content for review!';
$lang->repo->error->comment = 'Please enter content!';
$lang->repo->error->title = 'Please enter title!';
$lang->repo->error->accessDenied = 'You do not have the privilege to access the repository.';
$lang->repo->error->noFound = 'The repo is not found.';
$lang->repo->error->noFile = '%s does not exist.';
$lang->repo->error->noPriv = 'The program does not have the privilege to switch to %s';
$lang->repo->error->output = "The command is: %s\nThe error is(%s): %s\n";
$lang->repo->error->clientVersion = "Client version is too low, please upgrade or change SVN client";
$lang->repo->error->encoding = "The encoding maybe wrong. Please change the encoding and try again.";
$lang->repo->syncTips = '<strong>You may find the reference about how to set Git sync from <a target="_blank" href="https://www.zentao.pm/book/zentaomanual/free-open-source-project-management-software-git-105.html">here</a>.</strong>';
$lang->repo->encodingsTips = "The encodings of commit comments, can be comma separated values,e.g. utf-8";
$lang->repo->example = new stdclass();
$lang->repo->example->client = new stdclass();
$lang->repo->example->path = new stdclass();
$lang->repo->example->client->git = "e.g. /usr/bin/git";
$lang->repo->example->client->svn = "e.g. /usr/bin/svn";
$lang->repo->example->path->git = "e.g. /homt/user/myproject";
$lang->repo->example->path->svn = "e.g. http://example.googlecode.com/svn/trunk/myproject";
$lang->repo->example->config = "Config directory is required in https. Use '--config-dir' to generate config dir.";
$lang->repo->example->encoding = "input encoding of files";
$lang->repo->typeList['standard'] = 'Standard';
$lang->repo->typeList['performance'] = 'Performance';
$lang->repo->typeList['security'] = 'Security';
$lang->repo->typeList['redundancy'] = 'Redundancy';
$lang->repo->typeList['logicError'] = 'Logic Error';
+11 -4
View File
@@ -21,7 +21,6 @@ $lang->repo->deleteBug = 'Delete Bug';
$lang->repo->addComment = 'Add Comment';
$lang->repo->editComment = 'Edit Comment';
$lang->repo->deleteComment = 'Delete Comment';
$lang->repo->selectModule = 'Select Module';
$lang->repo->submit = 'Submit';
$lang->repo->cancel = 'Cancel';
@@ -99,6 +98,13 @@ $lang->repo->commitTitle = "The %sth Commit";
$lang->repo->mark = "Mark Tag";
$lang->repo->split = "Split Mark";
$lang->repo->objectRule = 'Object Rule';
$lang->repo->objectIdRule = 'Object ID Rule';
$lang->repo->actionRule = 'Action RUle';
$lang->repo->manHourRule = 'Man-hour Rule';
$lang->repo->ruleUnit = "Unit";
$lang->repo->ruleSplit = "Multiple keywords are divided by ';'. For example: task multiple keywords: Task;task";
$lang->repo->viewDiffList['inline'] = 'Inline';
$lang->repo->viewDiffList['appose'] = 'Parallel';
@@ -128,9 +134,10 @@ $lang->repo->notice->lastSyncTime = 'Last Sync:';
$lang->repo->rules = new stdclass();
$lang->repo->rules->exampleLabel = "Comment Example";
$lang->repo->rules->example['task']['start'] = "%start% %task% %id%1%split%2 %cost%%consumedmark%1 %left%%leftmark%3";
$lang->repo->rules->example['task']['finish'] = "%finish% %task% %id%1%split%2 %cost%%consumedmark%10";
$lang->repo->rules->example['bug']['resolve'] = "%resolve% %bug% %id%1%split%2 %resolvedBuild% %buildmark%10";
$lang->repo->rules->example['task']['start'] = "%start% %task% %id%1%split%2 %cost%%consumedmark%1%cunit% %left%%leftmark%3%lunit%";
$lang->repo->rules->example['task']['finish'] = "%finish% %task% %id%1%split%2 %cost%%consumedmark%10%cunit%";
$lang->repo->rules->example['task']['effort'] = "%effort% %task% %id%1%split%2 %cost%%consumedmark%1%cunit% %left%%leftmark%3%lunit%";
$lang->repo->rules->example['bug']['resolve'] = "%resolve% %bug% %id%1%split%2";
$lang->repo->error = new stdclass();
$lang->repo->error->useless = 'Your server disabled exec and shell_exec, so it cannot be applied.';
+178
View File
@@ -0,0 +1,178 @@
<?php
$lang->repo->common = 'Repo';
$lang->repo->browse = 'View';
$lang->repo->viewRevision = 'View Revision';
$lang->repo->create = 'Create';
$lang->repo->createAction = 'Create Repo';
$lang->repo->edit = 'Edit';
$lang->repo->editAction = 'Edit Repo';
$lang->repo->delete = 'Delete Repo';
$lang->repo->showSyncCommit = 'Display Synchronization';
$lang->repo->ajaxSyncCommit = 'Interface: Ajax Sync Note';
$lang->repo->setRules = 'Set rules';
$lang->repo->download = 'Download File';
$lang->repo->downloadDiff = 'Download Diff';
$lang->repo->diffAction = 'Revision Diff';
$lang->repo->revisionAction = 'Revision Detail';
$lang->repo->blameAction = 'Repo Blame';
$lang->repo->addBug = 'Add Review';
$lang->repo->editBug = 'Edit Bug';
$lang->repo->deleteBug = 'Delete Bug';
$lang->repo->addComment = 'Add Comment';
$lang->repo->editComment = 'Edit Comment';
$lang->repo->deleteComment = 'Delete Comment';
$lang->repo->submit = 'Submit';
$lang->repo->cancel = 'Cancel';
$lang->repo->addComment = 'Add Comment';
$lang->repo->product = $lang->productCommon;
$lang->repo->module = 'Module';
$lang->repo->project = $lang->projectCommon;
$lang->repo->type = 'Type';
$lang->repo->assign = 'AssignTo';
$lang->repo->title = 'Title';
$lang->repo->detile = 'Detail';
$lang->repo->lines = 'Lines';
$lang->repo->line = 'Line';
$lang->repo->expand = 'Unfold';
$lang->repo->collapse = 'Fold';
$lang->repo->id = 'ID';
$lang->repo->SCM = 'Type';
$lang->repo->name = 'Name';
$lang->repo->path = 'Path';
$lang->repo->prefix = 'Prefix';
$lang->repo->config = 'Config';
$lang->repo->desc = 'Describe';
$lang->repo->account = 'Username';
$lang->repo->password = 'Password';
$lang->repo->encoding = 'Encoding';
$lang->repo->client = 'Client Path';
$lang->repo->size = 'Size';
$lang->repo->revision = 'Revision';
$lang->repo->revisionA = 'Revision';
$lang->repo->revisions = 'Revision';
$lang->repo->time = 'Date';
$lang->repo->committer = 'Committer';
$lang->repo->commits = 'Commits';
$lang->repo->synced = 'Initialize Sync';
$lang->repo->lastSync = 'Last Sync';
$lang->repo->deleted = 'Deleted';
$lang->repo->commit = 'Commit';
$lang->repo->comment = 'Comment';
$lang->repo->view = 'View File';
$lang->repo->viewA = 'View';
$lang->repo->log = 'Revision Log';
$lang->repo->blame = 'Blame';
$lang->repo->date = 'Date';
$lang->repo->diff = 'Diff';
$lang->repo->diffAB = 'Diff';
$lang->repo->diffAll = 'Diff All';
$lang->repo->viewDiff = 'View diff';
$lang->repo->allLog = 'All Revisions';
$lang->repo->location = 'Location';
$lang->repo->file = 'File';
$lang->repo->action = 'Action';
$lang->repo->code = 'Code';
$lang->repo->review = 'Repo Review';
$lang->repo->acl = 'Privilege';
$lang->repo->group = 'Group';
$lang->repo->user = 'User';
$lang->repo->info = 'Version Info';
$lang->repo->title = 'Title';
$lang->repo->status = 'Status';
$lang->repo->openedBy = 'CreatedBy';
$lang->repo->assignedTo = 'AssignedTo';
$lang->repo->openedDate = 'CreatedDate';
$lang->repo->latestRevision = 'Latest Revision';
$lang->repo->actionInfo = "Add by %s in %s";
$lang->repo->changes = "Change Log";
$lang->repo->reviewLocation = "File: %s@%s, line:%s - %s";
$lang->repo->commentEdit = '<i class="icon-pencil"></i>';
$lang->repo->commentDelete = '<i class="icon-remove"></i>';
$lang->repo->allChanges = "Other Changes";
$lang->repo->commitTitle = "The %sth Commit";
$lang->repo->mark = "Mark Tag";
$lang->repo->split = "Split Mark";
$lang->repo->objectRule = 'Object Rule';
$lang->repo->objectIdRule = 'Object ID Rule';
$lang->repo->actionRule = 'Action RUle';
$lang->repo->manHourRule = 'Man-hour Rule';
$lang->repo->ruleUnit = "Unit";
$lang->repo->ruleSplit = "Multiple keywords are divided by ';'. For example: task multiple keywords: Task;task";
$lang->repo->viewDiffList['inline'] = 'Inline';
$lang->repo->viewDiffList['appose'] = 'Parallel';
$lang->repo->encryptList['plain'] = 'No encryption';
$lang->repo->encryptList['base64'] = 'BASE64';
$lang->repo->logStyles['A'] = 'Add';
$lang->repo->logStyles['M'] = 'Modification';
$lang->repo->logStyles['D'] = 'Delete';
$lang->repo->encodingList['utf_8'] = 'UTF-8';
$lang->repo->encodingList['gbk'] = 'GBK';
$lang->repo->scmList['Git'] = 'Git';
$lang->repo->scmList['Subversion'] = 'Subversion';
$lang->repo->notice = new stdclass();
$lang->repo->notice->syncing = 'Synchronizing. Please wait ...';
$lang->repo->notice->syncComplete = 'Synchronized. Now redirecting ...';
$lang->repo->notice->syncedCount = 'The number of records synchronized is ';
$lang->repo->notice->delete = 'Are you sure delete this repo?';
$lang->repo->notice->successDelete = 'Repository is removed.';
$lang->repo->notice->commentContent = 'Comment';
$lang->repo->notice->deleteBug = 'Are you sure to delete this bug?';
$lang->repo->notice->deleteComment = 'Are you sure to delete this comment?';
$lang->repo->notice->lastSyncTime = 'Last Sync:';
$lang->repo->rules = new stdclass();
$lang->repo->rules->exampleLabel = "Comment Example";
$lang->repo->rules->example['task']['start'] = "%start% %task% %id%1%split%2 %cost%%consumedmark%1%cunit% %left%%leftmark%3%lunit%";
$lang->repo->rules->example['task']['finish'] = "%finish% %task% %id%1%split%2 %cost%%consumedmark%10%cunit%";
$lang->repo->rules->example['task']['effort'] = "%effort% %task% %id%1%split%2 %cost%%consumedmark%1%cunit% %left%%leftmark%3%lunit%";
$lang->repo->rules->example['bug']['resolve'] = "%resolve% %bug% %id%1%split%2";
$lang->repo->error = new stdclass();
$lang->repo->error->useless = 'Your server disabled exec and shell_exec, so it cannot be applied.';
$lang->repo->error->connect = 'Connection to the repo failed. Please enter username, password and repo address correctly!';
$lang->repo->error->version = 'Version 1.8+ of https and svn protocol is required. Please update to latest version! Go to http://subversion.apache.org/';
$lang->repo->error->path = 'Repo address is the file path, e.g. /home/test.';
$lang->repo->error->cmd = 'Client Error!';
$lang->repo->error->diff = 'Two versions must be selected.';
$lang->repo->error->product = "Please select {$lang->productCommon}!";
$lang->repo->error->commentText = 'Please enter content for review!';
$lang->repo->error->comment = 'Please enter content!';
$lang->repo->error->title = 'Please enter title!';
$lang->repo->error->accessDenied = 'You do not have the privilege to access the repository.';
$lang->repo->error->noFound = 'The repo is not found.';
$lang->repo->error->noFile = '%s does not exist.';
$lang->repo->error->noPriv = 'The program does not have the privilege to switch to %s';
$lang->repo->error->output = "The command is: %s\nThe error is(%s): %s\n";
$lang->repo->error->clientVersion = "Client version is too low, please upgrade or change SVN client";
$lang->repo->error->encoding = "The encoding maybe wrong. Please change the encoding and try again.";
$lang->repo->syncTips = '<strong>You may find the reference about how to set Git sync from <a target="_blank" href="https://www.zentao.pm/book/zentaomanual/free-open-source-project-management-software-git-105.html">here</a>.</strong>';
$lang->repo->encodingsTips = "The encodings of commit comments, can be comma separated values,e.g. utf-8";
$lang->repo->example = new stdclass();
$lang->repo->example->client = new stdclass();
$lang->repo->example->path = new stdclass();
$lang->repo->example->client->git = "e.g. /usr/bin/git";
$lang->repo->example->client->svn = "e.g. /usr/bin/svn";
$lang->repo->example->path->git = "e.g. /homt/user/myproject";
$lang->repo->example->path->svn = "e.g. http://example.googlecode.com/svn/trunk/myproject";
$lang->repo->example->config = "Config directory is required in https. Use '--config-dir' to generate config dir.";
$lang->repo->example->encoding = "input encoding of files";
$lang->repo->typeList['standard'] = 'Standard';
$lang->repo->typeList['performance'] = 'Performance';
$lang->repo->typeList['security'] = 'Security';
$lang->repo->typeList['redundancy'] = 'Redundancy';
$lang->repo->typeList['logicError'] = 'Logic Error';
+2 -1
View File
@@ -4,6 +4,7 @@ $lang->repo->browse = '浏览';
$lang->repo->viewRevision = '查看修订';
$lang->repo->create = '创建';
$lang->repo->createAction = '创建版本库';
$lang->repo->maintain = '版本库列表';
$lang->repo->edit = '编辑';
$lang->repo->editAction = '编辑版本库';
$lang->repo->delete = '删除版本库';
@@ -137,7 +138,7 @@ $lang->repo->rules->exampleLabel = "注释示例";
$lang->repo->rules->example['task']['start'] = "%start% %task% %id%1%split%2 %cost%%consumedmark%1%cunit% %left%%leftmark%3%lunit%";
$lang->repo->rules->example['task']['finish'] = "%finish% %task% %id%1%split%2 %cost%%consumedmark%10%cunit%";
$lang->repo->rules->example['task']['effort'] = "%effort% %task% %id%1%split%2 %cost%%consumedmark%1%cunit% %left%%leftmark%3%lunit%";
$lang->repo->rules->example['bug']['resolve'] = "%resolve% %bug% %id%1%split%2 %resolvedBuild% %buildmark%10";
$lang->repo->rules->example['bug']['resolve'] = "%resolve% %bug% %id%1%split%2";
$lang->repo->error = new stdclass();
$lang->repo->error->useless = '你的服务器禁用了exec,shell_exec方法,无法使用该功能';
+179
View File
@@ -0,0 +1,179 @@
<?php
$lang->repo->common = '代碼';
$lang->repo->browse = '瀏覽';
$lang->repo->viewRevision = '查看修訂';
$lang->repo->create = '創建';
$lang->repo->createAction = '創建版本庫';
$lang->repo->maintain = '版本庫列表';
$lang->repo->edit = '編輯';
$lang->repo->editAction = '編輯版本庫';
$lang->repo->delete = '刪除版本庫';
$lang->repo->showSyncCommit = '顯示同步進度';
$lang->repo->ajaxSyncCommit = '介面:AJAX同步註釋';
$lang->repo->setRules = '指令配置';
$lang->repo->download = '下載';
$lang->repo->downloadDiff = '下載Diff';
$lang->repo->diffAction = '版本對比';
$lang->repo->revisionAction = '版本詳情';
$lang->repo->blameAction = '版本追溯';
$lang->repo->addBug = '添加評審';
$lang->repo->editBug = '編輯評審';
$lang->repo->deleteBug = '刪除評審';
$lang->repo->addComment = '添加備註';
$lang->repo->editComment = '編輯備註';
$lang->repo->deleteComment = '刪除備註';
$lang->repo->submit = '提交';
$lang->repo->cancel = '取消';
$lang->repo->addComment = '添加評論';
$lang->repo->product = $lang->productCommon;
$lang->repo->module = '模組';
$lang->repo->project = $lang->projectCommon;
$lang->repo->type = '類型';
$lang->repo->assign = '指派';
$lang->repo->title = '標題';
$lang->repo->detile = '詳情';
$lang->repo->lines = '代碼行';
$lang->repo->line = '行';
$lang->repo->expand = '點擊展開';
$lang->repo->collapse = '點擊摺疊';
$lang->repo->id = '編號';
$lang->repo->SCM = '類型';
$lang->repo->name = '名稱';
$lang->repo->path = '地址';
$lang->repo->prefix = '地址擴展';
$lang->repo->config = '配置目錄';
$lang->repo->desc = '描述';
$lang->repo->account = '用戶名';
$lang->repo->password = '密碼';
$lang->repo->encoding = '編碼';
$lang->repo->client = '客戶端';
$lang->repo->size = '大小';
$lang->repo->revision = '查看版本';
$lang->repo->revisionA = '版本';
$lang->repo->revisions = '版本';
$lang->repo->time = '提交時間';
$lang->repo->committer = '作者';
$lang->repo->commits = '提交數';
$lang->repo->synced = '初始化同步';
$lang->repo->lastSync = '最後同步時間';
$lang->repo->deleted = '已刪除';
$lang->repo->commit = '提交';
$lang->repo->comment = '註釋';
$lang->repo->view = '查看檔案';
$lang->repo->viewA = '查看';
$lang->repo->log = '版本歷史';
$lang->repo->blame = '追溯';
$lang->repo->date = '日期';
$lang->repo->diff = '比較差異';
$lang->repo->diffAB = '比較';
$lang->repo->diffAll = '全部比較';
$lang->repo->viewDiff = '查看差異';
$lang->repo->allLog = '所有版本';
$lang->repo->location = '位置';
$lang->repo->file = '檔案';
$lang->repo->action = '操作';
$lang->repo->code = '代碼';
$lang->repo->review = '評審';
$lang->repo->acl = '權限';
$lang->repo->group = '分組';
$lang->repo->user = '用戶';
$lang->repo->info = '版本信息';
$lang->repo->title = '標題';
$lang->repo->status = '狀態';
$lang->repo->openedBy = '創建者';
$lang->repo->assignedTo = '指派給';
$lang->repo->openedDate = '創建日期';
$lang->repo->latestRevision = '最近修訂版本';
$lang->repo->actionInfo = "由%s在%s添加";
$lang->repo->changes = "修改記錄";
$lang->repo->reviewLocation = "%s@%s,%s行 - %s行";
$lang->repo->commentEdit = '<i class="icon-pencil"></i>';
$lang->repo->commentDelete = '<i class="icon-remove"></i>';
$lang->repo->allChanges = "其他改動";
$lang->repo->commitTitle = "第%s次提交";
$lang->repo->mark = "開始標記";
$lang->repo->split = "多ID間隔";
$lang->repo->objectRule = '對象匹配規則';
$lang->repo->objectIdRule = '對象ID匹配規則';
$lang->repo->actionRule = '動作匹配規則';
$lang->repo->manHourRule = '工時匹配規則';
$lang->repo->ruleUnit = "單位";
$lang->repo->ruleSplit = "多關鍵字用';'分割,如:任務多關鍵字: Task;task";
$lang->repo->viewDiffList['inline'] = '直列';
$lang->repo->viewDiffList['appose'] = '並排';
$lang->repo->encryptList['plain'] = '不加密';
$lang->repo->encryptList['base64'] = 'BASE64';
$lang->repo->logStyles['A'] = '添加';
$lang->repo->logStyles['M'] = '修改';
$lang->repo->logStyles['D'] = '刪除';
$lang->repo->encodingList['utf_8'] = 'UTF-8';
$lang->repo->encodingList['gbk'] = 'GBK';
$lang->repo->scmList['Git'] = 'Git';
$lang->repo->scmList['Subversion'] = 'Subversion';
$lang->repo->notice = new stdclass();
$lang->repo->notice->syncing = '正在同步中, 請稍等...';
$lang->repo->notice->syncComplete = '同步完成,正在跳轉...';
$lang->repo->notice->syncedCount = '已經同步記錄條數';
$lang->repo->notice->delete = '是否要刪除該版本庫?';
$lang->repo->notice->successDelete = '已經成功刪除版本庫。';
$lang->repo->notice->commentContent = '輸入回覆內容';
$lang->repo->notice->deleteBug = '確認刪除該Bug?';
$lang->repo->notice->deleteComment = '確認刪除該回覆?';
$lang->repo->notice->lastSyncTime = '最後更新于:';
$lang->repo->rules = new stdclass();
$lang->repo->rules->exampleLabel = "註釋示例";
$lang->repo->rules->example['task']['start'] = "%start% %task% %id%1%split%2 %cost%%consumedmark%1%cunit% %left%%leftmark%3%lunit%";
$lang->repo->rules->example['task']['finish'] = "%finish% %task% %id%1%split%2 %cost%%consumedmark%10%cunit%";
$lang->repo->rules->example['task']['effort'] = "%effort% %task% %id%1%split%2 %cost%%consumedmark%1%cunit% %left%%leftmark%3%lunit%";
$lang->repo->rules->example['bug']['resolve'] = "%resolve% %bug% %id%1%split%2";
$lang->repo->error = new stdclass();
$lang->repo->error->useless = '你的伺服器禁用了exec,shell_exec方法,無法使用該功能';
$lang->repo->error->connect = '連接版本庫失敗,請填寫正確的用戶名、密碼和版本庫地址!';
$lang->repo->error->version = "https和svn協議需要1.8及以上版本的客戶端,請升級到最新版本!詳情訪問:http://subversion.apache.org/";
$lang->repo->error->path = '版本庫地址直接填寫檔案路徑,如:/home/test。';
$lang->repo->error->cmd = '客戶端錯誤!';
$lang->repo->error->diff = '必須選擇兩個版本';
$lang->repo->error->product = "請選擇{$lang->productCommon}!";
$lang->repo->error->commentText = '請填寫評審內容';
$lang->repo->error->comment = '請填寫內容';
$lang->repo->error->title = '請填寫標題';
$lang->repo->error->accessDenied = '你沒有權限訪問該版本庫';
$lang->repo->error->noFound = '你訪問的版本庫不存在';
$lang->repo->error->noFile = '目錄 %s 不存在';
$lang->repo->error->noPriv = '程序沒有權限切換到目錄 %s';
$lang->repo->error->output = "執行命令:%s\n錯誤結果(%s): %s\n";
$lang->repo->error->clientVersion = "客戶端版本過低,請升級或更換SVN客戶端";
$lang->repo->error->encoding = "編碼可能錯誤,請更換編碼重試。";
$lang->repo->syncTips = '請參照<a target="_blank" href="https://www.zentao.net/book/zentaopmshelp/207.html">這裡</a>,設置版本庫定時同步。';
$lang->repo->encodingsTips = "提交日誌的編碼,可以用逗號連接起來的多個,比如utf-8。";
$lang->repo->example = new stdclass();
$lang->repo->example->client = new stdclass();
$lang->repo->example->path = new stdclass();
$lang->repo->example->client->git = "例如:/usr/bin/git";
$lang->repo->example->client->svn = "例如:/usr/bin/svn";
$lang->repo->example->path->git = "例如:/homt/user/myproject";
$lang->repo->example->path->svn = "例如:http://example.googlecode.com/svn/trunk/myproject";
$lang->repo->example->config = "https需要填寫配置目錄的位置,通過config-dir選項生成配置目錄";
$lang->repo->example->encoding = "填寫版本庫中檔案的編碼";
$lang->repo->typeList['standard'] = '規範';
$lang->repo->typeList['performance'] = '性能';
$lang->repo->typeList['security'] = '安全';
$lang->repo->typeList['redundancy'] = '冗餘';
$lang->repo->typeList['logicError'] = '邏輯錯誤';
+51 -28
View File
@@ -488,6 +488,23 @@ class repoModel extends model
return substr($revision, 0, 10) . '<span title="' . sprintf($this->lang->repo->commitTitle, $commit) . '"> (' . $commit . ') </span>';
}
/**
* Get cache file.
*
* @param int $repoID
* @param string $path
* @param int $revision
* @access public
* @return string
*/
public function getCacheFile($repoID, $path, $revision)
{
$cachePath = $this->app->getCacheRoot() . '/' . 'repo';
if(!is_dir($cachePath)) mkdir($cachePath, 0777, true);
if(!is_writable($cachePath)) return false;
return $cachePath . '/' . $repoID . '-' . md5("{$this->cookie->repoBranch}-$path-$revision");
}
/**
* Save commit.
*
@@ -1082,7 +1099,7 @@ class repoModel extends model
foreach($idMatches[0] as $id)
{
$bugs[$id] = $id;
$actions['bug'][$id]['resolve']['build'] = $matches[11][$i];
$actions['bug'][$id]['resolve'] = array();
}
}
}
@@ -1152,8 +1169,6 @@ class repoModel extends model
$costMarks = str_replace(';', '|', preg_replace('/([^;])/', '\\\\\1', trim($rules['mark']['consumed'], ';')));
$lefts = str_replace(';', '|', trim($rules['task']['left'], ';'));
$leftMarks = str_replace(';', '|', preg_replace('/([^;])/', '\\\\\1', trim($rules['mark']['left'], ';')));
$builds = str_replace(';', '|', trim($rules['bug']['resolvedBuild'], ';'));
$buildMarks = str_replace(';', '|', preg_replace('/([^;])/', '\\\\\1', trim($rules['mark']['resolvedBuild'], ';')));
$taskModule = str_replace(';', '|', trim($rules['module']['task'], ';'));
$bugModule = str_replace(';', '|', trim($rules['module']['bug'], ';'));
$costUnit = str_replace(';', '|', trim($rules['unit']['consumed'], ';'));
@@ -1167,19 +1182,17 @@ class repoModel extends model
$bugReg = "(($bugModule) +(({$idMarks})[0-9]+(({$idSplits})[0-9]+)*))";
$costReg = "($costs) *(($costMarks)([0-9]+)($costUnit))";
$leftReg = "($lefts) *(($leftMarks)([0-9]+)($leftUnit))";
$buildReg = "($builds) *(($buildMarks)([0-9]+))";
$startTaskReg = "({$startAction}) *{$taskReg} +$costReg +$leftReg";
$effortTaskReg = "({$effortAction}) *{$taskReg} +$costReg +$leftReg";
$finishTaskReg = "({$finishAction}) *{$taskReg} +$costReg";
$resolveBugReg = "({$resolveAction}) *{$bugReg} +$buildReg";
$startTaskReg = "({$startAction}) *{$taskReg}.*$costReg.*$leftReg";
$effortTaskReg = "({$effortAction}) *{$taskReg}.*$costReg.*$leftReg";
$finishTaskReg = "({$finishAction}) *{$taskReg}.*$costReg";
$resolveBugReg = "({$resolveAction}) *{$bugReg}";
$reg = array();
$reg['taskReg'] = $taskReg;
$reg['bugReg'] = $bugReg;
$reg['costReg'] = $costReg;
$reg['leftReg'] = $leftReg;
$reg['buildReg'] = $buildReg;
$reg['startTaskReg'] = $startTaskReg;
$reg['effortTaskReg'] = $effortTaskReg;
$reg['finishTaskReg'] = $finishTaskReg;
@@ -1227,6 +1240,7 @@ class repoModel extends model
{
$this->post->set('realStarted', date('Y-m-d'));
$changes = $this->task->start($taskID);
foreach($this->createActionChanges($log, $repoRoot, $scm) as $change) $changes[] = $change;
if($changes)
{
$action->action = $this->post->left == 0 ? 'finished' : 'started';
@@ -1250,11 +1264,24 @@ class repoModel extends model
{
$this->task->recordEstimate($taskID);
}
$action->action = $scm == 'svn' ? 'svncommited' : 'gitcommited';
$action->objectType = 'task';
$action->objectID = $taskID;
$action->product = $productsAndProjects[$taskID]['product'];
$action->project = $productsAndProjects[$taskID]['project'];
$changes = $this->createActionChanges($log, $repoRoot, $scm);
$this->saveRecord($action, $changes);
}
elseif($taskAction == 'finish')
{
$task = $this->task->getById($taskID);
$this->post->set('finishedDate', date('Y-m-d'));
$this->post->set('currentConsumed', $this->post->consumed);
$this->post->set('consumed', $this->post->consumed + $task->consumed);
$changes = $this->task->finish($taskID);
foreach($this->createActionChanges($log, $repoRoot, $scm) as $change) $changes[] = $change;
if($changes)
{
$action->action = 'finished';
@@ -1262,7 +1289,7 @@ class repoModel extends model
}
}
}
unset($object['tasks'][$taskID]);
unset($objects['tasks'][$taskID]);
}
}
if(isset($actions['bug']))
@@ -1277,11 +1304,12 @@ class repoModel extends model
$action->project = $productsAndProjects[$bugID]->project;
foreach($bugActions as $bugAction => $params)
{
foreach($params as $field => $param) $this->post->set($field, $param);
if($bugAction == 'resolve')
{
$this->post->set('resolvedBuild', 'trunk');
$this->post->set('resolution', 'fixed');
$changes = $this->bug->resolve($bugID);
foreach($this->createActionChanges($log, $repoRoot, $scm) as $change) $changes[] = $change;
if($changes)
{
$action->action = 'resolved';
@@ -1289,7 +1317,7 @@ class repoModel extends model
}
}
}
unset($object['bugs'][$bugID]);
unset($objects['bugs'][$bugID]);
}
}
@@ -1354,15 +1382,9 @@ class repoModel extends model
$this->dao->update(TABLE_ACTION)->data($action)->where('id')->eq($record->id)->exec();
if($changes)
{
$historyID = $this->dao->findByAction($record->id)->from(TABLE_HISTORY)->fetch('id');
if($historyID)
{
$this->dao->update(TABLE_HISTORY)->data($changes)->where('id')->eq($historyID)->exec();
}
else
{
$this->action->logHistory($record->id, array($changes));
}
$historyIdList = $this->dao->findByAction($record->id)->from(TABLE_HISTORY)->fetchPairs('id', 'id');
if($historyIdList) $this->dao->delete()->from(TABLE_HISTORY)->where('id')->in($historyIdList)->exec();
$this->loadModel('action')->logHistory($record->id, $changes);
}
}
else
@@ -1371,7 +1393,7 @@ class repoModel extends model
if($changes)
{
$actionID = $this->dao->lastInsertID();
$this->action->logHistory($actionID, array($changes));
$this->loadModel('action')->logHistory($actionID, $changes);
}
}
}
@@ -1404,14 +1426,15 @@ class repoModel extends model
$diff .= $action == 'M' ? "$diffLink\n" : "\n" ;
}
}
$changes = new stdclass();
$changes->field = $scm == 'svn' ? 'subversion' : 'git';
$changes->old = '';
$changes->new = '';
$changes->diff = trim($diff);
$change = new stdclass();
$change->field = $scm == 'svn' ? 'subversion' : 'git';
$change->old = '';
$change->new = '';
$change->diff = trim($diff);
$changes[] = $change;
$this->server->set('PHP_SELF', $oldSelf);
return (array)$changes;
return $changes;
}
/**
+11 -12
View File
@@ -20,7 +20,7 @@
<tbody>
<tr>
<th class='w-110px'><?php echo $lang->repo->objectRule;?></th>
<td>
<td class='w-400px'>
<div class='input-group'>
<?php foreach($config->repo->rules['module'] as $module => $match):?>
<span class='input-group-addon'><?php echo $lang->{$module}->common;?></span>
@@ -28,6 +28,8 @@
<?php endforeach;?>
</div>
</td>
<td class='w-150px'></td>
<td></td>
</tr>
<tr>
<th><?php echo $lang->repo->objectIdRule;?></th>
@@ -49,16 +51,19 @@
<?php echo html::input("rules[task][start]", $config->repo->rules['task']['start'], "class='form-control'");?>
<span class='input-group-addon'><?php echo $lang->task->common . $space . $lang->task->finish;?></span>
<?php echo html::input("rules[task][finish]", $config->repo->rules['task']['finish'], "class='form-control'");?>
<span class='input-group-addon'><?php echo $lang->task->common . $space . $lang->task->logEfforts;?></span>
<?php echo html::input("rules[task][logEfforts]", $config->repo->rules['task']['logEfforts'], "class='form-control'");?>
<span class='input-group-addon'><?php echo $lang->bug->common . $space . $lang->bug->resolve;?></span>
<?php echo html::input("rules[bug][resolve]", $config->repo->rules['bug']['resolve'], "class='form-control'");?>
</div>
</td>
<td></td>
</tr>
<tr>
<th><?php echo $lang->repo->manHourRule;?></th>
<td>
<div class='input-group'>
<span class='input-group-addon'><?php echo $lang->task->common . $space . $lang->task->logEfforts;?></span>
<?php echo html::input("rules[task][logEfforts]", $config->repo->rules['task']['logEfforts'], "class='form-control'");?>
</div>
<div class='input-group'>
<span class='input-group-addon'><?php echo $lang->task->consumed?></span>
<?php echo html::input("rules[task][consumed]", $config->repo->rules['task']['consumed'], "class='form-control'");?>
@@ -75,24 +80,18 @@
<span class='input-group-addon'><?php echo $lang->repo->ruleUnit?></span>
<?php echo html::input("rules[unit][left]", $config->repo->rules['unit']['left'], "class='form-control'");?>
</div>
<div class='input-group'>
<span class='input-group-addon'><?php echo $lang->bug->resolvedBuild?></span>
<?php echo html::input("rules[bug][resolvedBuild]", $config->repo->rules['bug']['resolvedBuild'], "class='form-control'");?>
<span class='input-group-addon'><?php echo $lang->repo->mark?></span>
<?php echo html::input("rules[mark][resolvedBuild]", $config->repo->rules['mark']['resolvedBuild'], "class='form-control'");?>
</div>
</td>
</tr>
<tr>
<th></th>
<td colspan='2'><?php echo $lang->repo->ruleSplit;?></td>
<td class='red' colspan='3'><?php echo $lang->repo->ruleSplit;?></td>
</tr>
<tr>
<th><?php echo $lang->repo->rules->exampleLabel;?></th>
<td colspan='2' id='example'></td>
<td colspan='3' id='example'></td>
</tr>
<tr>
<td colspan='3' class='text-center'>
<td colspan='4' class='text-center'>
<?php echo html::submitButton();?>
<?php echo html::backButton();?>
</td>
+2 -1
View File
@@ -1432,7 +1432,7 @@ class story extends control
* @access public
* @return void
*/
public function report($productID, $browseType, $branchID, $moduleID, $chartType = 'pie')
public function report($productID, $browseType, $branchID, $moduleID, $chartType = 'pie', $storyType = 'story')
{
$this->loadModel('report');
$this->view->charts = array();
@@ -1460,6 +1460,7 @@ class story extends control
$this->view->productID = $productID;
$this->view->branchID = $branchID;
$this->view->browseType = $browseType;
$this->view->storyType = $storyType;
$this->view->moduleID = $moduleID;
$this->view->chartType = $chartType;
$this->view->checkedCharts = $this->post->charts ? join(',', $this->post->charts) : '';
+1
View File
@@ -24,6 +24,7 @@ $lang->story->edit = "Edit Story";
$lang->story->batchEdit = "Batch Edit";
$lang->story->subdivide = 'Decompose';
$lang->story->subdivideAction = 'Decompose Story';
$lang->story->splitRequirent = 'Decompose';
$lang->story->close = 'Close';
$lang->story->closeAction = 'Close Story';
$lang->story->batchClose = 'Batch Close';
+1
View File
@@ -24,6 +24,7 @@ $lang->story->edit = "编辑";
$lang->story->batchEdit = "批量编辑";
$lang->story->subdivide = '细分';
$lang->story->subdivideAction = "细分{$lang->storyCommon}";
$lang->story->splitRequirent = '拆分';
$lang->story->close = '关闭';
$lang->story->closeAction = "关闭{$lang->storyCommon}";
$lang->story->batchClose = '批量关闭';
+1 -1
View File
@@ -840,7 +840,7 @@ class storyModel extends model
->batchCheck($this->config->story->close->requiredFields, 'notempty')
->where('id')->eq($storyID)->exec();
$changes = common::createChanges($oldStory, $newStory);
$actionID = $this->action->create('story', $storyID, 'Closed', '', 'Subdivided');
$actionID = $this->loadModel('action')->create('story', $storyID, 'Closed', '', 'Subdivided');
$this->action->logHistory($actionID, $changes);
return $actionID;
+1
View File
@@ -134,5 +134,6 @@ $(function()
});
});
</script>
<?php js::set('storyType', $type);?>
<?php include '../../common/view/pastetext.html.php';?>
<?php include '../../common/view/footer.html.php';?>
+1
View File
@@ -88,4 +88,5 @@
<?php js::set('oldStorySpec', $story->spec);?>
<?php js::set('oldStoryVerify', $story->verify);?>
<?php js::set('changed', 0);?>
<?php js::set('storyType', $story->type);?>
<?php include '../../common/view/footer.html.php';?>
+1
View File
@@ -216,4 +216,5 @@
</div>
<?php js::set('projectID', $projectID);?>
<?php js::set('storyModule', $lang->story->module);?>
<?php js::set('storyType', $type);?>
<?php include '../../common/view/footer.html.php';?>
+1
View File
@@ -278,4 +278,5 @@
</div>
</form>
</div>
<?php js::set('storyType', $story->type);?>
<?php include '../../common/view/footer.html.php';?>
+1
View File
@@ -86,4 +86,5 @@
<?php js::set('browseType', $browseType);?>
<?php js::set('branchID', $branchID);?>
<?php js::set('moduleID', $moduleID);?>
<?php js::set('storyType', $storyType);?>
<?php include '../../common/view/footer.html.php';?>
+1
View File
@@ -94,4 +94,5 @@ var assignedTo = '<?php $story->lastEditedBy ? print($story->lastEditedBy) : pri
</div>
</div>
<?php js::set('storyID', $story->id);?>
<?php js::set('storyType', $story->type);?>
<?php include '../../common/view/footer.html.php';?>
+6 -4
View File
@@ -74,9 +74,10 @@
common::printIcon('story', 'review', "storyID=$story->id", $story, 'button', '', '', 'showinonlybody');
if($story->status != 'closed' and !isonlybody())
{
$misc = "class='btn' data-toggle='modal' data-type='iframe' data-width='95%'";
$link = $this->createLink('story', 'batchCreate', "productID=$story->product&branch=$story->branch&moduleID=$story->module&storyID=$story->id", '', true);
if(common::hasPriv('story', 'batchCreate')) echo html::a($link, "<i class='icon icon-sitemap'></i> " . $lang->story->subdivide, '', $misc);
$divideLang = ($story->type == 'story' || !$story->type) ? $lang->story->subdivide : $lang->story->splitRequirent;
$misc = "class='btn divideStory' data-toggle='modal' data-type='iframe' data-width='95%'";
$link = $this->createLink('story', 'batchCreate', "productID=$story->product&branch=$story->branch&moduleID=$story->module&storyID=$story->id", '', true);
if(common::hasPriv('story', 'batchCreate')) echo html::a($link, "<i class='icon icon-sitemap'></i> " . $divideLang, '', $misc);
}
common::printIcon('story', 'assignTo', "storyID=$story->id", $story, 'button', '', '', 'iframe showinonlybody', true);
@@ -108,7 +109,7 @@
echo "<div class='divider'></div>";
common::printIcon('story', 'edit', "storyID=$story->id", $story);
common::printIcon('story', 'create', "productID=$story->product&branch=$story->branch&moduleID=$story->module&storyID=$story->id", $story, 'button', 'copy', '', '', true, "data-width='1050'");
common::printIcon('story', 'create', "productID=$story->product&branch=$story->branch&moduleID=$story->module&storyID=$story->id&projectID=0&bugID=0&planID=0&todoID=0&extra=&type=$story->type", $story, 'button', 'copy', '', '', true, "data-width='1050'");
common::printIcon('story', 'delete', "storyID=$story->id", $story, 'button', 'trash', 'hiddenwin');
?>
<?php endif;?>
@@ -400,6 +401,7 @@ js::set('createStory', $lang->story->create);
js::set('productID', $story->product);
js::set('branch', $story->branch);
js::set('moduleID', $story->module);
js::set('storyType', $story->type);
?>
<?php include '../../common/view/syntaxhighlighter.html.php';?>
<?php include '../../common/view/footer.html.php';?>
+22 -41
View File
@@ -89,7 +89,11 @@ class svnModel extends model
$this->printLog("get this repo logs.");
$lastInDB = $this->repo->getLatestCommit($repoID);
/* Ignore unsynced repo. */
if(empty($lastInDB)) continue;
if(empty($lastInDB))
{
$this->printLog("Please init repo {$repo->name}");
continue;
}
$version = $lastInDB->commit;
$logs = $this->repo->getUnsyncCommits($repo);
@@ -139,15 +143,23 @@ class svnModel extends model
$jobs = zget($tagGroup, $repoID, array());
foreach($jobs as $job)
{
$dirs = $this->getRepoTags($repo, $job->svnDir);
end($dirs);
$lastTag = current($dirs);
if($lastTag != $job->lastTag)
$dirs = $this->getRepoTags($repo, $job->svnDir);
$isNew = false;
$lastTag = '';
foreach($dirs as $dir)
{
$tag = rtrim($repo->path , '/') . '/' . trim($job->svnDir, '/') . '/' . $lastTag;
if($dir == $job->lastTag)
{
$isNew = true;
continue;
}
if(!$isNew) continue;
$lastTag = $dir;
$tag = rtrim($repo->path , '/') . '/' . trim($job->svnDir, '/') . '/' . $lastTag;
$this->compile->createByJob($job->id, $tag, 'tag');
$this->dao->update(TABLE_JOB)->set('lastTag')->eq($lastTag)->where('id')->eq($job->id)->exec();
}
if($lastTag) $this->dao->update(TABLE_JOB)->set('lastTag')->eq($lastTag)->where('id')->eq($job->id)->exec();
}
}
}
@@ -258,40 +270,9 @@ class svnModel extends model
*/
public function getRepoTags($repo, $path)
{
$parent = '/';
if($repo->prefix) $parent = rtrim($repo->prefix, '/');
if(trim($path, '/')) $parent = rtrim($repo->prefix, '/') . '/' . trim($path, '/');
$stmt = $this->dao->select('t1.*,t2.revision as svnRevision,t2.time')->from(TABLE_REPOFILES)->alias('t1')
->leftJoin(TABLE_REPOHISTORY)->alias('t2')->on('t1.revision = t2.id')
->where('t1.repo')->eq($repo->id)
->andWhere('t1.type')->eq('dir')
->andWhere('t1.parent')->eq($parent)
->orderBy('path,svnRevision,time')
->query();
$dirs = array();
while($row = $stmt->fetch())
{
$path = $row->path;
if($repo->prefix) $path = str_replace($repo->prefix, '', $path);
if(empty($path)) $path = '/';
$dirs[$path] = $row;
if($row->action == 'D') unset($dirs[$path]);
}
$dirTime = array();
foreach($dirs as $dirPath => $dir) $dirTime[$dir->time][$dirPath] = $dirPath;
ksort($dirTime);
$dirPairs = array();
foreach($dirTime as $time => $dirPaths)
{
ksort($dirPaths);
foreach($dirPaths as $dirPath) $dirPairs[$dirPath] = basename($dirPath);
}
return $dirPairs;
$scm = $this->app->loadClass('scm');
$scm->setEngine($repo);
return $scm->tags($path);
}
/**
+1
View File
@@ -117,3 +117,4 @@ $lang->upgrade->fromVersions['11_6_4'] = '11.6.4';
$lang->upgrade->fromVersions['11_6_5'] = '11.6.5';
$lang->upgrade->fromVersions['11_7'] = '11.7';
$lang->upgrade->fromVersions['12_0'] = '12.0';
$lang->upgrade->fromVersions['12_0_1'] = '12.0.1';
+6 -4
View File
@@ -566,7 +566,7 @@ class upgradeModel extends model
case '12_0_1':
$this->saveLogs('Execute 12_0_1');
$this->execSQL($this->getUpgradeFile('12.0.1'));
$this->saveRepo();
$this->importRepoFromConfig();
$this->appendExec('12_0_1');
}
@@ -730,6 +730,7 @@ class upgradeModel extends model
}
case '11_7' : $confirmContent .= file_get_contents($this->getUpgradeFile('11.7'));
case '12_0' :
case '12_0_1': $confirmContent .= file_get_contents($this->getUpgradeFile('12.0.1'));
}
return str_replace('zt_', $this->config->db->prefix, $confirmContent);
}
@@ -3641,9 +3642,9 @@ class upgradeModel extends model
* Save repo from svn and git config.
*
* @access public
* @return void
* @return bool
*/
public function saveRepo()
public function importRepoFromConfig()
{
$this->app->loadConfig('svn');
if(isset($this->config->svn->repos))
@@ -3667,7 +3668,7 @@ class upgradeModel extends model
$svnRepo->encrypt = 'base64';
$svnRepo->encoding = zget($repo, 'encoding', $this->config->svn->encoding);
$scm->setEngine($repo);
$scm->setEngine($svnRepo);
$info = $scm->info('');
$svnRepo->prefix = empty($info->root) ? '' : trim(str_ireplace($info->root, '', str_replace('\\', '/', $svnRepo->path)), '/');
if($svnRepo->prefix) $svnRepo->prefix = '/' . $svnRepo->prefix;
@@ -3701,6 +3702,7 @@ class upgradeModel extends model
$this->dao->insert(TABLE_REPO)->data($gitRepo)->exec();
}
}
return true;
}
/**
+18 -7
View File
@@ -34,11 +34,12 @@ $lang->webhook->date = 'Datum';
$lang->webhook->data = 'Daten';
$lang->webhook->result = 'Ergebnis';
$lang->webhook->typeList[''] = '';
$lang->webhook->typeList['dingding'] = 'Dingding Robot';
$lang->webhook->typeList['dingapi'] = 'Dingding Notifier';
$lang->webhook->typeList['weixin'] = 'Enterprise WeChat';
$lang->webhook->typeList['default'] = 'SDtandard';
$lang->webhook->typeList[''] = '';
$lang->webhook->typeList['dinggroup'] = 'Dingding Robot';
$lang->webhook->typeList['dinguser'] = 'Dingding Notifier';
$lang->webhook->typeList['wechatgroup'] = 'Enterprise WeChat Robot';
$lang->webhook->typeList['wechatuser'] = 'Enterprise WeChat Notifier';
$lang->webhook->typeList['default'] = 'Others';
$lang->webhook->sendTypeList['sync'] = 'Synchron';
$lang->webhook->sendTypeList['async'] = 'Asynchron';
@@ -46,9 +47,17 @@ $lang->webhook->sendTypeList['async'] = 'Asynchron';
$lang->webhook->dingAgentId = 'AgentID';
$lang->webhook->dingAppKey = 'AppKey';
$lang->webhook->dingAppSecret = 'AppSecret';
$lang->webhook->dingUserid = 'UserID';
$lang->webhook->dingUserid = 'Ding Userid';
$lang->webhook->dingBindStatus = 'Bind Status';
$lang->webhook->wechatCorpId = 'Corp ID';
$lang->webhook->wechatCorpSecret = 'Corp Secret';
$lang->webhook->wechatAgentId = 'Agent ID';
$lang->webhook->wechatUserid = 'Wechat Userid';
$lang->webhook->wechatBindStatus = 'Bind Status';
$lang->webhook->zentaoUser = 'Zentao User';
$lang->webhook->dingBindStatusList['0'] = 'No';
$lang->webhook->dingBindStatusList['1'] = 'Yes';
@@ -71,7 +80,9 @@ $lang->webhook->note->async = 'Wenn der Sendungstyp asynchron ist, wird Cron b
$lang->webhook->note->bind = 'Bind User is only required for Dingding Notifier.';
$lang->webhook->note->product = "Alle Aktionen triggern den Hook wenn das {$lang->productCommon} leer ist, andernsfalls werden nur Aktionen des {$lang->productCommon} ausgelöst.";
$lang->webhook->note->project = "Alle Aktionen triggern den Hook wenn das {$lang->projectCommon} leer ist, andernsfalls werden nur Aktionen des {$lang->projectCommon} ausgelöst.";
$lang->webhook->note->dingKey = " <a href='http://www.zentao.net/book/zentaopmshelp/358.html' target='_blank'><i class='icon-help'></i></a>";
$lang->webhook->note->dingHelp = " <a href='http://www.zentao.net/book/zentaopmshelp/358.html' target='_blank'><i class='icon-help'></i></a>";
$lang->webhook->note->wechatHelp = " <a href='http://www.zentao.net/book/zentaopmshelp/367.html' target='_blank'><i class='icon-help'></i></a>";
$lang->webhook->note->typeList['bearychat'] = 'Fügen Sie einen ZenTao bot in bearychat ein um die Adresse des Webhooks zu erhalten.';
$lang->webhook->note->typeList['dingding'] = 'Fügen Sie einen eigenen bot in dingding ein um die Adresse des Webhooks zu erhalten.';
+18 -7
View File
@@ -34,11 +34,12 @@ $lang->webhook->date = 'Sent';
$lang->webhook->data = 'Data';
$lang->webhook->result = 'Result';
$lang->webhook->typeList[''] = '';
$lang->webhook->typeList['dingding'] = 'Dingding Robot';
$lang->webhook->typeList['dingapi'] = 'Dingding Notifier';
$lang->webhook->typeList['weixin'] = 'Enterprise WeChat';
$lang->webhook->typeList['default'] = 'Others';
$lang->webhook->typeList[''] = '';
$lang->webhook->typeList['dinggroup'] = 'Dingding Robot';
$lang->webhook->typeList['dinguser'] = 'Dingding Notifier';
$lang->webhook->typeList['wechatgroup'] = 'Enterprise WeChat Robot';
$lang->webhook->typeList['wechatuser'] = 'Enterprise WeChat Notifier';
$lang->webhook->typeList['default'] = 'Others';
$lang->webhook->sendTypeList['sync'] = 'Synchronous';
$lang->webhook->sendTypeList['async'] = 'Asynchronous';
@@ -46,9 +47,17 @@ $lang->webhook->sendTypeList['async'] = 'Asynchronous';
$lang->webhook->dingAgentId = 'AgentID';
$lang->webhook->dingAppKey = 'AppKey';
$lang->webhook->dingAppSecret = 'AppSecret';
$lang->webhook->dingUserid = 'UserID';
$lang->webhook->dingUserid = 'Ding UserID';
$lang->webhook->dingBindStatus = 'Bind Status';
$lang->webhook->wechatCorpId = 'Corp ID';
$lang->webhook->wechatCorpSecret = 'Corp Secret';
$lang->webhook->wechatAgentId = 'Agent ID';
$lang->webhook->wechatUserid = 'Wechat Userid';
$lang->webhook->wechatBindStatus = 'Bind Status';
$lang->webhook->zentaoUser = 'Zentao User';
$lang->webhook->dingBindStatusList['0'] = 'No';
$lang->webhook->dingBindStatusList['1'] = 'Yes';
@@ -71,7 +80,9 @@ $lang->webhook->note->async = 'If it is asynchronous, you have to go to Admin-
$lang->webhook->note->bind = 'Bind User is only required for Dingding Notifier.';
$lang->webhook->note->product = "All actions will trigger the hook if {$lang->productCommon} is empty, or only actions of selected {$lang->productCommon} will trigger it.";
$lang->webhook->note->project = "All actions will trigger the hook if {$lang->projectCommon} is empty, or only actions of selected {$lang->projectCommon} will trigger it.";
$lang->webhook->note->dingKey = " <a href='http://www.zentao.net/book/zentaopmshelp/358.html' target='_blank'><i class='icon-help'></i></a>";
$lang->webhook->note->dingHelp = " <a href='http://www.zentao.net/book/zentaopmshelp/358.html' target='_blank'><i class='icon-help'></i></a>";
$lang->webhook->note->wechatHelp = " <a href='http://www.zentao.net/book/zentaopmshelp/367.html' target='_blank'><i class='icon-help'></i></a>";
$lang->webhook->note->typeList['bearychat'] = 'Add a ZenTao bot in bearychat and get the webhook url.';
$lang->webhook->note->typeList['dingding'] = 'Add a customized bot in dingding and get the webhook url.';
+18 -7
View File
@@ -34,11 +34,12 @@ $lang->webhook->date = 'Date envoi';
$lang->webhook->data = 'Donnée';
$lang->webhook->result = 'Résultat';
$lang->webhook->typeList[''] = '';
$lang->webhook->typeList['dingding'] = 'Dingding Robot';
$lang->webhook->typeList['dingapi'] = 'Dingding Notifier';
$lang->webhook->typeList['weixin'] = 'Enterprise WeChat';
$lang->webhook->typeList['default'] = 'Autre';
$lang->webhook->typeList[''] = '';
$lang->webhook->typeList['dinggroup'] = 'Dingding Robot';
$lang->webhook->typeList['dinguser'] = 'Dingding Notifier';
$lang->webhook->typeList['wechatgroup'] = 'Enterprise WeChat Robot';
$lang->webhook->typeList['wechatuser'] = 'Enterprise WeChat Notifier';
$lang->webhook->typeList['default'] = 'Others';
$lang->webhook->sendTypeList['sync'] = 'Synchrone';
$lang->webhook->sendTypeList['async'] = 'Asynchrone';
@@ -46,9 +47,17 @@ $lang->webhook->sendTypeList['async'] = 'Asynchrone';
$lang->webhook->dingAgentId = 'AgentID';
$lang->webhook->dingAppKey = 'AppKey';
$lang->webhook->dingAppSecret = 'AppSecret';
$lang->webhook->dingUserid = 'UserID';
$lang->webhook->dingUserid = 'Ding Userid';
$lang->webhook->dingBindStatus = 'Bind Status';
$lang->webhook->wechatCorpId = 'Corp ID';
$lang->webhook->wechatCorpSecret = 'Corp Secret';
$lang->webhook->wechatAgentId = 'Agent ID';
$lang->webhook->wechatUserid = 'Wechat Userid';
$lang->webhook->wechatBindStatus = 'Bind Status';
$lang->webhook->zentaoUser = 'Zentao User';
$lang->webhook->dingBindStatusList['0'] = 'No';
$lang->webhook->dingBindStatusList['1'] = 'Yes';
@@ -71,7 +80,9 @@ $lang->webhook->note->async = "Si le type d'envoi est asynchrone, vous devez a
$lang->webhook->note->bind = 'Bind User is only required for Dingding Notifier.';
$lang->webhook->note->product = "Toutes les actions vont déclencher le flux si {$lang->productCommon} est vide, ou seulement les actions du {$lang->productCommon} sélectionné vont le déclencher.";
$lang->webhook->note->project = "Toutes les actions vont déclencher le flux si {$lang->projectCommon} est vide, ou seulement les actions du {$lang->projectCommon} sélectionné vont le déclencher.";
$lang->webhook->note->dingKey = " <a href='http://www.zentao.net/book/zentaopmshelp/358.html' target='_blank'><i class='icon-help'></i></a>";
$lang->webhook->note->dingHelp = " <a href='http://www.zentao.net/book/zentaopmshelp/358.html' target='_blank'><i class='icon-help'></i></a>";
$lang->webhook->note->wechatHelp = " <a href='http://www.zentao.net/book/zentaopmshelp/367.html' target='_blank'><i class='icon-help'></i></a>";
$lang->webhook->note->typeList['bearychat'] = "Ajout d'un bot a ZenTao dans bearychat et obtenez l'url du flux.";
$lang->webhook->note->typeList['dingding'] = "Ajout d'un bot personnalisé dans dingding et obtenez l'url du flux.";
+1 -1
View File
@@ -76,7 +76,7 @@ $lang->webhook->confirmDelete = '您確認要刪除該webhook嗎?';
$lang->webhook->trimWords = '了';
$lang->webhook->note = new stdClass();
$lang->webhook->note->async = '非同步需要打開計劃任務';
$lang->webhook->note->async = '非同步需要打開計劃任務。';
$lang->webhook->note->bind = '只有[釘釘/微信]工作通知類型才需要綁定用戶。';
$lang->webhook->note->product = "此項為空時所有{$lang->productCommon}的動作都會觸發鈎子,否則只有關聯{$lang->productCommon}的動作才會觸發。";
$lang->webhook->note->project = "此項為空時所有{$lang->projectCommon}的動作都會觸發鈎子,否則只有關聯{$lang->projectCommon}的動作才會觸發。";
+4 -4
View File
@@ -168,7 +168,7 @@ class webhookModel extends model
$webhook->secret = json_encode($webhook->secret);
$webhook->url = $this->config->webhook->dingapiUrl;
}
elseif ($webhook->type == 'wechatuser')
elseif($webhook->type == 'wechatuser')
{
$webhook->secret = array();
$webhook->secret['agentId'] = $webhook->wechatAgentId;
@@ -234,7 +234,7 @@ class webhookModel extends model
$webhook->secret = json_encode($webhook->secret);
}
elseif ($webhook->type == 'wechatuser')
elseif($webhook->type == 'wechatuser')
{
$webhook->secret = array();
$webhook->secret['agentId'] = $webhook->wechatAgentId;
@@ -574,7 +574,7 @@ class webhookModel extends model
$result = $dingapi->send($openIdList, $sendData);
return json_encode($result);
}
elseif ($webhook->type == 'wechatuser')
elseif($webhook->type == 'wechatuser')
{
$this->app->loadClass('wechatapi', true);
$wechatapi = new wechatapi($webhook->secret->appKey, $webhook->secret->appSecret, $webhook->secret->agentId);
@@ -645,8 +645,8 @@ class webhookModel extends model
/**
* Save log.
*
* @param int $actionID
* @param object $webhook
* @param int $actionID
* @param string $data
* @param string $result
* @access public