diff --git a/src/main/scala/gitbucket/core/controller/PullRequestsController.scala b/src/main/scala/gitbucket/core/controller/PullRequestsController.scala index bb6ec2640..05a4ec7c3 100644 --- a/src/main/scala/gitbucket/core/controller/PullRequestsController.scala +++ b/src/main/scala/gitbucket/core/controller/PullRequestsController.scala @@ -375,6 +375,11 @@ trait PullRequestsControllerBase extends ControllerBase { get("/:owner/:repository/compare")(referrersOnly { forkedRepository => val headBranch = params.get("head") + val quickLoad = params + .get("quick") + .map(_.equalsIgnoreCase("true")) + .getOrElse(context.settings.basicBehavior.compareNoCheckByDefault) + val quickQuery = if (quickLoad) "?quick=true" else "" (forkedRepository.repository.originUserName, forkedRepository.repository.originRepositoryName) match { case (Some(originUserName), Some(originRepositoryName)) => getRepository(originUserName, originRepositoryName).map { originRepository => @@ -388,7 +393,7 @@ trait PullRequestsControllerBase extends ControllerBase { .getOrElse(JGitUtil.getDefaultBranch(oldGit, originRepository).get._2) redirect( - s"/${forkedRepository.owner}/${forkedRepository.name}/compare/$originUserName:$oldBranch...$newBranch" + s"/${forkedRepository.owner}/${forkedRepository.name}/compare/${originUserName}:${oldBranch}...${newBranch}${quickQuery}" ) } } getOrElse NotFound() @@ -396,7 +401,7 @@ trait PullRequestsControllerBase extends ControllerBase { Using.resource(Git.open(getRepositoryDir(forkedRepository.owner, forkedRepository.name))) { git => JGitUtil.getDefaultBranch(git, forkedRepository).map { case (_, defaultBranch) => redirect( - s"/${forkedRepository.owner}/${forkedRepository.name}/compare/$defaultBranch...${headBranch.getOrElse(defaultBranch)}" + s"/${forkedRepository.owner}/${forkedRepository.name}/compare/${defaultBranch}...${headBranch.getOrElse(defaultBranch)}${quickQuery}" ) } getOrElse { redirect(s"/${forkedRepository.owner}/${forkedRepository.name}") @@ -436,76 +441,112 @@ trait PullRequestsControllerBase extends ControllerBase { val Seq(origin, forked) = multiParams("splat") val (originOwner, originId) = parseCompareIdentifier(origin, forkedRepository.owner) val (forkedOwner, forkedId) = parseCompareIdentifier(forked, forkedRepository.owner) + val requestedCheck = params.get("check").contains("true") + val quickLoad = params + .get("quick") + .map(_.equalsIgnoreCase("true")) + .getOrElse(!requestedCheck && context.settings.basicBehavior.compareNoCheckByDefault) (for ( originRepositoryName <- getOriginRepositoryName(originOwner, forkedOwner, forkedRepository); originRepository <- getRepository(originOwner, originRepositoryName) ) yield { - val (oldId, newId) = - getPullRequestCommitFromTo(originRepository, forkedRepository, originId, forkedId) + val members = + ((forkedRepository.repository.originUserName, forkedRepository.repository.originRepositoryName) match { + case (Some(userName), Some(repositoryName)) => + getRepository(userName, repositoryName) match { + case Some(x) => x.repository :: getForkedRepositories(userName, repositoryName) + case None => getForkedRepositories(userName, repositoryName) + } + case _ => + forkedRepository.repository :: getForkedRepositories(forkedRepository.owner, forkedRepository.name) + }).map { repository => + (repository.userName, repository.repositoryName, repository.defaultBranch) + } - (oldId, newId) match { - case (Some(oldId), Some(newId)) => - val (commits, diffs) = getRequestCompareInfo( - originRepository.owner, - originRepository.name, - oldId.getName, - forkedRepository.owner, - forkedRepository.name, - newId.getName, - context.settings - ) + val text = forkedId.replaceAll("[\\-_]", " ") + val fallbackTitle = text.substring(0, 1).toUpperCase + text.substring(1) - val title = if (commits.flatten.length == 1) { - commits.flatten.head.shortMessage - } else { - val text = forkedId.replaceAll("[\\-_]", " ") - text.substring(0, 1).toUpperCase + text.substring(1) - } + if (quickLoad) { + html.compare( + fallbackTitle, + Seq.empty, + Seq.empty, + members, + List.empty, + originId, + forkedId, + "", + "", + getContentTemplate(originRepository, "PULL_REQUEST_TEMPLATE"), + forkedRepository, + originRepository, + forkedRepository, + hasDeveloperRole(originRepository.owner, originRepository.name, context.loginAccount), + getAssignableUserNames(originRepository.owner, originRepository.name), + getMilestones(originRepository.owner, originRepository.name), + getPriorities(originRepository.owner, originRepository.name), + getDefaultPriority(originRepository.owner, originRepository.name), + getLabels(originRepository.owner, originRepository.name), + getCustomFields(originRepository.owner, originRepository.name).filter(_.enableForPullRequests), + quickLoad + ) + } else { + val (oldId, newId) = + getPullRequestCommitFromTo(originRepository, forkedRepository, originId, forkedId) - html.compare( - title, - commits, - diffs, - ((forkedRepository.repository.originUserName, forkedRepository.repository.originRepositoryName) match { - case (Some(userName), Some(repositoryName)) => - getRepository(userName, repositoryName) match { - case Some(x) => x.repository :: getForkedRepositories(userName, repositoryName) - case None => getForkedRepositories(userName, repositoryName) - } - case _ => - forkedRepository.repository :: getForkedRepositories(forkedRepository.owner, forkedRepository.name) - }).map { repository => - (repository.userName, repository.repositoryName, repository.defaultBranch) - }, - commits.flatten - .flatMap(commit => - getCommitComments(forkedRepository.owner, forkedRepository.name, commit.id, includePullRequest = false) - ) - .toList, - originId, - forkedId, - oldId.getName, - newId.getName, - getContentTemplate(originRepository, "PULL_REQUEST_TEMPLATE"), - forkedRepository, - originRepository, - forkedRepository, - hasDeveloperRole(originRepository.owner, originRepository.name, context.loginAccount), - getAssignableUserNames(originRepository.owner, originRepository.name), - getMilestones(originRepository.owner, originRepository.name), - getPriorities(originRepository.owner, originRepository.name), - getDefaultPriority(originRepository.owner, originRepository.name), - getLabels(originRepository.owner, originRepository.name), - getCustomFields(originRepository.owner, originRepository.name).filter(_.enableForPullRequests) - ) - case (oldId, newId) => - redirect( - s"/${forkedRepository.owner}/${forkedRepository.name}/compare/" + - s"$originOwner:${oldId.map(_ => originId).getOrElse(originRepository.repository.defaultBranch)}..." + - s"$forkedOwner:${newId.map(_ => forkedId).getOrElse(forkedRepository.repository.defaultBranch)}" - ) + (oldId, newId) match { + case (Some(oldId), Some(newId)) => + val (commits, diffs) = getRequestCompareInfo( + originRepository.owner, + originRepository.name, + oldId.getName, + forkedRepository.owner, + forkedRepository.name, + newId.getName, + context.settings + ) + val title = if (commits.flatten.length == 1) { + commits.flatten.head.shortMessage + } else { + fallbackTitle + } + + val commitComments = commits.flatten + .flatMap(commit => getCommitComments(forkedRepository.owner, forkedRepository.name, commit.id, false)) + .toList + + html.compare( + title, + commits, + diffs, + members, + commitComments, + originId, + forkedId, + oldId.getName, + newId.getName, + getContentTemplate(originRepository, "PULL_REQUEST_TEMPLATE"), + forkedRepository, + originRepository, + forkedRepository, + hasDeveloperRole(originRepository.owner, originRepository.name, context.loginAccount), + getAssignableUserNames(originRepository.owner, originRepository.name), + getMilestones(originRepository.owner, originRepository.name), + getPriorities(originRepository.owner, originRepository.name), + getDefaultPriority(originRepository.owner, originRepository.name), + getLabels(originRepository.owner, originRepository.name), + getCustomFields(originRepository.owner, originRepository.name).filter(_.enableForPullRequests), + quickLoad + ) + case (oldId, newId) => + redirect( + s"/${forkedRepository.owner}/${forkedRepository.name}/compare/" + + s"${originOwner}:${oldId.map(_ => originId).getOrElse(originRepository.repository.defaultBranch)}..." + + s"${forkedOwner}:${newId.map(_ => forkedId).getOrElse(forkedRepository.repository.defaultBranch)}" + ) + } } }) getOrElse NotFound() }) diff --git a/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala index 3702dac67..12150bb1c 100644 --- a/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala +++ b/src/main/scala/gitbucket/core/controller/SystemSettingsController.scala @@ -49,6 +49,7 @@ trait SystemSettingsControllerBase extends AccountManagementControllerBase { "gravatar" -> trim(label("Gravatar", boolean())), "notification" -> trim(label("Notification", boolean())), "limitVisibleRepositories" -> trim(label("limitVisibleRepositories", boolean())), + "compareNoCheckByDefault" -> trim(label("Default compare mode", boolean())), )(BasicBehavior.apply), "ssh" -> mapping( "enabled" -> trim(label("SSH access", boolean())), diff --git a/src/main/scala/gitbucket/core/service/SystemSettingsService.scala b/src/main/scala/gitbucket/core/service/SystemSettingsService.scala index 479f68679..eb43b56a2 100644 --- a/src/main/scala/gitbucket/core/service/SystemSettingsService.scala +++ b/src/main/scala/gitbucket/core/service/SystemSettingsService.scala @@ -30,6 +30,7 @@ trait SystemSettingsService { props.setProperty(Gravatar, settings.basicBehavior.gravatar.toString) props.setProperty(Notification, settings.basicBehavior.notification.toString) props.setProperty(LimitVisibleRepositories, settings.basicBehavior.limitVisibleRepositories.toString) + props.setProperty(CompareNoCheckByDefault, settings.basicBehavior.compareNoCheckByDefault.toString) props.setProperty(SshEnabled, settings.ssh.enabled.toString) settings.ssh.bindAddress.foreach { bindAddress => props.setProperty(SshBindAddressHost, bindAddress.host.trim()) @@ -128,7 +129,8 @@ trait SystemSettingsService { ), getValue(props, Gravatar, false), getValue(props, Notification, false), - getValue(props, LimitVisibleRepositories, false) + getValue(props, LimitVisibleRepositories, false), + getValue(props, CompareNoCheckByDefault, false) ), Ssh( enabled = getValue(props, SshEnabled, false), @@ -281,6 +283,7 @@ object SystemSettingsService { gravatar: Boolean, notification: Boolean, limitVisibleRepositories: Boolean, + compareNoCheckByDefault: Boolean, ) case class RepositoryOperation( @@ -413,6 +416,7 @@ object SystemSettingsService { private val Gravatar = "gravatar" private val Notification = "notification" private val LimitVisibleRepositories = "limitVisibleRepositories" + private val CompareNoCheckByDefault = "compare_no_check_by_default" private val SshEnabled = "ssh" private val SshHost = "ssh.host" private val SshPort = "ssh.port" diff --git a/src/main/twirl/gitbucket/core/admin/settings_system.scala.html b/src/main/twirl/gitbucket/core/admin/settings_system.scala.html index 4fef350d8..d7837e535 100644 --- a/src/main/twirl/gitbucket/core/admin/settings_system.scala.html +++ b/src/main/twirl/gitbucket/core/admin/settings_system.scala.html @@ -240,6 +240,21 @@ + + +