This is effectively fixed by T13098, which modularizes test output.
- Queries
- All Stories
- Search
- Advanced Search
- Transactions
- Transaction Logs
Advanced Search
Sep 27 2018
Aug 27 2018
This doesn't have a repro and will probably be fixed via rewrite / modernization in T13077 anyway.
Aug 9 2018
Aug 8 2018
Aug 6 2018
See PHI801. This is a similar case to the one above, but I think the underlying use case was a bit more compelling: the install was transitioning from a set of older web nodes to newer web nodes as a part of a general infrastructure upgrade, and making various fixes to the deployment and support software as part of that process. One aspect of these adjacent fixes was changing the path from /something/something/phabricator to /something-else/something-else/phabricator (I think as a consequence of adjusting deploy strategy), so newer nodes would have a different absolute path than older nodes. Both sets of nodes were in production simultaneously.
Aug 1 2018
The workaround does not work for me on Debian 9.5 with OpenSSH 7.4p1. Actually I am surprised this worked for anyone, since the issue appears to be that the buffer of the pipe between ssh-auth's stdout and the parent's stdin is being filled, hence ssh-auth blocking at some point. It should not matter how fast these buffers are being filled...
Jul 30 2018
We have a more reliable break for this now, in the form:
Jul 26 2018
I can't get anything to break at all now. 💁
I made a change like this to split responses into small blocks and give each a random chance of failing (I tried 4096 and 4027, a prime near 4KB, as miniblock sizes):
A recent, probably more concrete issue that I've seen is that wget of a large file can succeed (wget automatically resumes) but we can end up with a file that has different content than the original, which is disastrously bad.
Jul 16 2018
Jun 7 2018
Confirmed on PHPUnit 7.2.2 👍
May 24 2018
This problem fixed by T13140. Thank you.
Apr 4 2018
Since there's no known actual problem with this today, I don't plan to fix it.
I don't currently plan to change the remaining edge case behaviors since I'm not sure they ever occur in the wild.
Apr 3 2018
Duplicate of T8936?
Mar 30 2018
I confirm the Maxime Corteel patch to be working with PHPUnit 7.0.1 too.
Mar 29 2018
I think this is sort of less bad/weird now, at least. You get a tokenizer instead, which is still empty, but you're prompted to "Type a repository name..." and the UI isn't this odd empty select thing anymore.
Mar 21 2018
Mar 16 2018
is there a chance that this problem will get fixed?
The change D17989 is already from May 2017 without any reviewer...
Mar 14 2018
Mar 7 2018
I believe the behavior of this UI should generally align well with what reasonable users might expect, now. In particular, /src/backend and /src/backend/ are now exactly the same in terms of actually resolving ownership, although the UI will continue to show you the value you entered (to avoid confusion where someone types /docs/README.md and the UI echoes back /docs/README.md/ and they have a reasonable concern that the path wasn't understood).
Probably better is to add pathIndex
Mar 5 2018
Feb 26 2018
See T13092; tangentially, it might be nice to render these stories more explicitly as "X added Y, removed Z (because Z is a subproject of Y, and objects may not be tagged with multiple mutual ancestors/descendant projects)", if some sufficiently terse phrasing can be found.
Feb 21 2018
Feb 16 2018
D19111 doesn't fix this in the general case, but should produce the desired behavior for most inputs such that the input is in the form [x](y) and y is the URI of a Wikipedia article.
The intent isn't unambiguous in the general case, consider: Blah blah (see also [x](y)).
Ah thanks!
The non-bold ones also open in a new tab.
Oh! Yes. Sort of.
Just curious, but is the bold effect intentional in the "No Encoding Relative" scenario?
Feb 14 2018
Feb 13 2018
After changes T13073, I am no longer able to reproduce this. That task has made some improvements and may have fixed whatever happened here.
Feb 11 2018
It isn't currently retroactive: the fix is in transition logic and the transition just didn't trigger before.
Is this retroactive to builds in this half state prior to this commit and
deploy?
Feb 10 2018
Feb 8 2018
D19032 now renders D123 in text contexts (plaintext email) as D123 <https://dev.tyrellcorp.com/D123> instead of https://dev.tyrellcorp.com/D123.
D19030 marks this as fixed: it removes this documentation.
Feb 7 2018
I've been running into the same issue for a while now. Using the Default Policy set to Subscribers for Files works well when adding files to Phriction pages and Maniphest tickets. However, when adding binary files as part of a Diff the creator of that Diff needs to change each files permissions by hand before a reviewer can download the Diff. Moreover, this needs to be repeated for every new version of that Diff.
Feb 4 2018
Feb 2 2018
We have also found legitimate users who have valid email addresses (Irish users) that are not accepted.
For those visiting from the future via search, I have decided to publish an unofficial bug patch in a github repo, as it breaks once in awhile due to upstream changes.
Thanks @mcorteel, I'll take a look.
Feb 1 2018
This report doesn't include working reproduction instructions so we can't move forward.
@cmmata here is my diff. It can probably be improved, but it works for me:
1 | diff --git a/src/unit/engine/PhpunitTestEngine.php b/src/unit/engine/PhpunitTestEngine.php |
---|---|
2 | index 8206b787..ef01fda4 100644 |
3 | --- a/src/unit/engine/PhpunitTestEngine.php |
4 | +++ b/src/unit/engine/PhpunitTestEngine.php |
5 | @@ -52,7 +52,7 @@ final class PhpunitTestEngine extends ArcanistUnitTestEngine { |
6 | if (!Filesystem::pathExists($test_path)) { |
7 | continue; |
8 | } |
9 | - $json_tmp = new TempFile(); |
10 | + $xml_tmp = new TempFile(); |
11 | $clover_tmp = null; |
12 | $clover = null; |
13 | if ($this->getEnableCoverage() !== false) { |
14 | @@ -64,10 +64,10 @@ final class PhpunitTestEngine extends ArcanistUnitTestEngine { |
15 | |
16 | $stderr = '-d display_errors=stderr'; |
17 | |
18 | - $futures[$test_path] = new ExecFuture('%C %C %C --log-json %s %C %s', |
19 | - $this->phpunitBinary, $config, $stderr, $json_tmp, $clover, $test_path); |
20 | + $futures[$test_path] = new ExecFuture('%C %C %C --log-junit %s %C %s', |
21 | + $this->phpunitBinary, $config, $stderr, $xml_tmp, $clover, $test_path); |
22 | $tmpfiles[$test_path] = array( |
23 | - 'json' => $json_tmp, |
24 | + 'xml' => $xml_tmp, |
25 | 'clover' => $clover_tmp, |
26 | ); |
27 | } |
28 | @@ -81,7 +81,7 @@ final class PhpunitTestEngine extends ArcanistUnitTestEngine { |
29 | |
30 | $results[] = $this->parseTestResults( |
31 | $test, |
32 | - $tmpfiles[$test]['json'], |
33 | + $tmpfiles[$test]['xml'], |
34 | $tmpfiles[$test]['clover'], |
35 | $stderr); |
36 | } |
37 | @@ -90,17 +90,17 @@ final class PhpunitTestEngine extends ArcanistUnitTestEngine { |
38 | } |
39 | |
40 | /** |
41 | - * Parse test results from phpunit json report. |
42 | + * Parse test results from phpunit XML report. |
43 | * |
44 | * @param string $path Path to test |
45 | - * @param string $json_tmp Path to phpunit json report |
46 | + * @param string $xml_tmp Path to phpunit XML report |
47 | * @param string $clover_tmp Path to phpunit clover report |
48 | * @param string $stderr Data written to stderr |
49 | * |
50 | * @return array |
51 | */ |
52 | - private function parseTestResults($path, $json_tmp, $clover_tmp, $stderr) { |
53 | - $test_results = Filesystem::readFile($json_tmp); |
54 | + private function parseTestResults($path, $xml_tmp, $clover_tmp, $stderr) { |
55 | + $test_results = Filesystem::readFile($xml_tmp); |
56 | return id(new ArcanistPhpunitTestResultParser()) |
57 | ->setEnableCoverage($this->getEnableCoverage()) |
58 | ->setProjectRoot($this->projectRoot) |
59 | diff --git a/src/unit/parser/ArcanistPhpunitTestResultParser.php b/src/unit/parser/ArcanistPhpunitTestResultParser.php |
60 | index 5ccff970..3d7fcd77 100644 |
61 | --- a/src/unit/parser/ArcanistPhpunitTestResultParser.php |
62 | +++ b/src/unit/parser/ArcanistPhpunitTestResultParser.php |
63 | @@ -9,10 +9,10 @@ |
64 | final class ArcanistPhpunitTestResultParser extends ArcanistTestResultParser { |
65 | |
66 | /** |
67 | - * Parse test results from phpunit json report |
68 | + * Parse test results from phpunit XML report |
69 | * |
70 | * @param string $path Path to test |
71 | - * @param string $test_results String containing phpunit json report |
72 | + * @param string $test_results String containing phpunit XML report |
73 | * |
74 | * @return array |
75 | */ |
76 | @@ -25,7 +25,7 @@ final class ArcanistPhpunitTestResultParser extends ArcanistTestResultParser { |
77 | return array($result); |
78 | } |
79 | |
80 | - $report = $this->getJsonReport($test_results); |
81 | + $report = simplexml_load_string($test_results); |
82 | |
83 | // coverage is for all testcases in the executed $path |
84 | $coverage = array(); |
85 | @@ -36,56 +36,36 @@ final class ArcanistPhpunitTestResultParser extends ArcanistTestResultParser { |
86 | $last_test_finished = true; |
87 | |
88 | $results = array(); |
89 | - foreach ($report as $event) { |
90 | - switch (idx($event, 'event')) { |
91 | - case 'test': |
92 | - break; |
93 | - case 'testStart': |
94 | - $last_test_finished = false; |
95 | - // fall through |
96 | - default: |
97 | - continue 2; // switch + loop |
98 | - } |
99 | - |
100 | + foreach ($report->testsuite as $test_suite) { |
101 | $status = ArcanistUnitTestResult::RESULT_PASS; |
102 | $user_data = ''; |
103 | |
104 | - if ('fail' == idx($event, 'status')) { |
105 | + if ((int)$test_suite['failures'] > 0) { |
106 | $status = ArcanistUnitTestResult::RESULT_FAIL; |
107 | - $user_data .= idx($event, 'message')."\n"; |
108 | - foreach (idx($event, 'trace') as $trace) { |
109 | - $user_data .= sprintf( |
110 | - "\n%s:%s", |
111 | - idx($trace, 'file'), |
112 | - idx($trace, 'line')); |
113 | + foreach ($test_suite->testcase as $test_case) { |
114 | + foreach ($test_case->failure as $failure) { |
115 | + $user_data .= sprintf( |
116 | + "\n%s", |
117 | + (string)$failure); |
118 | + } |
119 | } |
120 | - } else if ('error' == idx($event, 'status')) { |
121 | - if (strpos(idx($event, 'message'), 'Skipped Test') !== false) { |
122 | - $status = ArcanistUnitTestResult::RESULT_SKIP; |
123 | - $user_data .= idx($event, 'message'); |
124 | - } else if (strpos( |
125 | - idx($event, 'message'), |
126 | - 'Incomplete Test') !== false) { |
127 | - $status = ArcanistUnitTestResult::RESULT_SKIP; |
128 | - $user_data .= idx($event, 'message'); |
129 | - } else { |
130 | - $status = ArcanistUnitTestResult::RESULT_BROKEN; |
131 | - $user_data .= idx($event, 'message'); |
132 | - foreach (idx($event, 'trace') as $trace) { |
133 | - $user_data .= sprintf( |
134 | - "\n%s:%s", |
135 | - idx($trace, 'file'), |
136 | - idx($trace, 'line')); |
137 | + } else if ($test_suite['errors'] > 0) { |
138 | + $status = ArcanistUnitTestResult::RESULT_BROKEN; |
139 | + foreach ($test_suite->testcase as $test_case) { |
140 | + foreach ($test_case->error as $error) { |
141 | + $user_data .= sprintf( |
142 | + "\n%s", |
143 | + (string)$error); |
144 | } |
145 | } |
146 | } |
147 | |
148 | - $name = preg_replace('/ \(.*\)/s', '', idx($event, 'test')); |
149 | + $name = preg_replace('/ \(.*\)/s', '', $test_suite['name']); |
150 | |
151 | $result = new ArcanistUnitTestResult(); |
152 | $result->setName($name); |
153 | $result->setResult($status); |
154 | - $result->setDuration(idx($event, 'time')); |
155 | + $result->setDuration((float)$test_suite['time']); |
156 | $result->setCoverage($coverage); |
157 | $result->setUserData($user_data); |
158 | |
159 | @@ -95,7 +75,7 @@ final class ArcanistPhpunitTestResultParser extends ArcanistTestResultParser { |
160 | |
161 | if (!$last_test_finished) { |
162 | $results[] = id(new ArcanistUnitTestResult()) |
163 | - ->setName(idx($event, 'test')) // use last event |
164 | + ->setName($test_suite['name']) // use last event |
165 | ->setUserData($this->stderr) |
166 | ->setResult(ArcanistUnitTestResult::RESULT_BROKEN); |
167 | } |
168 | @@ -161,28 +141,4 @@ final class ArcanistPhpunitTestResultParser extends ArcanistTestResultParser { |
169 | return $reports; |
170 | } |
171 | |
172 | - /** |
173 | - * We need this non-sense to make json generated by phpunit |
174 | - * valid. |
175 | - * |
176 | - * @param string $json String containing JSON report |
177 | - * @return array JSON decoded array |
178 | - */ |
179 | - private function getJsonReport($json) { |
180 | - |
181 | - if (empty($json)) { |
182 | - throw new Exception( |
183 | - pht( |
184 | - 'JSON report file is empty, it probably means that phpunit '. |
185 | - 'failed to run tests. Try running %s with %s option and then run '. |
186 | - 'generated phpunit command yourself, you might get the answer.', |
187 | - 'arc unit', |
188 | - '--trace')); |
189 | - } |
190 | - |
191 | - $json = preg_replace('/}{\s*"/', '},{"', $json); |
192 | - $json = '['.$json.']'; |
193 | - return phutil_json_decode($json); |
194 | - } |
195 | - |
196 | } |
@mcorteel I have the same problem, arc unit only works with phpunit 5.7. If I use 6.5, it fails. Do you have that patch anywhere with public access so we can use it while it's not published?
Jan 27 2018
Jan 26 2018
This is quite old and I have no idea how to reproduce it and thus no idea how to fix it. Locally, I tried a few things and wasn't able to identify a case where the Herald field value differed from my actual project list.
Jan 24 2018
Jan 21 2018
From https://bugzilla.mindrot.org/show_bug.cgi?id=2496, this is apparently fixed in the OpenSSH upstream (https://github.com/openssh/openssh-portable/commit/ddd3d34e5c7979ca6f4a3a98a7d219a4ed3d98c2). Since this is a bug in OpenSSH, an upstream fix is available, and the impact is fairly narrow, I don't plan to work around it in Phabricator.