mirror of
				https://github.com/gitbucket/gitbucket.git
				synced 2025-10-31 02:25:59 +01:00 
			
		
		
		
	Use ControlUtil.
This commit is contained in:
		| @@ -1,6 +1,8 @@ | |||||||
| package app | package app | ||||||
|  |  | ||||||
| import _root_.util.Directory._ | import _root_.util.Directory._ | ||||||
|  | import _root_.util.Implicits._ | ||||||
|  | import _root_.util.ControlUtil._ | ||||||
| import _root_.util.{FileUtil, Validations} | import _root_.util.{FileUtil, Validations} | ||||||
| import org.scalatra._ | import org.scalatra._ | ||||||
| import org.scalatra.json._ | import org.scalatra.json._ | ||||||
| @@ -57,56 +59,51 @@ abstract class ControllerBase extends ScalatraFilter | |||||||
|    */ |    */ | ||||||
|   implicit def context: Context = Context(servletContext.getContextPath, LoginAccount, currentURL, request) |   implicit def context: Context = Context(servletContext.getContextPath, LoginAccount, currentURL, request) | ||||||
|  |  | ||||||
|   private def currentURL: String = { |   private def currentURL: String = defining(request.getQueryString){ queryString => | ||||||
|     val queryString = request.getQueryString |  | ||||||
|     request.getRequestURI + (if(queryString != null) "?" + queryString else "") |     request.getRequestURI + (if(queryString != null) "?" + queryString else "") | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private def LoginAccount: Option[Account] = { |   private def LoginAccount: Option[Account] = | ||||||
|     session.get("LOGIN_ACCOUNT") match { |     session.get("LOGIN_ACCOUNT") match { | ||||||
|       case Some(x: Account) => Some(x) |       case Some(x: Account) => Some(x) | ||||||
|       case _ => None |       case _ => None | ||||||
|     } |     } | ||||||
|   } |  | ||||||
|  |  | ||||||
|   def ajaxGet(path : String)(action : => Any) : Route = { |   def ajaxGet(path : String)(action : => Any) : Route = | ||||||
|     super.get(path){ |     super.get(path){ | ||||||
|       request.setAttribute("AJAX", "true") |       request.setAttribute("AJAX", "true") | ||||||
|       action |       action | ||||||
|     } |     } | ||||||
|   } |  | ||||||
|  |  | ||||||
|   override def ajaxGet[T](path : String, form : MappingValueType[T])(action : T => Any) : Route = { |   override def ajaxGet[T](path : String, form : MappingValueType[T])(action : T => Any) : Route = | ||||||
|     super.ajaxGet(path, form){ form => |     super.ajaxGet(path, form){ form => | ||||||
|       request.setAttribute("AJAX", "true") |       request.setAttribute("AJAX", "true") | ||||||
|       action(form) |       action(form) | ||||||
|     } |     } | ||||||
|   } |  | ||||||
|  |  | ||||||
|   def ajaxPost(path : String)(action : => Any) : Route = { |   def ajaxPost(path : String)(action : => Any) : Route = | ||||||
|     super.post(path){ |     super.post(path){ | ||||||
|       request.setAttribute("AJAX", "true") |       request.setAttribute("AJAX", "true") | ||||||
|       action |       action | ||||||
|     } |     } | ||||||
|   } |  | ||||||
|  |  | ||||||
|   override def ajaxPost[T](path : String, form : MappingValueType[T])(action : T => Any) : Route = { |   override def ajaxPost[T](path : String, form : MappingValueType[T])(action : T => Any) : Route = | ||||||
|     super.ajaxPost(path, form){ form => |     super.ajaxPost(path, form){ form => | ||||||
|       request.setAttribute("AJAX", "true") |       request.setAttribute("AJAX", "true") | ||||||
|       action(form) |       action(form) | ||||||
|     } |     } | ||||||
|   } |  | ||||||
|  |  | ||||||
|   protected def NotFound() = { |   protected def NotFound() = | ||||||
|     if(request.getAttribute("AJAX") == null){ |     if(request.hasAttribute("AJAX")){ | ||||||
|       org.scalatra.NotFound(html.error("Not Found")) |  | ||||||
|     } else { |  | ||||||
|       org.scalatra.NotFound() |       org.scalatra.NotFound() | ||||||
|  |     } else { | ||||||
|  |       org.scalatra.NotFound(html.error("Not Found")) | ||||||
|     } |     } | ||||||
|   } |  | ||||||
|  |  | ||||||
|   protected def Unauthorized()(implicit context: app.Context) = { |   protected def Unauthorized()(implicit context: app.Context) = | ||||||
|     if(request.getAttribute("AJAX") == null){ |     if(request.hasAttribute("AJAX")){ | ||||||
|  |       org.scalatra.Unauthorized() | ||||||
|  |     } else { | ||||||
|       if(context.loginAccount.isDefined){ |       if(context.loginAccount.isDefined){ | ||||||
|         org.scalatra.Unauthorized(redirect("/")) |         org.scalatra.Unauthorized(redirect("/")) | ||||||
|       } else { |       } else { | ||||||
| @@ -116,13 +113,9 @@ abstract class ControllerBase extends ScalatraFilter | |||||||
|           org.scalatra.Unauthorized(redirect("/signin?redirect=" + currentURL)) |           org.scalatra.Unauthorized(redirect("/signin?redirect=" + currentURL)) | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     } else { |  | ||||||
|       org.scalatra.Unauthorized() |  | ||||||
|     } |     } | ||||||
|   } |  | ||||||
|  |  | ||||||
|   protected def baseUrl = { |   protected def baseUrl = defining(request.getRequestURL.toString){ url => | ||||||
|     val url = request.getRequestURL.toString |  | ||||||
|     url.substring(0, url.length - (request.getRequestURI.length - request.getContextPath.length)) |     url.substring(0, url.length - (request.getRequestURI.length - request.getContextPath.length)) | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -133,12 +126,10 @@ abstract class ControllerBase extends ScalatraFilter | |||||||
|  */ |  */ | ||||||
| case class Context(path: String, loginAccount: Option[Account], currentUrl: String, request: HttpServletRequest){ | case class Context(path: String, loginAccount: Option[Account], currentUrl: String, request: HttpServletRequest){ | ||||||
|  |  | ||||||
|   def redirectUrl = { |   def redirectUrl = if(request.getParameter("redirect") != null){ | ||||||
|     if(request.getParameter("redirect") != null){ |     request.getParameter("redirect") | ||||||
|       request.getParameter("redirect") |   } else { | ||||||
|     } else { |     currentUrl | ||||||
|       currentUrl |  | ||||||
|     } |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
| @@ -147,13 +138,12 @@ case class Context(path: String, loginAccount: Option[Account], currentUrl: Stri | |||||||
|    * If object has not been cached with the specified key then retrieves by given action. |    * If object has not been cached with the specified key then retrieves by given action. | ||||||
|    * Cached object are available during a request. |    * Cached object are available during a request. | ||||||
|    */ |    */ | ||||||
|   def cache[A](key: String)(action: => A): A = { |   def cache[A](key: String)(action: => A): A = | ||||||
|     Option(request.getAttribute("cache." + key).asInstanceOf[A]).getOrElse { |     Option(request.getAttribute("cache." + key).asInstanceOf[A]).getOrElse { | ||||||
|       val newObject = action |       val newObject = action | ||||||
|       request.setAttribute("cache." + key, newObject) |       request.setAttribute("cache." + key, newObject) | ||||||
|       newObject |       newObject | ||||||
|     } |     } | ||||||
|   } |  | ||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -163,7 +153,7 @@ case class Context(path: String, loginAccount: Option[Account], currentUrl: Stri | |||||||
| trait AccountManagementControllerBase extends ControllerBase with FileUploadControllerBase { | trait AccountManagementControllerBase extends ControllerBase with FileUploadControllerBase { | ||||||
|   self: AccountService  => |   self: AccountService  => | ||||||
|  |  | ||||||
|   protected def updateImage(userName: String, fileId: Option[String], clearImage: Boolean): Unit = { |   protected def updateImage(userName: String, fileId: Option[String], clearImage: Boolean): Unit = | ||||||
|     if(clearImage){ |     if(clearImage){ | ||||||
|       getAccountByUserName(userName).flatMap(_.image).map { image => |       getAccountByUserName(userName).flatMap(_.image).map { image => | ||||||
|         new java.io.File(getUserUploadDir(userName), image).delete() |         new java.io.File(getUserUploadDir(userName), image).delete() | ||||||
| @@ -179,7 +169,6 @@ trait AccountManagementControllerBase extends ControllerBase with FileUploadCont | |||||||
|         updateAvatarImage(userName, Some(filename)) |         updateAvatarImage(userName, Some(filename)) | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   } |  | ||||||
|  |  | ||||||
|   protected def uniqueUserName: Constraint = new Constraint(){ |   protected def uniqueUserName: Constraint = new Constraint(){ | ||||||
|     override def validate(name: String, value: String): Option[String] = |     override def validate(name: String, value: String): Option[String] = | ||||||
| @@ -212,15 +201,14 @@ trait FileUploadControllerBase { | |||||||
|   //  def removeTemporaryFile(fileId: String)(implicit session: HttpSession): Unit = |   //  def removeTemporaryFile(fileId: String)(implicit session: HttpSession): Unit = | ||||||
|   //    getTemporaryFile(fileId).delete() |   //    getTemporaryFile(fileId).delete() | ||||||
|  |  | ||||||
|   def removeTemporaryFiles()(implicit session: HttpSession): Unit = |   def removeTemporaryFiles()(implicit session: HttpSession): Unit = FileUtils.deleteDirectory(TemporaryDir) | ||||||
|     FileUtils.deleteDirectory(TemporaryDir) |  | ||||||
|  |  | ||||||
|   def getUploadedFilename(fileId: String)(implicit session: HttpSession): Option[String] = { |   def getUploadedFilename(fileId: String)(implicit session: HttpSession): Option[String] = | ||||||
|     val filename = Option(session.getAttribute("upload_" + fileId).asInstanceOf[String]) |     defining(Option(session.getAttribute("upload_" + fileId).asInstanceOf[String])){ filename => | ||||||
|     if(filename.isDefined){ |       if(filename.isDefined){ | ||||||
|       session.removeAttribute("upload_" + fileId) |         session.removeAttribute("upload_" + fileId) | ||||||
|  |       } | ||||||
|  |       filename | ||||||
|     } |     } | ||||||
|     filename |  | ||||||
|   } |  | ||||||
|  |  | ||||||
| } | } | ||||||
| @@ -2,6 +2,7 @@ package app | |||||||
|  |  | ||||||
| import service._ | import service._ | ||||||
| import util.UsersAuthenticator | import util.UsersAuthenticator | ||||||
|  | import util.Implicits._ | ||||||
|  |  | ||||||
| class DashboardController extends DashboardControllerBase | class DashboardController extends DashboardControllerBase | ||||||
|   with IssuesService with PullRequestService with RepositoryService with AccountService |   with IssuesService with PullRequestService with RepositoryService with AccountService | ||||||
| @@ -43,11 +44,10 @@ trait DashboardControllerBase extends ControllerBase { | |||||||
|  |  | ||||||
|     // condition |     // condition | ||||||
|     val sessionKey = "dashboard/issues" |     val sessionKey = "dashboard/issues" | ||||||
|     val condition = if(request.getQueryString == null) |     val condition = session.putAndGet(sessionKey, | ||||||
|       session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition] |       if(request.hasQueryString) IssueSearchCondition(request) | ||||||
|     else IssueSearchCondition(request) |       else session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition] | ||||||
|  |     ) | ||||||
|     session.put(sessionKey, condition) |  | ||||||
|  |  | ||||||
|     val userName = context.loginAccount.get.userName |     val userName = context.loginAccount.get.userName | ||||||
|     val repositories = getUserRepositories(userName, baseUrl).map(repo => repo.owner -> repo.name) |     val repositories = getUserRepositories(userName, baseUrl).map(repo => repo.owner -> repo.name) | ||||||
| @@ -76,14 +76,10 @@ trait DashboardControllerBase extends ControllerBase { | |||||||
|  |  | ||||||
|     // condition |     // condition | ||||||
|     val sessionKey = "dashboard/pulls" |     val sessionKey = "dashboard/pulls" | ||||||
|     val condition = { |     val condition = session.putAndGet(sessionKey, { | ||||||
|       if(request.getQueryString == null) |       if(request.hasQueryString) IssueSearchCondition(request) | ||||||
|         session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition] |       else session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition] | ||||||
|       else |     }.copy(repo = repository)) | ||||||
|         IssueSearchCondition(request) |  | ||||||
|     }.copy(repo = repository) |  | ||||||
|  |  | ||||||
|     session.put(sessionKey, condition) |  | ||||||
|  |  | ||||||
|     val userName = context.loginAccount.get.userName |     val userName = context.loginAccount.get.userName | ||||||
|     val repositories = getUserRepositories(userName, baseUrl).map(repo => repo.owner -> repo.name) |     val repositories = getUserRepositories(userName, baseUrl).map(repo => repo.owner -> repo.name) | ||||||
|   | |||||||
| @@ -5,6 +5,8 @@ import jp.sf.amateras.scalatra.forms._ | |||||||
| import service._ | import service._ | ||||||
| import IssuesService._ | import IssuesService._ | ||||||
| import util.{CollaboratorsAuthenticator, ReferrerAuthenticator, ReadableUsersAuthenticator, Notifier} | import util.{CollaboratorsAuthenticator, ReferrerAuthenticator, ReadableUsersAuthenticator, Notifier} | ||||||
|  | import util.Implicits._ | ||||||
|  | import util.ControlUtil._ | ||||||
| import org.scalatra.Ok | import org.scalatra.Ok | ||||||
|  |  | ||||||
| class IssuesController extends IssuesControllerBase | class IssuesController extends IssuesControllerBase | ||||||
| @@ -57,12 +59,9 @@ trait IssuesControllerBase extends ControllerBase { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   get("/:owner/:repository/issues/:id")(referrersOnly { repository => |   get("/:owner/:repository/issues/:id")(referrersOnly { repository => | ||||||
|     val owner   = repository.owner |     defining(repository.owner, repository.name, params("id")){ case (owner, name, issueId) => | ||||||
|     val name    = repository.name |       getIssue(owner, name, issueId) map { | ||||||
|     val issueId = params("id") |         issues.html.issue( | ||||||
|  |  | ||||||
|     getIssue(owner, name, issueId) map { |  | ||||||
|       issues.html.issue( |  | ||||||
|           _, |           _, | ||||||
|           getComments(owner, name, issueId.toInt), |           getComments(owner, name, issueId.toInt), | ||||||
|           getIssueLabels(owner, name, issueId.toInt), |           getIssueLabels(owner, name, issueId.toInt), | ||||||
| @@ -71,65 +70,64 @@ trait IssuesControllerBase extends ControllerBase { | |||||||
|           getLabels(owner, name), |           getLabels(owner, name), | ||||||
|           hasWritePermission(owner, name, context.loginAccount), |           hasWritePermission(owner, name, context.loginAccount), | ||||||
|           repository) |           repository) | ||||||
|     } getOrElse NotFound |       } getOrElse NotFound | ||||||
|  |     } | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   get("/:owner/:repository/issues/new")(readableUsersOnly { repository => |   get("/:owner/:repository/issues/new")(readableUsersOnly { repository => | ||||||
|     val owner = repository.owner |     defining(repository.owner, repository.name){ case (owner, name) => | ||||||
|     val name  = repository.name |       issues.html.create( | ||||||
|  |           (getCollaborators(owner, name) :+ owner).sorted, | ||||||
|     issues.html.create( |           getMilestones(owner, name), | ||||||
|         (getCollaborators(owner, name) :+ owner).sorted, |           getLabels(owner, name), | ||||||
|         getMilestones(owner, name), |           hasWritePermission(owner, name, context.loginAccount), | ||||||
|         getLabels(owner, name), |           repository) | ||||||
|         hasWritePermission(owner, name, context.loginAccount), |     } | ||||||
|         repository) |  | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   post("/:owner/:repository/issues/new", issueCreateForm)(readableUsersOnly { (form, repository) => |   post("/:owner/:repository/issues/new", issueCreateForm)(readableUsersOnly { (form, repository) => | ||||||
|     val owner    = repository.owner |     defining(repository.owner, repository.name){ case (owner, name) => | ||||||
|     val name     = repository.name |       val writable = hasWritePermission(owner, name, context.loginAccount) | ||||||
|     val writable = hasWritePermission(owner, name, context.loginAccount) |       val userName = context.loginAccount.get.userName | ||||||
|     val userName = context.loginAccount.get.userName |  | ||||||
|  |  | ||||||
|     // insert issue |       // insert issue | ||||||
|     val issueId = createIssue(owner, name, userName, form.title, form.content, |       val issueId = createIssue(owner, name, userName, form.title, form.content, | ||||||
|       if(writable) form.assignedUserName else None, |         if(writable) form.assignedUserName else None, | ||||||
|       if(writable) form.milestoneId else None) |         if(writable) form.milestoneId else None) | ||||||
|  |  | ||||||
|     // insert labels |       // insert labels | ||||||
|     if(writable){ |       if(writable){ | ||||||
|       form.labelNames.map { value => |         form.labelNames.map { value => | ||||||
|         val labels = getLabels(owner, name) |           val labels = getLabels(owner, name) | ||||||
|         value.split(",").foreach { labelName => |           value.split(",").foreach { labelName => | ||||||
|           labels.find(_.labelName == labelName).map { label => |             labels.find(_.labelName == labelName).map { label => | ||||||
|             registerIssueLabel(owner, name, issueId, label.labelId) |               registerIssueLabel(owner, name, issueId, label.labelId) | ||||||
|  |             } | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|  |  | ||||||
|  |       // record activity | ||||||
|  |       recordCreateIssueActivity(owner, name, userName, issueId, form.title) | ||||||
|  |  | ||||||
|  |       // notifications | ||||||
|  |       Notifier().toNotify(repository, issueId, form.content.getOrElse("")){ | ||||||
|  |         Notifier.msgIssue(s"${baseUrl}/${owner}/${name}/issues/${issueId}") | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       redirect(s"/${owner}/${name}/issues/${issueId}") | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     // record activity |  | ||||||
|     recordCreateIssueActivity(owner, name, userName, issueId, form.title) |  | ||||||
|  |  | ||||||
|     // notifications |  | ||||||
|     Notifier().toNotify(repository, issueId, form.content.getOrElse("")){ |  | ||||||
|       Notifier.msgIssue(s"${baseUrl}/${owner}/${name}/issues/${issueId}") |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     redirect(s"/${owner}/${name}/issues/${issueId}") |  | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   ajaxPost("/:owner/:repository/issues/edit/:id", issueEditForm)(readableUsersOnly { (form, repository) => |   ajaxPost("/:owner/:repository/issues/edit/:id", issueEditForm)(readableUsersOnly { (form, repository) => | ||||||
|     val owner = repository.owner |     defining(repository.owner, repository.name){ case (owner, name) => | ||||||
|     val name  = repository.name |       getIssue(owner, name, params("id")).map { issue => | ||||||
|  |         if(isEditable(owner, name, issue.openedUserName)){ | ||||||
|     getIssue(owner, name, params("id")).map { issue => |           updateIssue(owner, name, issue.issueId, form.title, form.content) | ||||||
|       if(isEditable(owner, name, issue.openedUserName)){ |           redirect(s"/${owner}/${name}/issues/_data/${issue.issueId}") | ||||||
|         updateIssue(owner, name, issue.issueId, form.title, form.content) |         } else Unauthorized | ||||||
|         redirect(s"/${owner}/${name}/issues/_data/${issue.issueId}") |       } getOrElse NotFound | ||||||
|       } else Unauthorized |     } | ||||||
|     } getOrElse NotFound |  | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   post("/:owner/:repository/issue_comments/new", commentForm)(readableUsersOnly { (form, repository) => |   post("/:owner/:repository/issue_comments/new", commentForm)(readableUsersOnly { (form, repository) => | ||||||
| @@ -147,15 +145,14 @@ trait IssuesControllerBase extends ControllerBase { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   ajaxPost("/:owner/:repository/issue_comments/edit/:id", commentForm)(readableUsersOnly { (form, repository) => |   ajaxPost("/:owner/:repository/issue_comments/edit/:id", commentForm)(readableUsersOnly { (form, repository) => | ||||||
|     val owner = repository.owner |     defining(repository.owner, repository.name){ case (owner, name) => | ||||||
|     val name  = repository.name |       getComment(owner, name, params("id")).map { comment => | ||||||
|  |         if(isEditable(owner, name, comment.commentedUserName)){ | ||||||
|     getComment(owner, name, params("id")).map { comment => |           updateComment(comment.commentId, form.content) | ||||||
|       if(isEditable(owner, name, comment.commentedUserName)){ |           redirect(s"/${owner}/${name}/issue_comments/_data/${comment.commentId}") | ||||||
|         updateComment(comment.commentId, form.content) |         } else Unauthorized | ||||||
|         redirect(s"/${owner}/${name}/issue_comments/_data/${comment.commentId}") |       } getOrElse NotFound | ||||||
|       } else Unauthorized |     } | ||||||
|     } getOrElse NotFound |  | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   ajaxGet("/:owner/:repository/issues/_data/:id")(readableUsersOnly { repository => |   ajaxGet("/:owner/:repository/issues/_data/:id")(readableUsersOnly { repository => | ||||||
| @@ -194,17 +191,17 @@ trait IssuesControllerBase extends ControllerBase { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   ajaxPost("/:owner/:repository/issues/:id/label/new")(collaboratorsOnly { repository => |   ajaxPost("/:owner/:repository/issues/:id/label/new")(collaboratorsOnly { repository => | ||||||
|     val issueId = params("id").toInt |     defining(params("id").toInt){ issueId => | ||||||
|  |       registerIssueLabel(repository.owner, repository.name, issueId, params("labelId").toInt) | ||||||
|     registerIssueLabel(repository.owner, repository.name, issueId, params("labelId").toInt) |       issues.html.labellist(getIssueLabels(repository.owner, repository.name, issueId)) | ||||||
|     issues.html.labellist(getIssueLabels(repository.owner, repository.name, issueId)) |     } | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   ajaxPost("/:owner/:repository/issues/:id/label/delete")(collaboratorsOnly { repository => |   ajaxPost("/:owner/:repository/issues/:id/label/delete")(collaboratorsOnly { repository => | ||||||
|     val issueId = params("id").toInt |     defining(params("id").toInt){ issueId => | ||||||
|  |       deleteIssueLabel(repository.owner, repository.name, issueId, params("labelId").toInt) | ||||||
|     deleteIssueLabel(repository.owner, repository.name, issueId, params("labelId").toInt) |       issues.html.labellist(getIssueLabels(repository.owner, repository.name, issueId)) | ||||||
|     issues.html.labellist(getIssueLabels(repository.owner, repository.name, issueId)) |     } | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   ajaxPost("/:owner/:repository/issues/:id/assign")(collaboratorsOnly { repository => |   ajaxPost("/:owner/:repository/issues/:id/assign")(collaboratorsOnly { repository => | ||||||
| @@ -223,36 +220,36 @@ trait IssuesControllerBase extends ControllerBase { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   post("/:owner/:repository/issues/batchedit/state")(collaboratorsOnly { repository => |   post("/:owner/:repository/issues/batchedit/state")(collaboratorsOnly { repository => | ||||||
|     val action = params.get("value") |     defining(params.get("value")){ action => | ||||||
|  |       executeBatch(repository) { | ||||||
|     executeBatch(repository) { |         handleComment(_, None, repository)( _ => action) | ||||||
|       handleComment(_, None, repository)( _ => action) |       } | ||||||
|     } |     } | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   post("/:owner/:repository/issues/batchedit/label")(collaboratorsOnly { repository => |   post("/:owner/:repository/issues/batchedit/label")(collaboratorsOnly { repository => | ||||||
|     val labelId = params("value").toInt |     defining(params("value").toInt){ labelId => | ||||||
|  |       executeBatch(repository) { issueId => | ||||||
|     executeBatch(repository) { issueId => |         getIssueLabel(repository.owner, repository.name, issueId, labelId) getOrElse { | ||||||
|       getIssueLabel(repository.owner, repository.name, issueId, labelId) getOrElse { |           registerIssueLabel(repository.owner, repository.name, issueId, labelId) | ||||||
|         registerIssueLabel(repository.owner, repository.name, issueId, labelId) |         } | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   post("/:owner/:repository/issues/batchedit/assign")(collaboratorsOnly { repository => |   post("/:owner/:repository/issues/batchedit/assign")(collaboratorsOnly { repository => | ||||||
|     val value = assignedUserName("value") |     defining(assignedUserName("value")){ value => | ||||||
|  |       executeBatch(repository) { | ||||||
|     executeBatch(repository) { |         updateAssignedUserName(repository.owner, repository.name, _, value) | ||||||
|       updateAssignedUserName(repository.owner, repository.name, _, value) |       } | ||||||
|     } |     } | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   post("/:owner/:repository/issues/batchedit/milestone")(collaboratorsOnly { repository => |   post("/:owner/:repository/issues/batchedit/milestone")(collaboratorsOnly { repository => | ||||||
|     val value = milestoneId("value") |     defining(milestoneId("value")){ value => | ||||||
|  |       executeBatch(repository) { | ||||||
|     executeBatch(repository) { |         updateMilestoneId(repository.owner, repository.name, _, value) | ||||||
|       updateMilestoneId(repository.owner, repository.name, _, value) |       } | ||||||
|     } |     } | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
| @@ -273,89 +270,89 @@ trait IssuesControllerBase extends ControllerBase { | |||||||
|   private def handleComment(issueId: Int, content: Option[String], repository: RepositoryService.RepositoryInfo) |   private def handleComment(issueId: Int, content: Option[String], repository: RepositoryService.RepositoryInfo) | ||||||
|       (getAction: model.Issue => Option[String] = |       (getAction: model.Issue => Option[String] = | ||||||
|            p1 => params.get("action").filter(_ => isEditable(p1.userName, p1.repositoryName, p1.openedUserName))) = { |            p1 => params.get("action").filter(_ => isEditable(p1.userName, p1.repositoryName, p1.openedUserName))) = { | ||||||
|     val owner    = repository.owner |  | ||||||
|     val name     = repository.name |  | ||||||
|     val userName = context.loginAccount.get.userName |  | ||||||
|  |  | ||||||
|     getIssue(owner, name, issueId.toString) map { issue => |     defining(repository.owner, repository.name){ case (owner, name) => | ||||||
|       val (action, recordActivity) = |       val userName = context.loginAccount.get.userName | ||||||
|         getAction(issue) |  | ||||||
|           .collect { |       getIssue(owner, name, issueId.toString) map { issue => | ||||||
|  |         val (action, recordActivity) = | ||||||
|  |           getAction(issue) | ||||||
|  |             .collect { | ||||||
|             case "close"  => true  -> (Some("close")  -> |             case "close"  => true  -> (Some("close")  -> | ||||||
|                 Some(if(issue.isPullRequest) recordClosePullRequestActivity _ else recordCloseIssueActivity _)) |               Some(if(issue.isPullRequest) recordClosePullRequestActivity _ else recordCloseIssueActivity _)) | ||||||
|             case "reopen" => false -> (Some("reopen") -> |             case "reopen" => false -> (Some("reopen") -> | ||||||
|                 Some(recordReopenIssueActivity _)) |               Some(recordReopenIssueActivity _)) | ||||||
|           } |           } | ||||||
|           .map { case (closed, t) => |             .map { case (closed, t) => | ||||||
|             updateClosed(owner, name, issueId, closed) |             updateClosed(owner, name, issueId, closed) | ||||||
|             t |             t | ||||||
|           } |           } | ||||||
|           .getOrElse(None -> None) |             .getOrElse(None -> None) | ||||||
|  |  | ||||||
|       val commentId = content |         val commentId = content | ||||||
|           .map       ( _ -> action.map( _ + "_comment" ).getOrElse("comment") ) |           .map       ( _ -> action.map( _ + "_comment" ).getOrElse("comment") ) | ||||||
|           .getOrElse ( action.get.capitalize -> action.get ) |           .getOrElse ( action.get.capitalize -> action.get ) | ||||||
|           match { |         match { | ||||||
|             case (content, action) => createComment(owner, name, userName, issueId, content, action) |           case (content, action) => createComment(owner, name, userName, issueId, content, action) | ||||||
|           } |         } | ||||||
|  |  | ||||||
|       // record activity |         // record activity | ||||||
|       content foreach { |         content foreach { | ||||||
|         (if(issue.isPullRequest) recordCommentPullRequestActivity _ else recordCommentIssueActivity _) |           (if(issue.isPullRequest) recordCommentPullRequestActivity _ else recordCommentIssueActivity _) | ||||||
|         (owner, name, userName, issueId, _) |           (owner, name, userName, issueId, _) | ||||||
|       } |         } | ||||||
|       recordActivity foreach ( _ (owner, name, userName, issueId, issue.title) ) |         recordActivity foreach ( _ (owner, name, userName, issueId, issue.title) ) | ||||||
|  |  | ||||||
|       // notifications |         // notifications | ||||||
|       Notifier() match { |         Notifier() match { | ||||||
|         case f => |           case f => | ||||||
|           content foreach { |             content foreach { | ||||||
|             f.toNotify(repository, issueId, _){ |               f.toNotify(repository, issueId, _){ | ||||||
|               Notifier.msgComment(s"${baseUrl}/${owner}/${name}/${ |                 Notifier.msgComment(s"${baseUrl}/${owner}/${name}/${ | ||||||
|                 if(issue.isPullRequest) "pull" else "issues"}/${issueId}#comment-${commentId}") |                   if(issue.isPullRequest) "pull" else "issues"}/${issueId}#comment-${commentId}") | ||||||
|  |               } | ||||||
|             } |             } | ||||||
|           } |             action foreach { | ||||||
|           action foreach { |               f.toNotify(repository, issueId, _){ | ||||||
|             f.toNotify(repository, issueId, _){ |                 Notifier.msgStatus(s"${baseUrl}/${owner}/${name}/issues/${issueId}") | ||||||
|               Notifier.msgStatus(s"${baseUrl}/${owner}/${name}/issues/${issueId}") |               } | ||||||
|             } |             } | ||||||
|           } |         } | ||||||
|       } |  | ||||||
|  |  | ||||||
|       issue -> commentId |         issue -> commentId | ||||||
|  |       } | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   private def searchIssues(filter: String, repository: RepositoryService.RepositoryInfo) = { |   private def searchIssues(filter: String, repository: RepositoryService.RepositoryInfo) = { | ||||||
|     val owner      = repository.owner |     defining(repository.owner, repository.name){ case (owner, repoName) => | ||||||
|     val repoName   = repository.name |       val filterUser = Map(filter -> params.getOrElse("userName", "")) | ||||||
|     val filterUser = Map(filter -> params.getOrElse("userName", "")) |       val page       = IssueSearchCondition.page(request) | ||||||
|     val page = IssueSearchCondition.page(request) |       val sessionKey = s"${owner}/${repoName}/issues" | ||||||
|     val sessionKey = s"${owner}/${repoName}/issues" |  | ||||||
|  |  | ||||||
|     // retrieve search condition |       // retrieve search condition | ||||||
|     val condition = if(request.getQueryString == null){ |       val condition = session.putAndGet(sessionKey, | ||||||
|       session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition] |         if(request.hasQueryString) IssueSearchCondition(request) | ||||||
|     } else IssueSearchCondition(request) |         else session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition] | ||||||
|  |       ) | ||||||
|  |  | ||||||
|     session.put(sessionKey, condition) |       issues.html.list( | ||||||
|  |           searchIssue(condition, filterUser, false, (page - 1) * IssueLimit, IssueLimit, owner -> repoName), | ||||||
|     issues.html.list( |           page, | ||||||
|         searchIssue(condition, filterUser, false, (page - 1) * IssueLimit, IssueLimit, owner -> repoName), |           (getCollaborators(owner, repoName) :+ owner).sorted, | ||||||
|         page, |           getMilestones(owner, repoName), | ||||||
|         (getCollaborators(owner, repoName) :+ owner).sorted, |           getLabels(owner, repoName), | ||||||
|         getMilestones(owner, repoName), |           countIssue(condition.copy(state = "open"), filterUser, false, owner -> repoName), | ||||||
|         getLabels(owner, repoName), |           countIssue(condition.copy(state = "closed"), filterUser, false, owner -> repoName), | ||||||
|         countIssue(condition.copy(state = "open"), filterUser, false, owner -> repoName), |           countIssue(condition, Map.empty, false, owner -> repoName), | ||||||
|         countIssue(condition.copy(state = "closed"), filterUser, false, owner -> repoName), |           context.loginAccount.map(x => countIssue(condition, Map("assigned" -> x.userName), false, owner -> repoName)), | ||||||
|         countIssue(condition, Map.empty, false, owner -> repoName), |           context.loginAccount.map(x => countIssue(condition, Map("created_by" -> x.userName), false, owner -> repoName)), | ||||||
|         context.loginAccount.map(x => countIssue(condition, Map("assigned" -> x.userName), false, owner -> repoName)), |           countIssueGroupByLabels(owner, repoName, condition, filterUser), | ||||||
|         context.loginAccount.map(x => countIssue(condition, Map("created_by" -> x.userName), false, owner -> repoName)), |           condition, | ||||||
|         countIssueGroupByLabels(owner, repoName, condition, filterUser), |           filter, | ||||||
|         condition, |           repository, | ||||||
|         filter, |           hasWritePermission(owner, repoName, context.loginAccount)) | ||||||
|         repository, |     } | ||||||
|         hasWritePermission(owner, repoName, context.loginAccount)) |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -63,109 +63,104 @@ trait PullRequestsControllerBase extends ControllerBase { | |||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   get("/:owner/:repository/pull/:id")(referrersOnly { repository => |   get("/:owner/:repository/pull/:id")(referrersOnly { repository => | ||||||
|     val owner   = repository.owner |     defining(repository.owner, repository.name, params("id").toInt){ case (owner, name, issueId) => | ||||||
|     val name    = repository.name |       getPullRequest(owner, name, issueId) map { case(issue, pullreq) => | ||||||
|     val issueId = params("id").toInt |         using(Git.open(getRepositoryDir(owner, name))){ git => | ||||||
|  |           val (commits, diffs) = | ||||||
|  |             getRequestCompareInfo(owner, name, pullreq.commitIdFrom, owner, name, pullreq.commitIdTo) | ||||||
|  |  | ||||||
|     getPullRequest(owner, name, issueId) map { case(issue, pullreq) => |           pulls.html.pullreq( | ||||||
|       using(Git.open(getRepositoryDir(owner, name))){ git => |             issue, pullreq, | ||||||
|         val requestCommitId = git.getRepository.resolve(pullreq.requestBranch) |             getComments(owner, name, issueId.toInt), | ||||||
|  |             (getCollaborators(owner, name) :+ owner).sorted, | ||||||
|         val (commits, diffs) = |             getMilestonesWithIssueCount(owner, name), | ||||||
|           getRequestCompareInfo(owner, name, pullreq.commitIdFrom, owner, name, pullreq.commitIdTo) |             commits, | ||||||
|  |             diffs, | ||||||
|         pulls.html.pullreq( |             if(issue.closed){ | ||||||
|           issue, pullreq, |               false | ||||||
|           getComments(owner, name, issueId.toInt), |             } else { | ||||||
|           (getCollaborators(owner, name) :+ owner).sorted, |               checkConflict(owner, name, pullreq.branch, owner, name, pullreq.requestBranch) | ||||||
|           getMilestonesWithIssueCount(owner, name), |             }, | ||||||
|           commits, |             hasWritePermission(owner, name, context.loginAccount), | ||||||
|           diffs, |             repository, | ||||||
|           if(issue.closed){ |             s"${baseUrl}${context.path}/git/${pullreq.requestUserName}/${pullreq.requestRepositoryName}.git") | ||||||
|             false |         } | ||||||
|           } else { |       } getOrElse NotFound | ||||||
|             checkConflict(owner, name, pullreq.branch, owner, name, pullreq.requestBranch) |     } | ||||||
|           }, |  | ||||||
|           hasWritePermission(owner, name, context.loginAccount), |  | ||||||
|           repository, |  | ||||||
|           s"${baseUrl}${context.path}/git/${pullreq.requestUserName}/${pullreq.requestRepositoryName}.git") |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|     } getOrElse NotFound |  | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   post("/:owner/:repository/pull/:id/merge", mergeForm)(collaboratorsOnly { (form, repository) => |   post("/:owner/:repository/pull/:id/merge", mergeForm)(collaboratorsOnly { (form, repository) => | ||||||
|     LockUtil.lock(s"${repository.owner}/${repository.name}/merge"){ |     defining(repository.owner, repository.name, params("id").toInt){ case (owner, name, issueId) => | ||||||
|       val issueId = params("id").toInt |       LockUtil.lock(s"${owner}/${name}/merge"){ | ||||||
|  |         getPullRequest(owner, name, issueId).map { case (issue, pullreq) => | ||||||
|  |           val remote = getRepositoryDir(owner, name) | ||||||
|  |           val tmpdir = new java.io.File(getTemporaryDir(owner, name), s"merge-${issueId}") | ||||||
|  |           val git = Git.cloneRepository.setDirectory(tmpdir).setURI(remote.toURI.toString).setBranch(pullreq.branch).call | ||||||
|  |  | ||||||
|       getPullRequest(repository.owner, repository.name, issueId).map { case (issue, pullreq) => |           try { | ||||||
|         val remote = getRepositoryDir(repository.owner, repository.name) |             // mark issue as merged and close. | ||||||
|         val tmpdir = new java.io.File(getTemporaryDir(repository.owner, repository.name), s"merge-${issueId}") |             val loginAccount = context.loginAccount.get | ||||||
|         val git = Git.cloneRepository.setDirectory(tmpdir).setURI(remote.toURI.toString).setBranch(pullreq.branch).call |             createComment(owner, name, loginAccount.userName, issueId, form.message, "merge") | ||||||
|  |             createComment(owner, name, loginAccount.userName, issueId, "Close", "close") | ||||||
|  |             updateClosed(owner, name, issueId, true) | ||||||
|  |  | ||||||
|         try { |             // record activity | ||||||
|           // mark issue as merged and close. |             recordMergeActivity(owner, name, loginAccount.userName, issueId, form.message) | ||||||
|           val loginAccount = context.loginAccount.get |  | ||||||
|           createComment(repository.owner, repository.name, loginAccount.userName, issueId, form.message, "merge") |  | ||||||
|           createComment(repository.owner, repository.name, loginAccount.userName, issueId, "Close", "close") |  | ||||||
|           updateClosed(repository.owner, repository.name, issueId, true) |  | ||||||
|  |  | ||||||
|           // record activity |             // fetch pull request to temporary working repository | ||||||
|           recordMergeActivity(repository.owner, repository.name, loginAccount.userName, issueId, form.message) |             val pullRequestBranchName = s"gitbucket-pullrequest-${issueId}" | ||||||
|  |  | ||||||
|           // fetch pull request to temporary working repository |             git.fetch | ||||||
|           val pullRequestBranchName = s"gitbucket-pullrequest-${issueId}" |               .setRemote(getRepositoryDir(owner, name).toURI.toString) | ||||||
|  |               .setRefSpecs(new RefSpec(s"refs/pull/${issueId}/head:refs/heads/${pullRequestBranchName}")).call | ||||||
|  |  | ||||||
|           git.fetch |             // merge pull request | ||||||
|             .setRemote(getRepositoryDir(repository.owner, repository.name).toURI.toString) |             git.checkout.setName(pullreq.branch).call | ||||||
|             .setRefSpecs(new RefSpec(s"refs/pull/${issueId}/head:refs/heads/${pullRequestBranchName}")).call |  | ||||||
|  |  | ||||||
|           // merge pull request |             val result = git.merge | ||||||
|           git.checkout.setName(pullreq.branch).call |               .include(git.getRepository.resolve(pullRequestBranchName)) | ||||||
|  |               .setFastForward(FastForwardMode.NO_FF) | ||||||
|  |               .setCommit(false) | ||||||
|  |               .call | ||||||
|  |  | ||||||
|           val result = git.merge |             if(result.getConflicts != null){ | ||||||
|             .include(git.getRepository.resolve(pullRequestBranchName)) |               throw new RuntimeException("This pull request can't merge automatically.") | ||||||
|             .setFastForward(FastForwardMode.NO_FF) |  | ||||||
|             .setCommit(false) |  | ||||||
|             .call |  | ||||||
|  |  | ||||||
|           if(result.getConflicts != null){ |  | ||||||
|             throw new RuntimeException("This pull request can't merge automatically.") |  | ||||||
|           } |  | ||||||
|  |  | ||||||
|           // merge commit |  | ||||||
|           git.getRepository.writeMergeCommitMsg( |  | ||||||
|             s"Merge pull request #${issueId} from ${pullreq.requestUserName}/${pullreq.requestRepositoryName}\n" |  | ||||||
|             + form.message) |  | ||||||
|  |  | ||||||
|           git.commit |  | ||||||
|             .setCommitter(new PersonIdent(loginAccount.userName, loginAccount.mailAddress)) |  | ||||||
|             .call |  | ||||||
|  |  | ||||||
|           // push |  | ||||||
|           git.push.call |  | ||||||
|  |  | ||||||
|           val (commits, _) = getRequestCompareInfo(repository.owner, repository.name, pullreq.commitIdFrom, |  | ||||||
|             pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.commitIdTo) |  | ||||||
|  |  | ||||||
|           commits.flatten.foreach { commit => |  | ||||||
|             if(!existsCommitId(repository.owner, repository.name, commit.id)){ |  | ||||||
|               insertCommitId(repository.owner, repository.name, commit.id) |  | ||||||
|             } |             } | ||||||
|  |  | ||||||
|  |             // merge commit | ||||||
|  |             git.getRepository.writeMergeCommitMsg( | ||||||
|  |               s"Merge pull request #${issueId} from ${pullreq.requestUserName}/${pullreq.requestRepositoryName}\n" | ||||||
|  |               + form.message) | ||||||
|  |  | ||||||
|  |             git.commit | ||||||
|  |               .setCommitter(new PersonIdent(loginAccount.userName, loginAccount.mailAddress)) | ||||||
|  |               .call | ||||||
|  |  | ||||||
|  |             // push | ||||||
|  |             git.push.call | ||||||
|  |  | ||||||
|  |             val (commits, _) = getRequestCompareInfo(owner, name, pullreq.commitIdFrom, | ||||||
|  |               pullreq.requestUserName, pullreq.requestRepositoryName, pullreq.commitIdTo) | ||||||
|  |  | ||||||
|  |             commits.flatten.foreach { commit => | ||||||
|  |               if(!existsCommitId(owner, name, commit.id)){ | ||||||
|  |                 insertCommitId(owner, name, commit.id) | ||||||
|  |               } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // notifications | ||||||
|  |             Notifier().toNotify(repository, issueId, "merge"){ | ||||||
|  |               Notifier.msgStatus(s"${baseUrl}/${owner}/${name}/pull/${issueId}") | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             redirect(s"/${owner}/${name}/pull/${issueId}") | ||||||
|  |  | ||||||
|  |           } finally { | ||||||
|  |             git.getRepository.close | ||||||
|  |             FileUtils.deleteDirectory(tmpdir) | ||||||
|           } |           } | ||||||
|  |         } getOrElse NotFound | ||||||
|           // notifications |       } | ||||||
|           Notifier().toNotify(repository, issueId, "merge"){ |  | ||||||
|             Notifier.msgStatus(s"${baseUrl}/${repository.owner}/${repository.name}/pull/${issueId}") |  | ||||||
|           } |  | ||||||
|  |  | ||||||
|           redirect(s"/${repository.owner}/${repository.name}/pull/${issueId}") |  | ||||||
|  |  | ||||||
|         } finally { |  | ||||||
|           git.getRepository.close |  | ||||||
|           FileUtils.deleteDirectory(tmpdir) |  | ||||||
|         } |  | ||||||
|       } getOrElse NotFound |  | ||||||
|     } |     } | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
| @@ -377,11 +372,10 @@ trait PullRequestsControllerBase extends ControllerBase { | |||||||
|       val sessionKey = s"${owner}/${repoName}/pulls" |       val sessionKey = s"${owner}/${repoName}/pulls" | ||||||
|  |  | ||||||
|       // retrieve search condition |       // retrieve search condition | ||||||
|       val condition = if(request.getQueryString == null){ |       val condition = session.putAndGet(sessionKey, | ||||||
|         session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition] |         if(request.hasQueryString) IssueSearchCondition(request) | ||||||
|       } else IssueSearchCondition(request) |         else session.get(sessionKey).getOrElse(IssueSearchCondition()).asInstanceOf[IssueSearchCondition] | ||||||
|  |       ) | ||||||
|       session.put(sessionKey, condition) |  | ||||||
|  |  | ||||||
|       pulls.html.list( |       pulls.html.list( | ||||||
|         searchIssue(condition, filterUser, true, (page - 1) * PullRequestLimit, PullRequestLimit, owner -> repoName), |         searchIssue(condition, filterUser, true, (page - 1) * PullRequestLimit, PullRequestLimit, owner -> repoName), | ||||||
|   | |||||||
| @@ -9,7 +9,6 @@ import org.scalatra.FlashMapSupport | |||||||
| import service.WebHookService.WebHookPayload | import service.WebHookService.WebHookPayload | ||||||
| import util.JGitUtil.CommitInfo | import util.JGitUtil.CommitInfo | ||||||
| import util.ControlUtil._ | import util.ControlUtil._ | ||||||
| import util.Implicits._ |  | ||||||
| import org.eclipse.jgit.api.Git | import org.eclipse.jgit.api.Git | ||||||
|  |  | ||||||
| class RepositorySettingsController extends RepositorySettingsControllerBase | class RepositorySettingsController extends RepositorySettingsControllerBase | ||||||
| @@ -123,8 +122,7 @@ trait RepositorySettingsControllerBase extends ControllerBase with FlashMapSuppo | |||||||
|    * Delete the web hook URL. |    * Delete the web hook URL. | ||||||
|    */ |    */ | ||||||
|   get("/:owner/:repository/settings/hooks/delete")(ownerOnly { repository => |   get("/:owner/:repository/settings/hooks/delete")(ownerOnly { repository => | ||||||
|     val url = params("url") |     deleteWebHookURL(repository.owner, repository.name, params("url")) | ||||||
|     deleteWebHookURL(repository.owner, repository.name, url) |  | ||||||
|     redirect(s"/${repository.owner}/${repository.name}/settings/hooks") |     redirect(s"/${repository.owner}/${repository.name}/settings/hooks") | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
| @@ -139,24 +137,19 @@ trait RepositorySettingsControllerBase extends ControllerBase with FlashMapSuppo | |||||||
|         .setMaxCount(3) |         .setMaxCount(3) | ||||||
|         .call.iterator.asScala.map(new CommitInfo(_)) |         .call.iterator.asScala.map(new CommitInfo(_)) | ||||||
|  |  | ||||||
|       val payload = WebHookPayload( |       callWebHook(repository.owner, repository.name, | ||||||
|         git, |         WebHookPayload( | ||||||
|         "refs/heads/" + repository.repository.defaultBranch, |           git, | ||||||
|         repository, |           "refs/heads/" + repository.repository.defaultBranch, | ||||||
|         commits.toList, |           repository, | ||||||
|         getAccountByUserName(repository.owner).get) |           commits.toList, | ||||||
|  |           getAccountByUserName(repository.owner).get)) | ||||||
|  |  | ||||||
|       callWebHook(repository.owner, repository.name, payload) |  | ||||||
|       flash += "info" -> "Test payload deployed!" |       flash += "info" -> "Test payload deployed!" | ||||||
|     } |     } | ||||||
|     redirect(s"/${repository.owner}/${repository.name}/settings/hooks") |     redirect(s"/${repository.owner}/${repository.name}/settings/hooks") | ||||||
|   }) |   }) | ||||||
|  |  | ||||||
|   // TODO Remove this action after web hook is completed. |  | ||||||
|   post("/xxx/xxx/xxx/webhooktest"){ |  | ||||||
|     println(params("payload")) |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
|    * Display the delete repository page. |    * Display the delete repository page. | ||||||
|    */ |    */ | ||||||
| @@ -182,9 +175,7 @@ trait RepositorySettingsControllerBase extends ControllerBase with FlashMapSuppo | |||||||
|    */ |    */ | ||||||
|   private def webHook: Constraint = new Constraint(){ |   private def webHook: Constraint = new Constraint(){ | ||||||
|     override def validate(name: String, value: String): Option[String] = |     override def validate(name: String, value: String): Option[String] = | ||||||
|       defining(request.paths){ paths => |       getWebHookURLs(params("owner"), params("repository")).map(_.url).find(_ == value).map(_ => "URL had been registered already.") | ||||||
|         getWebHookURLs(paths(1), paths(2)).map(_.url).find(_ == value).map(_ => "URL had been registered already.") |  | ||||||
|       } |  | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   /** |   /** | ||||||
| @@ -192,13 +183,11 @@ trait RepositorySettingsControllerBase extends ControllerBase with FlashMapSuppo | |||||||
|    */ |    */ | ||||||
|   private def collaborator: Constraint = new Constraint(){ |   private def collaborator: Constraint = new Constraint(){ | ||||||
|     override def validate(name: String, value: String): Option[String] = |     override def validate(name: String, value: String): Option[String] = | ||||||
|       defining(request.paths){ paths => |       getAccountByUserName(value) match { | ||||||
|         getAccountByUserName(value) match { |         case None => Some("User does not exist.") | ||||||
|           case None => Some("User does not exist.") |         case Some(x) if(x.userName == params("owner") || getCollaborators(params("owner"), params("repository")).contains(x.userName)) | ||||||
|           case Some(x) if(x.userName == paths(1) || getCollaborators(paths(1), paths(2)).contains(x.userName)) |                   => Some("User can access this repository already.") | ||||||
|                     => Some("User can access this repository already.") |         case _    => None | ||||||
|           case _    => None |  | ||||||
|         } |  | ||||||
|       } |       } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -23,7 +23,6 @@ trait SignInControllerBase extends ControllerBase { self: SystemSettingsService | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   post("/signin", form){ form => |   post("/signin", form){ form => | ||||||
|     val settings = loadSystemSettings() |  | ||||||
|     authenticate(loadSystemSettings(), form.userName, form.password) match { |     authenticate(loadSystemSettings(), form.userName, form.password) match { | ||||||
|       case Some(account) => signin(account) |       case Some(account) => signin(account) | ||||||
|       case None => redirect("/signin") |       case None => redirect("/signin") | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| package util | package util | ||||||
|  |  | ||||||
| import scala.util.matching.Regex | import scala.util.matching.Regex | ||||||
| import javax.servlet.http.HttpServletRequest | import javax.servlet.http.{HttpSession, HttpServletRequest} | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Provides some usable implicit conversions. |  * Provides some usable implicit conversions. | ||||||
| @@ -44,7 +44,20 @@ object Implicits { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   implicit class RichRequest(request: HttpServletRequest){ |   implicit class RichRequest(request: HttpServletRequest){ | ||||||
|  |  | ||||||
|     def paths: Array[String] = request.getRequestURI.substring(request.getContextPath.length).split("/") |     def paths: Array[String] = request.getRequestURI.substring(request.getContextPath.length).split("/") | ||||||
|  |  | ||||||
|  |     def hasQueryString: Boolean = request.getQueryString != null | ||||||
|  |  | ||||||
|  |     def hasAttribute(name: String): Boolean = request.getAttribute(name) != null | ||||||
|  |  | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   implicit class RichSession(session: HttpSession){ | ||||||
|  |     def putAndGet[T](key: String, value: T): T = { | ||||||
|  |       session.setAttribute(key, value) | ||||||
|  |       value | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| } | } | ||||||
		Reference in New Issue
	
	Block a user