commit:     bf8819eb6a578957741caaabe33e2f3b67265336
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Tue Nov 11 02:33:18 2025 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Tue Nov 11 04:58:32 2025 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=bf8819eb

egencache: update use.local.desc atomically

Bug: https://bugs.gentoo.org/577126
Signed-off-by: Zac Medico <zmedico <AT> gentoo.org>

 bin/egencache | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/bin/egencache b/bin/egencache
index 6b131360d5..7359a17125 100755
--- a/bin/egencache
+++ b/bin/egencache
@@ -63,7 +63,7 @@ try:
     from portage.package.ebuild._parallel_manifest.ManifestScheduler import (
         manifest_scheduler_retry,
     )
-    from portage.util import cmp_sort_key, writemsg_level, no_color
+    from portage.util import atomic_ofstream, cmp_sort_key, writemsg_level, 
no_color
     from portage.util._async.AsyncFunction import AsyncFunction
     from portage.util._async.AsyncTaskFuture import AsyncTaskFuture
     from portage.util._async.run_main_scheduler import run_main_scheduler
@@ -669,7 +669,7 @@ try:
                             "r+b",
                         )
                     else:
-                        output = open(
+                        output = atomic_ofstream(
                             _unicode_encode(
                                 desc_path, encoding=_encodings["fs"], 
errors="strict"
                             ),
@@ -698,7 +698,7 @@ try:
                     )
                     self._preserve_comments = False
                     try:
-                        output = open(
+                        output = atomic_ofstream(
                             _unicode_encode(
                                 desc_path, encoding=_encodings["fs"], 
errors="strict"
                             ),
@@ -728,14 +728,24 @@ try:
 
                 # Finished probing comments in binary mode, now append
                 # in text mode.
-                output = open(
+                output = atomic_ofstream(
                     _unicode_encode(
                         desc_path, encoding=_encodings["fs"], errors="strict"
                     ),
-                    mode="a",
+                    mode="w",
                     encoding=_encodings["repo.content"],
                     errors="backslashreplace",
                 )
+                # Copy previous content in order to simulate "append" with 
atomic_ofstream.
+                with open(
+                    _unicode_encode(
+                        desc_path, encoding=_encodings["fs"], errors="strict"
+                    ),
+                    encoding=_encodings["repo.content"],
+                    errors="backslashreplace",
+                ) as previous_content:
+                    for line in previous_content:
+                        output.write(line)
                 output.write("\n")
             else:
                 output.write(

Reply via email to