diff --git a/bfg-test/src/main/scala/com/madgag/git/bfg/test/unpackedRepo.scala b/bfg-test/src/main/scala/com/madgag/git/bfg/test/unpackedRepo.scala index 4fecf898..4a79c9d1 100644 --- a/bfg-test/src/main/scala/com/madgag/git/bfg/test/unpackedRepo.scala +++ b/bfg-test/src/main/scala/com/madgag/git/bfg/test/unpackedRepo.scala @@ -4,7 +4,7 @@ import com.madgag.git._ import com.madgag.git.test._ import org.eclipse.jgit.internal.storage.file.{GC, ObjectDirectory} import org.eclipse.jgit.lib.Constants.OBJ_BLOB -import org.eclipse.jgit.lib.{ObjectId, ObjectReader, Repository} +import org.eclipse.jgit.lib.{ObjectId, ObjectReader, Repository, FileMode} import org.eclipse.jgit.revwalk.{RevCommit, RevTree} import org.eclipse.jgit.treewalk.TreeWalk import org.scalatest.matchers.{MatchResult, Matcher} @@ -38,6 +38,8 @@ class unpackedRepo(filePath: String) extends FlatSpec with Matchers { def haveFolder(name: String): Matcher[ObjectId] = haveTreeEntry(name, _.isSubtree) + def haveFileMode(name: String, fm: FileMode) = haveTreeEntry(name, (file : TreeWalk) => file.getFileMode == fm && file.getNameString == name) + def haveTreeEntry(name: String, p: TreeWalk => Boolean)= new Matcher[ObjectId] { def apply(treeish: ObjectId) = { treeOrBlobPointedToBy(treeish.asRevObject) match { diff --git a/bfg/src/test/resources/sample-repos/chmodExample.git.zip b/bfg/src/test/resources/sample-repos/chmodExample.git.zip new file mode 100644 index 00000000..36ff8d6a Binary files /dev/null and b/bfg/src/test/resources/sample-repos/chmodExample.git.zip differ diff --git a/bfg/src/test/scala/com/madgag/git/bfg/cli/MainSpec.scala b/bfg/src/test/scala/com/madgag/git/bfg/cli/MainSpec.scala index 1a7f684e..09d80277 100644 --- a/bfg/src/test/scala/com/madgag/git/bfg/cli/MainSpec.scala +++ b/bfg/src/test/scala/com/madgag/git/bfg/cli/MainSpec.scala @@ -22,7 +22,7 @@ package com.madgag.git.bfg.cli import com.madgag.git._ import com.madgag.git.bfg.cli.test.unpackedRepo -import org.eclipse.jgit.lib.ObjectId +import org.eclipse.jgit.lib.{FileMode, ObjectId} import org.eclipse.jgit.revwalk.RevCommit import org.scalatest.{FlatSpec, Inspectors, Matchers, OptionValues} @@ -124,5 +124,17 @@ class MainSpec extends FlatSpec with Matchers with OptionValues with Inspectors run("--fix-filename-duplicates-preferring tree") } } + + "Corrupt trees bad file modes" should { + "make .pl and .sh files executable and all other files non-executable" in new unpackedRepo("/sample-repos/chmodExample.git.zip") { + ensureRemovalOf(commitHistory(haveFileMode("test.pl", FileMode.REGULAR_FILE).atLeastOnce)) { + ensureRemovalOf(commitHistory(haveFileMode("test.sh", FileMode.REGULAR_FILE).atLeastOnce)) { + ensureRemovalOf(commitHistory(haveFileMode("test.txt", FileMode.EXECUTABLE_FILE).atLeastOnce)) { + run("--no-blob-protection --chmod:-x=*.* --chmod:+x=*.{sh,pl}") + } + } + } + } + } } diff --git a/chmodExample.git b/chmodExample.git new file mode 160000 index 00000000..1a2b2d85 --- /dev/null +++ b/chmodExample.git @@ -0,0 +1 @@ +Subproject commit 1a2b2d85f36cf97ff9404026f55b7a2d11076752