diff --git a/module/common/lang/menuOrder.php b/module/common/lang/menuOrder.php
index 0f4795e6a6..f70998035e 100644
--- a/module/common/lang/menuOrder.php
+++ b/module/common/lang/menuOrder.php
@@ -77,8 +77,8 @@ $lang->testsuite->menuOrder = $lang->testcase->menuOrder;
$lang->caselib->menuOrder = $lang->testcase->menuOrder;
$lang->testreport->menuOrder = $lang->testcase->menuOrder;
-$lang->ci->menuOrder[5] = 'browse';
-$lang->ci->menuOrder[10] = 'job';
+$lang->ci->menuOrder[5] = 'code';
+$lang->ci->menuOrder[10] = 'build';
$lang->ci->menuOrder[20] = 'jenkins';
$lang->ci->menuOrder[15] = 'maintain';
$lang->ci->menuOrder[25] = 'match';
diff --git a/module/common/lang/zh-cn.php b/module/common/lang/zh-cn.php
index 2595345871..b6e2068d86 100644
--- a/module/common/lang/zh-cn.php
+++ b/module/common/lang/zh-cn.php
@@ -334,11 +334,11 @@ $lang->caselib->menu->caselib = array('link' => '用例库|caselib|browse|libI
$lang->ci = new stdclass();
$lang->ci->menu = new stdclass();
-$lang->ci->menu->browse = array('link' =>'代码|repo|browse|repoID=%s', 'alias' => 'diff,view,revision,log,blame,showsynccomment');
-$lang->ci->menu->job = array('link' =>'构建|integration|browse', 'subModule' => 'compile,integration');
-$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->match = array('link' =>'匹配设置|repo|setmatchcomment');
+$lang->ci->menu->code = array('link' => '代码|repo|browse|repoID=%s', 'alias' => 'diff,view,revision,log,blame,showsynccomment');
+$lang->ci->menu->build = array('link' => '构建|integration|browse', 'subModule' => 'compile,integration');
+$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->match = array('link' => '指令|repo|setmatchcomment');
$lang->repo = new stdclass();
$lang->jenkins = new stdclass();
diff --git a/module/repo/control.php b/module/repo/control.php
index d5ae319317..bc9da02aa3 100644
--- a/module/repo/control.php
+++ b/module/repo/control.php
@@ -263,7 +263,76 @@ class repo extends control
public function browse($repoID = 0, $path = '', $revision = 'HEAD', $refresh = 0)
{
if($this->get->path) $path = $this->get->path;
- $this->locate($this->repo->createLink('log', "repoID=$repoID&entry=&revision=$revision", empty($path) ? '' : "entry=$path"));
+ if(empty($refresh) and $this->cookie->repoRefresh) $refresh = $this->cookie->repoRefresh;
+ $this->repo->setMenu($this->repos, $repoID);
+ $this->repo->setBackSession('list', $withOtherModule = true);
+ if($repoID == 0) $repoID = $this->session->repoID;
+
+ $repo = $this->repo->getRepoByID($repoID);
+ if(!$repo->synced) $this->locate($this->repo->createLink('showSyncComment', "repoID=$repoID"));
+
+ $path = $this->repo->decodePath($path);
+ $cacheFile = $this->repo->getCacheFile($repoID, $path, $revision);
+ $this->scm->setEngine($repo);
+
+ $this->app->loadClass('pager', $static = true);
+ $pager = new pager(0, 8, 1);
+
+ /* Cache infos. */
+ if($refresh or !$cacheFile or !file_exists($cacheFile) or (time() - filemtime($cacheFile)) / 60 > $this->config->repo->cacheTime)
+ {
+ $infos = $this->scm->ls($path, $revision);
+
+ if($infos and $repo->SCM == 'Subversion')
+ {
+ $revisionList = array();
+ foreach($infos as $info) $revisionList[$info->revision] = $info->revision;
+ $comments = $this->repo->getHistory($repoID, $revisionList);
+ foreach($infos as $info)
+ {
+ if(isset($comments[$info->revision]))
+ {
+ $comment = $comments[$info->revision];
+ $info->comment = $comment->comment;
+ }
+ }
+ }
+
+ if($cacheFile)
+ {
+ if(!file_exists($cacheFile . '.lock'))
+ {
+ touch($cacheFile . '.lock');
+ file_put_contents($cacheFile, serialize($infos));
+ unlink($cacheFile . '.lock');
+ }
+ }
+ }
+ else
+ {
+ $infos = unserialize(file_get_contents($cacheFile));
+ }
+ if($refresh) $this->repo->updateLatestCommit($repo);
+ if($this->cookie->repoRefresh) setcookie('repoRefresh', 0, 0, $this->config->webRoot);
+
+ $logType = 'dir';
+ $revisions = $this->repo->getLogs($repo, $path, $revision, $logType, $pager);
+ $commiters = $this->loadModel('user')->getCommiters();
+ foreach($infos as $info) $info->committer = zget($commiters, $info->account, $info->account);
+ foreach($revisions as $log) $log->committer = zget($commiters, $log->committer, $log->committer);
+
+ $this->view->title = $this->lang->repo->common;
+ $this->view->repo = $repo;
+ $this->view->revisions = $revisions;
+ $this->view->revision = $revision;
+ $this->view->infos = $infos;
+ $this->view->repoID = $repoID;
+ $this->view->pager = $pager;
+ $this->view->path = urldecode($path);
+ $this->view->logType = $logType;
+ $this->view->cacheTime = date('m-d H:i', filemtime($cacheFile));
+
+ $this->display();
}
/**
diff --git a/module/repo/css/blame.css b/module/repo/css/blame.css
new file mode 100644
index 0000000000..57c589e9de
--- /dev/null
+++ b/module/repo/css/blame.css
@@ -0,0 +1,11 @@
+.panel.code > .content{border: 1px solid #ccc;}
+.blame{font-size:13px;}
+.blame thead{font-weight:bold; background:#ddd;}
+.blame td{border-left:1px solid #ccc;}
+.blame tr.topLine > td:first-child{border-left:none;}
+.blame .info{ background-color:#f7f7f7; vertical-align:top; padding:0px 4px}
+.topLine{border-top: 1px solid #ccc;}
+.topLine td.info{padding:8px 4px;}
+pre {margin-bottom:0px;display:block; white-space: pre-wrap; padding:0px 3px; border:0px; background:none;}
+.line{ font-weight: bold; border: 1px solid #E4E4E4; background-color: #ECECEC; text-align: right;}
+.panel-actions.pull-right{margin-top:-5px; }
diff --git a/module/repo/css/browse.css b/module/repo/css/browse.css
new file mode 100644
index 0000000000..9b6db01afb
--- /dev/null
+++ b/module/repo/css/browse.css
@@ -0,0 +1,2 @@
+#mainMenu > .btn-toolbar{height: 35px; line-height: 35px;}
+.btn-toolbar > .last-sync-time{display:inline-block; float:left; margin-right: 10px;}
diff --git a/module/repo/css/log.css b/module/repo/css/log.css
index 6ebb508f44..e69de29bb2 100644
--- a/module/repo/css/log.css
+++ b/module/repo/css/log.css
@@ -1 +0,0 @@
-#contentNav{display:none;}
diff --git a/module/repo/model.php b/module/repo/model.php
index 36f15ce624..4c3a0b373d 100644
--- a/module/repo/model.php
+++ b/module/repo/model.php
@@ -455,6 +455,24 @@ class repoModel extends model
return $revisions;
}
+ /**
+ * Get history.
+ *
+ * @param int $repoID
+ * @param array $revisions
+ * @access public
+ * @return array
+ */
+ public function getHistory($repoID, $revisions)
+ {
+ return $this->dao->select('DISTINCT t1.*')->from(TABLE_REPOHISTORY)->alias('t1')
+ ->leftJoin(TABLE_REPOBRANCH)->alias('t2')->on('t1.id=t2.revision')
+ ->where('t1.repo')->eq($repoID)
+ ->andWhere('t1.revision')->in($revisions)
+ ->beginIF($this->cookie->repoBranch)->andWhere('t2.branch')->eq($this->cookie->repoBranch)->fi()
+ ->fetchAll('revision');
+ }
+
/**
* Get git revisionName.
*
diff --git a/module/repo/view/log.html.php b/module/repo/view/log.html.php
index c0b3ff37d3..ff75246c2b 100644
--- a/module/repo/view/log.html.php
+++ b/module/repo/view/log.html.php
@@ -12,6 +12,10 @@