From ba28acaa64c33d8a8afe12c91a76f5dd5b57483c Mon Sep 17 00:00:00 2001
From: Jelte Fennema-Nio <postgres@jeltef.nl>
Date: Tue, 3 Mar 2026 09:43:33 +0100
Subject: [PATCH v2 4/7] pgindent: Use git ls-files to discover files

---
 src/tools/pgindent/pgindent | 56 +++++++++++++++++++++++++++++--------
 1 file changed, 44 insertions(+), 12 deletions(-)

diff --git a/src/tools/pgindent/pgindent b/src/tools/pgindent/pgindent
index f8ac9c8268b..983fe0b1d4f 100755
--- a/src/tools/pgindent/pgindent
+++ b/src/tools/pgindent/pgindent
@@ -13,7 +13,6 @@ use strict;
 use warnings FATAL => 'all';
 
 use Cwd qw(abs_path getcwd);
-use File::Find;
 use File::Spec;
 use File::Temp;
 use IO::Handle;
@@ -500,23 +499,56 @@ sub is_perl_file
 	return $file_out =~ /:.*perl[0-9]*\b/i;
 }
 
-my $wanted = sub {
-	my ($dev, $ino, $mode, $nlink, $uid, $gid);
-	(($dev, $ino, $mode, $nlink, $uid, $gid) = lstat($_))
-	  && -f _
-	  || return;
-	if ($do_c && is_c_file($File::Find::name))
+sub discover_files
+{
+	my @paths = @_;
+	my @discovered;
+
+	# Separate individual files from directories
+	my @dirs;
+	foreach my $path (@paths)
 	{
-		push(@files, $File::Find::name);
+		if (-f $path)
+		{
+			push(@discovered, $path);
+		}
+		elsif (-d $path)
+		{
+			push(@dirs, $path);
+		}
+		else
+		{
+			warn "Could not find $path";
+		}
 	}
-	elsif ($do_perl && is_perl_file($File::Find::name))
+
+	# Use git ls-files for directories to avoid searching build trees etc.
+	if (@dirs)
 	{
-		push(@files, $File::Find::name);
+		my @git_files = `git ls-files -- @dirs`;
+		die "git ls-files error" if $?;
+		chomp(@git_files);
+		push(@discovered, @git_files);
 	}
-};
+
+	return @discovered;
+}
 
 # any non-option arguments are files or directories to be processed
-File::Find::find({ wanted => $wanted, no_chdir => 1 }, @ARGV) if @ARGV;
+if (@ARGV)
+{
+	foreach my $f (discover_files(@ARGV))
+	{
+		if ($do_c && is_c_file($f))
+		{
+			push(@files, $f);
+		}
+		elsif ($do_perl && is_perl_file($f))
+		{
+			push(@files, $f);
+		}
+	}
+}
 
 # commit file locations are relative to the source root
 chdir "$sourcedir/../../.." if @commits && $sourcedir;
-- 
2.53.0

