[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 |