author | Idan Kamara <idankk86@gmail.com> |
Sun, 16 Dec 2012 20:33:00 +0200 | |
changeset 18317 | 365fecd984c7 |
parent 17798 | 4091b0322918 |
child 19383 | 41c06a02814e |
permissions | -rw-r--r-- |
6887
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
1 |
# win32mbcs.py -- MBCS filename support for Mercurial |
5846
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
2 |
# |
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
3 |
# Copyright (c) 2008 Shun-ichi Goto <shunichi.goto@gmail.com> |
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
4 |
# |
10050
dd37f044f1fa
win32mbcs: Add configuration to specify path encoding
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9569
diff
changeset
|
5 |
# Version: 0.3 |
5846
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
6 |
# Author: Shun-ichi Goto <shunichi.goto@gmail.com> |
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
7 |
# |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8001
diff
changeset
|
8 |
# This software may be used and distributed according to the terms of the |
10263 | 9 |
# GNU General Public License version 2 or any later version. |
5846
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
10 |
# |
8228
eee2319c5895
add blank line after copyright notices and after header
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
11 |
|
8932
f87884329419
extensions: fix up description lines some more
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
8894
diff
changeset
|
12 |
'''allow the use of MBCS paths with problematic encodings |
5846
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
13 |
|
8001
c0e3aca616de
win32mbcs: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7983
diff
changeset
|
14 |
Some MBCS encodings are not good for some path operations (i.e. |
c0e3aca616de
win32mbcs: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7983
diff
changeset
|
15 |
splitting path, case conversion, etc.) with its encoded bytes. We call |
c0e3aca616de
win32mbcs: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7983
diff
changeset
|
16 |
such a encoding (i.e. shift_jis and big5) as "problematic encoding". |
c0e3aca616de
win32mbcs: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7983
diff
changeset
|
17 |
This extension can be used to fix the issue with those encodings by |
8665
e4ad46f9a004
win32mbcs: capitalize Unicode
Martin Geisler <mg@lazybytes.net>
parents:
8491
diff
changeset
|
18 |
wrapping some functions to convert to Unicode string before path |
8001
c0e3aca616de
win32mbcs: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7983
diff
changeset
|
19 |
operation. |
5846
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
20 |
|
8668
aea3a23151bd
fixed typos found in translatable strings
Martin Geisler <mg@lazybytes.net>
parents:
8667
diff
changeset
|
21 |
This extension is useful for: |
9216
9b2649b6ce5c
win32mbcs: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9154
diff
changeset
|
22 |
|
9b2649b6ce5c
win32mbcs: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9154
diff
changeset
|
23 |
- Japanese Windows users using shift_jis encoding. |
9b2649b6ce5c
win32mbcs: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9154
diff
changeset
|
24 |
- Chinese Windows users using big5 encoding. |
9b2649b6ce5c
win32mbcs: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9154
diff
changeset
|
25 |
- All users who use a repository with one of problematic encodings on |
9b2649b6ce5c
win32mbcs: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9154
diff
changeset
|
26 |
case-insensitive file system. |
6887
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
27 |
|
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
28 |
This extension is not needed for: |
9216
9b2649b6ce5c
win32mbcs: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9154
diff
changeset
|
29 |
|
9b2649b6ce5c
win32mbcs: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9154
diff
changeset
|
30 |
- Any user who use only ASCII chars in path. |
9b2649b6ce5c
win32mbcs: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9154
diff
changeset
|
31 |
- Any user who do not use any of problematic encodings. |
5846
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
32 |
|
6887
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
33 |
Note that there are some limitations on using this extension: |
9216
9b2649b6ce5c
win32mbcs: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9154
diff
changeset
|
34 |
|
9b2649b6ce5c
win32mbcs: fix formatting of lists with proper reST markup
Martin Geisler <mg@lazybytes.net>
parents:
9154
diff
changeset
|
35 |
- You should use single encoding in one repository. |
13067
9696954415db
win32mbcs: use extsetup() to wrap functions only once.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
10264
diff
changeset
|
36 |
- If the repository path ends with 0x5c, .hg/hgrc cannot be read. |
13330
551856dea9a6
win32mbcs: Fix typo in documentation
Javi Merino <cibervicho@gmail.com>
parents:
13067
diff
changeset
|
37 |
- win32mbcs is not compatible with fixutf8 extension. |
10050
dd37f044f1fa
win32mbcs: Add configuration to specify path encoding
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9569
diff
changeset
|
38 |
|
10067
fd6729805f44
win32mbcs: fix typos and reST syntax
Martin Geisler <mg@lazybytes.net>
parents:
10050
diff
changeset
|
39 |
By default, win32mbcs uses encoding.encoding decided by Mercurial. |
fd6729805f44
win32mbcs: fix typos and reST syntax
Martin Geisler <mg@lazybytes.net>
parents:
10050
diff
changeset
|
40 |
You can specify the encoding by config option:: |
6887
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
41 |
|
10050
dd37f044f1fa
win32mbcs: Add configuration to specify path encoding
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9569
diff
changeset
|
42 |
[win32mbcs] |
dd37f044f1fa
win32mbcs: Add configuration to specify path encoding
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9569
diff
changeset
|
43 |
encoding = sjis |
dd37f044f1fa
win32mbcs: Add configuration to specify path encoding
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9569
diff
changeset
|
44 |
|
10067
fd6729805f44
win32mbcs: fix typos and reST syntax
Martin Geisler <mg@lazybytes.net>
parents:
10050
diff
changeset
|
45 |
It is useful for the users who want to commit with UTF-8 log message. |
8894
868670dbc237
extensions: improve the consistency of synopses
Cédric Duval <cedricduval@free.fr>
parents:
8866
diff
changeset
|
46 |
''' |
5846
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
47 |
|
9098
5e4654f5522d
win32mbcs: look up modules using sys.modules (issue1729)
Brodie Rao <me+hg@dackz.net>
parents:
8932
diff
changeset
|
48 |
import os, sys |
5846
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
49 |
from mercurial.i18n import _ |
7948
de377b1a9a84
move encoding bits from util to encoding
Matt Mackall <mpm@selenic.com>
parents:
7877
diff
changeset
|
50 |
from mercurial import util, encoding |
16743
38caf405d010
hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents:
15724
diff
changeset
|
51 |
testedwith = 'internal' |
5846
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
52 |
|
13067
9696954415db
win32mbcs: use extsetup() to wrap functions only once.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
10264
diff
changeset
|
53 |
_encoding = None # see extsetup |
10050
dd37f044f1fa
win32mbcs: Add configuration to specify path encoding
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9569
diff
changeset
|
54 |
|
6887
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
55 |
def decode(arg): |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
56 |
if isinstance(arg, str): |
10050
dd37f044f1fa
win32mbcs: Add configuration to specify path encoding
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9569
diff
changeset
|
57 |
uarg = arg.decode(_encoding) |
dd37f044f1fa
win32mbcs: Add configuration to specify path encoding
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9569
diff
changeset
|
58 |
if arg == uarg.encode(_encoding): |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
59 |
return uarg |
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
60 |
raise UnicodeError("Not local encoding") |
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
61 |
elif isinstance(arg, tuple): |
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
62 |
return tuple(map(decode, arg)) |
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
63 |
elif isinstance(arg, list): |
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
64 |
return map(decode, arg) |
9131
2bbb8419720d
win32mbcs: wrapper supports keyword arguments and dict result.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9100
diff
changeset
|
65 |
elif isinstance(arg, dict): |
2bbb8419720d
win32mbcs: wrapper supports keyword arguments and dict result.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9100
diff
changeset
|
66 |
for k, v in arg.items(): |
2bbb8419720d
win32mbcs: wrapper supports keyword arguments and dict result.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9100
diff
changeset
|
67 |
arg[k] = decode(v) |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
68 |
return arg |
6887
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
69 |
|
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
70 |
def encode(arg): |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
71 |
if isinstance(arg, unicode): |
10050
dd37f044f1fa
win32mbcs: Add configuration to specify path encoding
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9569
diff
changeset
|
72 |
return arg.encode(_encoding) |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
73 |
elif isinstance(arg, tuple): |
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
74 |
return tuple(map(encode, arg)) |
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
75 |
elif isinstance(arg, list): |
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
76 |
return map(encode, arg) |
9131
2bbb8419720d
win32mbcs: wrapper supports keyword arguments and dict result.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9100
diff
changeset
|
77 |
elif isinstance(arg, dict): |
2bbb8419720d
win32mbcs: wrapper supports keyword arguments and dict result.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9100
diff
changeset
|
78 |
for k, v in arg.items(): |
2bbb8419720d
win32mbcs: wrapper supports keyword arguments and dict result.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9100
diff
changeset
|
79 |
arg[k] = encode(v) |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
80 |
return arg |
6887
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
81 |
|
9132
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
82 |
def appendsep(s): |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
83 |
# ensure the path ends with os.sep, appending it if necessary. |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
84 |
try: |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
85 |
us = decode(s) |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
86 |
except UnicodeError: |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
87 |
us = s |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
88 |
if us and us[-1] not in ':/\\': |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
89 |
s += os.sep |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
90 |
return s |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
91 |
|
17798
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
92 |
|
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
93 |
def basewrapper(func, argtype, enc, dec, args, kwds): |
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
94 |
# check check already converted, then call original |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
95 |
for arg in args: |
17798
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
96 |
if isinstance(arg, argtype): |
9131
2bbb8419720d
win32mbcs: wrapper supports keyword arguments and dict result.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9100
diff
changeset
|
97 |
return func(*args, **kwds) |
5846
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
98 |
|
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
99 |
try: |
17798
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
100 |
# convert string arguments, call func, then convert back the |
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
101 |
# return value. |
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
102 |
return enc(func(*dec(args), **dec(kwds))) |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
103 |
except UnicodeError: |
9132
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
104 |
raise util.Abort(_("[win32mbcs] filename conversion failed with" |
10050
dd37f044f1fa
win32mbcs: Add configuration to specify path encoding
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9569
diff
changeset
|
105 |
" %s encoding\n") % (_encoding)) |
6887
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
106 |
|
17798
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
107 |
def wrapper(func, args, kwds): |
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
108 |
return basewrapper(func, unicode, encode, decode, args, kwds) |
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
109 |
|
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
110 |
|
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
111 |
def reversewrapper(func, args, kwds): |
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
112 |
return basewrapper(func, str, decode, encode, args, kwds) |
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
113 |
|
9132
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
114 |
def wrapperforlistdir(func, args, kwds): |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
115 |
# Ensure 'path' argument ends with os.sep to avoids |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
116 |
# misinterpreting last 0x5c of MBCS 2nd byte as path separator. |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
117 |
if args: |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
118 |
args = list(args) |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
119 |
args[0] = appendsep(args[0]) |
9391
2705e6816d33
use 'x in dict' instead of 'dict.has_key(x)'
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9275
diff
changeset
|
120 |
if 'path' in kwds: |
9132
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
121 |
kwds['path'] = appendsep(kwds['path']) |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
122 |
return func(*args, **kwds) |
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
123 |
|
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
124 |
def wrapname(name, wrapper): |
9098
5e4654f5522d
win32mbcs: look up modules using sys.modules (issue1729)
Brodie Rao <me+hg@dackz.net>
parents:
8932
diff
changeset
|
125 |
module, name = name.rsplit('.', 1) |
5e4654f5522d
win32mbcs: look up modules using sys.modules (issue1729)
Brodie Rao <me+hg@dackz.net>
parents:
8932
diff
changeset
|
126 |
module = sys.modules[module] |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
127 |
func = getattr(module, name) |
9131
2bbb8419720d
win32mbcs: wrapper supports keyword arguments and dict result.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9100
diff
changeset
|
128 |
def f(*args, **kwds): |
2bbb8419720d
win32mbcs: wrapper supports keyword arguments and dict result.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9100
diff
changeset
|
129 |
return wrapper(func, args, kwds) |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
130 |
try: |
17428
72803c8edaa4
avoid using abbreviations that look like spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
16743
diff
changeset
|
131 |
f.__name__ = func.__name__ # fails with Python 2.3 |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
132 |
except Exception: |
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
133 |
pass |
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
134 |
setattr(module, name, f) |
6887
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
135 |
|
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
136 |
# List of functions to be wrapped. |
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
137 |
# NOTE: os.path.dirname() and os.path.basename() are safe because |
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
138 |
# they use result of os.path.split() |
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
139 |
funcs = '''os.path.join os.path.split os.path.splitext |
15724
9e6a13c2aeb9
win32mbcs: allow win32mbcs extension to be enabled on cygwin platform
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
140 |
os.path.normpath os.makedirs |
9098
5e4654f5522d
win32mbcs: look up modules using sys.modules (issue1729)
Brodie Rao <me+hg@dackz.net>
parents:
8932
diff
changeset
|
141 |
mercurial.util.endswithsep mercurial.util.splitpath mercurial.util.checkcase |
14841
6990340c57a8
win32mbcs: wrap two more functions to be wrapped.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
13330
diff
changeset
|
142 |
mercurial.util.fspath mercurial.util.pconvert mercurial.util.normpath |
6990340c57a8
win32mbcs: wrap two more functions to be wrapped.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
13330
diff
changeset
|
143 |
mercurial.util.checkwinfilename mercurial.util.checkosfilename''' |
5846
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
144 |
|
17798
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
145 |
# These functions are required to be called with local encoded string |
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
146 |
# because they expects argument is local encoded string and cause |
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
147 |
# problem with unicode string. |
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
148 |
rfuncs = '''mercurial.encoding.upper mercurial.encoding.lower''' |
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
149 |
|
15724
9e6a13c2aeb9
win32mbcs: allow win32mbcs extension to be enabled on cygwin platform
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
150 |
# List of Windows specific functions to be wrapped. |
9e6a13c2aeb9
win32mbcs: allow win32mbcs extension to be enabled on cygwin platform
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
151 |
winfuncs = '''os.path.splitunc''' |
9e6a13c2aeb9
win32mbcs: allow win32mbcs extension to be enabled on cygwin platform
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
152 |
|
5846
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
153 |
# codec and alias names of sjis and big5 to be faked. |
6887
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
154 |
problematic_encodings = '''big5 big5-tw csbig5 big5hkscs big5-hkscs |
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
155 |
hkscs cp932 932 ms932 mskanji ms-kanji shift_jis csshiftjis shiftjis |
304484c7e0ba
Update win32mbcs extension
Shun-ichi Goto <shunichi.goto@gmail.com>
parents:
6210
diff
changeset
|
156 |
sjis s_jis shift_jis_2004 shiftjis2004 sjis_2004 sjis2004 |
8714
505a96cbc923
Add cp950 as problematic encoding which is used in chinese windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
8668
diff
changeset
|
157 |
shift_jisx0213 shiftjisx0213 sjisx0213 s_jisx0213 950 cp950 ms950 ''' |
5846
02884e56c217
New extension to support problematic MBCS on Windows.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
diff
changeset
|
158 |
|
13067
9696954415db
win32mbcs: use extsetup() to wrap functions only once.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
10264
diff
changeset
|
159 |
def extsetup(ui): |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
160 |
# TODO: decide use of config section for this extension |
15724
9e6a13c2aeb9
win32mbcs: allow win32mbcs extension to be enabled on cygwin platform
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
161 |
if ((not os.path.supports_unicode_filenames) and |
9e6a13c2aeb9
win32mbcs: allow win32mbcs extension to be enabled on cygwin platform
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
162 |
(sys.platform != 'cygwin')): |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
163 |
ui.warn(_("[win32mbcs] cannot activate on this platform.\n")) |
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
164 |
return |
10050
dd37f044f1fa
win32mbcs: Add configuration to specify path encoding
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9569
diff
changeset
|
165 |
# determine encoding for filename |
dd37f044f1fa
win32mbcs: Add configuration to specify path encoding
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9569
diff
changeset
|
166 |
global _encoding |
dd37f044f1fa
win32mbcs: Add configuration to specify path encoding
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9569
diff
changeset
|
167 |
_encoding = ui.config('win32mbcs', 'encoding', encoding.encoding) |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
168 |
# fake is only for relevant environment. |
10050
dd37f044f1fa
win32mbcs: Add configuration to specify path encoding
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9569
diff
changeset
|
169 |
if _encoding.lower() in problematic_encodings.split(): |
7877
eba7f12b0c51
cleanup: whitespace cleanup
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
7598
diff
changeset
|
170 |
for f in funcs.split(): |
9132
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
171 |
wrapname(f, wrapper) |
15724
9e6a13c2aeb9
win32mbcs: allow win32mbcs extension to be enabled on cygwin platform
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
172 |
if os.name == 'nt': |
9e6a13c2aeb9
win32mbcs: allow win32mbcs extension to be enabled on cygwin platform
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
173 |
for f in winfuncs.split(): |
9e6a13c2aeb9
win32mbcs: allow win32mbcs extension to be enabled on cygwin platform
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
15672
diff
changeset
|
174 |
wrapname(f, wrapper) |
9132
b47d7b440c5c
win32mbcs: add special wrapper for osutil.listdir().
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
9131
diff
changeset
|
175 |
wrapname("mercurial.osutil.listdir", wrapperforlistdir) |
17798
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
176 |
# wrap functions to be called with local byte string arguments |
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
177 |
for f in rfuncs.split(): |
4091b0322918
win32mbcs: add reversing wrapper for some unicode-incompatible functions.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
17428
diff
changeset
|
178 |
wrapname(f, reversewrapper) |
13067
9696954415db
win32mbcs: use extsetup() to wrap functions only once.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
10264
diff
changeset
|
179 |
# Check sys.args manually instead of using ui.debug() because |
9696954415db
win32mbcs: use extsetup() to wrap functions only once.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
10264
diff
changeset
|
180 |
# command line options is not yet applied when |
9696954415db
win32mbcs: use extsetup() to wrap functions only once.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
10264
diff
changeset
|
181 |
# extensions.loadall() is called. |
9696954415db
win32mbcs: use extsetup() to wrap functions only once.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
10264
diff
changeset
|
182 |
if '--debug' in sys.argv: |
9696954415db
win32mbcs: use extsetup() to wrap functions only once.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
10264
diff
changeset
|
183 |
ui.write("[win32mbcs] activated with encoding: %s\n" |
9696954415db
win32mbcs: use extsetup() to wrap functions only once.
Shun-ichi GOTO <shunichi.goto@gmail.com>
parents:
10264
diff
changeset
|
184 |
% _encoding) |