From 9fbb5b4de3410e82e9747cb031d7250c1e6b2beb Mon Sep 17 00:00:00 2001
From: Wolfgang Bangerth <bangerth@colostate.edu>
Date: Wed, 3 Feb 2021 13:54:27 -0700
Subject: [PATCH] Ensure exactly one newline at the end of each file.

---
 contrib/utilities/indent | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/contrib/utilities/indent b/contrib/utilities/indent
index 039619b442..0da2355d68 100755
--- a/contrib/utilities/indent
+++ b/contrib/utilities/indent
@@ -75,3 +75,35 @@ process_changed "tests include source examples cmake/scripts contrib/python-bind
 
 process_changed "tests include source examples cmake/scripts contrib/python-bindings doc" \
   ".*\.(cc|h|cu|cuh|html|dox|txt)" remove_trailing_whitespace
+
+
+#
+# Ensure only a single newline at end of files
+#
+ensure_single_trailing_newline()
+{
+  f=$1
+
+  # Remove newlines at end of file
+  # Check that the current line only contains newlines
+  # If it doesn't match, print it
+  # If it does match and we're not at the end of the file,
+  # append the next line to the current line and repeat the check
+  # If it does match and we're at the end of the file,
+  # remove the line.
+  sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' $f >$f.tmpi
+
+  # Then add a newline to the end of the file
+  # '$' denotes the end of file
+  # 'a\' appends the following text (which in this case is nothing)
+  # on a new line
+  sed -e '$a\' $f.tmpi >$f.tmp
+
+  diff -q $f $f.tmp >/dev/null || mv $f.tmp $f
+  rm -f $f.tmp $f.tmpi
+}
+export -f ensure_single_trailing_newline
+
+process_changed "tests include source examples cmake/scripts contrib/python-bindings doc" \
+  ".*\.(cc|h|cu|cuh|html|dox|txt)" ensure_single_trailing_newline
+
-- 
2.39.5