Mercurial > hg-git
view hggit/compat.py @ 1092:3799bf885c1d
compat: use newer read_pkt_refs from dulwich if possible
Beginning with dulwich 0.18, it now supports reporting the symrefs so we
no longer need to monkey patch (will require future patches to use the
new code, though).
author | Sean Farley <sean@farley.io> |
---|---|
date | Mon, 27 Nov 2017 17:45:51 -0500 |
parents | c06d4656b77b |
children | 8e61d7a29932 |
line wrap: on
line source
from mercurial import ( url, util as hgutil, ) try: from mercurial import encoding hfsignoreclean = encoding.hfsignoreclean except AttributeError: # compat with hg 3.2.1 and earlier, which doesn't have # hfsignoreclean (This was borrowed wholesale from hg 3.2.2.) _ignore = [unichr(int(x, 16)).encode("utf-8") for x in "200c 200d 200e 200f 202a 202b 202c 202d 202e " "206a 206b 206c 206d 206e 206f feff".split()] # verify the next function will work assert set([i[0] for i in _ignore]) == set(["\xe2", "\xef"]) def hfsignoreclean(s): """Remove codepoints ignored by HFS+ from s. >>> hfsignoreclean(u'.h\u200cg'.encode('utf-8')) '.hg' >>> hfsignoreclean(u'.h\ufeffg'.encode('utf-8')) '.hg' """ if "\xe2" in s or "\xef" in s: for c in _ignore: s = s.replace(c, '') return s try: from mercurial import vfs as vfsmod hgvfs = vfsmod.vfs except ImportError: # vfsmod was extracted in hg 4.2 from mercurial import scmutil hgvfs = scmutil.vfs def gitvfs(repo): """return a vfs suitable to read git related data""" # Mercurial >= 3.3: repo.shared() if repo.sharedpath != repo.path: return hgvfs(repo.sharedpath) else: return repo.vfs def passwordmgr(ui): try: realm = hgutil.urlreq.httppasswordmgrwithdefaultrealm() return url.passwordmgr(ui, realm) except (TypeError, AttributeError): # compat with hg < 3.9 return url.passwordmgr(ui) try: import dulwich.client FetchPackResult = dulwich.client.FetchPackResult read_pkt_refs = dulwich.client.read_pkt_refs except (AttributeError, ImportError): # older dulwich doesn't return the symref where remote HEAD points, so we # monkey patch it here from dulwich.errors import GitProtocolError from dulwich.protocol import extract_capabilities def read_pkt_refs(proto): server_capabilities = None refs = {} # Receive refs from server for pkt in proto.read_pkt_seq(): (sha, ref) = pkt.rstrip('\n').split(None, 1) if sha == 'ERR': raise GitProtocolError(ref) if server_capabilities is None: (ref, server_capabilities) = extract_capabilities(ref) symref = 'symref=HEAD:' for cap in server_capabilities: if cap.startswith(symref): sha = cap.replace(symref, '') refs[ref] = sha if len(refs) == 0: return None, set([]) return refs, set(server_capabilities) CONFIG_DEFAULTS = { 'git': { 'authors': None, 'blockdotgit': True, 'blockdothg': True, 'branch_bookmark_suffix': None, 'debugextrainmessage': False, # test only -- do not document this! 'findcopiesharder': False, 'intree': None, 'mindate': None, 'public': list, 'renamelimit': 400, 'similarity': 0, }, 'hggit': { 'mapsavefrequency': 0, 'usephases': False, } } hasconfigitems = False def registerconfigs(configitem): global hasconfigitems hasconfigitems = True for section, items in CONFIG_DEFAULTS.iteritems(): for item, default in items.iteritems(): configitem(section, item, default=default) def config(ui, subtype, section, item): if subtype == 'string': subtype = '' getconfig = getattr(ui, 'config' + subtype) if hasconfigitems: return getconfig(section, item) return getconfig(section, item, CONFIG_DEFAULTS[section][item])