Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix exclude filters on Windows #158

Merged
merged 1 commit into from Jan 9, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
20 changes: 15 additions & 5 deletions scripts/gcovr
Expand Up @@ -2287,23 +2287,33 @@ else:
#
# Setup filters
#
def build_filter(regex):
if os.name == 'nt':
# Windows path separators must be escaped before being parsed into a
# regex, but we do not want to escape the regex itself, so instead of
# using realpath, we escape the path and join it manually (realpath
# doesn't resolve symlinks on Windows anyway)
return re.compile(re.escape(os.getcwd() + "\\") + regex)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like a reasonable solution to fix the Windows filter problem, but do we really need a separate code path just for Windows? Wouldn't something like this also work?:

return re.compile(re.escape(os.getcwd() + os.path.sep) + regex)

Or do you see any drawbacks with that approach, e.g. around symlinks?

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

At line 505 in gcovr, "Return if the filename does not match the filter" it will always return in Windows. For me this is a serious issue... by removing 10 lines of code the gcovr tool is really working great for me!!!! wasted 2 days on this grgrrgr...

Around line 518 in gcovr, find following part of code:

    #
    # Return if the filename does not match the filter
    #
    filtered_fname = None
    for i in range(0, len(options.filter)):
        if options.filter[i].match(fname):
            filtered_fname = options.root_filter.sub('', fname)
            break
    if filtered_fname is None:
        if options.verbose:
            sys.stdout.write("  Filtering coverage data for file %s\n" % fname)
        return

and change this code in:

    #
    # Return if the filename does not match the filter
    #
    #filtered_fname = None
    #for i in range(0, len(options.filter)):
    #    if options.filter[i].match(fname):
    #        filtered_fname = options.root_filter.sub('', fname)
    #        break
    #if filtered_fname is None:
    #    if options.verbose:
    #        sys.stdout.write("  Filtering coverage data for file %s\n" % fname)
    #    return

Remember not to use tabs, only spaces are allowed!
This will cure the windows problem. If there are too many files, just exclude them the right way.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@barthoukes Thank you for investigating this, and I'm sorry that you found gcovr difficult to use. But please note that this discussion should be limited to the changes in this pull request.

You seem to have found a related but different issue. Please consider opening a new issue for your problem (see our contributing guide). If this is a solution to your Stack Overflow question, consider answering there.

else:
return re.compile(os.path.realpath(regex))

for i in range(0, len(options.exclude)):
options.exclude[i] = re.compile(os.path.realpath(options.exclude[i]))
options.exclude[i] = build_filter(options.exclude[i])

if options.exclude_dirs is not None:
for i in range(0, len(options.exclude_dirs)):
options.exclude_dirs[i] = re.compile(os.path.realpath(options.exclude_dirs[i]))
options.exclude_dirs[i] = build_filter(options.exclude_dirs[i])

options.root_filter = re.compile(re.escape(root_dir + os.sep))
for i in range(0, len(options.filter)):
options.filter[i] = re.compile(os.path.realpath(options.filter[i]))
options.filter[i] = build_filter(options.filter[i])
if len(options.filter) == 0:
options.filter.append(options.root_filter)

for i in range(0, len(options.gcov_exclude)):
options.gcov_exclude[i] = re.compile(os.path.realpath(options.gcov_exclude[i]))
options.gcov_exclude[i] = build_filter(options.gcov_exclude[i])
if options.gcov_filter is not None:
options.gcov_filter = re.compile(os.path.realpath(options.gcov_filter))
options.gcov_filter = build_filter(options.gcov_filter)
else:
options.gcov_filter = re.compile('')
#
Expand Down