pgindent: filter files for the --commit option
authorAndrew Dunstan <andrew@dunslane.net>
Sun, 12 Feb 2023 13:43:44 +0000 (08:43 -0500)
committerAndrew Dunstan <andrew@dunslane.net>
Sun, 12 Feb 2023 13:51:01 +0000 (08:51 -0500)
per gripe from Shi Yu, solution from Jelte Fennema

Also add a check that the file exists, and issue a warning if it
doesn't.

As an efficiency measure, avoid processing any file more than once.

Discussion: https://postgr.es/m/TYAPR01MB6315B86619944D4A6B56842DFDDE9@TYAPR01MB6315.jpnprd01.prod.outlook.com

src/tools/pgindent/pgindent

index 07970f758c2efb3bd244827314b133cbe2a97fed..a793971e078789448a7fa589a13198e795d112fb 100755 (executable)
@@ -444,7 +444,7 @@ File::Find::find({wanted => $wanted}, @ARGV) if @ARGV;
 foreach my $commit (@commits)
 {
        my $prev="$commit~";
-       my @affected=`git diff-tree --no-commit-id --name-only -r $commit $prev`;
+       my @affected=`git diff --diff-filter=ACMR --name-only $prev $commit`;
        die "git error" if $?;
        chomp(@affected);
        push(@files,@affected);
@@ -453,11 +453,23 @@ foreach my $commit (@commits)
 # remove excluded files from the file list
 process_exclude();
 
+my %processed;
+
 foreach my $source_filename (@files)
 {
+       # skip duplicates
+       next if $processed{$source_filename};
+       $processed{$source_filename} = 1;
+
        # ignore anything that's not a .c or .h file
        next unless $source_filename =~ /\.[ch]$/;
 
+       # don't try to indent a file that doesn't exist
+       unless (-f $source_filename)
+       {
+               warn "Could not find $source_filename";
+               next;
+       }
        # Automatically ignore .c and .h files that correspond to a .y or .l
        # file.  indent tends to get badly confused by Bison/flex output,
        # and there's no value in indenting derived files anyway.