You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

49 lines
1.3 KiB

#/usr/bin/perl
# Given the diff output on stdin, run clang-format on the input hunks.
#
# Author: Bryan Tan (Technius)
use strict;
# Table mapping changed files to array of hunks.
my %changed_files;
# Array of hunks in the current file. Only stores the new location.
my @hunks;
# Current file
my $current_file;
# Push the pending hunks to the changed file table.
sub push_changes {
if (scalar @hunks > 0) {
$changed_files{$current_file} = [@hunks];
@hunks = ();
}
}
while (my $line = <STDIN>) {
if ($line =~ /^diff .* a\/(?<old_file>.*) b\/(?<new_file>.*)$/) {
# New file
push_changes;
$current_file = $+{new_file};
} elsif ($line =~ /^@@ -([0-9]+)(,([0-9]+))? \+(?<new_pos>[0-9]+)(,(?<new_len>[0-9]+))? @@/) {
my $new_len = $+{new_len};
$new_len = 1 if ($new_len eq "");
push @hunks, [$+{new_pos}, $new_len];
}
}
push_changes;
# Now, run clang format on the changed lines.
while (my ($file_name, $hunks_ref) = each %changed_files) {
foreach my $hunk_ref (@{$hunks_ref}) {
my $start_pos = @{$hunk_ref}[0];
my $line_count = @{$hunk_ref}[1];
my $end_pos = $start_pos + $line_count - 1;
if ($line_count > 0) {
printf "Running clang-format-8 on %s, lines %i-%i\n", $file_name, $start_pos, $end_pos;
`clang-format-8 -i -style=file -lines=$start_pos:$end_pos $file_name`;
die "Failed to run clang-format-8: exit code $?" if $? != 0;
}
}
}