<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body text="#000000" bgcolor="#FFFFFF">
Hi,<br>
<br>
Yup, sounds reasonable!<br>
<br>
Traditionally these tests were using FileCheck. The point of
replacing FileCheck with diff was that FileCheck failure reports for
incorrectly produced plist files on tests were very hard to
understand, especially when it was happening on a remote buildbot.
This was happening because plists are XML files and most bugs in
them usually look like large (10-20) lines suddenly appearing or
disappearing, with the most important information being in the
innermost XML tag in the middle of the chunk. Because FileCheck
reports only the first line that doesn't match, it made it very
annoying to debug. Diffs, on the other hand, are outright perfect
for the task.<br>
<br>
An external normalization script doesn't anyhow contradict this
purpose, and if i understand correctly it was in fact one of the
possible solutions that was considered back in
<a class="moz-txt-link-freetext" href="https://reviews.llvm.org/D50545#1195519">https://reviews.llvm.org/D50545#1195519</a><br>
<br>
<div class="moz-cite-prefix">On 4/2/19 1:07 PM, Hubert Tong via
cfe-dev wrote:<br>
</div>
<blockquote type="cite"
cite="mid:CACvkUqYtmrHeyu1ELbLmF-Eo3B8WREJ+ZpkSh6LXuA-+3tHiZw@mail.gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<div dir="ltr">
<div dir="ltr">Various tests in `clang/test/Analysis/` invoke
`diff` with a non-portable `-I` option. I do not believe that
a requirement for a `diff` utility that supports such an
extension is intended by the community. I believe that
replacing `diff -I` with `diff` on files that have been
normalized using `grep -v` is a reasonable solution. A minor
detail is that the output being checked is produced without a
newline at the end of the file. As part of the proposed
solution, the file is rehabilitated as a text file (as
required by `grep`) by adding such a newline. The same is done
for the reference expected files that are missing a newline at
the end of the file. The solution is sketched out below for
feedback.<br>
</div>
<div dir="ltr"><br>
</div>
<div dir="ltr">The normalization is in many cases encoded in a
lit substitution `%diff_plist`. A sample application of the
proposed change would look like the following. See further
below for additional rationale on the particulars.<br>
<br>
Replace the RUN line:<br>
<font size="2"><span style="font-family:monospace,monospace">-//
RUN: cat %t.plist | %diff_plist %S/Inputs/expected-plists/</span></font><font
size="2"><span style="font-family:monospace,monospace">unix-fns.c.plist
-<br>
+// RUN: %normalize_plist <%S/Inputs/expected-plists/</span></font><font
size="2"><span style="font-family:monospace,monospace">unix-fns.c.plist
>%t.expected.sed.plist && echo >>%t.plist
&& %normalize_plist <%t.plist | diff -u
%t.expected.sed.plist -</span></font><br>
<br>
Replace the lit substitution:<br>
<span style="font-family:monospace,monospace">-# Diff command
used by Clang Analyzer tests (when comparing .plist files<br>
+# Filtering command used by Clang Analyzer tests (when
comparing .plist files<br>
# with reference output)<br>
-config.substitutions.append((</span><span
style="font-family:monospace,monospace">'%diff_plist',<br>
- 'diff -u -w -I "<string>/" -I "<string>.:"
-I "version"'))<br>
+config.substitutions.append((</span><span
style="font-family:monospace,monospace">'%normalize_plist',<br>
+ "grep -Ev '%s|%s|%s'" %<br>
+ ('^[[:space:]]*<string>.* version
.*</string>$',<br>
+ '^[[:space:]]*<string>/.*</</span><span
style="font-family:monospace,monospace">string>$',<br>
+ '^[[:space:]]*<string>.:.*</</span><span
style="font-family:monospace,monospace">string>$')))</span><br>
<br>
Why not use more `RUN` lines?<br>
The output being checked is line-number sensitive. Keeping the
same number of `RUN` lines minimizes unnecessary noise and
risk of errors.<br>
<br>
Why not use `sed`?<br>
`sed` can be used to normalize the lines that are expected to
vary; however, the some of the expected-output files have
these lines omitted.<br>
The `grep` replacement is more compatible with the behaviour
of `diff -I`. The filtered files are nevertheless named with
"sed" for the connotation that substitution took place.<br>
<br>
Why remove `-w` from `diff`?<br>
It appears that the `-w` option was being used for its effect
(in some implementations) of ignoring the difference between a
file that ends with a newline and one which does not.
Following normalization of both files to end in a newline,
this is no longer necessary. Since the effect is non-portable,
keeping the option (and thus allowing the non-portable effect
to occur, and perhaps become relied upon during development)
is potentially harmful.<br>
<br>
Why not add the newline via `cat`?<br>
The newline can be added (in this context) using `echo | cat
file -` as opposed to using `echo >>file`; however, the
`lit` implementation of `cat` does not operate as expected on
the standard input.<br>
</div>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<pre class="moz-quote-pre" wrap="">_______________________________________________
cfe-dev mailing list
<a class="moz-txt-link-abbreviated" href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>
<a class="moz-txt-link-freetext" href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a>
</pre>
</blockquote>
<br>
</body>
</html>