Skip to content

Commit 94ccdd9

Browse files
committed
Properly return correct exit code for success.
1 parent c83ae63 commit 94ccdd9

File tree

2 files changed

+65
-8
lines changed

2 files changed

+65
-8
lines changed

src/main/c/xmq-cli.c

+14-8
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ bool cmd_replace(XMQCliCommand *command);
312312
bool cmd_substitute(XMQCliCommand *command);
313313
XMQCliCmd cmd_from(const char *s);
314314
XMQCliCmdGroup cmd_group(XMQCliCmd cmd);
315-
bool cmd_load(XMQCliCommand *command);
315+
bool cmd_load(XMQCliCommand *command, bool *no_more_data);
316316
const char *cmd_name(XMQCliCmd cmd);
317317
bool cmd_to(XMQCliCommand *command);
318318
bool cmd_output(XMQCliCommand *command);
@@ -348,7 +348,7 @@ void invoke_shell(xmlNode *n, const char *cmd);
348348
void page(const char *start, const char *stop);
349349
void browse(XMQCliCommand *c);
350350
void open_browser(const char *file);
351-
bool perform_command(XMQCliCommand *c);
351+
bool perform_command(XMQCliCommand *c, bool *no_more_data);
352352
void prepare_command(XMQCliCommand *c, XMQCliCommand *load_command);
353353
void print_version_and_exit();
354354
void print_license_and_exit();
@@ -1029,7 +1029,8 @@ bool handle_option(const char *arg, const char *arg_next, XMQCliCommand *command
10291029
{
10301030
cmd.in_format = XMQ_CONTENT_HTML;
10311031
}
1032-
bool ok = cmd_load(&cmd);
1032+
bool ignore_no_more_data = false;
1033+
bool ok = cmd_load(&cmd, &ignore_no_more_data);
10331034
if (!ok) return false;
10341035
xmlDocPtr doc = (xmlDocPtr)xmqGetImplementationDoc(cmd.env->doc);
10351036
command->node_doc = doc;
@@ -1832,7 +1833,7 @@ bool cmd_tokenize(XMQCliCommand *command)
18321833
return err == 0;
18331834
}
18341835

1835-
bool cmd_load(XMQCliCommand *command)
1836+
bool cmd_load(XMQCliCommand *command, bool *no_more_data)
18361837
{
18371838
if (!command) return false;
18381839

@@ -1899,6 +1900,7 @@ bool cmd_load(XMQCliCommand *command)
18991900
command->input_content_stop);
19001901
if (command->input_current_line_start >= command->input_content_stop)
19011902
{
1903+
*no_more_data = true;
19021904
return false;
19031905
}
19041906
xmqSetOriginalSize(command->env->doc, command->input_current_line_stop-command->input_current_line_start);
@@ -3639,8 +3641,9 @@ void page(const char *start, const char *stop)
36393641
printf("\033[0m");
36403642
}
36413643

3642-
bool perform_command(XMQCliCommand *c)
3644+
bool perform_command(XMQCliCommand *c, bool *no_more_data)
36433645
{
3646+
*no_more_data = false;
36443647
if (c->cmd == XMQ_CLI_CMD_NONE) return true;
36453648

36463649
switch (c->cmd) {
@@ -3649,7 +3652,7 @@ bool perform_command(XMQCliCommand *c)
36493652
case XMQ_CLI_CMD_NO_OUTPUT:
36503653
return true;
36513654
case XMQ_CLI_CMD_LOAD:
3652-
return cmd_load(c);
3655+
return cmd_load(c, no_more_data);
36533656
case XMQ_CLI_CMD_TO_XMQ:
36543657
case XMQ_CLI_CMD_TO_XML:
36553658
case XMQ_CLI_CMD_TO_HTMQ:
@@ -4127,6 +4130,7 @@ int main(int argc, const char **argv)
41274130
}
41284131

41294132
bool more_content = true;
4133+
bool no_more_data = false;
41304134

41314135
while (more_content)
41324136
{
@@ -4138,10 +4142,12 @@ int main(int argc, const char **argv)
41384142
while (c)
41394143
{
41404144
debug_("xmq=", "performing %s", cmd_name(c->cmd));
4141-
bool ok = perform_command(c);
4145+
bool ok = perform_command(c, &no_more_data);
41424146
if (!ok)
41434147
{
4144-
rc = 1;
4148+
// cmd_load returns false and sets no_more_data when we are out of lines.
4149+
// This is not an error. Only set rc to 1 if a real failure.
4150+
if (!no_more_data) rc = 1;
41454151
break;
41464152
}
41474153
c = c->next;

tests/test_special_002_exit_code.sh

+51
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#!/bin/sh
2+
# libxmq - Copyright 2025 Fredrik Öhrström (spdx: MIT)
3+
4+
PROG=$1
5+
OUTPUT=$2
6+
TEST_NAME=$(basename $1 2> /dev/null)
7+
TEST_NAME=${TEST_NAME%.*}
8+
9+
if [ -z "$OUTPUT" ] || [ -z "$PROG" ]
10+
then
11+
echo "Usage: tests/test_special....sh [XMQ_BINARY] [OUTPUT_DIR]"
12+
exit 1
13+
fi
14+
15+
mkdir -p $OUTPUT
16+
17+
cat > $OUTPUT/input.xml <<EOF
18+
<root>
19+
<child>Hello Homebrew!</child>
20+
</root>
21+
EOF
22+
23+
cat > $OUTPUT/expected.xmq <<EOF
24+
child = 'Hello Homebrew!'
25+
EOF
26+
27+
$PROG $OUTPUT/input.xml select //child > $OUTPUT/output.xmq
28+
RC="$?"
29+
30+
if [ "$?" = "0" ]
31+
then
32+
echo "OK: test special 002 exit code"
33+
else
34+
echo "ERROR: test special 002 exit code, expected 0 as exit code but got $RC"
35+
exit 1
36+
fi
37+
38+
if diff $OUTPUT/output.xmq $OUTPUT/expected.xmq
39+
then
40+
echo "OK: test special 002 xmq output"
41+
else
42+
echo "ERROR: test special 002 xmq"
43+
echo "Formatting differ:"
44+
if [ -n "$USE_MELD" ]
45+
then
46+
meld $OUTPUT/expected.xmq $OUTPUT/output.xmq
47+
else
48+
diff $OUTPUT/expected.xmq $OUTPUT/output.xmq
49+
fi
50+
exit 1
51+
fi

0 commit comments

Comments
 (0)