changeset 176:45af42cb97b7

Write into the database file using a coroutine
author Franz Glasner <hg@dom66.de>
date Sat, 01 Sep 2018 15:58:36 +0200
parents a884f134906e
children 48559b277291
files extensions/timestamps.py
diffstat 1 files changed, 29 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/extensions/timestamps.py	Sat Sep 01 12:39:42 2018 +0200
+++ b/extensions/timestamps.py	Sat Sep 01 15:58:36 2018 +0200
@@ -136,16 +136,19 @@
     if not repo.local():
         raise error.Abort(_("repository is not local"))
     matcher = gen_matcher(repo, ctx, tsconfig=tsconfig)
-    with util.posixfile(repo.wjoin(TIMESTAMPS_DATABASE), "wb") as db:
+    with io.open(repo.wjoin(TIMESTAMPS_DATABASE), "wb") as db:
         with FloatTimesInStat():
-            db.write("/version/ 1\n")
-            db.write("/encoding/ binary\n")
+            dbwriter = db_writer(db)
+            dbwriter.send(None)   # prime the coroutine
+            dbwriter.send(("/version/", "1"))
+            dbwriter.send(("/encoding/", "binary"))
             for fn in ctx:
                 if matcher(fn):
                     st = os.lstat(repo.wjoin(fn))
                     print (fn, st, st.st_mtime, to_isoformat(st.st_mtime))
-                    db.write("%s %s\n" % (escape_str_field(fn),
-                                          to_isoformat(st.st_mtime)))
+                    dbwriter.send((fn, to_isoformat(st.st_mtime)))
+            dbwriter.close()
+
 
 def restore_timestamps(ui, repo, ctx,
                        tsconfig=None):
@@ -313,6 +316,27 @@
         yield record
 
 
+def db_writer(db):
+    """A coroutine to write records into the database `db`.
+
+    :param db: the binary file to be written into
+
+    """
+    try:
+        while True:
+            fields = (yield)
+            print_sep = False
+            for field in fields:
+                if print_sep:
+                    db.write(' ')
+                else:
+                    print_sep = True
+                db.write(escape_str_field(field))
+            db.write('\n')
+    finally:
+        db.flush()
+
+
 def to_isoformat(t):
     """Return the POSIX timestamp `t` formatted in full ISO format.