diff --git a/src/main/scala/gitbucket/core/controller/PullRequestsController.scala b/src/main/scala/gitbucket/core/controller/PullRequestsController.scala index c505fba..a162471 100644 --- a/src/main/scala/gitbucket/core/controller/PullRequestsController.scala +++ b/src/main/scala/gitbucket/core/controller/PullRequestsController.scala @@ -294,11 +294,12 @@ issueId <- params("id").toIntOpt loginAccount <- context.loginAccount (issue, pullreq) <- getPullRequest(baseRepository.owner, baseRepository.name, issueId) + repository <- getRepository(pullreq.requestUserName, pullreq.requestRepositoryName) + remoteRepository <- getRepository(pullreq.userName, pullreq.repositoryName) owner = pullreq.requestUserName name = pullreq.requestRepositoryName if hasDeveloperRole(owner, name, context.loginAccount) } yield { - val repository = getRepository(owner, name).get val branchProtection = getProtectedBranchInfo(owner, name, pullreq.requestBranch) if (branchProtection.needStatusCheck(loginAccount.userName)) { flash += "error" -> s"branch ${pullreq.requestBranch} is protected need status check." @@ -314,11 +315,9 @@ JGitUtil.getAllCommitIds(git) }.toSet pullRemote( - owner, - name, + repository, pullreq.requestBranch, - pullreq.userName, - pullreq.repositoryName, + remoteRepository, pullreq.branch, loginAccount, s"Merge branch '${alias}' into ${pullreq.requestBranch}" @@ -341,31 +340,6 @@ .map(c => new JGitUtil.CommitInfo(c)) .toList - commits.foreach { commit => - if (!existIds.contains(commit.id)) { - createIssueComment(owner, name, commit) - } - } - - // record activity - recordPushActivity(owner, name, loginAccount.userName, pullreq.branch, commits) - - // close issue by commit message - if (pullreq.requestBranch == repository.repository.defaultBranch) { - commits.foreach { commit => - closeIssuesFromMessage(commit.fullMessage, loginAccount.userName, owner, name).foreach { - issueId => - getIssue(repository.owner, repository.name, issueId.toString).foreach { issue => - callIssuesWebHook("closed", repository, issue, baseUrl, loginAccount) - PluginRegistry().getIssueHooks - .foreach( - _.closedByCommitComment(issue, repository, commit.fullMessage, loginAccount) - ) - } - } - } - } - // call web hook callPullRequestWebHookByRequestBranch( "synchronize", diff --git a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala index 1054149..dcf57f1 100644 --- a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala @@ -7,14 +7,13 @@ import gitbucket.core.repo.html import gitbucket.core.helper import gitbucket.core.service._ +import gitbucket.core.service.RepositoryCommitFileService.CommitFile import gitbucket.core.util._ -import gitbucket.core.util.JGitUtil._ import gitbucket.core.util.StringUtil._ import gitbucket.core.util.SyntaxSugars._ import gitbucket.core.util.Implicits._ import gitbucket.core.util.Directory._ import gitbucket.core.model.{Account, CommitState, CommitStatus, WebHook} -import gitbucket.core.service.WebHookService._ import gitbucket.core.view import gitbucket.core.view.helpers import org.apache.commons.compress.archivers.{ArchiveEntry, ArchiveOutputStream} @@ -24,15 +23,12 @@ import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream import org.apache.commons.compress.compressors.xz.XZCompressorOutputStream import org.apache.commons.compress.utils.IOUtils -import org.scalatra.forms._ import org.apache.commons.io.FileUtils -import org.ec4j.core.model.PropertyType +import org.scalatra.forms._ import org.eclipse.jgit.api.{ArchiveCommand, Git} import org.eclipse.jgit.archive.{TgzFormat, ZipFormat} -import org.eclipse.jgit.dircache.{DirCache, DirCacheBuilder} import org.eclipse.jgit.errors.MissingObjectException import org.eclipse.jgit.lib._ -import org.eclipse.jgit.transport.{ReceiveCommand, ReceivePack} import org.eclipse.jgit.treewalk.TreeWalk import org.eclipse.jgit.treewalk.filter.PathFilter import org.json4s.jackson.Serialization @@ -42,6 +38,7 @@ class RepositoryViewerController extends RepositoryViewerControllerBase with RepositoryService + with RepositoryCommitFileService with AccountService with ActivityService with IssuesService @@ -64,6 +61,7 @@ */ trait RepositoryViewerControllerBase extends ControllerBase { self: RepositoryService + with RepositoryCommitFileService with AccountService with ActivityService with IssuesService @@ -319,13 +317,34 @@ CommitFile(line.substring(0, i).trim, line.substring(i + 1).trim) } + val newFiles = files.map { file => + file.copy(name = if (form.path.length == 0) file.name else s"${form.path}/${file.name}") + } + commitFiles( repository = repository, branch = form.branch, path = form.path, files = files, - message = form.message.getOrElse("Add files via upload") - ) + message = form.message.getOrElse("Add files via upload"), + loginAccount = context.loginAccount.get + ) { + case (git, headTip, builder, inserter) => + JGitUtil.processTree(git, headTip) { (path, tree) => + if (!newFiles.exists(_.name.contains(path))) { + builder.add(JGitUtil.createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId)) + } + } + + newFiles.foreach { file => + val bytes = + FileUtils.readFileToByteArray(new File(getTemporaryDir(session.getId), FileUtil.checkFilename(file.id))) + builder.add( + JGitUtil.createDirCacheEntry(file.name, FileMode.REGULAR_FILE, inserter.insert(Constants.OBJ_BLOB, bytes)) + ) + builder.finish() + } + } if (form.path.length == 0) { redirect(s"/${repository.owner}/${repository.name}/tree/${form.branch}") @@ -394,7 +413,8 @@ content = appendNewLine(convertLineSeparator(form.content, form.lineSeparator), form.lineSeparator), charset = form.charset, message = form.message.getOrElse(s"Create ${form.newFileName}"), - commit = form.commit + commit = form.commit, + loginAccount = context.loginAccount.get ) redirect( @@ -417,7 +437,8 @@ } else { form.message.getOrElse(s"Rename ${form.oldFileName.get} to ${form.newFileName}") }, - commit = form.commit + commit = form.commit, + loginAccount = context.loginAccount.get ) redirect( @@ -436,7 +457,8 @@ content = "", charset = "", message = form.message.getOrElse(s"Delete ${form.fileName}"), - commit = form.commit + commit = form.commit, + loginAccount = context.loginAccount.get ) println(form.path) @@ -930,185 +952,6 @@ lazy val isValid: Boolean = fileIds.nonEmpty } - case class CommitFile(id: String, name: String) - - private def commitFiles( - repository: RepositoryService.RepositoryInfo, - files: Seq[CommitFile], - branch: String, - path: String, - message: String - ) = { - // prepend path to the filename - val newFiles = files.map { file => - file.copy(name = if (path.length == 0) file.name else s"${path}/${file.name}") - } - - _commitFile(repository, branch, message) { - case (git, headTip, builder, inserter) => - JGitUtil.processTree(git, headTip) { (path, tree) => - if (!newFiles.exists(_.name.contains(path))) { - builder.add(JGitUtil.createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId)) - } - } - - newFiles.foreach { file => - val bytes = - FileUtils.readFileToByteArray(new File(getTemporaryDir(session.getId), FileUtil.checkFilename(file.id))) - builder.add( - JGitUtil.createDirCacheEntry(file.name, FileMode.REGULAR_FILE, inserter.insert(Constants.OBJ_BLOB, bytes)) - ) - builder.finish() - } - } - } - - private def commitFile( - repository: RepositoryService.RepositoryInfo, - branch: String, - path: String, - newFileName: Option[String], - oldFileName: Option[String], - content: String, - charset: String, - message: String, - commit: String - ) = { - - val newPath = newFileName.map { newFileName => - if (path.length == 0) newFileName else s"${path}/${newFileName}" - } - val oldPath = oldFileName.map { oldFileName => - if (path.length == 0) oldFileName else s"${path}/${oldFileName}" - } - - _commitFile(repository, branch, message) { - case (git, headTip, builder, inserter) => - if (headTip.getName == commit) { - val permission = JGitUtil - .processTree(git, headTip) { (path, tree) => - // Add all entries except the editing file - if (!newPath.contains(path) && !oldPath.contains(path)) { - builder.add(JGitUtil.createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId)) - } - // Retrieve permission if file exists to keep it - oldPath.collect { case x if x == path => tree.getEntryFileMode.getBits } - } - .flatten - .headOption - - newPath.foreach { newPath => - builder.add(JGitUtil.createDirCacheEntry(newPath, permission.map { bits => - FileMode.fromBits(bits) - } getOrElse FileMode.REGULAR_FILE, inserter.insert(Constants.OBJ_BLOB, content.getBytes(charset)))) - } - builder.finish() - } - } - } - - private def _commitFile(repository: RepositoryService.RepositoryInfo, branch: String, message: String)( - f: (Git, ObjectId, DirCacheBuilder, ObjectInserter) => Unit - ) = { - - LockUtil.lock(s"${repository.owner}/${repository.name}") { - using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => - val loginAccount = context.loginAccount.get - val builder = DirCache.newInCore.builder() - val inserter = git.getRepository.newObjectInserter() - val headName = s"refs/heads/${branch}" - val headTip = git.getRepository.resolve(headName) - - f(git, headTip, builder, inserter) - - val commitId = JGitUtil.createNewCommit( - git, - inserter, - headTip, - builder.getDirCache.writeTree(inserter), - headName, - loginAccount.fullName, - loginAccount.mailAddress, - message - ) - - inserter.flush() - inserter.close() - - val receivePack = new ReceivePack(git.getRepository) - val receiveCommand = new ReceiveCommand(headTip, commitId, headName) - - // call post commit hook - val error = PluginRegistry().getReceiveHooks.flatMap { hook => - hook.preReceive(repository.owner, repository.name, receivePack, receiveCommand, loginAccount.userName) - }.headOption - - error match { - case Some(error) => - // commit is rejected - // TODO Notify commit failure to edited user - val refUpdate = git.getRepository.updateRef(headName) - refUpdate.setNewObjectId(headTip) - refUpdate.setForceUpdate(true) - refUpdate.update() - - case None => - // update refs - val refUpdate = git.getRepository.updateRef(headName) - refUpdate.setNewObjectId(commitId) - refUpdate.setForceUpdate(false) - refUpdate.setRefLogIdent(new PersonIdent(loginAccount.fullName, loginAccount.mailAddress)) - refUpdate.update() - - // update pull request - updatePullRequests(repository.owner, repository.name, branch) - - // record activity - val commitInfo = new CommitInfo(JGitUtil.getRevCommitFromId(git, commitId)) - recordPushActivity(repository.owner, repository.name, loginAccount.userName, branch, List(commitInfo)) - - // create issue comment by commit message - createIssueComment(repository.owner, repository.name, commitInfo) - - // close issue by commit message - if (branch == repository.repository.defaultBranch) { - closeIssuesFromMessage(message, loginAccount.userName, repository.owner, repository.name).foreach { - issueId => - getIssue(repository.owner, repository.name, issueId.toString).foreach { issue => - callIssuesWebHook("closed", repository, issue, baseUrl, loginAccount) - PluginRegistry().getIssueHooks - .foreach(_.closedByCommitComment(issue, repository, message, loginAccount)) - } - } - } - - // call post commit hook - PluginRegistry().getReceiveHooks.foreach { hook => - hook.postReceive(repository.owner, repository.name, receivePack, receiveCommand, loginAccount.userName) - } - - //call web hook - callPullRequestWebHookByRequestBranch("synchronize", repository, branch, context.baseUrl, loginAccount) - val commit = new JGitUtil.CommitInfo(JGitUtil.getRevCommitFromId(git, commitId)) - callWebHookOf(repository.owner, repository.name, WebHook.Push) { - getAccountByUserName(repository.owner).map { ownerAccount => - WebHookPushPayload( - git, - loginAccount, - headName, - repository, - List(commit), - ownerAccount, - oldId = headTip, - newId = commitId - ) - } - } - } - } - } - } - private val readmeFiles = PluginRegistry().renderableExtensions.map { extension => s"readme.${extension}" } ++ Seq("readme.txt", "readme") diff --git a/src/main/scala/gitbucket/core/service/MergeService.scala b/src/main/scala/gitbucket/core/service/MergeService.scala index 3eab6b3..8fa665e 100644 --- a/src/main/scala/gitbucket/core/service/MergeService.scala +++ b/src/main/scala/gitbucket/core/service/MergeService.scala @@ -1,8 +1,15 @@ package gitbucket.core.service -import gitbucket.core.model.Account +import gitbucket.core.api.JsonFormat +import gitbucket.core.model.{Account, WebHook} +import gitbucket.core.plugin.PluginRegistry +import gitbucket.core.service.RepositoryService.RepositoryInfo import gitbucket.core.util.Directory._ +import gitbucket.core.util.JGitUtil import gitbucket.core.util.SyntaxSugars._ +import gitbucket.core.model.Profile._ +import gitbucket.core.model.Profile.profile._ +import gitbucket.core.model.Profile.profile.blockingApi._ import org.eclipse.jgit.merge.{MergeStrategy, Merger, RecursiveMerger} import org.eclipse.jgit.api.Git import org.eclipse.jgit.transport.RefSpec @@ -13,6 +20,8 @@ import scala.collection.JavaConverters._ trait MergeService { + self: AccountService with ActivityService with IssuesService with RepositoryService with WebHookPullRequestService => + import MergeService._ /** @@ -136,27 +145,69 @@ tryMergeRemote(userName, repositoryName, branch, requestUserName, requestRepositoryName, requestBranch).left.toOption def pullRemote( - localUserName: String, - localRepositoryName: String, + localRepository: RepositoryInfo, localBranch: String, - remoteUserName: String, - remoteRepositoryName: String, + remoteRepository: RepositoryInfo, remoteBranch: String, loginAccount: Account, message: String - ): Option[ObjectId] = { + )(implicit s: Session, c: JsonFormat.Context): Option[ObjectId] = { + val localUserName = localRepository.owner + val localRepositoryName = localRepository.name + val remoteUserName = remoteRepository.owner + val remoteRepositoryName = remoteRepository.name tryMergeRemote(localUserName, localRepositoryName, localBranch, remoteUserName, remoteRepositoryName, remoteBranch).map { case (newTreeId, oldBaseId, oldHeadId) => using(Git.open(getRepositoryDir(localUserName, localRepositoryName))) { git => + val existIds = JGitUtil.getAllCommitIds(git).toSet + val committer = new PersonIdent(loginAccount.fullName, loginAccount.mailAddress) val newCommit = Util.createMergeCommit(git.getRepository, newTreeId, committer, message, Seq(oldBaseId, oldHeadId)) Util.updateRefs(git.getRepository, s"refs/heads/${localBranch}", newCommit, false, committer, Some("merge")) + + val commits = git.log + .addRange(oldBaseId, newCommit) + .call + .iterator + .asScala + .map(c => new JGitUtil.CommitInfo(c)) + .toList + + commits.foreach { commit => + if (!existIds.contains(commit.id)) { + createIssueComment(localUserName, localRepositoryName, commit) + } + } + + // record activity + recordPushActivity( + localUserName, + localRepositoryName, + loginAccount.userName, + localBranch, + commits + ) + + // close issue by commit message + if (localBranch == localRepository.repository.defaultBranch) { + commits.foreach { commit => + closeIssuesFromMessage(commit.fullMessage, loginAccount.userName, localUserName, localRepositoryName) + .foreach { issueId => + getIssue(localRepository.owner, localRepository.name, issueId.toString).foreach { issue => + callIssuesWebHook("closed", localRepository, issue, "baseUrl for dummy", loginAccount) + PluginRegistry().getIssueHooks + .foreach( + _.closedByCommitComment(issue, localRepository, commit.fullMessage, loginAccount) + ) + } + } + } + } } oldBaseId }.toOption } - } object MergeService { diff --git a/src/main/scala/gitbucket/core/service/PullRequestService.scala b/src/main/scala/gitbucket/core/service/PullRequestService.scala index 8612d74..d391f91 100644 --- a/src/main/scala/gitbucket/core/service/PullRequestService.scala +++ b/src/main/scala/gitbucket/core/service/PullRequestService.scala @@ -164,7 +164,7 @@ /** * Fetch pull request contents into refs/pull/${issueId}/head and update pull request table. */ - def updatePullRequests(owner: String, repository: String, branch: String)(implicit s: Session): Unit = + def updatePullRequests(owner: String, repository: String, branch: String)(implicit s: Session): Unit = { getPullRequestsByRequest(owner, repository, branch, Some(false)).foreach { pullreq => if (Repositories.filter(_.byRepository(pullreq.userName, pullreq.repositoryName)).exists.run) { // Update the git repository @@ -206,6 +206,7 @@ updateCommitId(pullreq.userName, pullreq.repositoryName, pullreq.issueId, commitIdTo, commitIdFrom) } } + } def getPullRequestByRequestCommit( userName: String, diff --git a/src/main/scala/gitbucket/core/service/RepositoryCommitFileService.scala b/src/main/scala/gitbucket/core/service/RepositoryCommitFileService.scala new file mode 100644 index 0000000..074d2a4 --- /dev/null +++ b/src/main/scala/gitbucket/core/service/RepositoryCommitFileService.scala @@ -0,0 +1,190 @@ +package gitbucket.core.service +import gitbucket.core.api.JsonFormat +import gitbucket.core.model.{Account, WebHook} +import gitbucket.core.model.Profile._ +import gitbucket.core.model.Profile.profile.blockingApi._ +import gitbucket.core.plugin.PluginRegistry +import gitbucket.core.service.WebHookService.WebHookPushPayload +import gitbucket.core.util.Directory.getRepositoryDir +import gitbucket.core.util.JGitUtil.CommitInfo +import gitbucket.core.util.{JGitUtil, LockUtil} +import gitbucket.core.util.SyntaxSugars.using +import org.eclipse.jgit.api.Git +import org.eclipse.jgit.dircache.{DirCache, DirCacheBuilder} +import org.eclipse.jgit.lib._ +import org.eclipse.jgit.transport.{ReceiveCommand, ReceivePack} + +trait RepositoryCommitFileService { + self: AccountService with ActivityService with IssuesService with PullRequestService with WebHookPullRequestService => + import RepositoryCommitFileService._ + + def commitFiles( + repository: RepositoryService.RepositoryInfo, + files: Seq[CommitFile], + branch: String, + path: String, + message: String, + loginAccount: Account + )( + f: (Git, ObjectId, DirCacheBuilder, ObjectInserter) => Unit + )(implicit s: Session, c: JsonFormat.Context) = { + // prepend path to the filename + _commitFile(repository, branch, message, loginAccount)(f) + } + + def commitFile( + repository: RepositoryService.RepositoryInfo, + branch: String, + path: String, + newFileName: Option[String], + oldFileName: Option[String], + content: String, + charset: String, + message: String, + commit: String, + loginAccount: Account + )(implicit s: Session, c: JsonFormat.Context) = { + + val newPath = newFileName.map { newFileName => + if (path.length == 0) newFileName else s"${path}/${newFileName}" + } + val oldPath = oldFileName.map { oldFileName => + if (path.length == 0) oldFileName else s"${path}/${oldFileName}" + } + + _commitFile(repository, branch, message, loginAccount) { + case (git, headTip, builder, inserter) => + if (headTip.getName == commit) { + val permission = JGitUtil + .processTree(git, headTip) { (path, tree) => + // Add all entries except the editing file + if (!newPath.contains(path) && !oldPath.contains(path)) { + builder.add(JGitUtil.createDirCacheEntry(path, tree.getEntryFileMode, tree.getEntryObjectId)) + } + // Retrieve permission if file exists to keep it + oldPath.collect { case x if x == path => tree.getEntryFileMode.getBits } + } + .flatten + .headOption + + newPath.foreach { newPath => + builder.add(JGitUtil.createDirCacheEntry(newPath, permission.map { bits => + FileMode.fromBits(bits) + } getOrElse FileMode.REGULAR_FILE, inserter.insert(Constants.OBJ_BLOB, content.getBytes(charset)))) + } + builder.finish() + } + } + } + + private def _commitFile( + repository: RepositoryService.RepositoryInfo, + branch: String, + message: String, + loginAccount: Account + )( + f: (Git, ObjectId, DirCacheBuilder, ObjectInserter) => Unit + )(implicit s: Session, c: JsonFormat.Context) = { + + LockUtil.lock(s"${repository.owner}/${repository.name}") { + using(Git.open(getRepositoryDir(repository.owner, repository.name))) { git => + val builder = DirCache.newInCore.builder() + val inserter = git.getRepository.newObjectInserter() + val headName = s"refs/heads/${branch}" + val headTip = git.getRepository.resolve(headName) + + f(git, headTip, builder, inserter) + + val commitId = JGitUtil.createNewCommit( + git, + inserter, + headTip, + builder.getDirCache.writeTree(inserter), + headName, + loginAccount.fullName, + loginAccount.mailAddress, + message + ) + + inserter.flush() + inserter.close() + + val receivePack = new ReceivePack(git.getRepository) + val receiveCommand = new ReceiveCommand(headTip, commitId, headName) + + // call post commit hook + val error = PluginRegistry().getReceiveHooks.flatMap { hook => + hook.preReceive(repository.owner, repository.name, receivePack, receiveCommand, loginAccount.userName) + }.headOption + + error match { + case Some(error) => + // commit is rejected + // TODO Notify commit failure to edited user + val refUpdate = git.getRepository.updateRef(headName) + refUpdate.setNewObjectId(headTip) + refUpdate.setForceUpdate(true) + refUpdate.update() + + case None => + // update refs + val refUpdate = git.getRepository.updateRef(headName) + refUpdate.setNewObjectId(commitId) + refUpdate.setForceUpdate(false) + refUpdate.setRefLogIdent(new PersonIdent(loginAccount.fullName, loginAccount.mailAddress)) + refUpdate.update() + + // update pull request + updatePullRequests(repository.owner, repository.name, branch) + + // record activity + val commitInfo = new CommitInfo(JGitUtil.getRevCommitFromId(git, commitId)) + recordPushActivity(repository.owner, repository.name, loginAccount.userName, branch, List(commitInfo)) + + // create issue comment by commit message + createIssueComment(repository.owner, repository.name, commitInfo) + + // close issue by commit message + if (branch == repository.repository.defaultBranch) { + closeIssuesFromMessage(message, loginAccount.userName, repository.owner, repository.name).foreach { + issueId => + getIssue(repository.owner, repository.name, issueId.toString).foreach { issue => + callIssuesWebHook("closed", repository, issue, "dummy baseUrl", loginAccount) + PluginRegistry().getIssueHooks + .foreach(_.closedByCommitComment(issue, repository, message, loginAccount)) + } + } + } + + // call post commit hook + PluginRegistry().getReceiveHooks.foreach { hook => + hook.postReceive(repository.owner, repository.name, receivePack, receiveCommand, loginAccount.userName) + } + + //call web hook + callPullRequestWebHookByRequestBranch("synchronize", repository, branch, "dummy base url", loginAccount) + val commit = new JGitUtil.CommitInfo(JGitUtil.getRevCommitFromId(git, commitId)) + callWebHookOf(repository.owner, repository.name, WebHook.Push) { + getAccountByUserName(repository.owner).map { ownerAccount => + WebHookPushPayload( + git, + loginAccount, + headName, + repository, + List(commit), + ownerAccount, + oldId = headTip, + newId = commitId + ) + } + } + } + } + } + } + +} + +object RepositoryCommitFileService { + case class CommitFile(id: String, name: String) +} diff --git a/src/main/scala/gitbucket/core/service/RepositoryService.scala b/src/main/scala/gitbucket/core/service/RepositoryService.scala index 61c99e6..d784291 100644 --- a/src/main/scala/gitbucket/core/service/RepositoryService.scala +++ b/src/main/scala/gitbucket/core/service/RepositoryService.scala @@ -1,19 +1,25 @@ package gitbucket.core.service +import gitbucket.core.api.JsonFormat import gitbucket.core.controller.Context import gitbucket.core.util._ import gitbucket.core.util.SyntaxSugars._ -import gitbucket.core.model.{Account, Collaborator, ReleaseTag, Repository, RepositoryOptions, Role} +import gitbucket.core.model.{CommitComments => _, Session => _, _} import gitbucket.core.model.Profile._ import gitbucket.core.model.Profile.profile.blockingApi._ import gitbucket.core.model.Profile.dateColumnType import gitbucket.core.plugin.PluginRegistry +import gitbucket.core.service.WebHookService.WebHookPushPayload import gitbucket.core.util.Directory.{getRepositoryDir, getRepositoryFilesDir, getTemporaryDir, getWikiRepositoryDir} -import gitbucket.core.util.JGitUtil.FileInfo +import gitbucket.core.util.JGitUtil.{CommitInfo, FileInfo} import org.apache.commons.io.FileUtils import org.eclipse.jgit.api.Git +import org.eclipse.jgit.dircache.{DirCache, DirCacheBuilder} +import org.eclipse.jgit.lib.{Repository => _, _} +import org.eclipse.jgit.transport.{ReceiveCommand, ReceivePack} -trait RepositoryService { self: AccountService => +trait RepositoryService { + self: AccountService => import RepositoryService._ /** @@ -95,16 +101,20 @@ val releaseAssets = ReleaseAssets.filter(_.byRepository(oldUserName, oldRepositoryName)).list Repositories - .filter { t => (t.originUserName === oldUserName.bind) && (t.originRepositoryName === oldRepositoryName.bind) + .filter { t => + (t.originUserName === oldUserName.bind) && (t.originRepositoryName === oldRepositoryName.bind) } - .map { t => t.originUserName -> t.originRepositoryName + .map { t => + t.originUserName -> t.originRepositoryName } .update(newUserName, newRepositoryName) Repositories - .filter { t => (t.parentUserName === oldUserName.bind) && (t.parentRepositoryName === oldRepositoryName.bind) + .filter { t => + (t.parentUserName === oldUserName.bind) && (t.parentRepositoryName === oldRepositoryName.bind) } - .map { t => t.parentUserName -> t.parentRepositoryName + .map { t => + t.parentUserName -> t.parentRepositoryName } .update(newUserName, newRepositoryName) @@ -139,12 +149,17 @@ newMilestones.find(_.title == milestones.find(_.milestoneId == id).get.title).get.milestoneId }, priorityId = x.priorityId.map { id => - newPriorities.find(_.priorityName == priorities.find(_.priorityId == id).get.priorityName).get.priorityId + newPriorities + .find(_.priorityName == priorities.find(_.priorityId == id).get.priorityName) + .get + .priorityId } ) }: _*) - PullRequests.insertAll(pullRequests.map(_.copy(userName = newUserName, repositoryName = newRepositoryName)): _*) + PullRequests.insertAll( + pullRequests.map(_.copy(userName = newUserName, repositoryName = newRepositoryName)): _* + ) IssueComments.insertAll( issueComments.map(_.copy(userName = newUserName, repositoryName = newRepositoryName)): _* ) @@ -169,9 +184,11 @@ // Update source repository of pull requests PullRequests - .filter { t => (t.requestUserName === oldUserName.bind) && (t.requestRepositoryName === oldRepositoryName.bind) + .filter { t => + (t.requestUserName === oldUserName.bind) && (t.requestRepositoryName === oldRepositoryName.bind) } - .map { t => t.requestUserName -> t.requestRepositoryName + .map { t => + t.requestUserName -> t.requestRepositoryName } .update(newUserName, newRepositoryName) @@ -199,10 +216,11 @@ Activities .filter { t => (t.message like s"%:${oldUserName}/${oldRepositoryName}]%") || - (t.message like s"%:${oldUserName}/${oldRepositoryName}#%") || - (t.message like s"%:${oldUserName}/${oldRepositoryName}@%") + (t.message like s"%:${oldUserName}/${oldRepositoryName}#%") || + (t.message like s"%:${oldUserName}/${oldRepositoryName}@%") } - .map { t => t.activityId -> t.message + .map { t => + t.activityId -> t.message } .list .foreach { @@ -220,7 +238,10 @@ s"[branch:${oldUserName}/${oldRepositoryName}#", s"[branch:${newUserName}/${newRepositoryName}#" ) - .replace(s"[tag:${oldUserName}/${oldRepositoryName}#", s"[tag:${newUserName}/${newRepositoryName}#") + .replace( + s"[tag:${oldUserName}/${oldRepositoryName}#", + s"[tag:${newUserName}/${newRepositoryName}#" + ) .replace( s"[pullreq:${oldUserName}/${oldRepositoryName}#", s"[pullreq:${newUserName}/${newRepositoryName}#" @@ -749,7 +770,6 @@ } object RepositoryService { - case class RepositoryInfo( owner: String, name: String,