Description
if the ivy.retrieve.pattern contains an optional parameter as the first parameter, the sync feature of ivy:retrieve will get a path with a trailing '(' causing it to find nothing to sync, leaving old files still in the retrieve path.
Example:
ivy.retrieve.pattern = lib/([type]/)/[artifact].[ext]
sync will try to match orphaned files against lib/( which obviously contains nothing.
The problem is in IvyPatternHelper.java getTokenRoot(), which only checks for the first '[', but in the pattern above it needs to check for the first '('.
I could see that nothing but the Resolver uses this function so it looks like it'll be pretty safe to just fix the check. I've attached a suggested fix below. I rarely touch java, so there might be simpler ways to do it, but at least it works.
diff -r 616a4e764dd1 src/java/org/apache/ivy/core/IvyPatternHelper.java --- a/src/java/org/apache/ivy/core/IvyPatternHelper.java Fri Nov 20 11:38:53 2009 +0100 +++ b/src/java/org/apache/ivy/core/IvyPatternHelper.java Fri Nov 20 12:54:27 2009 +0100 @@ -472,7 +472,15 @@ } public static String getTokenRoot(String pattern) { - int index = pattern.indexOf('['); + int[] delimiters = {'[', '('}; + for (int index = 0; index < delimiters.length; ++index) { + pattern = getTokenRoot(pattern, delimiters[index]); + } + return pattern; + } + + private static String getTokenRoot(String pattern, int delimiter) { + int index = pattern.indexOf(delimiter); if (index == -1) { return pattern; } else {
improved summary and description