This commit is contained in:
reneeteng
2020-03-12 16:16:15 +08:00
82 changed files with 2482 additions and 303 deletions
-1
View File
@@ -80,7 +80,6 @@ zentaoxx:
cp -r xuan/xxb/config/ext/maps.php zentaoxx/config/ext/
cp -r xuan/xxb/apischeme.json zentaoxx/
cp $(XUANPATH)/xxb/config/ext/maps.php zentaoxx/config/ext/
cp $(XUANPATH)/xxb/module/im/model.php zentaoxx/module/im/model.php
cp $(XUANPATH)/xxb/apischeme.json zentaoxx/
cp -r xuanxuan/config/* zentaoxx/config/
cp -r xuanxuan/module/* zentaoxx/module/
+1 -1
View File
@@ -1 +1 @@
12.0.1
12.1.stable
+1 -1
View File
@@ -16,7 +16,7 @@ if(!class_exists('config')){class config{}}
if(!function_exists('getWebRoot')){function getWebRoot(){}}
/* 基本设置。Basic settings. */
$config->version = '12.0.1'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->version = '12.1'; // ZenTaoPHP的版本。 The version of ZenTaoPHP. Don't change it.
$config->charset = 'UTF-8'; // ZenTaoPHP的编码。 The encoding of ZenTaoPHP.
$config->cookieLife = time() + 2592000; // Cookie的生存时间。The cookie life time.
$config->timezone = 'Asia/Shanghai'; // 时区设置。 The time zone setting, for more see http://www.php.net/manual/en/timezones.php.
+1 -1
View File
@@ -11,7 +11,7 @@ $filter->rules->orderBy = '/^\w+_(desc|asc)$/i';
$filter->rules->browseType = '/^by\w+$/i';
$filter->rules->word = '/^\w+$/';
$filter->rules->paramName = '/^[a-zA-Z0-9_\.]+$/';
$filter->rules->paramValue = '/^[a-zA-Z0-9=_,`#+\^\/\.%\|\x7f-\xff]+$/';
$filter->rules->paramValue = '/^[a-zA-Z0-9=_,`#+\^\/\.%\|\x7f-\xff\-]+$/';
$filter->default = new stdclass();
$filter->default->moduleName = 'code';
+1
View File
@@ -174,6 +174,7 @@ define('TABLE_JOB', '`' . $config->db->prefix . 'job`');
define('TABLE_COMPILE', '`' . $config->db->prefix . 'compile`');
define('TABLE_REPO', '`' . $config->db->prefix . 'repo`');
define('TABLE_RELATION', '`' . $config->db->prefix . 'relation`');
define('TABLE_REPOHISTORY', '`' . $config->db->prefix . 'repohistory`');
define('TABLE_REPOFILES', '`' . $config->db->prefix . 'repofiles`');
define('TABLE_REPOBRANCH', '`' . $config->db->prefix . 'repobranch`');
File diff suppressed because it is too large Load Diff
+15 -38
View File
@@ -1,14 +1,12 @@
ALTER TABLE `zt_story` CHANGE `type` `type` varchar(30) COLLATE 'utf8_general_ci' NOT NULL DEFAULT 'story' AFTER `keywords`;
UPDATE zt_story SET `type` = 'story' WHERE `type` = '';
-- DROP TABLE IF EXISTS `zt_jenkins`;
CREATE TABLE IF NOT EXISTS `zt_jenkins` (
`id` smallint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`url` varchar(255) DEFAULT NULL,
`account` varchar(30) DEFAULT NULL,
`password` varchar(30) NOT NULL,
`encrypt` varchar(30) NOT NULL DEFAULT 'plain',
`token` varchar(255) DEFAULT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
@@ -18,36 +16,37 @@ CREATE TABLE IF NOT EXISTS `zt_jenkins` (
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_integration`;
CREATE TABLE IF NOT EXISTS `zt_integration` (
CREATE TABLE IF NOT EXISTS `zt_job` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`repo` mediumint(8) unsigned NOT NULL,
`jenkins` mediumint(8) unsigned NOT NULL,
`jenkinsJob` varchar(500) NOT NULL,
`jkHost` mediumint(8) unsigned NOT NULL,
`jkJob` varchar(500) NOT NULL,
`triggerType` varchar(255) NOT NULL,
`svnFolder` varchar(255) NOT NULL,
`scheduleDay` varchar(255) DEFAULT NULL,
`tagKeywords` varchar(255) DEFAULT NULL,
`commentKeywords` varchar(255) DEFAULT NULL,
`svnDir` varchar(255) NOT NULL,
`atDay` varchar(20) DEFAULT NULL,
`atTime` varchar(10) DEFAULT NULL,
`comment` varchar(255) DEFAULT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
`lastExec` datetime DEFAULT NULL,
`lastStatus` varchar(255) DEFAULT NULL,
`lastTag` varchar(255) DEFAULT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_compile`;
CREATE TABLE IF NOT EXISTS `zt_compile` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`cijob` mediumint(8) unsigned NOT NULL,
`queueItem` mediumint(8) NOT NULL,
`job` mediumint(8) unsigned NOT NULL,
`queue` mediumint(8) NOT NULL,
`status` varchar(255) NOT NULL,
`logs` text,
`atTime` varchar(10) NOT NULL,
`tag` varchar(255) NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`updateDate` datetime NOT NULL,
@@ -60,32 +59,10 @@ INSERT INTO `zt_cron` (`m`, `h`, `dom`, `mon`, `dow`, `command`, `remark`, `type
('*/5', '*', '*', '*', '*', 'moduleName=ci&methodName=checkBuildStatus', '同步Jenkins任务状态', 'zentao', 1, 'normal', '0000-00-00 00:00:00'),
('*/5', '*', '*', '*', '*', 'moduleName=ci&methodName=exec', '执行Jenkins任务', 'zentao', 1, 'normal', '0000-00-00 00:00:00');
ALTER TABLE `zt_integration`
CHANGE `jenkins` `jkHost` mediumint(8) unsigned NOT NULL AFTER `repo`,
CHANGE `jenkinsJob` `jkJob` varchar(500) COLLATE 'utf8_general_ci' NOT NULL AFTER `jkHost`,
CHANGE `svnFolder` `svnDir` varchar(255) COLLATE 'utf8_general_ci' NOT NULL AFTER `triggerType`,
CHANGE `scheduleDay` `atDay` varchar(20) COLLATE 'utf8_general_ci' NULL AFTER `svnDir`,
ADD `atTime` varchar(10) COLLATE 'utf8_general_ci' NULL AFTER `atDay`,
DROP `tagKeywords`,
DROP `commentKeywords`,
ADD `comment` varchar(255) COLLATE 'utf8_general_ci' NULL AFTER `atTime`,
ADD `lastTag` varchar(255) COLLATE 'utf8_general_ci' NULL;
ALTER TABLE `zt_webhook` MODIFY COLUMN `type` varchar(15) NOT NULL;
ALTER TABLE `zt_webhook` MODIFY COLUMN `type` varchar(15) NOT NULL DEFAULT 'default';
UPDATE `zt_webhook` SET `type` = 'dinggroup' WHERE `type` = 'dingding';
UPDATE `zt_webhook` SET `type` = 'dinguser' WHERE `type` = 'dingapi';
UPDATE `zt_webhook` SET `type` = 'wechatgroup' WHERE `type` = 'weixin';
UPDATE `zt_grouppriv` SET `method` = 'edit' WHERE `module` = 'repo' AND `method` = 'settings';
UPDATE `zt_grouppriv` SET `method` = 'showsynccommit' WHERE `module` = 'repo' AND `method` = 'showsynccomment';
ALTER TABLE `zt_compile`
CHANGE `cijob` `integration` mediumint(8) unsigned NOT NULL AFTER `name`,
CHANGE `queueItem` `queue` mediumint(8) NOT NULL AFTER `integration`;
ALTER TABLE `zt_jenkins` CHANGE `serviceUrl` `url` varchar(255) COLLATE 'utf8_general_ci' NULL AFTER `name`;
ALTER TABLE `zt_jenkins` DROP `encrypt`;
ALTER TABLE `zt_compile` ADD `atTime` varchar(10) COLLATE 'utf8_general_ci' NULL AFTER `logs`;
ALTER TABLE `zt_compile` ADD `tag` varchar(255) COLLATE 'utf8_general_ci' NULL AFTER `logs`;
ALTER TABLE `zt_integration` RENAME TO `zt_job`;
ALTER TABLE `zt_compile` CHANGE `integration` `job` mediumint(8) unsigned NOT NULL AFTER `name`;
UPDATE `zt_grouppriv` SET `method` = 'showsynccommit' WHERE `module` = 'repo' AND `method` = 'showSyncComment';
+171 -23
View File
@@ -217,10 +217,12 @@ CREATE TABLE IF NOT EXISTS `zt_company` (
CREATE TABLE IF NOT EXISTS `zt_compile` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`integration` mediumint(8) unsigned NOT NULL,
`job` mediumint(8) unsigned NOT NULL,
`queue` mediumint(8) NOT NULL,
`status` varchar(255) NOT NULL,
`logs` text,
`atTime` varchar(10) NOT NULL,
`tag` varchar(255) NOT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`updateDate` datetime NOT NULL,
@@ -422,27 +424,6 @@ CREATE TABLE IF NOT EXISTS `zt_history` (
PRIMARY KEY (`id`),
KEY `action` (`action`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_integration`;
CREATE TABLE IF NOT EXISTS `zt_integration` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`repo` mediumint(8) unsigned NOT NULL,
`jenkins` mediumint(8) unsigned NOT NULL,
`jenkinsJob` varchar(500) NOT NULL,
`triggerType` varchar(255) NOT NULL,
`svnFolder` varchar(255) NOT NULL,
`scheduleDay` varchar(255) DEFAULT NULL,
`tagKeywords` varchar(255) DEFAULT NULL,
`commentKeywords` varchar(255) DEFAULT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
`lastExec` datetime DEFAULT NULL,
`lastStatus` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_jenkins`;
CREATE TABLE IF NOT EXISTS `zt_jenkins` (
`id` smallint(8) unsigned NOT NULL AUTO_INCREMENT,
@@ -458,6 +439,28 @@ CREATE TABLE IF NOT EXISTS `zt_jenkins` (
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_job`;
CREATE TABLE IF NOT EXISTS `zt_job` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`repo` mediumint(8) unsigned NOT NULL,
`jkHost` mediumint(8) unsigned NOT NULL,
`jkJob` varchar(500) NOT NULL,
`triggerType` varchar(255) NOT NULL,
`svnDir` varchar(255) NOT NULL,
`atDay` varchar(255) DEFAULT NULL,
`atTime` varchar(10) DEFAULT NULL,
`comment` varchar(255) DEFAULT NULL,
`createdBy` varchar(30) NOT NULL,
`createdDate` datetime NOT NULL,
`editedBy` varchar(30) NOT NULL,
`editedDate` datetime NOT NULL,
`lastExec` datetime DEFAULT NULL,
`lastStatus` varchar(255) DEFAULT NULL,
`lastTag` varchar(255) DEFAULT NULL,
`deleted` enum('0','1') NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_module`;
CREATE TABLE IF NOT EXISTS `zt_module` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
@@ -1044,7 +1047,7 @@ CREATE TABLE IF NOT EXISTS `zt_entry` (
-- DROP TABLE IF EXISTS `zt_webhook`;
CREATE TABLE IF NOT EXISTS `zt_webhook` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
`type` varchar(10) NOT NULL DEFAULT 'default',
`type` varchar(15) NOT NULL DEFAULT 'default',
`name` varchar(50) NOT NULL,
`url` varchar(255) NOT NULL,
`domain` varchar(255) NOT NULL,
@@ -1116,6 +1119,23 @@ CREATE TABLE IF NOT EXISTS `zt_repo` (
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_relation`;
CREATE TABLE `zt_relation` (
`id` int(8) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`program` mediumint(8) NOT NULL,
`product` mediumint(8) NOT NULL,
`project` mediumint(8) NOT NULL,
`AType` char(30) NOT NULL,
`AID` mediumint(8) NOT NULL,
`AVersion` char(30) NOT NULL,
`relation` char(30) NOT NULL,
`BType` char(30) NOT NULL,
`BID` mediumint(8) NOT NULL,
`BVersion` char(30) NOT NULL,
`extra` char(30) NOT NULL,
UNIQUE KEY `relation` (`relation`,`AType`,`BType`, `AID`, `BID`)
) ENGINE='MyISAM' DEFAULT CHARSET=utf8;
-- DROP TABLE IF EXISTS `zt_repobranch`;
CREATE TABLE IF NOT EXISTS `zt_repobranch` (
`repo` mediumint(8) unsigned NOT NULL,
@@ -1422,6 +1442,30 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(1, 'release', 'unlinkStory'),
(1, 'release', 'view'),
(1, 'release', 'changeStatus'),
(1, 'repo', 'view'),
(1, 'repo', 'blame'),
(1, 'repo', 'revision'),
(1, 'repo', 'showSyncCommit'),
(1, 'repo', 'download'),
(1, 'repo', 'browse'),
(1, 'repo', 'diff'),
(1, 'repo', 'log'),
(1, 'repo', 'maintain'),
(1, 'repo', 'setRules'),
(1, 'repo', 'create'),
(1, 'repo', 'edit'),
(1, 'repo', 'delete'),
(1, 'compile', 'browse'),
(1, 'compile', 'logs'),
(1, 'jenkins', 'browse'),
(1, 'jenkins', 'create'),
(1, 'jenkins', 'edit'),
(1, 'jenkins', 'delete'),
(1, 'job', 'browse'),
(1, 'job', 'create'),
(1, 'job', 'edit'),
(1, 'job', 'delete'),
(1, 'job', 'exec'),
(1, 'report', 'bugAssign'),
(1, 'report', 'bugCreate'),
(1, 'report', 'index'),
@@ -1693,6 +1737,14 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(2, 'release', 'browse'),
(2, 'release', 'export'),
(2, 'release', 'view'),
(2, 'repo', 'view'),
(2, 'repo', 'blame'),
(2, 'repo', 'revision'),
(2, 'repo', 'showSyncCommit'),
(2, 'repo', 'download'),
(2, 'repo', 'browse'),
(2, 'repo', 'diff'),
(2, 'repo', 'log'),
(2, 'report', 'bugAssign'),
(2, 'report', 'bugCreate'),
(2, 'report', 'index'),
@@ -1879,6 +1931,14 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(3, 'release', 'browse'),
(3, 'release', 'export'),
(3, 'release', 'view'),
(3, 'repo', 'view'),
(3, 'repo', 'blame'),
(3, 'repo', 'revision'),
(3, 'repo', 'showSyncCommit'),
(3, 'repo', 'download'),
(3, 'repo', 'browse'),
(3, 'repo', 'diff'),
(3, 'repo', 'log'),
(3, 'report', 'bugAssign'),
(3, 'report', 'bugCreate'),
(3, 'report', 'index'),
@@ -2142,6 +2202,30 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(4, 'release', 'browse'),
(4, 'release', 'export'),
(4, 'release', 'view'),
(4, 'repo', 'view'),
(4, 'repo', 'blame'),
(4, 'repo', 'revision'),
(4, 'repo', 'showSyncCommit'),
(4, 'repo', 'download'),
(4, 'repo', 'browse'),
(4, 'repo', 'diff'),
(4, 'repo', 'log'),
(4, 'repo', 'create'),
(4, 'repo', 'edit'),
(4, 'repo', 'delete'),
(4, 'repo', 'maintain'),
(4, 'repo', 'setRules'),
(4, 'compile', 'browse'),
(4, 'compile', 'logs'),
(4, 'jenkins', 'browse'),
(4, 'jenkins', 'create'),
(4, 'jenkins', 'edit'),
(4, 'jenkins', 'delete'),
(4, 'job', 'browse'),
(4, 'job', 'create'),
(4, 'job', 'edit'),
(4, 'job', 'delete'),
(4, 'job', 'exec'),
(4, 'report', 'bugAssign'),
(4, 'report', 'bugCreate'),
(4, 'report', 'index'),
@@ -2400,6 +2484,30 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(5, 'release', 'unlinkStory'),
(5, 'release', 'view'),
(5, 'release', 'changeStatus'),
(5, 'repo', 'view'),
(5, 'repo', 'blame'),
(5, 'repo', 'revision'),
(5, 'repo', 'showSyncCommit'),
(5, 'repo', 'download'),
(5, 'repo', 'browse'),
(5, 'repo', 'diff'),
(5, 'repo', 'log'),
(5, 'repo', 'create'),
(5, 'repo', 'edit'),
(5, 'repo', 'delete'),
(5, 'repo', 'maintain'),
(5, 'repo', 'setRules'),
(5, 'compile', 'browse'),
(5, 'compile', 'logs'),
(5, 'jenkins', 'browse'),
(5, 'jenkins', 'create'),
(5, 'jenkins', 'edit'),
(5, 'jenkins', 'delete'),
(5, 'job', 'browse'),
(5, 'job', 'create'),
(5, 'job', 'edit'),
(5, 'job', 'delete'),
(5, 'job', 'exec'),
(5, 'report', 'bugAssign'),
(5, 'report', 'bugCreate'),
(5, 'report', 'index'),
@@ -2646,6 +2754,14 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(6, 'release', 'browse'),
(6, 'release', 'export'),
(6, 'release', 'view'),
(6, 'repo', 'view'),
(6, 'repo', 'blame'),
(6, 'repo', 'revision'),
(6, 'repo', 'showSyncCommit'),
(6, 'repo', 'download'),
(6, 'repo', 'browse'),
(6, 'repo', 'diff'),
(6, 'repo', 'log'),
(6, 'report', 'bugAssign'),
(6, 'report', 'bugCreate'),
(6, 'report', 'index'),
@@ -2885,6 +3001,14 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(7, 'release', 'unlinkStory'),
(7, 'release', 'view'),
(7, 'release', 'changeStatus'),
(7, 'repo', 'view'),
(7, 'repo', 'blame'),
(7, 'repo', 'revision'),
(7, 'repo', 'showSyncCommit'),
(7, 'repo', 'download'),
(7, 'repo', 'browse'),
(7, 'repo', 'diff'),
(7, 'repo', 'log'),
(7, 'report', 'bugAssign'),
(7, 'report', 'bugCreate'),
(7, 'report', 'index'),
@@ -3107,6 +3231,14 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(8, 'release', 'browse'),
(8, 'release', 'export'),
(8, 'release', 'view'),
(8, 'repo', 'view'),
(8, 'repo', 'blame'),
(8, 'repo', 'revision'),
(8, 'repo', 'showSyncCommit'),
(8, 'repo', 'download'),
(8, 'repo', 'browse'),
(8, 'repo', 'diff'),
(8, 'repo', 'log'),
(8, 'report', 'bugAssign'),
(8, 'report', 'bugCreate'),
(8, 'report', 'index'),
@@ -3347,6 +3479,14 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(9, 'release', 'browse'),
(9, 'release', 'export'),
(9, 'release', 'view'),
(9, 'repo', 'view'),
(9, 'repo', 'blame'),
(9, 'repo', 'revision'),
(9, 'repo', 'showSyncCommit'),
(9, 'repo', 'download'),
(9, 'repo', 'browse'),
(9, 'repo', 'diff'),
(9, 'repo', 'log'),
(9, 'report', 'bugAssign'),
(9, 'report', 'bugCreate'),
(9, 'report', 'index'),
@@ -3490,6 +3630,14 @@ INSERT INTO `zt_grouppriv` (`group`, `module`, `method`) VALUES
(10, 'qa', 'index'),
(10, 'release', 'browse'),
(10, 'release', 'view'),
(10, 'repo', 'view'),
(10, 'repo', 'blame'),
(10, 'repo', 'revision'),
(10, 'repo', 'showSyncCommit'),
(10, 'repo', 'download'),
(10, 'repo', 'browse'),
(10, 'repo', 'diff'),
(10, 'repo', 'log'),
(10, 'report', 'bugAssign'),
(10, 'report', 'bugCreate'),
(10, 'report', 'index'),
+14
View File
@@ -1,3 +1,17 @@
2020-03-10 12.1
完成的需求:
4594 调整浏览代码时版本表头的对齐
4595 代码浏览文件全屏之后按钮应是缩回按钮
4598 svn封装获取某一个目录下面目录和文件列表的功能
4243 实现禅道消息到企业微信个人的通知
4593 附件输出方式改为边读边下
4586 提醒的宽度太宽了
4585 备份列表的表头对齐
修复的Bug
2893 与钉钉集成的性能需要优化
2965 卸载插件文件无法删除
2968 后台数据页面无法展示展示
2020-02-12 12.0.1
完成的需求:
4588 添加需求、任务、bug、用例之后能够记录所属模块
+2
View File
@@ -136,6 +136,8 @@ class router extends baseRouter
if($setting->key == 'hourPoint') $hourCommon = $setting->value;
}
$config->storyCommon = $storyCommon;
/* Set productCommon, projectCommon, storyCommon and hourCommon. Default english lang. */
$lang->productCommon = isset($this->config->productCommonList[$this->clientLang][(int)$productCommon]) ? $this->config->productCommonList[$this->clientLang][(int)$productCommon] : $this->config->productCommonList['en'][(int)$productCommon];
$lang->projectCommon = isset($this->config->projectCommonList[$this->clientLang][(int)$projectCommon]) ? $this->config->projectCommonList[$this->clientLang][(int)$projectCommon] : $this->config->projectCommonList['en'][(int)$projectCommon];
+3 -2
View File
@@ -104,13 +104,14 @@ class Subversion
}
ksort($dirs);
$tags = array();
$tags = array();
$prefix = empty(trim($path, '/')) ? '/' : '/' . trim($path, '/') . '/';
foreach($dirs as $dirNames)
{
ksort($dirNames);
foreach($dirNames as $dirName)
{
$dirPath = $path . '/' . $dirName;
$dirPath = $prefix . $dirName;
$tags[$dirPath] = $dirName;
}
}
+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