diff -r 6d43b39fbaa0 -r 03ff17a4bf53 hgext/infinitepush/common.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hgext/infinitepush/common.py Fri Feb 09 13:39:15 2018 +0530 @@ -0,0 +1,58 @@ +# Copyright 2017 Facebook, Inc. +# +# This software may be used and distributed according to the terms of the +# GNU General Public License version 2 or any later version. + +from __future__ import absolute_import + +import json +import os +import struct +import tempfile + +from mercurial.node import hex + +from mercurial import ( + error, + extensions, +) + +def isremotebooksenabled(ui): + return ('remotenames' in extensions._extensions and + ui.configbool('remotenames', 'bookmarks')) + +def encodebookmarks(bookmarks): + encoded = {} + for bookmark, node in bookmarks.iteritems(): + encoded[bookmark] = node + dumped = json.dumps(encoded) + result = struct.pack('>i', len(dumped)) + dumped + return result + +def downloadbundle(repo, unknownbinhead): + index = repo.bundlestore.index + store = repo.bundlestore.store + bundleid = index.getbundle(hex(unknownbinhead)) + if bundleid is None: + raise error.Abort('%s head is not known' % hex(unknownbinhead)) + bundleraw = store.read(bundleid) + return _makebundlefromraw(bundleraw) + +def _makebundlefromraw(data): + fp = None + fd, bundlefile = tempfile.mkstemp() + try: # guards bundlefile + try: # guards fp + fp = os.fdopen(fd, 'wb') + fp.write(data) + finally: + fp.close() + except Exception: + try: + os.unlink(bundlefile) + except Exception: + # we would rather see the original exception + pass + raise + + return bundlefile