
On 04/16/2013 07:41 AM, Osier Yang wrote:
Detected by a simple Shell script:
for i in $(find -type f -name "*.[ch]" | grep -v gnulib); do
You can limit things to version-controlled files a bit faster with: for i in $(git ls-files -- '*.[ch]'); do
awk 'BEGIN { FS=" " fail=0 } /^# *include.*\.h[">]$/{
This pattern misses files that include a header with a comment saying why, such as this one: src/util/virxml.c:#include <math.h> /* for isnan() */
arr[$NF]++
This doesn't catch duplication between "" and <> in the same file, since it includes the delimiter as part of the key name. Slightly more powerful is: /# *include/{ match($0, /["<][^">]*[">]/) arr[substr($0, RSTART+1, RLENGTH-2)]++ } which uses the array name of just the filename regardless of delimiters.
} END { for (key in arr) { if (arr[key] > 1) { fail=1 printf("%d %s\n", arr[key], key) } } if (fail == 1) exit 1 }' $i
if test $? != 0; then echo "Duplicate header(s) in $i" fi done;
A later patch will add the syntax-check to avoid duplicate headers. ---
What you have works, but with my improvements to the script, I still see this after your patch: 2 testutils.h Duplicate header(s) in ./tests/qemumonitortest.c 2 testutils.h Duplicate header(s) in ./tests/qemuxmlnstest.c 2 testutils.h Duplicate header(s) in ./tests/qemuxml2argvtest.c 2 testutils.h Duplicate header(s) in ./tests/qemuargv2xmltest.c 2 testutils.h Duplicate header(s) in ./tests/shunloadtest.c 2 testutils.h Duplicate header(s) in ./tests/vmx2xmltest.c 2 testutils.h Duplicate header(s) in ./tests/domainsnapshotxml2xmltest.c 2 testutils.h Duplicate header(s) in ./tests/qemuhelptest.c 2 testutils.h Duplicate header(s) in ./tests/lxcxml2xmltest.c 2 testutils.h Duplicate header(s) in ./tests/xml2vmxtest.c 2 testutils.h Duplicate header(s) in ./tests/qemuxml2xmltest.c 2 testutils.h Duplicate header(s) in ./tests/esxutilstest.c 2 testutils.h Duplicate header(s) in ./tests/openvzutilstest.c 2 libxl.h Duplicate header(s) in ./src/libxl/libxl_driver.c testutils.h is cleaned up in patch 2; but the duplicate libxl.h in libxl_driver.c is still buggy. ACK with libxl_driver.c also fixed (you can touch up the commit message if you like, but that's not required; as long as we later get the syntax check right). -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org