Ticket #2150: patch5.txt

File patch5.txt, 6.3 KB (added by ewong, 7 years ago)

Patch to fix ticket.

Line 
1diff --git a/master/buildbot/steps/shell.py b/master/buildbot/steps/shell.py
2index 6d56741..010ae0e 100644
3--- a/master/buildbot/steps/shell.py
4+++ b/master/buildbot/steps/shell.py
5@@ -157,6 +157,15 @@ class ShellCommand(buildstep.LoggingBuildStep):
6                      'tests' ...)
7         """
8 
9+        def recurseNests(self, mainlist, commands):
10+           for x in commands:
11+              if isinstance(x, (str, unicode)):
12+                  mainlist.append(x)
13+              elif x == []:
14+                  ""
15+              else:
16+                  recurseNests(self, mainlist, x)
17+
18         try:
19             if done and self.descriptionDone is not None:
20                 return self.descriptionDone
21@@ -171,13 +180,22 @@ class ShellCommand(buildstep.LoggingBuildStep):
22             words = self.command
23             if isinstance(words, (str, unicode)):
24                 words = words.split()
25-            if len(words) < 1:
26+
27+            tmp = []
28+            for x in words:
29+                if isinstance(x, (str, unicode)):
30+                   tmp.append(x)
31+                else:
32+                   recurseNests(self, tmp, x)
33+
34+            if len(tmp) < 1:
35                 return ["???"]
36-            if len(words) == 1:
37-                return ["'%s'" % words[0]]
38-            if len(words) == 2:
39-                return ["'%s" % words[0], "%s'" % words[1]]
40-            return ["'%s" % words[0], "%s" % words[1], "...'"]
41+            if len(tmp) == 1:
42+                return ["'%s'" % tmp[0]]
43+            if len(tmp) == 2:
44+                return ["'%s" % tmp[0], "%s'" % tmp[1]]
45+            return ["'%s" % tmp[0], "%s" % tmp[1], "...'"]
46+
47         except:
48             log.err(failure.Failure(), "Error describing step")
49             return ["???"]
50@@ -200,9 +218,24 @@ class ShellCommand(buildstep.LoggingBuildStep):
51             # dictionary, so we shouldn't be affecting anyone but ourselves.
52 
53     def buildCommandKwargs(self, warnings):
54+        def recurseNests(self, mainlist, commands):
55+           for x in commands:
56+              if isinstance(x, (str, unicode)):
57+                  mainlist.append(x)
58+              elif x == []:
59+                  ""
60+              else:
61+                  recurseNests(self, mainlist, x)
62+
63         kwargs = buildstep.LoggingBuildStep.buildCommandKwargs(self)
64         kwargs.update(self.remote_kwargs)
65-        kwargs['command'] = self.command
66+        tmp = []
67+        if isinstance(self.command, list):
68+           recurseNests(self, tmp, self.command)
69+        else:
70+           tmp = self.command
71+
72+        kwargs['command'] = tmp
73 
74         # check for the usePTY flag
75         if kwargs.has_key('usePTY') and kwargs['usePTY'] != 'slave-config':
76diff --git a/master/buildbot/test/unit/test_steps_shell.py b/master/buildbot/test/unit/test_steps_shell.py
77index 84d263d..b357134 100644
78--- a/master/buildbot/test/unit/test_steps_shell.py
79+++ b/master/buildbot/test/unit/test_steps_shell.py
80@@ -102,6 +102,26 @@ class TestShellCommandExecution(steps.BuildStepMixin, unittest.TestCase):
81         self.assertEqual((step.describe(), step.describe(done=True)),
82                          (["'this", "is", "...'"],)*2)
83 
84+    def test_describe_from_nested_command_list(self):
85+        step = shell.ShellCommand(command=["this", ["is", "a"], "nested"])
86+        self.assertEqual((step.describe(), step.describe(done=True)),
87+                         (["'this", "is", "...'"],)*2)
88+
89+    def test_describe_from_nested_command_tuples(self):
90+        step = shell.ShellCommand(command=["this", ("is", "a"), "nested"])
91+        self.assertEqual((step.describe(), step.describe(done=True)),
92+                         (["'this", "is", "...'"],)*2)
93+
94+    def test_describe_from_nested_command_list_empty(self):
95+        step = shell.ShellCommand(command=["this", [], ["is", "a"], "nested"])
96+        self.assertEqual((step.describe(), step.describe(done=True)),
97+                         (["'this", "is", "...'"],)*2)
98+
99+    def test_describe_from_nested_command_list_deep(self):
100+        step = shell.ShellCommand(command=[["this", [[["is", ["a"]]]]]])
101+        self.assertEqual((step.describe(), step.describe(done=True)),
102+                         (["'this", "is", "...'"],)*2)
103+
104     def test_describe_custom(self):
105         step = shell.ShellCommand(command="echo hello",
106                         description=["echoing"], descriptionDone=["echoed"])
107@@ -127,6 +147,48 @@ class TestShellCommandExecution(steps.BuildStepMixin, unittest.TestCase):
108         self.expectOutcome(result=SUCCESS, status_text=["'echo", "hello'"])
109         return self.runStep()
110 
111+    def test_run_nested_command(self):
112+        self.setupStep(
113+                shell.ShellCommand(workdir='build',
114+                         command=['trial', ['-b', '-B'], 'buildbot.test']))
115+        self.expectCommands(
116+            ExpectShell(workdir='build',
117+                         command=['trial', '-b', '-B', 'buildbot.test'],
118+                         usePTY="slave-config")
119+            + 0
120+        )
121+        self.expectOutcome(result=SUCCESS,
122+           status_text=["'trial", "-b", "...'"])
123+        return self.runStep()
124+
125+    def test_run_nested_deeply_command(self):
126+        self.setupStep(
127+                shell.ShellCommand(workdir='build',
128+                         command=[['trial', ['-b', ['-B']]], 'buildbot.test']))
129+        self.expectCommands(
130+            ExpectShell(workdir='build',
131+                         command=['trial', '-b', '-B', 'buildbot.test'],
132+                         usePTY="slave-config")
133+            + 0
134+        )
135+        self.expectOutcome(result=SUCCESS,
136+           status_text=["'trial", "-b", "...'"])
137+        return self.runStep()
138+
139+    def test_run_nested_empty_command(self):
140+        self.setupStep(
141+                shell.ShellCommand(workdir='build',
142+                         command=['trial', [], '-b', [], 'buildbot.test']))
143+        self.expectCommands(
144+            ExpectShell(workdir='build',
145+                         command=['trial', '-b', 'buildbot.test'],
146+                         usePTY="slave-config")
147+            + 0
148+        )
149+        self.expectOutcome(result=SUCCESS,
150+           status_text=["'trial", "-b", "...'"])
151+        return self.runStep()
152+
153     def test_run_env(self):
154         self.setupStep(
155                 shell.ShellCommand(workdir='build', command="echo hello"),