summaryrefslogtreecommitdiffstats
path: root/hacking/build_library/build_ansible/change_detection.py
diff options
context:
space:
mode:
Diffstat (limited to 'hacking/build_library/build_ansible/change_detection.py')
-rw-r--r--hacking/build_library/build_ansible/change_detection.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/hacking/build_library/build_ansible/change_detection.py b/hacking/build_library/build_ansible/change_detection.py
new file mode 100644
index 0000000..22e21d3
--- /dev/null
+++ b/hacking/build_library/build_ansible/change_detection.py
@@ -0,0 +1,33 @@
+# Copyright: (c) 2018, Ansible Project
+# GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt)
+
+from __future__ import (absolute_import, division, print_function)
+__metaclass__ = type
+
+
+def update_file_if_different(filename, b_data):
+ """
+ Replace file content only if content is different.
+
+ This preserves timestamps in case the file content has not changed. It performs multiple
+ operations on the file so it is not atomic and may be slower than simply writing to the file.
+
+ :arg filename: The filename to write to
+ :b_data: Byte string containing the data to write to the file
+ """
+ try:
+ with open(filename, 'rb') as f:
+ b_data_old = f.read()
+ except IOError as e:
+ if e.errno != 2:
+ raise
+ # File did not exist, set b_data_old to a sentinel value so that
+ # b_data gets written to the filename
+ b_data_old = None
+
+ if b_data_old != b_data:
+ with open(filename, 'wb') as f:
+ f.write(b_data)
+ return True
+
+ return False