Mercurial > hgrepos > DevTools > mercurial-extensions
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.
