diff --git a/src/main/scala/app/AccountController.scala b/src/main/scala/app/AccountController.scala index 6e7d1c3..4628a36 100644 --- a/src/main/scala/app/AccountController.scala +++ b/src/main/scala/app/AccountController.scala @@ -88,6 +88,12 @@ "name" -> trim(label("Repository name", text(required))) )(ForkRepositoryForm.apply) + case class AccountForm(accountName: String) + + val accountForm = mapping( + "account" -> trim(label("Group/User name", text(required, validAccountName))) + )(AccountForm.apply) + /** * Displays user information. */ @@ -354,11 +360,31 @@ get("/:owner/:repository/fork")(readableUsersOnly { repository => val loginAccount = context.loginAccount.get val loginUserName = loginAccount.userName + val groups = getGroupsByUserName(loginUserName) + groups match { + case _: List[String] => + val managerPermissions = groups.map { group => + val members = getGroupMembers(group) + context.loginAccount.exists(x => members.exists { member => member.userName == x.userName && member.isManager }) + } + _root_.helper.html.forkrepository( + repository, + (groups zip managerPermissions).toMap + ) + case _ => redirect(s"/${loginUserName}") + } + }) - LockUtil.lock(s"${loginUserName}/${repository.name}"){ - if(repository.owner == loginUserName || getRepository(loginAccount.userName, repository.name, baseUrl).isDefined){ + post("/:owner/:repository/fork", accountForm)(readableUsersOnly { (form, repository) => + val loginAccount = context.loginAccount.get + val loginUserName = loginAccount.userName + val accountName = form.accountName + + LockUtil.lock(s"${accountName}/${repository.name}"){ + if(getRepository(accountName, repository.name, baseUrl).isDefined || + (accountName != loginUserName && !getGroupsByUserName(loginUserName).contains(accountName))){ // redirect to the repository if repository already exists - redirect(s"/${loginUserName}/${repository.name}") + redirect(s"/${accountName}/${repository.name}") } else { // Insert to the database at first val originUserName = repository.repository.originUserName.getOrElse(repository.owner) @@ -366,7 +392,7 @@ createRepository( repositoryName = repository.name, - userName = loginUserName, + userName = accountName, description = repository.repository.description, isPrivate = repository.repository.isPrivate, originRepositoryName = Some(originRepositoryName), @@ -376,22 +402,22 @@ ) // Insert default labels - insertDefaultLabels(loginUserName, repository.name) + insertDefaultLabels(accountName, repository.name) // clone repository actually JGitUtil.cloneRepository( getRepositoryDir(repository.owner, repository.name), - getRepositoryDir(loginUserName, repository.name)) + getRepositoryDir(accountName, repository.name)) // Create Wiki repository JGitUtil.cloneRepository( getWikiRepositoryDir(repository.owner, repository.name), - getWikiRepositoryDir(loginUserName, repository.name)) + getWikiRepositoryDir(accountName, repository.name)) // Record activity - recordForkActivity(repository.owner, repository.name, loginUserName) + recordForkActivity(repository.owner, repository.name, loginUserName, accountName) // redirect to the repository - redirect(s"/${loginUserName}/${repository.name}") + redirect(s"/${accountName}/${repository.name}") } } }) @@ -431,4 +457,13 @@ case None => Some("Key is invalid.") } } + + private def validAccountName: Constraint = new Constraint(){ + override def validate(name: String, value: String, messages: Messages): Option[String] = { + getAccountByUserName(value) match { + case Some(_) => None + case None => Some("Invalid Group/User Account.") + } + } + } } diff --git a/src/main/scala/app/RepositoryViewerController.scala b/src/main/scala/app/RepositoryViewerController.scala index 8c83f2c..69e02ea 100644 --- a/src/main/scala/app/RepositoryViewerController.scala +++ b/src/main/scala/app/RepositoryViewerController.scala @@ -442,6 +442,10 @@ repo.html.files(revision, repository, if(path == ".") Nil else path.split("/").toList, // current path + context.loginAccount match { + case None => List() + case account: Option[model.Account] => getGroupsByUserName(account.get.userName) + }, // groups of current user new JGitUtil.CommitInfo(lastModifiedCommit), // last modified commit files, readme, hasWritePermission(repository.owner, repository.name, context.loginAccount), flash.get("info"), flash.get("error")) diff --git a/src/main/scala/service/ActivityService.scala b/src/main/scala/service/ActivityService.scala index a90bfb5..b1e8202 100644 --- a/src/main/scala/service/ActivityService.scala +++ b/src/main/scala/service/ActivityService.scala @@ -160,10 +160,10 @@ None, currentDate) - def recordForkActivity(userName: String, repositoryName: String, activityUserName: String)(implicit s: Session): Unit = + def recordForkActivity(userName: String, repositoryName: String, activityUserName: String, forkedUserName: String)(implicit s: Session): Unit = Activities insert Activity(userName, repositoryName, activityUserName, "fork", - s"[user:${activityUserName}] forked [repo:${userName}/${repositoryName}] to [repo:${activityUserName}/${repositoryName}]", + s"[user:${activityUserName}] forked [repo:${userName}/${repositoryName}] to [repo:${forkedUserName}/${repositoryName}]", None, currentDate) diff --git a/src/main/twirl/helper/forkrepository.scala.html b/src/main/twirl/helper/forkrepository.scala.html new file mode 100644 index 0000000..e73ce34 --- /dev/null +++ b/src/main/twirl/helper/forkrepository.scala.html @@ -0,0 +1,18 @@ +@(repository: service.RepositoryService.RepositoryInfo, + groupAndPerm: Map[String, Boolean])(implicit context: app.Context) +@import context._ +@import view.helpers._ +

Where should we fork this repository?

+
+
+
@avatar(loginAccount.get.userName, 100)@@@loginAccount.get.userName
+ @for((groupName, isManager) <- groupAndPerm) { + @if(isManager) { +
@avatar(groupName, 100)@@@groupName
+ } else { +
@avatar(groupName, 100)@@@groupName
+ } + } +
+ +
\ No newline at end of file diff --git a/src/main/twirl/main.scala.html b/src/main/twirl/main.scala.html index fa60811..74a955a 100644 --- a/src/main/twirl/main.scala.html +++ b/src/main/twirl/main.scala.html @@ -18,6 +18,7 @@ + @@ -29,6 +30,7 @@ +