From 51d7c43489577effcd7a30fddd112ad9edf1483a Mon Sep 17 00:00:00 2001 From: nazoking Date: Tue, 3 Mar 2015 23:49:22 +0900 Subject: [PATCH 1/7] add blame --- .../RepositoryViewerController.scala | 38 ++++- .../scala/gitbucket/core/util/JGitUtil.scala | 31 ++++ .../twirl/gitbucket/core/repo/blob.scala.html | 144 +++++++++++++++--- .../webapp/assets/common/css/gitbucket.css | 101 ++++++++++++ 4 files changed, 285 insertions(+), 29 deletions(-) diff --git a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala index 629410ac2..45a6ef6f8 100644 --- a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala @@ -27,7 +27,6 @@ class RepositoryViewerController extends RepositoryViewerControllerBase with RepositoryService with AccountService with ActivityService with IssuesService with WebHookService with CommitsService with ReadableUsersAuthenticator with ReferrerAuthenticator with CollaboratorsAuthenticator with PullRequestService - /** * The repository viewer. */ @@ -207,10 +206,9 @@ trait RepositoryViewerControllerBase extends ControllerBase { /** * Displays the file content of the specified branch or commit. */ - get("/:owner/:repository/blob/*")(referrersOnly { repository => + val blobRoute = get("/:owner/:repository/blob/*")(referrersOnly { repository => val (id, path) = splitPath(repository, multiParams("splat").head) val raw = params.get("raw").getOrElse("false").toBoolean - using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git => val revCommit = JGitUtil.getRevCommitFromId(git, git.getRepository.resolve(id)) val lastModifiedCommit = JGitUtil.getLastModifiedCommit(git, revCommit, path) @@ -222,12 +220,44 @@ trait RepositoryViewerControllerBase extends ControllerBase { } } else { html.blob(id, repository, path.split("/").toList, JGitUtil.getContentInfo(git, path, objectId), - new JGitUtil.CommitInfo(lastModifiedCommit), hasWritePermission(repository.owner, repository.name, context.loginAccount)) + new JGitUtil.CommitInfo(lastModifiedCommit),hasWritePermission(repository.owner, repository.name, context.loginAccount), + request.paths(2)=="blame") } } getOrElse NotFound } }) + get("/:owner/:repository/blame/*"){ + blobRoute.action() + } + + /** + * Blame data. + */ + ajaxGet("/:owner/:repository/get-blame/*")(referrersOnly { repository => + val (id, path) = splitPath(repository, multiParams("splat").head) + contentType = formats("json") + using(Git.open(getRepositoryDir(repository.owner, repository.name))){ git => + val last = git.log.add(git.getRepository.resolve(id)).addPath(path).setMaxCount(1).call.iterator.next.name + Map( + "root" -> s"${context.baseUrl}/${repository.owner}/${repository.name}", + "id" -> id, + "path" -> path, + "last" -> last, + "blame" -> JGitUtil.getBlame(git, id, path).map{ blame => + Map( + "id" -> blame.id, + "author" -> view.helpers.user(blame.authorName, blame.authorEmailAddress).toString, + "avatar" -> view.helpers.avatarLink(blame.authorName, 32, blame.authorEmailAddress).toString, + "authed" -> helper.html.datetimeago(blame.authorTime).toString, + "parent" -> blame.parent, + "commited" -> blame.commitTime.getTime, + "message" -> blame.message, + "lines" -> blame.lines) + }) + } + }) + /** * Displays details of the specified commit. */ diff --git a/src/main/scala/gitbucket/core/util/JGitUtil.scala b/src/main/scala/gitbucket/core/util/JGitUtil.scala index d2d531b95..2c0259ed1 100644 --- a/src/main/scala/gitbucket/core/util/JGitUtil.scala +++ b/src/main/scala/gitbucket/core/util/JGitUtil.scala @@ -138,6 +138,9 @@ object JGitUtil { case class BranchInfo(name: String, committerName: String, commitTime: Date, committerEmailAddress:String, mergeInfo: Option[BranchMergeInfo], commitId: String) + case class BlameInfo(id: String, authorName: String, authorEmailAddress: String, authorTime:java.util.Date, + parent: Option[String], commitTime:java.util.Date, message:String, lines:Set[Int]) + /** * Returns RevCommit from the commit or tag id. * @@ -748,4 +751,32 @@ object JGitUtil { } } } + + def getBlame(git: Git, id: String, path: String): Iterable[BlameInfo] = { + Option(git.getRepository.resolve(id)).map{ commitId => + val blamer = new org.eclipse.jgit.api.BlameCommand(git.getRepository); + blamer.setStartCommit(commitId) + blamer.setFilePath(path) + val blame = blamer.call() + var blameMap = Map[String, JGitUtil.BlameInfo]() + var idLine = List[(String, Int)]() + val commits = 0.to(blame.getResultContents().size()-1).map{ i => + val c = blame.getSourceCommit(i) + if(!blameMap.contains(c.name)){ + blameMap += c.name -> JGitUtil.BlameInfo( + c.name, + c.getAuthorIdent.getName, + c.getAuthorIdent.getEmailAddress, + c.getAuthorIdent.getWhen, + c.getParents().sortBy(_.getCommitTime()).lastOption.map(_.name), + c.getCommitterIdent.getWhen, + c.getShortMessage, + Set.empty) + } + idLine :+= (c.name, i) + } + val limeMap = idLine.groupBy(_._1).mapValues(_.map(_._2).toSet) + blameMap.values.map{b => b.copy(lines=limeMap(b.id))} + }.getOrElse(Seq.empty) + } } diff --git a/src/main/twirl/gitbucket/core/repo/blob.scala.html b/src/main/twirl/gitbucket/core/repo/blob.scala.html index 99f106270..c5e11df8a 100644 --- a/src/main/twirl/gitbucket/core/repo/blob.scala.html +++ b/src/main/twirl/gitbucket/core/repo/blob.scala.html @@ -3,12 +3,29 @@ pathList: List[String], content: gitbucket.core.util.JGitUtil.ContentInfo, latestCommit: gitbucket.core.util.JGitUtil.CommitInfo, - hasWritePermission: Boolean)(implicit context: gitbucket.core.controller.Context) + hasWritePermission: Boolean, + isBlame: Boolean)(implicit context: gitbucket.core.controller.Context) @import context._ @import gitbucket.core.view.helpers._ @html.main(s"${repository.owner}/${repository.name}", Some(repository)) { @html.menu("code", repository){
+
+ Newer +
    +
  1. +
  2. +
  3. +
  4. +
  5. +
  6. +
  7. +
  8. +
  9. +
  10. +
+ Older +
@helper.html.branchcontrol( branch, repository, @@ -42,6 +59,9 @@ Edit } Raw + @if(content.viewType == "text"){ + Blame + } History @if(hasWritePermission){ Delete @@ -52,13 +72,13 @@ @if(content.viewType == "text"){ - @defining(pathList.reverse.head) { file => - @if(renderableSuffixes.find(suffix => file.toLowerCase.endsWith(suffix))) { + @defining(renderableSuffixes.find(suffix => pathList.reverse.head.toLowerCase.endsWith(suffix))) { isRrenderable => + @if(!isBlame && isRrenderable) {
@renderMarkup(pathList, content.content.get, branch, repository, false, false)
} else { -
@content.content.get
+
@content.content.get
} } } @@ -84,30 +104,104 @@ $(window).load(function(){ updateHighlighting(); }).hashchange(); - $('pre.prettyprint ol.linenums li').each(function(i, e){ + function updateSourceLineNum(){ + $('.source-line-num').remove(); var pre = $('pre.prettyprint'); - pre.append($('
') - .data('line', (i + 1)) - .css({ - cursor : 'pointer', - position: 'absolute', - top : $(e).position().top + 'px', - left : pre.position().left + 'px', - width : ($(e).position().left - pre.position().left) + 'px', - height : '16px' - })); - }); - - $('div.source-line-num').click(function(e){ - var line = $(e.target).data('line'); - var hash = location.hash; - if(e.shiftKey == true && hash.match(/#L\d+(-L\d+)?/)){ - var lines = hash.split('-'); - location.hash = lines[0] + '-L' + line; - } else { - location.hash = '#L' + line; + $('pre.prettyprint ol.linenums li').each(function(i, e){ + var p = $(e).position(); + var left = pre.position().left + pre.append($('
') + .data('line', (i + 1)) + .css({ + cursor : 'pointer', + position: 'absolute', + top : p.top + 'px', + width : (p.left - left) + 'px', + left : left, + height : '16px' + })); + }); + $('div.source-line-num').click(function(e){ + var line = $(e.target).data('line'); + var hash = location.hash; + if(e.shiftKey == true && hash.match(/#L\d+(-L\d+)?/)){ + var lines = hash.split('-'); + location.hash = lines[0] + '-L' + line; + } else { + location.hash = '#L' + line; + } + }); + } + updateSourceLineNum(); + var repository = $('.blame-action').data('repository'); + $('.blame-action').click(function(e){ + if(history.pushState && $('pre.prettyprint.no-renderable').length){ + e.preventDefault(); + history.pushState(null, null, this.href); + updateBlame(); } }); + + function updateBlame(){ + var m = /^\/(blame|blob)(\/.*)$/.exec(location.pathname.substring(repository.length)); + var mode = m[1]; + $('.blame-action').toggleClass("active", mode=='blame').attr('href', repository + (m[1]=='blame'?'/blob':'/blame')+m[2]); + var pre = $('pre.prettyprint'); + if(pre.parents("td").find(".blame").length){ + pre.parents("div.container").toggleClass("blame-container", mode=='blame'); + updateSourceLineNum(); + return; + } + if(mode=='blob'){ + return; + } + $('.blame-action').addClass("active"); + var base = $('
').css({height:pre.height()}).prependTo(pre.parents("td")[0]); + base.parents("div.container").addClass("blame-container"); + updateSourceLineNum(); + $.get($('.blame-action').data('url')).done(function(data){ + var blame = data.blame; + var index = []; + for(var i=0;i') + .append($('').attr("href",data.root+'/commits/'+blame.id).text(blame.id.substr(0,7))); + if(blame.parent){ + sha.append($('
')) + .append($('
').text('prev').attr("href",data.root+'/blame/'+blame.parent+'/'+data.path)); + } + lastDiv = $('
') + .addClass('heat'+Math.min(10,Math.max(1,Math.ceil((now-blame.commited)/(24*3600*1000*70))))) + .toggleClass('blame-last',blame.id==data.last) + .data('line', (i + 1)) + .css({ + "top" : p.top + 'px', + "min-height" : h+'px', + }) + .append(sha) + .append($(blame.avatar).addClass('avatar').css({"float":"left"})) + .append($('
').text(blame.message)) + .append($('
').html(blame.author+ " authed "+blame.authed)) + .appendTo(base); + } + }); + }); + return false; + }; + updateBlame(); }); /** diff --git a/src/main/webapp/assets/common/css/gitbucket.css b/src/main/webapp/assets/common/css/gitbucket.css index 6888dfd90..c9b6f9582 100644 --- a/src/main/webapp/assets/common/css/gitbucket.css +++ b/src/main/webapp/assets/common/css/gitbucket.css @@ -1328,3 +1328,104 @@ h5 a.markdown-anchor-link { h6 a.markdown-anchor-link { top: 6px; } + +/****************************************************************************/ +/* blame */ +/****************************************************************************/ +div.container.blame-container{ + width:1270px; +} +.line-age-legend { + display: none; +} +.blame-container .line-age-legend { + display: block; + float: right; + font-size: 12px; + color: #777; +} +.blame-container .line-age-legend ol { + display: inline-block; + list-style: none; + margin: 0 5px; +} +.blame-container .line-age-legend ol li { + display: inline-block; + width: 8px; + height: 10px; +} +.blame-container pre.blob{ + margin-left: 350px; +} +.blame-container pre.prettyprint ol.linenums li.blame-sep{ + border-top: 1px solid rgb(219, 219, 219); + margin-top: -1px; +} +.blame{ + font-size: 12px; + white-space: normal; + width: 340px; + float: left; + min-height: 100px; + display: none; +} +.blame-container .blame{ + display: block; +} +.blame .blame-commit-title{ + font-weight: bold; + color: #333; + line-height: 1.1; +} +.blame .avatar{ + margin-right: 4px; + margin-bottom: 4px; +} +.blame .blame-info{ + background: white; + box-shadow:rgba(113, 135, 164, 0.65098) 0px 0px 4px 0px; + position: absolute; + width: 340px; + padding: 2px; + border-right: 2px solid; +} +.blame-sha{ + font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace; + float: right; + text-align: right; +} +.blame-sha .muted-link{ + color: #777; +} +.blame-sha .muted-link:hover{ + color: #4183c4; +} + +.blame .blame-info:hover{ + z-index: 100; + box-shadow:rgba(113, 135, 164, 0.65098) 0px 0px 4px 3px; +} +.blame .blame-info.blame-last{ + background: #FDFCED; +} +.blame-info.heat1{ border-right-color:#ffeca7} +.blame-info.heat2{ border-right-color:#ffdd8c} +.blame-info.heat3{ border-right-color:#ffdd7c} +.blame-info.heat4{ border-right-color:#fba447} +.blame-info.heat5{ border-right-color:#f68736} +.blame-info.heat6{ border-right-color:#f37636} +.blame-info.heat7{ border-right-color:#ca6632} +.blame-info.heat8{ border-right-color:#c0513f} +.blame-info.heat9{ border-right-color:#a2503a} +.blame-info.heat10{border-right-color:#793738} + +.heat1{background-color:#ffeca7} +.heat2{background-color:#ffdd8c} +.heat3{background-color:#ffdd7c} +.heat4{background-color:#fba447} +.heat5{background-color:#f68736} +.heat6{background-color:#f37636} +.heat7{background-color:#ca6632} +.heat8{background-color:#c0513f} +.heat9{background-color:#a2503a} +.heat10{background-color:#793738} From dc0aa0851e416f401424277f99249e1675552ff1 Mon Sep 17 00:00:00 2001 From: nazoking Date: Wed, 4 Mar 2015 03:14:22 +0900 Subject: [PATCH 2/7] implove source-line-num performance. and Stop scroll when click line number. --- .../twirl/gitbucket/core/repo/blob.scala.html | 55 +++++++++++-------- .../webapp/assets/common/css/gitbucket.css | 8 +++ 2 files changed, 41 insertions(+), 22 deletions(-) diff --git a/src/main/twirl/gitbucket/core/repo/blob.scala.html b/src/main/twirl/gitbucket/core/repo/blob.scala.html index c5e11df8a..2a41137cd 100644 --- a/src/main/twirl/gitbucket/core/repo/blob.scala.html +++ b/src/main/twirl/gitbucket/core/repo/blob.scala.html @@ -104,35 +104,41 @@ $(window).load(function(){ updateHighlighting(); }).hashchange(); + var pre = $('pre.prettyprint'); function updateSourceLineNum(){ $('.source-line-num').remove(); - var pre = $('pre.prettyprint'); - $('pre.prettyprint ol.linenums li').each(function(i, e){ - var p = $(e).position(); - var left = pre.position().left - pre.append($('
') - .data('line', (i + 1)) - .css({ - cursor : 'pointer', - position: 'absolute', - top : p.top + 'px', - width : (p.left - left) + 'px', - left : left, - height : '16px' - })); - }); - $('div.source-line-num').click(function(e){ - var line = $(e.target).data('line'); + var pos = pre.find('ol.linenums').position(); + $('
').css({ + height:pre.height(), + width:'48px', + cursor:'pointer', + position: 'absolute', + top : pos.top + 'px', + left : pos.left + 'px' + }).click(function(e){ + $(window).hashchange(function(){}) + var pos = $(this).data("pos"); + if(!pos){ + pos = $('ol.linenums li').map(function(){ return {id:$(this).attr("id"),top:$(this).position().top} }).toArray(); + $(this).data("pos",pos); + } + for(var i=0;ie.pageY){ + break; + } + } + var line = pos[i].id.replace(/^L/,''); var hash = location.hash; if(e.shiftKey == true && hash.match(/#L\d+(-L\d+)?/)){ var lines = hash.split('-'); location.hash = lines[0] + '-L' + line; } else { + var p = $("#L"+line).attr('id',""); location.hash = '#L' + line; + p.attr('id','L'+line); } - }); + }).appendTo(pre); } - updateSourceLineNum(); var repository = $('.blame-action').data('repository'); $('.blame-action').click(function(e){ if(history.pushState && $('pre.prettyprint.no-renderable').length){ @@ -146,13 +152,13 @@ $(window).load(function(){ var m = /^\/(blame|blob)(\/.*)$/.exec(location.pathname.substring(repository.length)); var mode = m[1]; $('.blame-action').toggleClass("active", mode=='blame').attr('href', repository + (m[1]=='blame'?'/blob':'/blame')+m[2]); - var pre = $('pre.prettyprint'); if(pre.parents("td").find(".blame").length){ pre.parents("div.container").toggleClass("blame-container", mode=='blame'); updateSourceLineNum(); return; } if(mode=='blob'){ + updateSourceLineNum(); return; } $('.blame-action').addClass("active"); @@ -214,15 +220,20 @@ function updateHighlighting(){ var lines = hash.substr(1).split('-'); if(lines.length == 1){ $('#' + lines[0]).addClass('highlight'); - $(window).scrollTop($('#' + lines[0]).offset().top - 40); + if(!updateHighlighting.scrolling){ + $(window).scrollTop($('#' + lines[0]).offset().top - 40); + } } else if(lines.length > 1){ var start = parseInt(lines[0].substr(1)); var end = parseInt(lines[1].substr(1)); for(var i = start; i <= end; i++){ $('#L' + i).addClass('highlight'); } - $(window).scrollTop($('#L' + start).offset().top - 40); + if(!updateHighlighting.scrolling){ + $(window).scrollTop($('#L' + start).offset().top - 40); + } } + updateHighlighting.scrolling = true; } } \ No newline at end of file diff --git a/src/main/webapp/assets/common/css/gitbucket.css b/src/main/webapp/assets/common/css/gitbucket.css index c9b6f9582..484bb8278 100644 --- a/src/main/webapp/assets/common/css/gitbucket.css +++ b/src/main/webapp/assets/common/css/gitbucket.css @@ -1332,6 +1332,14 @@ h6 a.markdown-anchor-link { /****************************************************************************/ /* blame */ /****************************************************************************/ +.blobview pre.blob{ + padding-left: 0; +} +.blobview ol.linenums{ + margin-left: 0; + padding-left: 50px; +} + div.container.blame-container{ width:1270px; } From e408eb43bbe0c418904efac157efe60072509790 Mon Sep 17 00:00:00 2001 From: nazoking Date: Wed, 4 Mar 2015 03:37:15 +0900 Subject: [PATCH 3/7] fix parent. only path exists --- src/main/scala/gitbucket/core/util/JGitUtil.scala | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/scala/gitbucket/core/util/JGitUtil.scala b/src/main/scala/gitbucket/core/util/JGitUtil.scala index 2c0259ed1..2e9d6159b 100644 --- a/src/main/scala/gitbucket/core/util/JGitUtil.scala +++ b/src/main/scala/gitbucket/core/util/JGitUtil.scala @@ -768,7 +768,8 @@ object JGitUtil { c.getAuthorIdent.getName, c.getAuthorIdent.getEmailAddress, c.getAuthorIdent.getWhen, - c.getParents().sortBy(_.getCommitTime()).lastOption.map(_.name), + Option(git.log.add(c).addPath(path).setSkip(1).setMaxCount(2).call.iterator.next) + .map(_.name), c.getCommitterIdent.getWhen, c.getShortMessage, Set.empty) From 3e0a50926f0bd050deef1b16f89296a9e5d82963 Mon Sep 17 00:00:00 2001 From: nazoking Date: Mon, 9 Mar 2015 23:42:04 +0900 Subject: [PATCH 4/7] resolve gravatar on blame --- src/main/scala/gitbucket/core/view/helpers.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/scala/gitbucket/core/view/helpers.scala b/src/main/scala/gitbucket/core/view/helpers.scala index 7d7b2b203..9c15445a3 100644 --- a/src/main/scala/gitbucket/core/view/helpers.scala +++ b/src/main/scala/gitbucket/core/view/helpers.scala @@ -117,8 +117,8 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache * Returns <img> which displays the avatar icon for the given user name. * This method looks up Gravatar if avatar icon has not been configured in user settings. */ - def avatar(userName: String, size: Int, tooltip: Boolean = false)(implicit context: Context): Html = - getAvatarImageHtml(userName, size, "", tooltip) + def avatar(userName: String, size: Int, tooltip: Boolean = false, mailAddress: String = "")(implicit context: Context): Html = + getAvatarImageHtml(userName, size, mailAddress, tooltip) /** * Returns <img> which displays the avatar icon for the given mail address. @@ -198,7 +198,7 @@ object helpers extends AvatarImageProvider with LinkConverter with RequestCache * If user does not exist or disabled, this method returns avatar image without link. */ def avatarLink(userName: String, size: Int, mailAddress: String = "", tooltip: Boolean = false)(implicit context: Context): Html = - userWithContent(userName, mailAddress)(avatar(userName, size, tooltip)) + userWithContent(userName, mailAddress)(avatar(userName, size, tooltip, mailAddress)) private def userWithContent(userName: String, mailAddress: String = "", styleClass: String = "")(content: Html)(implicit context: Context): Html = (if(mailAddress.isEmpty){ From 41a6a29771446c24b7b2460af01e7d406e5e25eb Mon Sep 17 00:00:00 2001 From: nazoking Date: Fri, 27 Mar 2015 21:03:41 +0900 Subject: [PATCH 5/7] fix for ie 7,8,9 --- src/main/twirl/gitbucket/core/repo/blob.scala.html | 3 ++- src/main/webapp/assets/common/css/gitbucket.css | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/twirl/gitbucket/core/repo/blob.scala.html b/src/main/twirl/gitbucket/core/repo/blob.scala.html index 2a41137cd..134b33958 100644 --- a/src/main/twirl/gitbucket/core/repo/blob.scala.html +++ b/src/main/twirl/gitbucket/core/repo/blob.scala.html @@ -161,6 +161,7 @@ $(window).load(function(){ updateSourceLineNum(); return; } + $(document.body).toggleClass('no-box-shadow',document.body.style.boxShadow===undefined); $('.blame-action').addClass("active"); var base = $('
').css({height:pre.height()}).prependTo(pre.parents("td")[0]); base.parents("div.container").addClass("blame-container"); @@ -195,7 +196,7 @@ $(window).load(function(){ .data('line', (i + 1)) .css({ "top" : p.top + 'px', - "min-height" : h+'px', + "min-height" : h+'px' }) .append(sha) .append($(blame.avatar).addClass('avatar').css({"float":"left"})) diff --git a/src/main/webapp/assets/common/css/gitbucket.css b/src/main/webapp/assets/common/css/gitbucket.css index 484bb8278..ee57d0bb5 100644 --- a/src/main/webapp/assets/common/css/gitbucket.css +++ b/src/main/webapp/assets/common/css/gitbucket.css @@ -1354,11 +1354,15 @@ div.container.blame-container{ } .blame-container .line-age-legend ol { display: inline-block; + *display: inline; + *zoom: 1; list-style: none; margin: 0 5px; } .blame-container .line-age-legend ol li { display: inline-block; + *display: inline; + *zoom: 1; width: 8px; height: 10px; } @@ -1397,6 +1401,11 @@ div.container.blame-container{ padding: 2px; border-right: 2px solid; } +.no-box-shadow .blame .blame-info{ + border-top: 1px solid #888; + border-bottom: 1px solid #888; + border-left: 1px solid #888; +} .blame-sha{ font: 11px Consolas, "Liberation Mono", Menlo, Courier, monospace; float: right; From 8e81758941bce330d016e4d46e8669c8017c3ff6 Mon Sep 17 00:00:00 2001 From: nazoking Date: Fri, 27 Mar 2015 21:06:12 +0900 Subject: [PATCH 6/7] fix link --- src/main/twirl/gitbucket/core/repo/blob.scala.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/twirl/gitbucket/core/repo/blob.scala.html b/src/main/twirl/gitbucket/core/repo/blob.scala.html index 134b33958..60ce69903 100644 --- a/src/main/twirl/gitbucket/core/repo/blob.scala.html +++ b/src/main/twirl/gitbucket/core/repo/blob.scala.html @@ -185,7 +185,7 @@ $(window).load(function(){ $(e).addClass('blame-sep') blame = index[i]; var sha = $('
') - .append($('').attr("href",data.root+'/commits/'+blame.id).text(blame.id.substr(0,7))); + .append($('').attr("href",data.root+'/commit/'+blame.id).text(blame.id.substr(0,7))); if(blame.parent){ sha.append($('
')) .append($('
').text('prev').attr("href",data.root+'/blame/'+blame.parent+'/'+data.path)); From 83fd2648f5c056f44ab778c57ff414b1a66e3282 Mon Sep 17 00:00:00 2001 From: nazoking Date: Fri, 27 Mar 2015 21:19:02 +0900 Subject: [PATCH 7/7] follow rename --- .../core/controller/RepositoryViewerController.scala | 3 ++- src/main/scala/gitbucket/core/util/JGitUtil.scala | 5 +++-- src/main/twirl/gitbucket/core/repo/blob.scala.html | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala index 45a6ef6f8..970469e02 100644 --- a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala @@ -250,7 +250,8 @@ trait RepositoryViewerControllerBase extends ControllerBase { "author" -> view.helpers.user(blame.authorName, blame.authorEmailAddress).toString, "avatar" -> view.helpers.avatarLink(blame.authorName, 32, blame.authorEmailAddress).toString, "authed" -> helper.html.datetimeago(blame.authorTime).toString, - "parent" -> blame.parent, + "prev" -> blame.prev, + "prevPath" -> blame.prevPath, "commited" -> blame.commitTime.getTime, "message" -> blame.message, "lines" -> blame.lines) diff --git a/src/main/scala/gitbucket/core/util/JGitUtil.scala b/src/main/scala/gitbucket/core/util/JGitUtil.scala index 2e9d6159b..3042a417f 100644 --- a/src/main/scala/gitbucket/core/util/JGitUtil.scala +++ b/src/main/scala/gitbucket/core/util/JGitUtil.scala @@ -139,7 +139,7 @@ object JGitUtil { case class BranchInfo(name: String, committerName: String, commitTime: Date, committerEmailAddress:String, mergeInfo: Option[BranchMergeInfo], commitId: String) case class BlameInfo(id: String, authorName: String, authorEmailAddress: String, authorTime:java.util.Date, - parent: Option[String], commitTime:java.util.Date, message:String, lines:Set[Int]) + prev: Option[String], prevPath: Option[String], commitTime:java.util.Date, message:String, lines:Set[Int]) /** * Returns RevCommit from the commit or tag id. @@ -768,8 +768,9 @@ object JGitUtil { c.getAuthorIdent.getName, c.getAuthorIdent.getEmailAddress, c.getAuthorIdent.getWhen, - Option(git.log.add(c).addPath(path).setSkip(1).setMaxCount(2).call.iterator.next) + Option(git.log.add(c).addPath(blame.getSourcePath(i)).setSkip(1).setMaxCount(2).call.iterator.next) .map(_.name), + if(blame.getSourcePath(i)==path){ None }else{ Some(blame.getSourcePath(i)) }, c.getCommitterIdent.getWhen, c.getShortMessage, Set.empty) diff --git a/src/main/twirl/gitbucket/core/repo/blob.scala.html b/src/main/twirl/gitbucket/core/repo/blob.scala.html index 60ce69903..ffe865fc4 100644 --- a/src/main/twirl/gitbucket/core/repo/blob.scala.html +++ b/src/main/twirl/gitbucket/core/repo/blob.scala.html @@ -186,9 +186,9 @@ $(window).load(function(){ blame = index[i]; var sha = $('