diff --git a/src/main/scala/gitbucket/core/view/helpers.scala b/src/main/scala/gitbucket/core/view/helpers.scala index 221b750..a28a1c8 100644 --- a/src/main/scala/gitbucket/core/view/helpers.scala +++ b/src/main/scala/gitbucket/core/view/helpers.scala @@ -4,7 +4,7 @@ import java.util.{Date, Locale, TimeZone} import gitbucket.core.controller.Context -import gitbucket.core.model.CommitState +import gitbucket.core.model.{CommitState, Repository} import gitbucket.core.plugin.{RenderRequest, PluginRegistry, Renderer} import gitbucket.core.service.{RepositoryService, RequestCache} import gitbucket.core.util.{FileUtil, JGitUtil, StringUtil} @@ -165,11 +165,29 @@ */ def encodeRefName(value: String): String = StringUtil.urlEncode(value).replace("%2F", "/") + /** + * Url encode except '/' and ':' + */ + def encodeCompareBranch(value: String) = + StringUtil.urlEncode(value).replace("%2F", "/").replace("%3A", ":") + def urlEncode(value: String): String = StringUtil.urlEncode(value) def urlEncode(value: Option[String]): String = value.map(urlEncode).getOrElse("") /** + * The default origin (branch or remote:branch pair) branches are compared to. + * + * There are two cases: when the repo is a fork and when the repo is not a + * fork. + * + * For a fork, the default ref is parentUserName:defaultBranch. + * For a non fork, the default ref is defaultBranch. + */ + def repositoryDefaultCompareOrigin(repo: Repository): String = + repo.parentUserName.map(n => s"$n:${repo.defaultBranch}").getOrElse(repo.defaultBranch) + + /** * Generates the url to the repository. */ def url(repository: RepositoryService.RepositoryInfo)(implicit context: Context): String = diff --git a/src/main/twirl/gitbucket/core/repo/branches.scala.html b/src/main/twirl/gitbucket/core/repo/branches.scala.html index 40d353c..e79105f 100644 --- a/src/main/twirl/gitbucket/core/repo/branches.scala.html +++ b/src/main/twirl/gitbucket/core/repo/branches.scala.html @@ -30,9 +30,9 @@ } }.getOrElse{ @if(context.loginAccount.isDefined){ - New Pull Request + New Pull Request }else{ - Compare + Compare } } @if(hasWritePermission){ diff --git a/src/test/scala/gitbucket/core/view/HelpersSpec.scala b/src/test/scala/gitbucket/core/view/HelpersSpec.scala new file mode 100644 index 0000000..b323393 --- /dev/null +++ b/src/test/scala/gitbucket/core/view/HelpersSpec.scala @@ -0,0 +1,51 @@ +package gitbucket.core.view + +import org.specs2.mutable._ +import gitbucket.core.model.Repository +import java.util.Date + +class HelpersSpec extends Specification { + def repository(defaultBranch: String, parentUserName: Option[String]) = + Repository( + userName = "some-user", + repositoryName = "some-repo", + isPrivate = false, + description = None, + defaultBranch = defaultBranch, + parentUserName = parentUserName, + parentRepositoryName = Some("some-repo"), + registeredDate = new Date(), + updatedDate = new Date(), + lastActivityDate = new Date(), + originUserName = Some("some-other-user"), + originRepositoryName = Some("some-repo") + ) + + "repositoryDefaultCompareOrigin" should { + "return default branch when not fork" in { + val repo = repository("master", None) + + helpers.repositoryDefaultCompareOrigin(repo) mustEqual "master" + } + + "return [upstream]:[branch] when a fork" in { + val repo = repository("some-branch", Some("parent-user")) + + helpers.repositoryDefaultCompareOrigin(repo) mustEqual "parent-user:some-branch" + } + } + + "encodeCompareBranch" should { + "not uri encode /" in { + helpers.encodeCompareBranch("foo/bar#baz") mustEqual "foo/bar%23baz" + } + + "not uri encode :" in { + helpers.encodeCompareBranch("foo:bar#baz") mustEqual "foo:bar%23baz" + } + + "uri encode special characters" in { + helpers.encodeCompareBranch("!#$&'()+,;=?@[]") mustEqual "%21%23%24%26%27%28%29%2B%2C%3B%3D%3F%40%5B%5D" + } + } +}