Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 274e5c2

Browse files
committedOct 30, 2018
CLI/Nodeset: handle multiline shell arguments (#394)
The NodeSet class doesn't consider newline as a node separator, so for now we have to take care of multiline shell arguments in the CLI by performing a union set operation from all lines of the arg. Closes #394. Change-Id: Ib34c66371837e797ddcf1b5246e2696ed29e2a5c
1 parent 66c62d4 commit 274e5c2

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed
 

‎lib/ClusterShell/CLI/Nodeset.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,33 +59,37 @@ def compute_nodeset(xset, args, autostep):
5959
"""Apply operations and operands from args on xset, an initial
6060
RangeSet or NodeSet."""
6161
class_set = xset.__class__
62-
# Process operations
62+
# Process operations from command arguments.
63+
# The special argument string "-" indicates to read stdin.
64+
# We also take care of multiline shell arguments (#394).
6365
while args:
6466
arg = args.pop(0)
6567
if arg in ("-i", "--intersection"):
6668
val = args.pop(0)
6769
if val == '-':
6870
process_stdin(xset.intersection_update, class_set, autostep)
6971
else:
70-
xset.intersection_update(class_set(val, autostep=autostep))
72+
xset.intersection_update(class_set.fromlist(val.splitlines(),
73+
autostep=autostep))
7174
elif arg in ("-x", "--exclude"):
7275
val = args.pop(0)
7376
if val == '-':
7477
process_stdin(xset.difference_update, class_set, autostep)
7578
else:
76-
xset.difference_update(class_set(val, autostep=autostep))
79+
xset.difference_update(class_set.fromlist(val.splitlines(),
80+
autostep=autostep))
7781
elif arg in ("-X", "--xor"):
7882
val = args.pop(0)
7983
if val == '-':
8084
process_stdin(xset.symmetric_difference_update, class_set,
8185
autostep)
8286
else:
83-
xset.symmetric_difference_update(class_set(val,
84-
autostep=autostep))
87+
xset.symmetric_difference_update(
88+
class_set.fromlist(val.splitlines(), autostep=autostep))
8589
elif arg == '-':
8690
process_stdin(xset.update, xset.__class__, autostep)
8791
else:
88-
xset.update(class_set(arg, autostep=autostep))
92+
xset.update(class_set.fromlist(arg.splitlines(), autostep=autostep))
8993

9094
return xset
9195

‎tests/CLINodesetTest.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ def test_002_count_intersection(self):
8484
self._nodeset_t(["--count", "foo[395-442]", "--intersection", "foo", "-i", "foo[1-200,245-394]"], None, b"0\n")
8585
self._nodeset_t(["--count", "foo[395-442]", "-i", "foo", "-i", "foo[0-200,245-394]"], None, b"0\n")
8686
self._nodeset_t(["--count", "foo[395-442]", "--intersection", "bar3,bar24", "-i", "foo[1-200,245-394]"], None, b"0\n")
87+
# multiline args (#394)
88+
self._nodeset_t(["--count", "foo[1,2]", "-i", "foo1\nfoo2"], None, b"2\n")
89+
self._nodeset_t(["--count", "foo[1,2]", "-i", "foo1\nfoo2", "foo3\nfoo4"], None, b"4\n")
8790

8891
def test_003_count_intersection_stdin(self):
8992
"""test nodeset --count --intersection (stdin)"""
@@ -114,6 +117,9 @@ def _battery_fold(self, args):
114117
self._nodeset_t(args + ["--fold", "foo[395-442]", "foo", "foo[1-200,245-394]"], None, b"foo,foo[1-200,245-442]\n")
115118
self._nodeset_t(args + ["--fold", "foo[395-442]", "foo", "foo[0-200,245-394]"], None, b"foo,foo[0-200,245-442]\n")
116119
self._nodeset_t(args + ["--fold", "foo[395-442]", "bar3,bar24", "foo[1-200,245-394]"], None, b"bar[3,24],foo[1-200,245-442]\n")
120+
# multiline arg (#394)
121+
self._nodeset_t(args + ["--fold", "foo3\nfoo1\nfoo2\nbar"], None, b"bar,foo[1-3]\n")
122+
self._nodeset_t(args + ["--fold", "foo3\n\n\nfoo1\n\nfoo2\n\n"], None, b"foo[1-3]\n")
117123
# stdin
118124
self._nodeset_t(args + ["--fold"], "\n", b"\n")
119125
self._nodeset_t(args + ["--fold"], "foo\n", b"foo\n")
@@ -212,6 +218,9 @@ def test_009_fold_xor(self):
212218
self._nodeset_t(["--fold", "foo[395-442]", "-X", "foo", "-X", "foo[1-200,245-394]"], None, b"foo,foo[1-200,245-442]\n")
213219
self._nodeset_t(["--fold", "foo[395-442]", "-X", "foo", "-X", "foo[0-200,245-394]"], None, b"foo,foo[0-200,245-442]\n")
214220
self._nodeset_t(["--fold", "foo[395-442]", "-X", "bar3,bar24", "-X", "foo[1-200,245-394]"], None, b"bar[3,24],foo[1-200,245-442]\n")
221+
# multiline args (#394)
222+
self._nodeset_t(["--fold", "foo[1-10]", "-X", "foo5\nfoo6\nfoo7"], None, b"foo[1-4,8-10]\n")
223+
self._nodeset_t(["--fold", "foo[1-10]", "-X", "foo5\nfoo6\nfoo7", "foo5\nfoo6"], None, b"foo[1-6,8-10]\n")
215224

216225
def test_010_fold_xor_stdin(self):
217226
"""test nodeset --fold --xor (stdin)"""
@@ -241,6 +250,9 @@ def test_011_fold_exclude(self):
241250
# Do no change
242251
self._nodeset_t(["--fold", "foo[6-10]", "-x", "bar[0-5]"], None, b"foo[6-10]\n")
243252
self._nodeset_t(["--fold", "foo[0-10]", "foo[13-18]", "--exclude", "foo[5-10,15]"], None, b"foo[0-4,13-14,16-18]\n")
253+
# multiline args (#394)
254+
self._nodeset_t(["--fold", "foo[0-5]", "-x", "foo0\nfoo9\nfoo3\nfoo2\nfoo1"], None, b"foo[4-5]\n")
255+
self._nodeset_t(["--fold", "foo[0-5]", "-x", "foo0\nfoo9\nfoo3\nfoo2\nfoo1", "foo5\nfoo6"], None, b"foo[4-6]\n")
244256

245257
def test_012_fold_exclude_stdin(self):
246258
"""test nodeset --fold --exclude (stdin)"""

0 commit comments

Comments
 (0)
Please sign in to comment.