Change to CopySpec#eachFile(Closure) behaviour in gradle 1.8


(l3moncurd) #1

Hi,

Given the following task:

task copyFiles(type:Copy) {
    from 'src'
into "${buildDir}"
  eachFile { println it.file
}
}

and the following file:

src/conf/file.properties

In Gradle 1.8 the eachFile closure gets called for each parent directory:

:copyFiles  src\conf  src\conf\file.properties  

Whereas when I run the task in Gradle 1.6, I get the following output:

:copyFiles  src\conf\file.properties  

I couldn’t see anything in the 1.7/1.8 release notes to suggest this was an intentional change.


(Peter Niederwieser) #2

It’s a known issue with 1.8.


(Peter Niederwieser) #3

Actually, it’s similar to but not quite the same as GRADLE-2900. Raised GRADLE-2906. Thanks for reporting.


(Alex Garnier) #4

This issue allow me to finally extract a zip with renaming of the root folder (e.g. ‘apache-tomcat-7.0.39.zip/apache-tomcat-7.0.39’ => ‘apache-tomcat’) without having an empty structure with old name

project.copy {
 from project.zipTree(project.file('apache-tomcat-7.0.39.zip'))
 into project.buildDir
 // Change root folder
 eachFile { FileCopyDetails fcp ->
  def segments = ['apache-tomcat'] + (fcp.relativePath.segments.size() == 1 ? [] : fcp.relativePath.segments[1..-1])
  def pathsegments = segments as String[]
  fcp.relativePath = new RelativePath(!fcp.file.isDirectory(), pathsegments)
 }
}