From 3c847bf9575c7f63a7ce13b59346a5f05320db33 Mon Sep 17 00:00:00 2001 From: Naoki Takezoe Date: Sun, 11 Feb 2018 14:54:40 +0900 Subject: [PATCH] (refs #1831) Add default merge strategy setting --- .../resources/update/gitbucket-core_4.22.xml | 1 + .../RepositorySettingsController.scala | 39 +++++++++---- .../gitbucket/core/model/Repository.scala | 6 +- .../core/service/RepositoryService.scala | 7 ++- .../core/pulls/mergeguide.scala.html | 56 +++++++++--------- .../core/settings/options.scala.html | 57 +++++++++++-------- 6 files changed, 99 insertions(+), 67 deletions(-) diff --git a/src/main/resources/update/gitbucket-core_4.22.xml b/src/main/resources/update/gitbucket-core_4.22.xml index 98a3b3dee..85dcc10f8 100644 --- a/src/main/resources/update/gitbucket-core_4.22.xml +++ b/src/main/resources/update/gitbucket-core_4.22.xml @@ -2,5 +2,6 @@ + diff --git a/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala b/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala index ffe98c1bf..b8248987c 100644 --- a/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositorySettingsController.scala @@ -40,7 +40,8 @@ trait RepositorySettingsControllerBase extends ControllerBase { wikiOption: String, externalWikiUrl: Option[String], allowFork: Boolean, - mergeOptions: Seq[String] + mergeOptions: Seq[String], + defaultMergeOption: String ) val optionsForm = mapping( @@ -52,15 +53,13 @@ trait RepositorySettingsControllerBase extends ControllerBase { "wikiOption" -> trim(label("Wiki Option" , text(required, featureOption))), "externalWikiUrl" -> trim(label("External Wiki URL" , optional(text(maxlength(200))))), "allowFork" -> trim(label("Allow Forking" , boolean())), - "mergeOptions" -> new ValueType[Seq[String]]{ - override def convert(name: String, params: Map[String, Seq[String]], messages: Messages): Seq[String] = - params.get("mergeOptions").getOrElse(Nil) - override def validate(name: String, params: Map[String, Seq[String]], messages: Messages): Seq[(String, String)] = - if(params.get("mergeOptions").getOrElse(Nil).isEmpty) Seq("mergeOptions" -> "At least one option must be enabled.") else Nil - }, - )(OptionsForm.apply) - - + "mergeOptions" -> mergeOptions, + "defaultMergeOption" -> trim(label("Default merge strategy", text(required))) + )(OptionsForm.apply).verifying { form => + if(!form.mergeOptions.contains(form.defaultMergeOption)){ + Seq("defaultMergeOption" -> s"This merge strategy isn't enabled.") + } else Nil + } // for default branch case class DefaultBranchForm(defaultBranch: String) @@ -128,7 +127,8 @@ trait RepositorySettingsControllerBase extends ControllerBase { form.wikiOption, form.externalWikiUrl, form.allowFork, - form.mergeOptions + form.mergeOptions, + form.defaultMergeOption ) // Change repository name if(repository.name != form.repositoryName){ @@ -509,4 +509,21 @@ trait RepositorySettingsControllerBase extends ControllerBase { } } } + + private def mergeOptions = new ValueType[Seq[String]]{ + override def convert(name: String, params: Map[String, Seq[String]], messages: Messages): Seq[String] = { + params.get("mergeOptions").getOrElse(Nil) + } + override def validate(name: String, params: Map[String, Seq[String]], messages: Messages): Seq[(String, String)] = { + val mergeOptions = params.get("mergeOptions").getOrElse(Nil) + if(mergeOptions.isEmpty){ + Seq("mergeOptions" -> "At least one option must be enabled.") + } else if(!mergeOptions.forall(x => Seq("merge-commit", "squash", "rebase").contains(x))){ + Seq("mergeOptions" -> "mergeOptions are invalid.") + } else { + Nil + } + } + } + } diff --git a/src/main/scala/gitbucket/core/model/Repository.scala b/src/main/scala/gitbucket/core/model/Repository.scala index 1e06a3987..5a24c3591 100644 --- a/src/main/scala/gitbucket/core/model/Repository.scala +++ b/src/main/scala/gitbucket/core/model/Repository.scala @@ -23,11 +23,12 @@ trait RepositoryComponent extends TemplateComponent { self: Profile => val externalWikiUrl = column[String]("EXTERNAL_WIKI_URL") val allowFork = column[Boolean]("ALLOW_FORK") val mergeOptions = column[String]("MERGE_OPTIONS") + val defaultMergeOption = column[String]("DEFAULT_MERGE_OPTION") def * = ( (userName, repositoryName, isPrivate, description.?, defaultBranch, registeredDate, updatedDate, lastActivityDate, originUserName.?, originRepositoryName.?, parentUserName.?, parentRepositoryName.?), - (issuesOption, externalIssuesUrl.?, wikiOption, externalWikiUrl.?, allowFork, mergeOptions) + (issuesOption, externalIssuesUrl.?, wikiOption, externalWikiUrl.?, allowFork, mergeOptions, defaultMergeOption) ).shaped <> ( { case (repository, options) => Repository( @@ -90,5 +91,6 @@ case class RepositoryOptions( wikiOption: String, externalWikiUrl: Option[String], allowFork: Boolean, - mergeOptions: String + mergeOptions: String, + defaultMergeOption: String ) diff --git a/src/main/scala/gitbucket/core/service/RepositoryService.scala b/src/main/scala/gitbucket/core/service/RepositoryService.scala index 34bb954af..fd7da446d 100644 --- a/src/main/scala/gitbucket/core/service/RepositoryService.scala +++ b/src/main/scala/gitbucket/core/service/RepositoryService.scala @@ -47,7 +47,8 @@ trait RepositoryService { self: AccountService => wikiOption = "PUBLIC", // TODO DISABLE for the forked repository? externalWikiUrl = None, allowFork = true, - mergeOptions = "merge-commit,squash,rebase" + mergeOptions = "merge-commit,squash,rebase", + defaultMergeOption = "merge-commit" ) ) @@ -365,7 +366,7 @@ trait RepositoryService { self: AccountService => */ def saveRepositoryOptions(userName: String, repositoryName: String, description: Option[String], isPrivate: Boolean, issuesOption: String, externalIssuesUrl: Option[String], wikiOption: String, externalWikiUrl: Option[String], - allowFork: Boolean, mergeOptions: Seq[String])(implicit s: Session): Unit = { + allowFork: Boolean, mergeOptions: Seq[String], defaultMergeOption: String)(implicit s: Session): Unit = { Repositories.filter(_.byRepository(userName, repositoryName)) .map { r => ( @@ -377,6 +378,7 @@ trait RepositoryService { self: AccountService => r.externalWikiUrl.?, r.allowFork, r.mergeOptions, + r.defaultMergeOption, r.updatedDate ) } .update ( @@ -388,6 +390,7 @@ trait RepositoryService { self: AccountService => externalWikiUrl, allowFork, mergeOptions.mkString(","), + defaultMergeOption, currentDate ) } diff --git a/src/main/twirl/gitbucket/core/pulls/mergeguide.scala.html b/src/main/twirl/gitbucket/core/pulls/mergeguide.scala.html index e80e60cbc..78e21fa81 100644 --- a/src/main/twirl/gitbucket/core/pulls/mergeguide.scala.html +++ b/src/main/twirl/gitbucket/core/pulls/mergeguide.scala.html @@ -143,48 +143,48 @@
- @defining(originRepository.repository.options.mergeOptions.split(",")){ mergeOptions =>
- +
- }
diff --git a/src/main/twirl/gitbucket/core/settings/options.scala.html b/src/main/twirl/gitbucket/core/settings/options.scala.html index 4e39f8edd..b024c5564 100644 --- a/src/main/twirl/gitbucket/core/settings/options.scala.html +++ b/src/main/twirl/gitbucket/core/settings/options.scala.html @@ -117,30 +117,39 @@
Select pull request merge strategies which are available in this repository. At least one option must be enabled.
- @defining(repository.repository.options.mergeOptions.split(",")){ mergeOptions => -
- -
-
- -
-
- -
- - } + @defining(repository.repository.options.mergeOptions.split(",")){ mergeOptions => +
+ +
+
+ +
+
+ +
+ + } +
+ + + +