summaryrefslogtreecommitdiffstats
path: root/solenv/clang-format/check-last-commit
diff options
context:
space:
mode:
Diffstat (limited to 'solenv/clang-format/check-last-commit')
-rwxr-xr-xsolenv/clang-format/check-last-commit98
1 files changed, 98 insertions, 0 deletions
diff --git a/solenv/clang-format/check-last-commit b/solenv/clang-format/check-last-commit
new file mode 100755
index 0000000000..0de5ac4b07
--- /dev/null
+++ b/solenv/clang-format/check-last-commit
@@ -0,0 +1,98 @@
+#!/usr/bin/env 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/.
+
+# Checks the style of the files changed in the last commit, for CI purposes.
+
+use strict;
+use warnings;
+use lib "solenv/clang-format";
+use ClangFormat;
+
+my $commit = 0;
+my $commit_id = 'HEAD';
+
+sub check_style()
+{
+ if ( ! -e ".git" )
+ {
+ # Can't diff when this is not a git checkout.
+ return;
+ }
+
+ my $src = ClangFormat::get_extension_regex();
+ my @good_names = ();
+ my @bad_names = ();
+ my $excluded_list_names = ClangFormat::get_excludelist();
+ my $clang_format = ClangFormat::find();
+ my $parent = $commit + 1;
+
+ # Get a list of non-deleted changed files.
+ # Explicitly use the low-level 'git diff-tree' (rather than plain 'git
+ # diff') so we get the new, but not the old files for renames and/or
+ # copies.
+ open (FILES, "git diff-tree -r --diff-filter=AM --name-only ${commit_id}~${parent} ${commit_id}~${commit} |") || die "Cannot run git diff.";
+ while (my $filename = <FILES>)
+ {
+ chomp $filename;
+ if ($filename =~ /\.($src)$/ and !exists($excluded_list_names->{$filename}))
+ {
+ if (! -x $clang_format)
+ {
+ my $version = ClangFormat::get_wanted_version();
+
+ print("solenv/clang-format/check-last-commit: ");
+ print("ERROR: no clang-format ${version} was found.\n\n");
+
+ exit(1);
+ }
+ if (ClangFormat::check_style($clang_format, $filename))
+ {
+ push @good_names, $filename;
+ }
+ else
+ {
+ push @bad_names, $filename;
+ }
+ }
+ }
+
+ # Enforce style.
+ if (scalar @bad_names)
+ {
+ print("\nERROR: The above differences were found between the code to commit \n");
+ print("and the clang-format rules. Tips:\n");
+ print("\n- You may run '/opt/lo/bin/clang-format -i <problematic file>' to fix up style automatically.\n");
+ print("- See solenv/clang-format/README on where to get the required version of clang-format binaries.\n");
+ print("- If you renamed an excluded file, update solenv/clang-format/excludelist accordingly to keep it excluded.\n");
+ print("\nsolenv/clang-format/check-last-commit: KO\n");
+ exit(1);
+ }
+ else
+ {
+ print("solenv/clang-format/check-last-commit: checked the following files:\n");
+ print(join("\n", @good_names));
+ print("\nsolenv/clang-format/check-last-commit: OK\n");
+ }
+}
+
+if (scalar(@ARGV) == 1)
+{
+ if (($ARGV[0] !~ /^[0-9]+$/) || (scalar($ARGV[0]) >= 8))
+ {
+ $commit_id = $ARGV[0];
+ }
+ else
+ {
+ $commit = $ARGV[0];
+ }
+}
+
+check_style();
+
+exit(0);
+
+# vim: set shiftwidth=4 softtabstop=4 expandtab: