Skip to content

Commit d08553a

Browse files
committedMay 16, 2013
Merge pull request #22 from heyzooi/master
fix for issue JENKINS-12800
2 parents 17322ca + 7217181 commit d08553a

File tree

3 files changed

+68
-6
lines changed

3 files changed

+68
-6
lines changed
 

‎pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
<parent>
2929
<groupId>org.jenkins-ci.plugins</groupId>
3030
<artifactId>plugin</artifactId>
31-
<version>1.399</version>
31+
<version>1.509</version>
3232
<relativePath />
3333
</parent>
3434
<artifactId>xcode-plugin</artifactId>

‎src/main/java/au/com/rayh/XCodeBuilder.java

+65-5
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@
4747
import java.io.ByteArrayOutputStream;
4848
import java.io.IOException;
4949
import java.util.ArrayList;
50-
import java.util.Arrays;
5150
import java.util.List;
51+
import java.util.StringTokenizer;
5252

5353
/**
5454
* @author Ray Hilton
@@ -552,12 +552,72 @@ else if (StringUtils.isEmpty(cfBundleVersion))
552552

553553
return true;
554554
}
555+
556+
enum ParserState {
557+
NORMAL,
558+
IN_QUOTE,
559+
IN_DOUBLE_QUOTE,
560+
ESCAPE_CHAR
561+
};
555562

556563
static List<String> splitXcodeBuildArguments(String xcodebuildArguments) {
557-
String[] parts = xcodebuildArguments.split("(?<!\\\\)\\s+");
558-
List<String> result = new ArrayList<String>(parts.length);
559-
for(String arg : parts) {
560-
result.add(arg.replaceAll("\\\\ ", " "));
564+
if (xcodebuildArguments == null || xcodebuildArguments.length() == 0) {
565+
return new ArrayList<String>(0);
566+
}
567+
568+
ParserState state = ParserState.NORMAL;
569+
final StringTokenizer tok = new StringTokenizer(xcodebuildArguments, "\"'\\ ", true);
570+
final List<String> result = new ArrayList<String>();
571+
final StringBuilder current = new StringBuilder();
572+
boolean lastTokenHasBeenQuoted = false;
573+
String nextTok;
574+
while (tok.hasMoreTokens()) {
575+
nextTok = tok.nextToken();
576+
switch (state) {
577+
case IN_QUOTE:
578+
if ("\'".equals(nextTok)) {
579+
lastTokenHasBeenQuoted = true;
580+
state = ParserState.NORMAL;
581+
} else {
582+
current.append(nextTok);
583+
}
584+
break;
585+
case IN_DOUBLE_QUOTE:
586+
if ("\"".equals(nextTok)) {
587+
lastTokenHasBeenQuoted = true;
588+
state = ParserState.NORMAL;
589+
} else {
590+
current.append(nextTok);
591+
}
592+
break;
593+
case ESCAPE_CHAR:
594+
current.append(nextTok);
595+
state = ParserState.NORMAL;
596+
break;
597+
default:
598+
if ("\'".equals(nextTok)) {
599+
state = ParserState.IN_QUOTE;
600+
} else if ("\"".equals(nextTok)) {
601+
state = ParserState.IN_DOUBLE_QUOTE;
602+
} else if ("\\".equals(nextTok)) {
603+
state = ParserState.ESCAPE_CHAR;
604+
} else if (" ".equals(nextTok) && !(current.length() > 0 && current.charAt(current.length() - 1) == '\\')) {
605+
if (lastTokenHasBeenQuoted || current.length() != 0) {
606+
result.add(current.toString());
607+
current.setLength(0);
608+
}
609+
} else {
610+
current.append(nextTok);
611+
}
612+
lastTokenHasBeenQuoted = false;
613+
break;
614+
}
615+
}
616+
if (lastTokenHasBeenQuoted || current.length() != 0) {
617+
result.add(current.toString());
618+
}
619+
if (state == ParserState.IN_QUOTE || state == ParserState.IN_DOUBLE_QUOTE) {
620+
throw new IllegalArgumentException(String.format("Inconsistent quotes: %s", xcodebuildArguments));
561621
}
562622
return result;
563623
}

‎src/test/java/au/com/rayh/XCodeBuilderTest.java

+2
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,7 @@ public void shouldSplitXcodeBuildArgumentsWithEscapedSpaces() throws Exception {
5959
XCodeBuilder.splitXcodeBuildArguments("CODE_SIGN_IDENTITY=iPhone\\ Developer:\\ Todd\\ Kirby"));
6060
assertEquals(asList("A=B", "CODE_SIGN_IDENTITY=iPhone Developer: Todd Kirby"),
6161
XCodeBuilder.splitXcodeBuildArguments("A=B CODE_SIGN_IDENTITY=iPhone\\ Developer:\\ Todd\\ Kirby"));
62+
assertEquals(asList("A=B", "CODE_SIGN_IDENTITY=iPhone Distribution", "C=D"),
63+
XCodeBuilder.splitXcodeBuildArguments("A=B CODE_SIGN_IDENTITY=\"iPhone Distribution\" C=D"));
6264
}
6365
}

0 commit comments

Comments
 (0)
Please sign in to comment.