diff --git a/src/tools/pgindent/pgindent b/src/tools/pgindent/pgindent
index 741b0ccb58..af0ddd1944 100755
--- a/src/tools/pgindent/pgindent
+++ b/src/tools/pgindent/pgindent
@@ -21,7 +21,8 @@ my $indent_opts =
 
 my $devnull = File::Spec->devnull;
 
-my ($typedefs_file, $typedef_str, $code_base, $excludes, $indent, $build);
+my ($typedefs_file, $typedef_str, $code_base, $excludes, $indent, $build,
+	$show_diff, $silent_diff);
 
 my %options = (
 	"typedefs=s"         => \$typedefs_file,
@@ -29,9 +30,14 @@ my %options = (
 	"code-base=s"        => \$code_base,
 	"excludes=s"         => \$excludes,
 	"indent=s"           => \$indent,
-	"build"              => \$build,);
+	"build"              => \$build,
+    "show-diff"          => \$show_diff,
+    "silent_diff"        => \$silent_diff,);
 GetOptions(%options) || die "bad command line argument\n";
 
+die "Cannot have both --silent-diff and --show-diff"
+  if $silent_diff && $show_diff;
+
 run_build($code_base) if ($build);
 
 # command line option wins, then first non-option arg,
@@ -283,30 +289,19 @@ sub run_indent
 
 }
 
-
-# for development diagnostics
-sub diff
+sub show_diff
 {
-	my $pre   = shift;
-	my $post  = shift;
-	my $flags = shift || "";
+	my $indented   = shift;
+	my $source_filename  = shift;
 
-	print STDERR "running diff\n";
-
-	my $pre_fh  = new File::Temp(TEMPLATE => "pgdiffbXXXXX");
 	my $post_fh = new File::Temp(TEMPLATE => "pgdiffaXXXXX");
 
-	print $pre_fh $pre;
-	print $post_fh $post;
+	print $post_fh $indented;
 
-	$pre_fh->close();
 	$post_fh->close();
 
-	system( "diff $flags "
-		  . $pre_fh->filename . " "
-		  . $post_fh->filename
-		  . " >&2");
-	return;
+	my $diff = `diff -u $source_filename $post_fh->filename  2>&1`;
+	return $diff;
 }
 
 
@@ -404,6 +399,8 @@ push(@files, @ARGV);
 
 foreach my $source_filename (@files)
 {
+	# ignore anything that's not a .c or .h file
+	next unless $source_filename =~/\.[ch]$/;
 
 	# Automatically ignore .c and .h files that correspond to a .y or .l
 	# file.  indent tends to get badly confused by Bison/flex output,
@@ -429,7 +426,24 @@ foreach my $source_filename (@files)
 
 	$source = post_indent($source, $source_filename);
 
-	write_source($source, $source_filename) if $source ne $orig_source;
+	if ($source ne $orig_source)
+	{
+		if ($silent_diff)
+		{
+			exit 2;
+		}
+		elsif ($show_diff)
+		{
+			print show_diff($source, $source_filename);
+		}
+		else
+		{
+			write_source($source, $source_filename);
+		}
+	}
+
 }
 
 build_clean($code_base) if $build;
+
+exit 0;
