Skip to content

Commit eb1e0d5

Browse files
committed
refs #6 fix to handle double-quoted string in json data for push subcommand
1 parent 6093c51 commit eb1e0d5

3 files changed

Lines changed: 23 additions & 16 deletions

File tree

app/src/main/java/jp/kazamori/github/actions/backlog/Main.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,27 @@
88
import jp.kazamori.github.actions.backlog.command.Push;
99
import jp.kazamori.github.actions.backlog.common.StrUtil;
1010
import jp.kazamori.github.actions.backlog.config.ConfigUtil;
11+
import jp.kazamori.github.actions.backlog.constant.SubCommand;
1112
import lombok.val;
1213
import org.slf4j.LoggerFactory;
1314
import picocli.CommandLine;
1415
import picocli.CommandLine.Command;
1516
import picocli.CommandLine.HelpCommand;
1617

18+
import java.util.Arrays;
19+
1720
@Command(name = "Backlog GitHub integration action",
1821
subcommands = {HelpCommand.class},
1922
description = "provides functionalities to integrate with Backlog")
2023
public class Main {
2124

2225
@VisibleForTesting
2326
static String[] ensureArgumentTokens(String[] args) {
24-
// for GitHub Actions
25-
// it takes inputs as two strings like below
26-
// "pull_request" "--repository kazamori/backlog-github-integration-action --pr-number 1"
27-
if (args.length != 2) {
27+
if (!args[0].equals(SubCommand.PUSH) && args.length != 2) {
2828
return args;
2929
}
30-
val tokens = StrUtil.extractStringToTokens(args[0], args[1]);
30+
val restArgs = Arrays.copyOfRange(args, 1, args.length);
31+
val tokens = StrUtil.extractStringToTokens(args[0], String.join(" ", restArgs));
3132
tokens.add(0, args[0]);
3233
return tokens.toArray(new String[]{});
3334
}

app/src/main/java/jp/kazamori/github/actions/backlog/common/StrUtil.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.google.common.base.Splitter;
44
import jp.kazamori.github.actions.backlog.constant.SubCommand;
5+
import lombok.val;
56

67
import java.util.List;
78
import java.util.regex.Pattern;
@@ -33,16 +34,16 @@ public static List<String> extractStringWithSingleQuoteToTokens(String str) {
3334
}
3435

3536
private static String extractArgumentsWithoutCommits(String str, int commitsPosition, int quoteEnd) {
36-
var s1 = str.substring(0, commitsPosition).trim();
37+
val s1 = str.substring(0, commitsPosition).trim();
3738
if (str.length() == quoteEnd) {
3839
return s1;
3940
}
40-
var s2 = str.substring(quoteEnd + 1, str.length()).trim();
41+
val s2 = str.substring(quoteEnd + 1, str.length()).trim();
4142
return String.format("%s %s", s1, s2);
4243
}
4344

4445
private static int getLastIndexFromBeginning(String str, int quoteStart, String quote) {
45-
var index = str.indexOf(quote, quoteStart);
46+
var index = str.indexOf(quote, quoteStart + 1);
4647
if (index < 0) {
4748
return index;
4849
}
@@ -61,16 +62,19 @@ private static int getLastIndexFromBeginning(String str, int quoteStart, String
6162
private static final String COMMITS_OPTION = "--commits";
6263

6364
public static List<String> extractPushCommandArguments(String str) {
64-
var commitsPosition = str.indexOf(COMMITS_OPTION);
65+
val commitsPosition = str.indexOf(COMMITS_OPTION);
6566
if (commitsPosition < 0) {
6667
return extractStringWithDoubleQuoteToTokens(str);
6768
}
68-
var quoteStart = str.indexOf(SINGLE_QUOTE, commitsPosition + 1);
69-
var quoteEnd = getLastIndexFromBeginning(str, quoteStart, SINGLE_QUOTE);
70-
var json = str.substring(quoteStart + 1, quoteEnd);
69+
val quoteStart = str.indexOf(SINGLE_QUOTE, commitsPosition + 1);
70+
val quoteEnd = getLastIndexFromBeginning(str, quoteStart, SINGLE_QUOTE);
71+
if (quoteEnd < 0) {
72+
throw new IllegalArgumentException("Invalid arguments");
73+
}
74+
val json = str.substring(quoteStart + 1, quoteEnd);
7175
// extract arguments without "--commits"
72-
var others = extractArgumentsWithoutCommits(str, commitsPosition, quoteEnd);
73-
var tokens = extractStringWithDoubleQuoteToTokens(others);
76+
val others = extractArgumentsWithoutCommits(str, commitsPosition, quoteEnd);
77+
val tokens = extractStringWithDoubleQuoteToTokens(others);
7478
tokens.add(COMMITS_OPTION);
7579
tokens.add(json);
7680
return tokens.stream().filter(e -> !e.trim().isEmpty()).collect(Collectors.toList());

app/src/test/java/jp/kazamori/github/actions/backlog/MainTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,10 @@ void ensureArgumentTokensForPullRequest(String[] args, int expectedLength, Strin
3535

3636
static Stream<Arguments> makePushArgsData() {
3737
return Stream.of(
38-
arguments(new String[]{"push", "--commits '[{\"key\": \"value\"}]' --opt param"}, 5, "[{\"key\": \"value\"}]"),
39-
arguments(new String[]{"push", "--opt param --commits '[{\"key\": \"handled by \\\"double quote\\\"\"}]'"},
38+
arguments(new String[]{
39+
"push", "--commits '[{\"key\": \"value\"}]' --opt param"}, 5, "[{\"key\": \"value\"}]"),
40+
arguments(new String[]{
41+
"push", "--opt param --commits '[{\"key\": \"handled by \\\"double", "quote\\\"\"}]'"},
4042
5, "[{\"key\": \"handled by \\\"double quote\\\"\"}]"),
4143
arguments(new String[]{"push", "--opt 'param' 'a\nb' --commits '[{\"key\": \"value\"}]' --verbose"},
4244
7, "[{\"key\": \"value\"}]")

0 commit comments

Comments
 (0)