annotate mercurial/pycompat.py @ 31409:fb1f70331ee6

pycompat: custom implementation of urllib.parse.quote() urllib.parse.quote() accepts either str or bytes and returns str. There exists a urllib.parse.quote_from_bytes() which only accepts bytes. We should probably use that to retain strong typing and avoid surprises. In addition, since nearly all strings in Mercurial are bytes, we probably don't want quote() returning unicode. So, this patch implements a custom quote() that only accepts bytes and returns bytes. The quoted URL should only contain URL safe characters which is a strict subset of ASCII. So `.encode('ascii', 'strict')` should be safe.
author Gregory Szorc <gregory.szorc@gmail.com>
date Mon, 13 Mar 2017 12:16:47 -0700
parents 1ed169c5e235
children 4acc49335a6e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28818
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
1 # pycompat.py - portability shim for python 3
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
2 #
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
3 # This software may be used and distributed according to the terms of the
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
4 # GNU General Public License version 2 or any later version.
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
5
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
6 """Mercurial portability shim for python 3.
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
7
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
8 This contains aliases to hide python version-specific details from the core.
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
9 """
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
10
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
11 from __future__ import absolute_import
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
12
30583
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
13 import getopt
30315
3874ddba1ab4 py3: add a bytes version of os.name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30313
diff changeset
14 import os
30681
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
15 import shlex
29584
06587edd1233 pycompat: make pycompat demandimport friendly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29566
diff changeset
16 import sys
06587edd1233 pycompat: make pycompat demandimport friendly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29566
diff changeset
17
30031
0f6d6fdd3c2a pycompat: provide 'ispy3' constant
Yuya Nishihara <yuya@tcha.org>
parents: 29812
diff changeset
18 ispy3 = (sys.version_info[0] >= 3)
0f6d6fdd3c2a pycompat: provide 'ispy3' constant
Yuya Nishihara <yuya@tcha.org>
parents: 29812
diff changeset
19
0f6d6fdd3c2a pycompat: provide 'ispy3' constant
Yuya Nishihara <yuya@tcha.org>
parents: 29812
diff changeset
20 if not ispy3:
29324
b501579147f1 py3: conditionalize cPickle import by adding in util
Pulkit Goyal <7895pulkit@gmail.com>
parents: 28882
diff changeset
21 import cPickle as pickle
29455
0c741fd6158a py3: conditionalize httplib import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29433
diff changeset
22 import httplib
29584
06587edd1233 pycompat: make pycompat demandimport friendly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29566
diff changeset
23 import Queue as _queue
29433
33770d2b6cf9 py3: conditionalize SocketServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29432
diff changeset
24 import SocketServer as socketserver
29584
06587edd1233 pycompat: make pycompat demandimport friendly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29566
diff changeset
25 import urlparse
30337
e0d9b6aab4c5 pycompat: introduce an alias for urllib.unquote
Augie Fackler <augie@google.com>
parents: 30316
diff changeset
26 urlunquote = urlparse.unquote
29432
34b914ac573e py3: conditionalize xmlrpclib import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29431
diff changeset
27 import xmlrpclib
29584
06587edd1233 pycompat: make pycompat demandimport friendly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29566
diff changeset
28 else:
06587edd1233 pycompat: make pycompat demandimport friendly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29566
diff changeset
29 import http.client as httplib
06587edd1233 pycompat: make pycompat demandimport friendly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29566
diff changeset
30 import pickle
06587edd1233 pycompat: make pycompat demandimport friendly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29566
diff changeset
31 import queue as _queue
06587edd1233 pycompat: make pycompat demandimport friendly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29566
diff changeset
32 import socketserver
06587edd1233 pycompat: make pycompat demandimport friendly
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29566
diff changeset
33 import urllib.parse as urlparse
30337
e0d9b6aab4c5 pycompat: introduce an alias for urllib.unquote
Augie Fackler <augie@google.com>
parents: 30316
diff changeset
34 urlunquote = urlparse.unquote_to_bytes
29432
34b914ac573e py3: conditionalize xmlrpclib import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29431
diff changeset
35 import xmlrpc.client as xmlrpclib
29431
80880ad3fccd py3: conditionalize the urlparse import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29414
diff changeset
36
30031
0f6d6fdd3c2a pycompat: provide 'ispy3' constant
Yuya Nishihara <yuya@tcha.org>
parents: 29812
diff changeset
37 if ispy3:
29808
965c91bad9e3 py3: move xrange alias next to import lines
Yuya Nishihara <yuya@tcha.org>
parents: 29790
diff changeset
38 import builtins
29810
45fa8de47a0f py3: provide (del|get|has|set)attr wrappers that accepts bytes
Yuya Nishihara <yuya@tcha.org>
parents: 29809
diff changeset
39 import functools
31381
06440ba06bc0 pycompat: move imports of cStringIO/io to where they are used
Yuya Nishihara <yuya@tcha.org>
parents: 31368
diff changeset
40 import io
06440ba06bc0 pycompat: move imports of cStringIO/io to where they are used
Yuya Nishihara <yuya@tcha.org>
parents: 31368
diff changeset
41
30119
f4a5e0e86a7e py3: add an os.fsencode backport to ease path handling
Martijn Pieters <mjpieters@fb.com>
parents: 30086
diff changeset
42 fsencode = os.fsencode
30313
42af0590f4b9 py3: add os.fsdecode() as pycompat.fsdecode()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30133
diff changeset
43 fsdecode = os.fsdecode
30315
3874ddba1ab4 py3: add a bytes version of os.name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30313
diff changeset
44 # A bytes version of os.name.
3874ddba1ab4 py3: add a bytes version of os.name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30313
diff changeset
45 osname = os.name.encode('ascii')
30316
ad40d307a9f0 py3: have pycompat.ospathsep and pycompat.ossep
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30315
diff changeset
46 ospathsep = os.pathsep.encode('ascii')
ad40d307a9f0 py3: have pycompat.ospathsep and pycompat.ossep
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30315
diff changeset
47 ossep = os.sep.encode('ascii')
30628
c6026c20a3ce py3: have a bytes version of os.altsep
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30584
diff changeset
48 osaltsep = os.altsep
c6026c20a3ce py3: have a bytes version of os.altsep
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30584
diff changeset
49 if osaltsep:
c6026c20a3ce py3: have a bytes version of os.altsep
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30584
diff changeset
50 osaltsep = osaltsep.encode('ascii')
30509
fc0cfe6c87d7 py3: add os.getcwdb() to have bytes path
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30481
diff changeset
51 # os.getcwd() on Python 3 returns string, but it has os.getcwdb() which
fc0cfe6c87d7 py3: add os.getcwdb() to have bytes path
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30481
diff changeset
52 # returns bytes.
fc0cfe6c87d7 py3: add os.getcwdb() to have bytes path
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30481
diff changeset
53 getcwd = os.getcwdb
30629
a82a6eee2613 py3: have a bytes version of sys.platform
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30628
diff changeset
54 sysplatform = sys.platform.encode('ascii')
30671
3fcaf0f660ce py3: have bytes version of sys.executable
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30666
diff changeset
55 sysexecutable = sys.executable
3fcaf0f660ce py3: have bytes version of sys.executable
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30666
diff changeset
56 if sysexecutable:
3fcaf0f660ce py3: have bytes version of sys.executable
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30666
diff changeset
57 sysexecutable = os.fsencode(sysexecutable)
31368
73b3bee8febe pycompat: default to BytesIO instead of StringIO
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31310
diff changeset
58 stringio = io.BytesIO
30344
19d8e19fde5b py3: document why os.fsencode() can be used to get back bytes argv
Yuya Nishihara <yuya@tcha.org>
parents: 30340
diff changeset
59
30481
277f4fe6d01a py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents: 30344
diff changeset
60 # TODO: .buffer might not exist if std streams were replaced; we'll need
277f4fe6d01a py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents: 30344
diff changeset
61 # a silly wrapper to make a bytes stream backed by a unicode one.
277f4fe6d01a py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents: 30344
diff changeset
62 stdin = sys.stdin.buffer
277f4fe6d01a py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents: 30344
diff changeset
63 stdout = sys.stdout.buffer
277f4fe6d01a py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents: 30344
diff changeset
64 stderr = sys.stderr.buffer
277f4fe6d01a py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents: 30344
diff changeset
65
30344
19d8e19fde5b py3: document why os.fsencode() can be used to get back bytes argv
Yuya Nishihara <yuya@tcha.org>
parents: 30340
diff changeset
66 # Since Python 3 converts argv to wchar_t type by Py_DecodeLocale() on Unix,
19d8e19fde5b py3: document why os.fsencode() can be used to get back bytes argv
Yuya Nishihara <yuya@tcha.org>
parents: 30340
diff changeset
67 # we can use os.fsencode() to get back bytes argv.
19d8e19fde5b py3: document why os.fsencode() can be used to get back bytes argv
Yuya Nishihara <yuya@tcha.org>
parents: 30340
diff changeset
68 #
19d8e19fde5b py3: document why os.fsencode() can be used to get back bytes argv
Yuya Nishihara <yuya@tcha.org>
parents: 30340
diff changeset
69 # https://hg.python.org/cpython/file/v3.5.1/Programs/python.c#l55
19d8e19fde5b py3: document why os.fsencode() can be used to get back bytes argv
Yuya Nishihara <yuya@tcha.org>
parents: 30340
diff changeset
70 #
19d8e19fde5b py3: document why os.fsencode() can be used to get back bytes argv
Yuya Nishihara <yuya@tcha.org>
parents: 30340
diff changeset
71 # TODO: On Windows, the native argv is wchar_t, so we'll need a different
19d8e19fde5b py3: document why os.fsencode() can be used to get back bytes argv
Yuya Nishihara <yuya@tcha.org>
parents: 30340
diff changeset
72 # workaround to simulate the Python 2 (i.e. ANSI Win32 API) behavior.
30888
86cd1f2cfff5 pycompat: verify sys.argv exists before forwarding it (issue5493)
Augie Fackler <augie@google.com>
parents: 30820
diff changeset
73 if getattr(sys, 'argv', None) is not None:
86cd1f2cfff5 pycompat: verify sys.argv exists before forwarding it (issue5493)
Augie Fackler <augie@google.com>
parents: 30820
diff changeset
74 sysargv = list(map(os.fsencode, sys.argv))
29808
965c91bad9e3 py3: move xrange alias next to import lines
Yuya Nishihara <yuya@tcha.org>
parents: 29790
diff changeset
75
31263
64596338ba10 py3: factor out bytechr() function
Yuya Nishihara <yuya@tcha.org>
parents: 31159
diff changeset
76 def bytechr(i):
64596338ba10 py3: factor out bytechr() function
Yuya Nishihara <yuya@tcha.org>
parents: 31159
diff changeset
77 return bytes([i])
64596338ba10 py3: factor out bytechr() function
Yuya Nishihara <yuya@tcha.org>
parents: 31159
diff changeset
78
31391
c9fd842dc886 pycompat: add helper to iterate each char in bytes
Yuya Nishihara <yuya@tcha.org>
parents: 31381
diff changeset
79 def iterbytestr(s):
c9fd842dc886 pycompat: add helper to iterate each char in bytes
Yuya Nishihara <yuya@tcha.org>
parents: 31381
diff changeset
80 """Iterate bytes as if it were a str object of Python 2"""
c9fd842dc886 pycompat: add helper to iterate each char in bytes
Yuya Nishihara <yuya@tcha.org>
parents: 31381
diff changeset
81 return iter(s[i:i + 1] for i in range(len(s)))
c9fd842dc886 pycompat: add helper to iterate each char in bytes
Yuya Nishihara <yuya@tcha.org>
parents: 31381
diff changeset
82
30032
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
83 def sysstr(s):
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
84 """Return a keyword str to be passed to Python functions such as
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
85 getattr() and str.encode()
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
86
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
87 This never raises UnicodeDecodeError. Non-ascii characters are
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
88 considered invalid and mapped to arbitrary but unique code points
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
89 such that 'sysstr(a) != sysstr(b)' for all 'a != b'.
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
90 """
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
91 if isinstance(s, builtins.str):
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
92 return s
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
93 return s.decode(u'latin-1')
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
94
29810
45fa8de47a0f py3: provide (del|get|has|set)attr wrappers that accepts bytes
Yuya Nishihara <yuya@tcha.org>
parents: 29809
diff changeset
95 def _wrapattrfunc(f):
45fa8de47a0f py3: provide (del|get|has|set)attr wrappers that accepts bytes
Yuya Nishihara <yuya@tcha.org>
parents: 29809
diff changeset
96 @functools.wraps(f)
45fa8de47a0f py3: provide (del|get|has|set)attr wrappers that accepts bytes
Yuya Nishihara <yuya@tcha.org>
parents: 29809
diff changeset
97 def w(object, name, *args):
30032
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
98 return f(object, sysstr(name), *args)
29810
45fa8de47a0f py3: provide (del|get|has|set)attr wrappers that accepts bytes
Yuya Nishihara <yuya@tcha.org>
parents: 29809
diff changeset
99 return w
45fa8de47a0f py3: provide (del|get|has|set)attr wrappers that accepts bytes
Yuya Nishihara <yuya@tcha.org>
parents: 29809
diff changeset
100
29811
178c89e8519a py3: import builtin wrappers automagically by code transformer
Yuya Nishihara <yuya@tcha.org>
parents: 29810
diff changeset
101 # these wrappers are automagically imported by hgloader
29810
45fa8de47a0f py3: provide (del|get|has|set)attr wrappers that accepts bytes
Yuya Nishihara <yuya@tcha.org>
parents: 29809
diff changeset
102 delattr = _wrapattrfunc(builtins.delattr)
45fa8de47a0f py3: provide (del|get|has|set)attr wrappers that accepts bytes
Yuya Nishihara <yuya@tcha.org>
parents: 29809
diff changeset
103 getattr = _wrapattrfunc(builtins.getattr)
45fa8de47a0f py3: provide (del|get|has|set)attr wrappers that accepts bytes
Yuya Nishihara <yuya@tcha.org>
parents: 29809
diff changeset
104 hasattr = _wrapattrfunc(builtins.hasattr)
45fa8de47a0f py3: provide (del|get|has|set)attr wrappers that accepts bytes
Yuya Nishihara <yuya@tcha.org>
parents: 29809
diff changeset
105 setattr = _wrapattrfunc(builtins.setattr)
29811
178c89e8519a py3: import builtin wrappers automagically by code transformer
Yuya Nishihara <yuya@tcha.org>
parents: 29810
diff changeset
106 xrange = builtins.range
29810
45fa8de47a0f py3: provide (del|get|has|set)attr wrappers that accepts bytes
Yuya Nishihara <yuya@tcha.org>
parents: 29809
diff changeset
107
31159
76a64c1e5439 py3: add pycompat.open and replace open() calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30820
diff changeset
108 def open(name, mode='r', buffering=-1):
76a64c1e5439 py3: add pycompat.open and replace open() calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30820
diff changeset
109 return builtins.open(name, sysstr(mode), buffering)
76a64c1e5439 py3: add pycompat.open and replace open() calls
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30820
diff changeset
110
30583
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
111 # getopt.getopt() on Python 3 deals with unicodes internally so we cannot
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
112 # pass bytes there. Passing unicodes will result in unicodes as return
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
113 # values which we need to convert again to bytes.
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
114 def getoptb(args, shortlist, namelist):
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
115 args = [a.decode('latin-1') for a in args]
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
116 shortlist = shortlist.decode('latin-1')
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
117 namelist = [a.decode('latin-1') for a in namelist]
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
118 opts, args = getopt.getopt(args, shortlist, namelist)
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
119 opts = [(a[0].encode('latin-1'), a[1].encode('latin-1'))
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
120 for a in opts]
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
121 args = [a.encode('latin-1') for a in args]
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
122 return opts, args
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
123
30584
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
124 # keys of keyword arguments in Python need to be strings which are unicodes
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
125 # Python 3. This function takes keyword arguments, convert the keys to str.
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
126 def strkwargs(dic):
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
127 dic = dict((k.decode('latin-1'), v) for k, v in dic.iteritems())
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
128 return dic
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
129
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
130 # keys of keyword arguments need to be unicode while passing into
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
131 # a function. This function helps us to convert those keys back to bytes
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
132 # again as we need to deal with bytes.
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
133 def byteskwargs(dic):
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
134 dic = dict((k.encode('latin-1'), v) for k, v in dic.iteritems())
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
135 return dic
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
136
30681
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
137 # shlex.split() accepts unicodes on Python 3. This function takes bytes
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
138 # argument, convert it into unicodes, pass into shlex.split(), convert the
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
139 # returned value to bytes and return that.
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
140 # TODO: handle shlex.shlex().
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
141 def shlexsplit(s):
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
142 ret = shlex.split(s.decode('latin-1'))
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
143 return [a.encode('latin-1') for a in ret]
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
144
30032
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
145 else:
31381
06440ba06bc0 pycompat: move imports of cStringIO/io to where they are used
Yuya Nishihara <yuya@tcha.org>
parents: 31368
diff changeset
146 import cStringIO
06440ba06bc0 pycompat: move imports of cStringIO/io to where they are used
Yuya Nishihara <yuya@tcha.org>
parents: 31368
diff changeset
147
31263
64596338ba10 py3: factor out bytechr() function
Yuya Nishihara <yuya@tcha.org>
parents: 31159
diff changeset
148 bytechr = chr
31391
c9fd842dc886 pycompat: add helper to iterate each char in bytes
Yuya Nishihara <yuya@tcha.org>
parents: 31381
diff changeset
149 iterbytestr = iter
31263
64596338ba10 py3: factor out bytechr() function
Yuya Nishihara <yuya@tcha.org>
parents: 31159
diff changeset
150
30032
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
151 def sysstr(s):
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
152 return s
2219f4f82ede pycompat: extract function that converts attribute or encoding name to str
Yuya Nishihara <yuya@tcha.org>
parents: 30031
diff changeset
153
30133
f6dcda7505f9 pycompat: only accept a bytestring filepath in Python 2
Martijn Pieters <mjpieters@fb.com>
parents: 30119
diff changeset
154 # Partial backport from os.py in Python 3, which only accepts bytes.
f6dcda7505f9 pycompat: only accept a bytestring filepath in Python 2
Martijn Pieters <mjpieters@fb.com>
parents: 30119
diff changeset
155 # In Python 2, our paths should only ever be bytes, a unicode path
f6dcda7505f9 pycompat: only accept a bytestring filepath in Python 2
Martijn Pieters <mjpieters@fb.com>
parents: 30119
diff changeset
156 # indicates a bug.
f6dcda7505f9 pycompat: only accept a bytestring filepath in Python 2
Martijn Pieters <mjpieters@fb.com>
parents: 30119
diff changeset
157 def fsencode(filename):
f6dcda7505f9 pycompat: only accept a bytestring filepath in Python 2
Martijn Pieters <mjpieters@fb.com>
parents: 30119
diff changeset
158 if isinstance(filename, str):
f6dcda7505f9 pycompat: only accept a bytestring filepath in Python 2
Martijn Pieters <mjpieters@fb.com>
parents: 30119
diff changeset
159 return filename
30119
f4a5e0e86a7e py3: add an os.fsencode backport to ease path handling
Martijn Pieters <mjpieters@fb.com>
parents: 30086
diff changeset
160 else:
30133
f6dcda7505f9 pycompat: only accept a bytestring filepath in Python 2
Martijn Pieters <mjpieters@fb.com>
parents: 30119
diff changeset
161 raise TypeError(
f6dcda7505f9 pycompat: only accept a bytestring filepath in Python 2
Martijn Pieters <mjpieters@fb.com>
parents: 30119
diff changeset
162 "expect str, not %s" % type(filename).__name__)
30119
f4a5e0e86a7e py3: add an os.fsencode backport to ease path handling
Martijn Pieters <mjpieters@fb.com>
parents: 30086
diff changeset
163
30313
42af0590f4b9 py3: add os.fsdecode() as pycompat.fsdecode()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30133
diff changeset
164 # In Python 2, fsdecode() has a very chance to receive bytes. So it's
42af0590f4b9 py3: add os.fsdecode() as pycompat.fsdecode()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30133
diff changeset
165 # better not to touch Python 2 part as it's already working fine.
42af0590f4b9 py3: add os.fsdecode() as pycompat.fsdecode()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30133
diff changeset
166 def fsdecode(filename):
42af0590f4b9 py3: add os.fsdecode() as pycompat.fsdecode()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30133
diff changeset
167 return filename
42af0590f4b9 py3: add os.fsdecode() as pycompat.fsdecode()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30133
diff changeset
168
30583
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
169 def getoptb(args, shortlist, namelist):
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
170 return getopt.getopt(args, shortlist, namelist)
c6ce11f2ee50 py3: make a bytes version of getopt.getopt()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30509
diff changeset
171
30584
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
172 def strkwargs(dic):
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
173 return dic
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
174
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
175 def byteskwargs(dic):
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
176 return dic
fbc3f73dc802 py3: utility functions to convert keys of kwargs to bytes/unicodes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30583
diff changeset
177
30315
3874ddba1ab4 py3: add a bytes version of os.name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30313
diff changeset
178 osname = os.name
30316
ad40d307a9f0 py3: have pycompat.ospathsep and pycompat.ossep
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30315
diff changeset
179 ospathsep = os.pathsep
ad40d307a9f0 py3: have pycompat.ospathsep and pycompat.ossep
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30315
diff changeset
180 ossep = os.sep
30628
c6026c20a3ce py3: have a bytes version of os.altsep
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30584
diff changeset
181 osaltsep = os.altsep
30481
277f4fe6d01a py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents: 30344
diff changeset
182 stdin = sys.stdin
277f4fe6d01a py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents: 30344
diff changeset
183 stdout = sys.stdout
277f4fe6d01a py3: provide bytes stdin/out/err through util module
Yuya Nishihara <yuya@tcha.org>
parents: 30344
diff changeset
184 stderr = sys.stderr
30888
86cd1f2cfff5 pycompat: verify sys.argv exists before forwarding it (issue5493)
Augie Fackler <augie@google.com>
parents: 30820
diff changeset
185 if getattr(sys, 'argv', None) is not None:
86cd1f2cfff5 pycompat: verify sys.argv exists before forwarding it (issue5493)
Augie Fackler <augie@google.com>
parents: 30820
diff changeset
186 sysargv = sys.argv
30629
a82a6eee2613 py3: have a bytes version of sys.platform
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30628
diff changeset
187 sysplatform = sys.platform
30509
fc0cfe6c87d7 py3: add os.getcwdb() to have bytes path
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30481
diff changeset
188 getcwd = os.getcwd
30671
3fcaf0f660ce py3: have bytes version of sys.executable
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30666
diff changeset
189 sysexecutable = sys.executable
30681
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30671
diff changeset
190 shlexsplit = shlex.split
31381
06440ba06bc0 pycompat: move imports of cStringIO/io to where they are used
Yuya Nishihara <yuya@tcha.org>
parents: 31368
diff changeset
191 stringio = cStringIO.StringIO
30315
3874ddba1ab4 py3: add a bytes version of os.name
Pulkit Goyal <7895pulkit@gmail.com>
parents: 30313
diff changeset
192
28818
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
193 empty = _queue.Empty
6041fb8f2da8 pycompat: add empty and queue to handle py3 divergence
timeless <timeless@mozdev.org>
parents:
diff changeset
194 queue = _queue.Queue
28834
2fac032c1269 pycompat: alias xrange to range in py3
timeless <timeless@mozdev.org>
parents: 28833
diff changeset
195
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
196 class _pycompatstub(object):
29812
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
197 def __init__(self):
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
198 self._aliases = {}
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
199
29812
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
200 def _registeraliases(self, origin, items):
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
201 """Add items that will be populated at the first access"""
30086
f3a1089654e3 pycompat: when setting attrs, ensure we use sysstr
Augie Fackler <augie@google.com>
parents: 30032
diff changeset
202 items = map(sysstr, items)
f3a1089654e3 pycompat: when setting attrs, ensure we use sysstr
Augie Fackler <augie@google.com>
parents: 30032
diff changeset
203 self._aliases.update(
f3a1089654e3 pycompat: when setting attrs, ensure we use sysstr
Augie Fackler <augie@google.com>
parents: 30032
diff changeset
204 (item.replace(sysstr('_'), sysstr('')).lower(), (origin, item))
f3a1089654e3 pycompat: when setting attrs, ensure we use sysstr
Augie Fackler <augie@google.com>
parents: 30032
diff changeset
205 for item in items)
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
206
29812
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
207 def __getattr__(self, name):
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
208 try:
29812
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
209 origin, item = self._aliases[name]
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
210 except KeyError:
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
211 raise AttributeError(name)
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
212 self.__dict__[name] = obj = getattr(origin, item)
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
213 return obj
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
214
29566
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
215 httpserver = _pycompatstub()
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
216 urlreq = _pycompatstub()
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
217 urlerr = _pycompatstub()
30031
0f6d6fdd3c2a pycompat: provide 'ispy3' constant
Yuya Nishihara <yuya@tcha.org>
parents: 29812
diff changeset
218 if not ispy3:
29566
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
219 import BaseHTTPServer
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
220 import CGIHTTPServer
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
221 import SimpleHTTPServer
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
222 import urllib2
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
223 import urllib
29812
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
224 urlreq._registeraliases(urllib, (
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
225 "addclosehook",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
226 "addinfourl",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
227 "ftpwrapper",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
228 "pathname2url",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
229 "quote",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
230 "splitattr",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
231 "splitpasswd",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
232 "splitport",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
233 "splituser",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
234 "unquote",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
235 "url2pathname",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
236 "urlencode",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
237 ))
29812
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
238 urlreq._registeraliases(urllib2, (
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
239 "AbstractHTTPHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
240 "BaseHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
241 "build_opener",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
242 "FileHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
243 "FTPHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
244 "HTTPBasicAuthHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
245 "HTTPDigestAuthHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
246 "HTTPHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
247 "HTTPPasswordMgrWithDefaultRealm",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
248 "HTTPSHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
249 "install_opener",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
250 "ProxyHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
251 "Request",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
252 "urlopen",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
253 ))
29812
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
254 urlerr._registeraliases(urllib2, (
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
255 "HTTPError",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
256 "URLError",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
257 ))
29812
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
258 httpserver._registeraliases(BaseHTTPServer, (
29566
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
259 "HTTPServer",
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
260 "BaseHTTPRequestHandler",
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
261 ))
29812
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
262 httpserver._registeraliases(SimpleHTTPServer, (
29566
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
263 "SimpleHTTPRequestHandler",
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
264 ))
29812
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
265 httpserver._registeraliases(CGIHTTPServer, (
29566
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
266 "CGIHTTPRequestHandler",
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
267 ))
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
268
29812
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
269 else:
31408
1ed169c5e235 pycompat: alias urllib symbols directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31391
diff changeset
270 import urllib.parse
1ed169c5e235 pycompat: alias urllib symbols directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31391
diff changeset
271 urlreq._registeraliases(urllib.parse, (
1ed169c5e235 pycompat: alias urllib symbols directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31391
diff changeset
272 "splitattr",
1ed169c5e235 pycompat: alias urllib symbols directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31391
diff changeset
273 "splitpasswd",
1ed169c5e235 pycompat: alias urllib symbols directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31391
diff changeset
274 "splitport",
1ed169c5e235 pycompat: alias urllib symbols directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31391
diff changeset
275 "splituser",
1ed169c5e235 pycompat: alias urllib symbols directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31391
diff changeset
276 "unquote",
1ed169c5e235 pycompat: alias urllib symbols directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31391
diff changeset
277 ))
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
278 import urllib.request
29812
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
279 urlreq._registeraliases(urllib.request, (
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
280 "AbstractHTTPHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
281 "BaseHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
282 "build_opener",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
283 "FileHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
284 "FTPHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
285 "ftpwrapper",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
286 "HTTPHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
287 "HTTPSHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
288 "install_opener",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
289 "pathname2url",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
290 "HTTPBasicAuthHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
291 "HTTPDigestAuthHandler",
29414
2646fbba4ca7 pycompat: add HTTPPasswordMgrWithDefaultRealm to Python 3 block
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29405
diff changeset
292 "HTTPPasswordMgrWithDefaultRealm",
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
293 "ProxyHandler",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
294 "Request",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
295 "url2pathname",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
296 "urlopen",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
297 ))
31408
1ed169c5e235 pycompat: alias urllib symbols directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31391
diff changeset
298 import urllib.response
1ed169c5e235 pycompat: alias urllib symbols directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31391
diff changeset
299 urlreq._registeraliases(urllib.response, (
1ed169c5e235 pycompat: alias urllib symbols directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31391
diff changeset
300 "addclosehook",
1ed169c5e235 pycompat: alias urllib symbols directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31391
diff changeset
301 "addinfourl",
1ed169c5e235 pycompat: alias urllib symbols directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31391
diff changeset
302 ))
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
303 import urllib.error
29812
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
304 urlerr._registeraliases(urllib.error, (
28882
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
305 "HTTPError",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
306 "URLError",
800ec7c048b0 pycompat: add util.urlerr util.urlreq classes for py3 compat
timeless <timeless@mozdev.org>
parents: 28835
diff changeset
307 ))
29566
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
308 import http.server
29812
c63ab0524db7 pycompat: delay loading modules registered to stub
Yuya Nishihara <yuya@tcha.org>
parents: 29811
diff changeset
309 httpserver._registeraliases(http.server, (
29566
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
310 "HTTPServer",
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
311 "BaseHTTPRequestHandler",
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
312 "SimpleHTTPRequestHandler",
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
313 "CGIHTTPRequestHandler",
075146e85bb6 py3: conditionalize BaseHTTPServer, SimpleHTTPServer and CGIHTTPServer import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29455
diff changeset
314 ))
31409
fb1f70331ee6 pycompat: custom implementation of urllib.parse.quote()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31408
diff changeset
315
fb1f70331ee6 pycompat: custom implementation of urllib.parse.quote()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31408
diff changeset
316 # urllib.parse.quote() accepts both str and bytes, decodes bytes
fb1f70331ee6 pycompat: custom implementation of urllib.parse.quote()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31408
diff changeset
317 # (if necessary), and returns str. This is wonky. We provide a custom
fb1f70331ee6 pycompat: custom implementation of urllib.parse.quote()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31408
diff changeset
318 # implementation that only accepts bytes and emits bytes.
fb1f70331ee6 pycompat: custom implementation of urllib.parse.quote()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31408
diff changeset
319 def quote(s, safe=r'/'):
fb1f70331ee6 pycompat: custom implementation of urllib.parse.quote()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31408
diff changeset
320 s = urllib.parse.quote_from_bytes(s, safe=safe)
fb1f70331ee6 pycompat: custom implementation of urllib.parse.quote()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31408
diff changeset
321 return s.encode('ascii', 'strict')
fb1f70331ee6 pycompat: custom implementation of urllib.parse.quote()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31408
diff changeset
322
fb1f70331ee6 pycompat: custom implementation of urllib.parse.quote()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31408
diff changeset
323 urlreq.quote = quote