author | Augie Fackler <augie@google.com> |
Fri, 14 Dec 2018 12:00:38 -0500 | |
changeset 40948 | a314eafd7c8d |
parent 38815 | 617ae7e33a65 |
child 43691 | 47ef023d0165 |
permissions | -rwxr-xr-x |
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
1 |
#!/usr/bin/env python |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
2 |
# |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
3 |
# hggettext - carefully extract docstrings for Mercurial |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
4 |
# |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
5 |
# Copyright 2009 Matt Mackall <mpm@selenic.com> and others |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
6 |
# |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
7 |
# This software may be used and distributed according to the terms of the |
10263 | 8 |
# GNU General Public License version 2 or any later version. |
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
9 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
10 |
# The normalize function is taken from pygettext which is distributed |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
11 |
# with Python under the Python License, which is GPL compatible. |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
12 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
13 |
"""Extract docstrings from Mercurial commands. |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
14 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
15 |
Compared to pygettext, this script knows about the cmdtable and table |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
16 |
dictionaries used by Mercurial, and will only extract docstrings from |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
17 |
functions mentioned therein. |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
18 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
19 |
Use xgettext like normal to extract strings marked as translatable and |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
20 |
join the message cataloges to get the final catalog. |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
21 |
""" |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
22 |
|
29171
de28dedd1ff1
py3: make i18n/hggettext use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29170
diff
changeset
|
23 |
from __future__ import absolute_import, print_function |
29170
2516bba643e7
py3: make i18n/hggettext use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
12823
diff
changeset
|
24 |
|
2516bba643e7
py3: make i18n/hggettext use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
12823
diff
changeset
|
25 |
import inspect |
2516bba643e7
py3: make i18n/hggettext use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
12823
diff
changeset
|
26 |
import os |
33817
726dd73df3b9
i18n: ignore doctest part to avoid warning at "make update-pot"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33815
diff
changeset
|
27 |
import re |
29170
2516bba643e7
py3: make i18n/hggettext use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents:
12823
diff
changeset
|
28 |
import sys |
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
29 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
30 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
31 |
def escape(s): |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
32 |
# The order is important, the backslash must be escaped first |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
33 |
# since the other replacements introduce new backslashes |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
34 |
# themselves. |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
35 |
s = s.replace('\\', '\\\\') |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
36 |
s = s.replace('\n', '\\n') |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
37 |
s = s.replace('\r', '\\r') |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
38 |
s = s.replace('\t', '\\t') |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
39 |
s = s.replace('"', '\\"') |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
40 |
return s |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
41 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
42 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
43 |
def normalize(s): |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
44 |
# This converts the various Python string types into a format that |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
45 |
# is appropriate for .po files, namely much closer to C style. |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
46 |
lines = s.split('\n') |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
47 |
if len(lines) == 1: |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
48 |
s = '"' + escape(s) + '"' |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
49 |
else: |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
50 |
if not lines[-1]: |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
51 |
del lines[-1] |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
52 |
lines[-1] = lines[-1] + '\n' |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
53 |
lines = map(escape, lines) |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
54 |
lineterm = '\\n"\n"' |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
55 |
s = '""\n"' + lineterm.join(lines) + '"' |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
56 |
return s |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
57 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
58 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
59 |
def poentry(path, lineno, s): |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
60 |
return ('#: %s:%d\n' % (path, lineno) + |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
61 |
'msgid %s\n' % normalize(s) + |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
62 |
'msgstr ""\n') |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
63 |
|
33817
726dd73df3b9
i18n: ignore doctest part to avoid warning at "make update-pot"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33815
diff
changeset
|
64 |
doctestre = re.compile(r'^ +>>> ', re.MULTILINE) |
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
65 |
|
38815
617ae7e33a65
i18n: format warning of hggettext in standard compiler error style
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
36948
diff
changeset
|
66 |
def offset(src, doc, name, lineno, default): |
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
67 |
"""Compute offset or issue a warning on stdout.""" |
33817
726dd73df3b9
i18n: ignore doctest part to avoid warning at "make update-pot"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33815
diff
changeset
|
68 |
# remove doctest part, in order to avoid backslash mismatching |
726dd73df3b9
i18n: ignore doctest part to avoid warning at "make update-pot"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33815
diff
changeset
|
69 |
m = doctestre.search(doc) |
726dd73df3b9
i18n: ignore doctest part to avoid warning at "make update-pot"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33815
diff
changeset
|
70 |
if m: |
726dd73df3b9
i18n: ignore doctest part to avoid warning at "make update-pot"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33815
diff
changeset
|
71 |
doc = doc[:m.start()] |
726dd73df3b9
i18n: ignore doctest part to avoid warning at "make update-pot"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33815
diff
changeset
|
72 |
|
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
73 |
# Backslashes in doc appear doubled in src. |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
74 |
end = src.find(doc.replace('\\', '\\\\')) |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
75 |
if end == -1: |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
76 |
# This can happen if the docstring contains unnecessary escape |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
77 |
# sequences such as \" in a triple-quoted string. The problem |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
78 |
# is that \" is turned into " and so doc wont appear in src. |
38815
617ae7e33a65
i18n: format warning of hggettext in standard compiler error style
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
36948
diff
changeset
|
79 |
sys.stderr.write("%s:%d:warning:" |
617ae7e33a65
i18n: format warning of hggettext in standard compiler error style
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
36948
diff
changeset
|
80 |
" unknown docstr offset, assuming %d lines\n" |
617ae7e33a65
i18n: format warning of hggettext in standard compiler error style
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
36948
diff
changeset
|
81 |
% (name, lineno, default)) |
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
82 |
return default |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
83 |
else: |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
84 |
return src.count('\n', 0, end) |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
85 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
86 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
87 |
def importpath(path): |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
88 |
"""Import a path like foo/bar/baz.py and return the baz module.""" |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
89 |
if path.endswith('.py'): |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
90 |
path = path[:-3] |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
91 |
if path.endswith('/__init__'): |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
92 |
path = path[:-9] |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
93 |
path = path.replace('/', '.') |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
94 |
mod = __import__(path) |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
95 |
for comp in path.split('.')[1:]: |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
96 |
mod = getattr(mod, comp) |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
97 |
return mod |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
98 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
99 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
100 |
def docstrings(path): |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
101 |
"""Extract docstrings from path. |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
102 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
103 |
This respects the Mercurial cmdtable/table convention and will |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
104 |
only extract docstrings from functions mentioned in these tables. |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
105 |
""" |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
106 |
mod = importpath(path) |
33819
d5ef17608159
i18n: ignore docstring for modules under mercurial
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33818
diff
changeset
|
107 |
if not path.startswith('mercurial/') and mod.__doc__: |
36948
0585337ea787
cleanup: fix some latent open(path).read() et al calls we previously missed
Augie Fackler <augie@google.com>
parents:
33819
diff
changeset
|
108 |
with open(path) as fobj: |
0585337ea787
cleanup: fix some latent open(path).read() et al calls we previously missed
Augie Fackler <augie@google.com>
parents:
33819
diff
changeset
|
109 |
src = fobj.read() |
38815
617ae7e33a65
i18n: format warning of hggettext in standard compiler error style
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
36948
diff
changeset
|
110 |
lineno = 1 + offset(src, mod.__doc__, path, 1, 7) |
29171
de28dedd1ff1
py3: make i18n/hggettext use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29170
diff
changeset
|
111 |
print(poentry(path, lineno, mod.__doc__)) |
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
112 |
|
12823
80deae3bc5ea
hggettext: handle i18nfunctions declaration for docstrings translations
Patrick Mezard <pmezard@gmail.com>
parents:
10263
diff
changeset
|
113 |
functions = list(getattr(mod, 'i18nfunctions', [])) |
80deae3bc5ea
hggettext: handle i18nfunctions declaration for docstrings translations
Patrick Mezard <pmezard@gmail.com>
parents:
10263
diff
changeset
|
114 |
functions = [(f, True) for f in functions] |
80deae3bc5ea
hggettext: handle i18nfunctions declaration for docstrings translations
Patrick Mezard <pmezard@gmail.com>
parents:
10263
diff
changeset
|
115 |
|
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
116 |
cmdtable = getattr(mod, 'cmdtable', {}) |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
117 |
if not cmdtable: |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
118 |
# Maybe we are processing mercurial.commands? |
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
119 |
cmdtable = getattr(mod, 'table', {}) |
12823
80deae3bc5ea
hggettext: handle i18nfunctions declaration for docstrings translations
Patrick Mezard <pmezard@gmail.com>
parents:
10263
diff
changeset
|
120 |
functions.extend((c[0], False) for c in cmdtable.itervalues()) |
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
121 |
|
12823
80deae3bc5ea
hggettext: handle i18nfunctions declaration for docstrings translations
Patrick Mezard <pmezard@gmail.com>
parents:
10263
diff
changeset
|
122 |
for func, rstrip in functions: |
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
123 |
if func.__doc__: |
33818
ed04d7254a91
i18n: use saved object to get actual function information if available
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33817
diff
changeset
|
124 |
docobj = func # this might be a proxy to provide formatted doc |
ed04d7254a91
i18n: use saved object to get actual function information if available
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33817
diff
changeset
|
125 |
func = getattr(func, '_origfunc', func) |
33621
16a175b3681e
i18n: use actual filename, in which function is defined, for hg.pot
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29720
diff
changeset
|
126 |
funcmod = inspect.getmodule(func) |
16a175b3681e
i18n: use actual filename, in which function is defined, for hg.pot
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29720
diff
changeset
|
127 |
extra = '' |
16a175b3681e
i18n: use actual filename, in which function is defined, for hg.pot
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29720
diff
changeset
|
128 |
if funcmod.__package__ == funcmod.__name__: |
16a175b3681e
i18n: use actual filename, in which function is defined, for hg.pot
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29720
diff
changeset
|
129 |
extra = '/__init__' |
16a175b3681e
i18n: use actual filename, in which function is defined, for hg.pot
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29720
diff
changeset
|
130 |
actualpath = '%s%s.py' % (funcmod.__name__.replace('.', '/'), extra) |
16a175b3681e
i18n: use actual filename, in which function is defined, for hg.pot
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29720
diff
changeset
|
131 |
|
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
132 |
src = inspect.getsource(func) |
29720
041fecbb588a
i18n: use inspect.getsourcelines() to obtain lineno from func or class
Yuya Nishihara <yuya@tcha.org>
parents:
29171
diff
changeset
|
133 |
lineno = inspect.getsourcelines(func)[1] |
33818
ed04d7254a91
i18n: use saved object to get actual function information if available
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33817
diff
changeset
|
134 |
doc = docobj.__doc__ |
ed04d7254a91
i18n: use saved object to get actual function information if available
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33817
diff
changeset
|
135 |
origdoc = getattr(docobj, '_origdoc', '') |
12823
80deae3bc5ea
hggettext: handle i18nfunctions declaration for docstrings translations
Patrick Mezard <pmezard@gmail.com>
parents:
10263
diff
changeset
|
136 |
if rstrip: |
80deae3bc5ea
hggettext: handle i18nfunctions declaration for docstrings translations
Patrick Mezard <pmezard@gmail.com>
parents:
10263
diff
changeset
|
137 |
doc = doc.rstrip() |
33815
97ee669f1f6d
i18n: make hggettext use original docstring to compute offset
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33621
diff
changeset
|
138 |
origdoc = origdoc.rstrip() |
97ee669f1f6d
i18n: make hggettext use original docstring to compute offset
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33621
diff
changeset
|
139 |
if origdoc: |
38815
617ae7e33a65
i18n: format warning of hggettext in standard compiler error style
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
36948
diff
changeset
|
140 |
lineno += offset(src, origdoc, actualpath, lineno, 1) |
33815
97ee669f1f6d
i18n: make hggettext use original docstring to compute offset
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
33621
diff
changeset
|
141 |
else: |
38815
617ae7e33a65
i18n: format warning of hggettext in standard compiler error style
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
36948
diff
changeset
|
142 |
lineno += offset(src, doc, actualpath, lineno, 1) |
33621
16a175b3681e
i18n: use actual filename, in which function is defined, for hg.pot
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29720
diff
changeset
|
143 |
print(poentry(actualpath, lineno, doc)) |
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
144 |
|
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
145 |
|
9539
c904e76e3834
help: move help topics from mercurial/help.py to help/*.txt
Martin Geisler <mg@lazybytes.net>
parents:
8626
diff
changeset
|
146 |
def rawtext(path): |
36948
0585337ea787
cleanup: fix some latent open(path).read() et al calls we previously missed
Augie Fackler <augie@google.com>
parents:
33819
diff
changeset
|
147 |
with open(path) as f: |
0585337ea787
cleanup: fix some latent open(path).read() et al calls we previously missed
Augie Fackler <augie@google.com>
parents:
33819
diff
changeset
|
148 |
src = f.read() |
29171
de28dedd1ff1
py3: make i18n/hggettext use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents:
29170
diff
changeset
|
149 |
print(poentry(path, 1, src)) |
9539
c904e76e3834
help: move help topics from mercurial/help.py to help/*.txt
Martin Geisler <mg@lazybytes.net>
parents:
8626
diff
changeset
|
150 |
|
c904e76e3834
help: move help topics from mercurial/help.py to help/*.txt
Martin Geisler <mg@lazybytes.net>
parents:
8626
diff
changeset
|
151 |
|
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
152 |
if __name__ == "__main__": |
8626
1fc1c77d4863
hggettext: ensure correct Mercurial is imported
Martin Geisler <mg@lazybytes.net>
parents:
8542
diff
changeset
|
153 |
# It is very important that we import the Mercurial modules from |
1fc1c77d4863
hggettext: ensure correct Mercurial is imported
Martin Geisler <mg@lazybytes.net>
parents:
8542
diff
changeset
|
154 |
# the source tree where hggettext is executed. Otherwise we might |
1fc1c77d4863
hggettext: ensure correct Mercurial is imported
Martin Geisler <mg@lazybytes.net>
parents:
8542
diff
changeset
|
155 |
# accidentally import and extract strings from a Mercurial |
1fc1c77d4863
hggettext: ensure correct Mercurial is imported
Martin Geisler <mg@lazybytes.net>
parents:
8542
diff
changeset
|
156 |
# installation mentioned in PYTHONPATH. |
1fc1c77d4863
hggettext: ensure correct Mercurial is imported
Martin Geisler <mg@lazybytes.net>
parents:
8542
diff
changeset
|
157 |
sys.path.insert(0, os.getcwd()) |
1fc1c77d4863
hggettext: ensure correct Mercurial is imported
Martin Geisler <mg@lazybytes.net>
parents:
8542
diff
changeset
|
158 |
from mercurial import demandimport; demandimport.enable() |
8542
de150a942ec8
i18n: accurately generate hg.pot
Martin Geisler <mg@lazybytes.net>
parents:
diff
changeset
|
159 |
for path in sys.argv[1:]: |
9539
c904e76e3834
help: move help topics from mercurial/help.py to help/*.txt
Martin Geisler <mg@lazybytes.net>
parents:
8626
diff
changeset
|
160 |
if path.endswith('.txt'): |
c904e76e3834
help: move help topics from mercurial/help.py to help/*.txt
Martin Geisler <mg@lazybytes.net>
parents:
8626
diff
changeset
|
161 |
rawtext(path) |
c904e76e3834
help: move help topics from mercurial/help.py to help/*.txt
Martin Geisler <mg@lazybytes.net>
parents:
8626
diff
changeset
|
162 |
else: |
c904e76e3834
help: move help topics from mercurial/help.py to help/*.txt
Martin Geisler <mg@lazybytes.net>
parents:
8626
diff
changeset
|
163 |
docstrings(path) |