diff --git a/modules/issuetracker/conf/module.xml b/modules/issuetracker/conf/module.xml index 7fb92060f..5da3d4ff3 100644 --- a/modules/issuetracker/conf/module.xml +++ b/modules/issuetracker/conf/module.xml @@ -53,7 +53,9 @@ + + diff --git a/modules/issuetracker/issuetracker.class.php b/modules/issuetracker/issuetracker.class.php index 46b8dc95b..7a364a571 100644 --- a/modules/issuetracker/issuetracker.class.php +++ b/modules/issuetracker/issuetracker.class.php @@ -47,6 +47,9 @@ $oModuleController->insertActionForward('issuetracker', 'view', 'dispIssuetrackerAdminAttachRelease'); $oModuleController->insertActionForward('issuetracker', 'controller', 'procIssuetrackerAdminAttachRelease'); + + $oDB = &DB::getInstance(); + $oDB->addIndex("issue_changesets","idx_unique_revision", array("module_srl","revision"), true); } function checkUpdate() diff --git a/modules/issuetracker/issuetracker.controller.php b/modules/issuetracker/issuetracker.controller.php index 1c518eb75..f8304d29b 100644 --- a/modules/issuetracker/issuetracker.controller.php +++ b/modules/issuetracker/issuetracker.controller.php @@ -57,7 +57,10 @@ $oDB->begin(); $output = executeQuery("issuetracker.insertIssue", $obj); - if(!$output->toBool()) return $output; + if(!$output->toBool()) { + $oDB->rollback(); + return $output; + } $output = $oDocumentController->insertDocument($obj); $msg_code = 'success_registed'; @@ -367,5 +370,35 @@ $this->setMessage('success_deleted'); } + function syncChangeset() + { + require_once($this->module_path.'classes/svn.class.php'); + $oSvn = new Svn($this->module_info->svn_url, $this->module_info->svn_cmd, $this->module_info->diff_cmd); + $oModel = &getModel('issuetracker'); + $status = $oSvn->getStatus(); + $latestRevision = $oModel->getLatestRevision($this->module_info->module_srl); + + $oController = &getController('issuetracker'); + if($latestRevision < $status->revision) + { + $logs = $oSvn->getLog("/", $latestRevision+1, $status->revision, false, $status->revision-$latestRevision); + foreach($logs as $log) + { + $obj = null; + $obj->revision = $log->revision; + $obj->author = $log->author; + $obj->date = date("YmdHis", strtotime($log->date)); + $obj->message = trim($log->msg); + $obj->module_srl = $this->module_info->module_srl; + executeQuery("issuetracker.insertChangeset", $obj); + } + } + } + + function procIssuetrackerSync() + { + $this->syncChangeset(); + } + } ?> diff --git a/modules/issuetracker/issuetracker.model.php b/modules/issuetracker/issuetracker.model.php index b60b546f3..01c998bc1 100644 --- a/modules/issuetracker/issuetracker.model.php +++ b/modules/issuetracker/issuetracker.model.php @@ -8,6 +8,7 @@ require_once(_XE_PATH_.'modules/issuetracker/issuetracker.item.php'); class issuetrackerModel extends issuetracker { + var $oSvn = null; function init() { @@ -348,5 +349,36 @@ $output = executeQueryArray('issuetracker.getGroupMembers', $args); return $output->data; } + + function getLatestRevision($module_srl) { + $args->module_srl = $module_srl; + $output = executeQuery('issuetracker.getLatestRevision', $args); + if($output->data && $output->data->revision) + { + return $output->data->revision; + } + else return 0; + } + + function getChangesets($module_srl, $enddate = null, $limit = 90) + { + if(!$enddate) + { + $enddate = date("Ymd"); + } + $args->enddate = date("Ymd", ztime($enddate)+24*60*60); + $args->startdate = date("Ymd", ztime($enddate)-24*60*60*$limit); + $args->module_srl = $module_srl; + $output = executeQueryArray("issuetracker.getChangesets", $args); + if(!$output->toBool() || !$output->data) + { + debugPrint($output); + return array(); + } + else + { + return $output->data; + } + } } ?> diff --git a/modules/issuetracker/issuetracker.view.php b/modules/issuetracker/issuetracker.view.php index a7108efd1..c45ee475b 100644 --- a/modules/issuetracker/issuetracker.view.php +++ b/modules/issuetracker/issuetracker.view.php @@ -67,6 +67,14 @@ if(!Context::get('act')) Context::set('act','dispIssuetrackerViewIssue'); } + function dispIssuetrackerTimeline() { + if(!$this->grant->access) return $this->dispIssuetrackerMessage('msg_not_permitted'); + $oModel = &getModel('issuetracker'); + $changesets = $oModel->getChangesets($this->module_info->module_srl); + Context::set('changesets', $changesets); + $this->setTemplateFile('timeline'); + } + /** * @brief 마일스톤과 그에 따른 통계 제공 **/ diff --git a/modules/issuetracker/lang/ko.lang.php b/modules/issuetracker/lang/ko.lang.php index 311f37447..14a62f92c 100644 --- a/modules/issuetracker/lang/ko.lang.php +++ b/modules/issuetracker/lang/ko.lang.php @@ -76,6 +76,7 @@ $lang->project_menus = array( 'dispIssuetrackerViewIssue' => '문제 열람', 'dispIssuetrackerNewIssue' => '문제 작성', + 'dispIssuetrackerTimeline' => '타임 라인', 'dispIssuetrackerViewMilestone' => '개발계획', 'dispIssuetrackerViewSource' => '코드 열람', 'dispIssuetrackerDownload' => '다운로드', diff --git a/modules/issuetracker/queries/getChangesets.xml b/modules/issuetracker/queries/getChangesets.xml new file mode 100644 index 000000000..0571d1c1b --- /dev/null +++ b/modules/issuetracker/queries/getChangesets.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/modules/issuetracker/queries/getLatestRevision.xml b/modules/issuetracker/queries/getLatestRevision.xml new file mode 100644 index 000000000..efe0b057e --- /dev/null +++ b/modules/issuetracker/queries/getLatestRevision.xml @@ -0,0 +1,11 @@ + + +
+ + + + + + + + diff --git a/modules/issuetracker/queries/insertChangeset.xml b/modules/issuetracker/queries/insertChangeset.xml new file mode 100644 index 000000000..fa3c300d6 --- /dev/null +++ b/modules/issuetracker/queries/insertChangeset.xml @@ -0,0 +1,12 @@ + + +
+ + + + + + + + + diff --git a/modules/issuetracker/schemas/issue_changesets.xml b/modules/issuetracker/schemas/issue_changesets.xml new file mode 100644 index 000000000..3260683cb --- /dev/null +++ b/modules/issuetracker/schemas/issue_changesets.xml @@ -0,0 +1,7 @@ +
+ + + + + +
diff --git a/modules/issuetracker/skins/xe_issuetracker/css/common.css b/modules/issuetracker/skins/xe_issuetracker/css/common.css index 1112fda4c..0a409d397 100644 --- a/modules/issuetracker/skins/xe_issuetracker/css/common.css +++ b/modules/issuetracker/skins/xe_issuetracker/css/common.css @@ -263,3 +263,13 @@ fieldset.history ul li.content { padding:10px; color:#444444;} .pagination.c2 a.next{ background:url(../images/arrowNextC1.gif) no-repeat center;} .pagination.c2 a.prev span, .pagination.c2 a.next span{ position:absolute; width:0; height:0; overflow:hidden; visibility:hidden;} + +/* Timeline */ +h4 { background: #F7F7F7 none repeat scroll 0 0; border-bottom:1px solid #D7D7D7; font-size:1.05em; } +dt .time { color: #999999; font-size: 0.90em; } +dt em { border-bottom: 1px dotted #BBBBBB; color: #BB0000; font-style:normal; text-decoration: none; } +dt .author { color: #666666; } +dd { color: #777766; font-size: 0.90em; } +dl { line-height: 1.3em; margin: 0; } +dt { padding: 5px 4px 2px 0 } +dd.changeset p { margin: 0; padding: 0; } diff --git a/modules/issuetracker/skins/xe_issuetracker/timeline.html b/modules/issuetracker/skins/xe_issuetracker/timeline.html new file mode 100644 index 000000000..1587a1d70 --- /dev/null +++ b/modules/issuetracker/skins/xe_issuetracker/timeline.html @@ -0,0 +1,20 @@ + +

Timeline

+ +{@ $curDate = null } + + +

{zdate($changeset->date, "Y-m-d")}

+ + + +
+{@ $curDate = zdate($changeset->date, "Ymd") } + +
+ {zdate($changeset->date,"H:i")} + Changeset [{$changeset->revision}] by {$changeset->author} +
+

{$changeset->message}

+ +