office-gobmx/solenv/clang-format/ClangFormat.pm
Thorsten Behrens 493ae7a6bb replace usage of blacklist with denylist
.. and a few cases of instead doing blacklist->excludelist where that
made more sense.

Background and motivation:
  https://tools.ietf.org/html/draft-knodel-terminology-02

[API CHANGE] officecfg::Office::Canvas::DeviceBlacklist -> DeviceDenylist
[API CHANGE] officecfg::Office::Canvas::BlacklistCurrentDevice -> DenylistCurrentDevice
[API CHANGE] officecfg::Office::Common::Misc::OpenCLBlackList -> OpenCLDenyList

Change-Id: Ia35e25496bf0cc0692d5de4cb66bfc232d3a869e
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98180
Tested-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
Reviewed-by: Thorsten Behrens <Thorsten.Behrens@CIB.de>
2020-07-10 01:34:54 +02:00

128 lines
3.2 KiB
Perl

# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
package ClangFormat;
use strict;
use warnings;
our @EXPORT_OK = qw(get_excludelist set_excludelist get_wanted_version get_own_directory get_extension_regex find check_style);
# Reads the excludelist.
sub get_excludelist()
{
my $src = "c|cpp|cxx|h|hxx|inl";
my %excludelist_names = ();
# Read the excludelist.
if (open(LINES, "solenv/clang-format/excludelist"))
{
while (my $line = <LINES>)
{
chomp $line;
$excludelist_names{$line} = 1;
}
}
return \%excludelist_names;
}
# Writes the excludelist.
# The single argument is a reference to an array.
sub set_excludelist
{
my @filenames = @{$_[0]};
open my $fh, ">", "solenv/clang-format/excludelist" or die $!;
print $fh "$_\n" for @filenames;
close $fh;
}
# Returns the clang-format version used of style enforcement.
sub get_wanted_version()
{
return "5.0.0";
}
# Returns the directory that can host a binary which is used automatically, even
# if it's not in PATH.
sub get_own_directory()
{
return "/opt/lo/bin";
}
# Returns a regex matching filenames we clang-format.
sub get_extension_regex()
{
return "c|cpp|cxx|h|hxx|inl";
}
# Use clang-format from CLANG_FORMAT, from our dedicated directory or from
# PATH, in this order.
sub find()
{
my $version = get_wanted_version();
my $opt_lo = get_own_directory();
my $clang_format;
if (!(defined($ENV{CLANG_FORMAT}) && is_matching_clang_format_version($ENV{CLANG_FORMAT}, $version)))
{
my @dirs = split /:/, $ENV{PATH};
unshift(@dirs, $opt_lo);
foreach my $dir (@dirs)
{
if (is_matching_clang_format_version("$dir/clang-format", $version))
{
$clang_format = "$dir/clang-format";
last;
}
}
}
else
{
$clang_format = $ENV{CLANG_FORMAT};
}
if ($^O eq "cygwin" && defined($clang_format))
{
$clang_format = `cygpath -m '$clang_format'`;
chomp $clang_format;
}
return $clang_format;
}
# Diffs the original and the formatted version of a single file from the index.
sub check_style($$)
{
# Make sure that not staged changes are not considered when diffing.
my ($clang_format, $filename) = @_;
my $index = $filename . ".index";
system("git show :$filename > $index");
my $format = $index . ".format";
system("'$clang_format' -assume-filename=$filename $index > $format");
my $ret = system("git --no-pager diff --no-index --exit-code $index $format") == 0;
unlink($index);
unlink($format);
return $ret;
}
# Private functions.
# Is this binary the version we standardize on?
sub is_matching_clang_format_version($$)
{
my ($clang_format, $version) = @_;
if (! -x $clang_format)
{
return 0;
}
return `'$clang_format' -version` =~ /^clang-format version $version(-\d+)? \(tags/;
}
1;
# vim: set shiftwidth=4 softtabstop=4 expandtab: