From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 7697E15806E for ; Tue, 23 May 2023 00:26:24 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id AB185E0956; Tue, 23 May 2023 00:26:23 +0000 (UTC) Received: from smtp.gentoo.org (woodpecker.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 8C58BE0956 for ; Tue, 23 May 2023 00:26:23 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id AF8D8335CEE for ; Tue, 23 May 2023 00:26:22 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id 0CDB18E4 for ; Tue, 23 May 2023 00:26:21 +0000 (UTC) From: "Sam James" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Sam James" Message-ID: <1684801329.a87be47f7d3245050da43d7c3ab4760d47e9fac5.sam@gentoo> Subject: [gentoo-commits] proj/portage:master commit in: lib/portage/dbapi/ X-VCS-Repository: proj/portage X-VCS-Files: lib/portage/dbapi/vartree.py X-VCS-Directories: lib/portage/dbapi/ X-VCS-Committer: sam X-VCS-Committer-Name: Sam James X-VCS-Revision: a87be47f7d3245050da43d7c3ab4760d47e9fac5 X-VCS-Branch: master Date: Tue, 23 May 2023 00:26:21 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Archives-Salt: d9e5ae4f-a5ac-4a1c-a296-5280ef587e66 X-Archives-Hash: e242b147876bab7eef877c60c2ec59c7 commit: a87be47f7d3245050da43d7c3ab4760d47e9fac5 Author: gcarq protonmail com> AuthorDate: Tue Feb 21 00:04:26 2023 +0000 Commit: Sam James gentoo org> CommitDate: Tue May 23 00:22:09 2023 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=a87be47f mergeme: Don't overwrite files if the content matches Uses filecmp.cmp(shallow=False) to compare file contents and doesn't replace them if they are equal. This results in less disk churn and helps to keep filesystem snapshots as small as possible. Closes: https://bugs.gentoo.org/722270 Signed-off-by: gcarq protonmail.com> Signed-off-by: Sam James gentoo.org> lib/portage/dbapi/vartree.py | 47 +++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/lib/portage/dbapi/vartree.py b/lib/portage/dbapi/vartree.py index a9e332a74..327b72bed 100644 --- a/lib/portage/dbapi/vartree.py +++ b/lib/portage/dbapi/vartree.py @@ -3,6 +3,8 @@ __all__ = ["vardbapi", "vartree", "dblink"] + ["write_contents", "tar_contents"] +import filecmp + import portage portage.proxy.lazyimport.lazyimport( @@ -5800,28 +5802,33 @@ class dblink: # whether config protection or not, we merge the new file the # same way. Unless moveme=0 (blocking directory) if moveme: - # Create hardlinks only for source files that already exist - # as hardlinks (having identical st_dev and st_ino). - hardlink_key = (mystat.st_dev, mystat.st_ino) + # only replace the existing file if it differs, see #722270 + already_merged = os.path.exists(mydest) + if already_merged and filecmp.cmp(mysrc, mydest, shallow=False): + zing = "===" + else: + # Create hardlinks only for source files that already exist + # as hardlinks (having identical st_dev and st_ino). + hardlink_key = (mystat.st_dev, mystat.st_ino) - hardlink_candidates = self._hardlink_merge_map.get(hardlink_key) - if hardlink_candidates is None: - hardlink_candidates = [] - self._hardlink_merge_map[hardlink_key] = hardlink_candidates + hardlink_candidates = self._hardlink_merge_map.get(hardlink_key) + if hardlink_candidates is None: + hardlink_candidates = [] + self._hardlink_merge_map[hardlink_key] = hardlink_candidates - mymtime = movefile( - mysrc, - mydest, - newmtime=thismtime, - sstat=mystat, - mysettings=self.settings, - hardlink_candidates=hardlink_candidates, - encoding=_encodings["merge"], - ) - if mymtime is None: - return 1 - hardlink_candidates.append(mydest) - zing = ">>>" + mymtime = movefile( + mysrc, + mydest, + newmtime=thismtime, + sstat=mystat, + mysettings=self.settings, + hardlink_candidates=hardlink_candidates, + encoding=_encodings["merge"], + ) + if mymtime is None: + return 1 + hardlink_candidates.append(mydest) + zing = ">>>" try: self._merged_path(mydest, os.lstat(mydest))