| [GRADLE-1611] Getting a path with backslashes where a path with slashes is expected in a ziptask with ziptree input Created: 14/Jun/11 Updated: 04/Jan/13 Resolved: 22/Jun/11 | |
| Status: | Resolved | 
| Project: | Gradle | 
| Affects Version/s: | 1.0-milestone-3 | 
| Fix Version/s: | None | 
| Type: | Bug | ||
| Reporter: | Ric Klaren | Assignee: | Unassigned | 
| Resolution: | Not A Bug | Votes: | 0 | 
| Description | 
| We have a distribution task, that combines a number of zip files into one together with the artifacts generated by our build. During the unpack of the original zip files we relocate a few directories. We now run into the issue that on unix everything works but on windows we are not seeing a 'denormalized' paths as we would expect (e.g. we see a path with back slashes in stead of slashes). The expectation from a path with slashes on windows stems from: http://gradle.org/current/docs/javadoc/org/gradle/api/file/FileTreeElement.html#getPath%28%29. 
task dist(type: Zip, dependsOn: cleanDist) {
    description = "Build distribution ZIP"
    subprojects {
        dependsOn(it.jar)
    }
    def virgoFileTree = zipTree(configurations.server.getSingleFile())
    def virgoDocPath = 'docs/virgo-' + virgo_version
    virgoFileTree.matching({include "**/docs/**/*"}).each {
        newPath = it.path.substring(it.path.indexOf('/docs/') + 5, it.path.lastIndexOf('/'))
        from(it) { into (virgoDocPath + newPath) }
    }
    // more of the same.....
}
The 'include' in the matching part works, but the indexOf's fail, on windows, due to it.path using slashes on unix and backslashes on windows. | 
| Comments | 
| Comment by Adam Murdoch [ 21/Jun/11 ] | 
| FileTree.each {} iterates over the files in the file tree as java.io.File objects. So, in your example above, it.path will contain native file name separators. Given that on windows this is a backslash, by calling into(virgoDocPath + newPath), you're asking Gradle to add the entry with backslashes in its name. You might instead use CopySpec.eachFile, which allows you to work with the normalised path: 
from(virgoFileTree) {
    include "**/docs/**/*"
    eachFile { FileCopyDetails file ->
       newPath = // do something with file.path
       file.path = // do something with newPath    
    }
}
See http://gradle.org/current/docs/javadoc/org/gradle/api/file/CopySpec.html#eachFile(groovy.lang.Closure) | 
| Comment by Ric Klaren [ 27/Jun/11 ] | 
| Thank you for the clarification, will update our build accordingly. Cheers, Ric |