diff --git a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala index d575c68..ad8b091 100644 --- a/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala +++ b/src/main/scala/gitbucket/core/controller/RepositoryViewerController.scala @@ -593,14 +593,18 @@ val headName = s"refs/heads/${branch}" val headTip = git.getRepository.resolve(headName) - JGitUtil.processTree(git, headTip){ (path, tree) => + val permission = JGitUtil.processTree(git, headTip){ (path, tree) => + // Add all entries except the editing file if(!newPath.exists(_ == path) && !oldPath.exists(_ == 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, FileMode.REGULAR_FILE, + 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() diff --git a/src/main/scala/gitbucket/core/util/JGitUtil.scala b/src/main/scala/gitbucket/core/util/JGitUtil.scala index 230fa6f..7c5f687 100644 --- a/src/main/scala/gitbucket/core/util/JGitUtil.scala +++ b/src/main/scala/gitbucket/core/util/JGitUtil.scala @@ -830,14 +830,16 @@ existIds.toSeq } - def processTree(git: Git, id: ObjectId)(f: (String, CanonicalTreeParser) => Unit) = { + def processTree[T](git: Git, id: ObjectId)(f: (String, CanonicalTreeParser) => T): Seq[T] = { using(new RevWalk(git.getRepository)){ revWalk => using(new TreeWalk(git.getRepository)){ treeWalk => val index = treeWalk.addTree(revWalk.parseTree(id)) treeWalk.setRecursive(true) + val result = new collection.mutable.ListBuffer[T]() while(treeWalk.next){ - f(treeWalk.getPathString, treeWalk.getTree(index, classOf[CanonicalTreeParser])) + result += f(treeWalk.getPathString, treeWalk.getTree(index, classOf[CanonicalTreeParser])) } + result.toSeq } } }