summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorJohn Estabrook <jestabro@vyos.io>2025-11-24 08:22:05 -0600
committerGitHub <noreply@github.com>2025-11-24 08:22:05 -0600
commit844d517fa43f2b31dee9320e4e2cb19e2b351684 (patch)
tree5f6ad7deb17460a76c62f92cdff2bca5b60657df /python
parentcae2717e9a608a1706e9dc134f7d560453ec4bfe (diff)
parent0bc7898a9651533fc8939291f2a33e75ecfdfc8e (diff)
downloadvyos-1x-844d517fa43f2b31dee9320e4e2cb19e2b351684.tar.gz
vyos-1x-844d517fa43f2b31dee9320e4e2cb19e2b351684.zip
Merge pull request #4864 from jestabro/util-file-compare
T8031: file comparison in boolean check unsaved_commits should ignore blank lines
Diffstat (limited to 'python')
-rw-r--r--python/vyos/config_mgmt.py3
-rw-r--r--python/vyos/utils/file.py27
2 files changed, 29 insertions, 1 deletions
diff --git a/python/vyos/config_mgmt.py b/python/vyos/config_mgmt.py
index 6bc9ff333..1ce397136 100644
--- a/python/vyos/config_mgmt.py
+++ b/python/vyos/config_mgmt.py
@@ -48,6 +48,7 @@ from vyos.utils.process import is_systemd_service_active
from vyos.utils.process import rc_cmd
from vyos.defaults import DEFAULT_COMMIT_CONFIRM_MINUTES
from vyos.component_version import append_system_version
+from vyos.utils.file import file_compare
SAVE_CONFIG = '/usr/libexec/vyos/vyos-save-config.py'
config_json = '/run/vyatta/config/config.json'
@@ -97,7 +98,7 @@ def unsaved_commits(allow_missing_config=False) -> bool:
return True
tmp_save = '/tmp/config.running'
save_config(tmp_save)
- ret = not cmp(tmp_save, config_file, shallow=False)
+ ret = not file_compare(tmp_save, config_file)
os.unlink(tmp_save)
return ret
diff --git a/python/vyos/utils/file.py b/python/vyos/utils/file.py
index 98d88d9e4..6708ade2d 100644
--- a/python/vyos/utils/file.py
+++ b/python/vyos/utils/file.py
@@ -312,3 +312,30 @@ def move_recursive(src: str, dst: str, overwrite=False):
copy_recursive(src, dst, overwrite=overwrite)
shutil.rmtree(src)
+
+
+def file_compare(file1: str, file2: str) -> bool:
+ """
+ Compare two files modulo blank lines, leading/trailing whitespace, final
+ newline.
+
+ Returns:
+ bool: True if files are equivalent in the sense above.
+
+ """
+
+ def non_empty(line):
+ return bool(line.strip())
+
+ with open(file1) as f1, open(file2) as f2:
+ it1 = filter(non_empty, f1)
+ it2 = filter(non_empty, f2)
+
+ try:
+ for l1, l2 in zip(it1, it2, strict=True):
+ if l1.strip() != l2.strip():
+ return False
+ except ValueError:
+ return False
+
+ return True