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}
+
+