summaryrefslogtreecommitdiffstats
path: root/hacking/build_library/build_ansible/change_detection.py
blob: 22e21d3c253ad002c1caf43f8c1d4d90cd0be2e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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