Patchwork [4,of,6] i18n: use saved object to get actual function information if available

login
register
mail settings
Submitter Katsunori FUJIWARA
Date Aug. 15, 2017, 4:19 p.m.
Message ID <b6dd19c795147e675b9c.1502813944@speaknoevil>
Download mbox | patch
Permalink /patch/23020/
State Accepted
Headers show

Comments

Katsunori FUJIWARA - Aug. 15, 2017, 4:19 p.m.
# HG changeset patch
# User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
# Date 1502792844 -32400
#      Tue Aug 15 19:27:24 2017 +0900
# Node ID b6dd19c795147e675b9caf58383b6cafd3f03534
# Parent  1d204d17d51eb143f1ef66426cec1831cd8c93bf
# Available At https://bitbucket.org/foozy/mercurial-wip
#              hg pull https://bitbucket.org/foozy/mercurial-wip -r b6dd19c79514
# EXP-Topic i18n-fix-update-pot-issues
i18n: use saved object to get actual function information if available

To list up available compression types instead of
".. bundlecompressionmarker" in "hg help bundlespec" output, proxy
object "docobject" is used, because:

- current online help system requires that __doc__ of registered
  object (maybe, function) is already well formatted in reST syntax

- bundletype() method of compressionengine classes is used to list up
  available compression types, but

- __doc__ of bundletype() object (= "instancemethod") is read-only

On the other hand, hggettext requires original function object, in
order to get document location in source code.

Therefore, description of each compression types isn't yet
translatable. Even if translatable, translators should make much
effort to determine location of original texts in source code.

To get actual function information, this patch makes hggettext use
function object saved as "_origfunc", if it is available. This patch
also changes bundlecompressiontopics() side, in order to explain how
these changes work easily.

This patch is a part of preparations for making description of each
compression types translatable.
Yuya Nishihara - Aug. 21, 2017, 12:46 p.m.
On Wed, 16 Aug 2017 01:19:04 +0900, FUJIWARA Katsunori wrote:
> # HG changeset patch
> # User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
> # Date 1502792844 -32400
> #      Tue Aug 15 19:27:24 2017 +0900
> # Node ID b6dd19c795147e675b9caf58383b6cafd3f03534
> # Parent  1d204d17d51eb143f1ef66426cec1831cd8c93bf
> # Available At https://bitbucket.org/foozy/mercurial-wip
> #              hg pull https://bitbucket.org/foozy/mercurial-wip -r b6dd19c79514
> # EXP-Topic i18n-fix-update-pot-issues
> i18n: use saved object to get actual function information if available
> 
> To list up available compression types instead of
> ".. bundlecompressionmarker" in "hg help bundlespec" output, proxy
> object "docobject" is used, because:
> 
> - current online help system requires that __doc__ of registered
>   object (maybe, function) is already well formatted in reST syntax
> 
> - bundletype() method of compressionengine classes is used to list up
>   available compression types, but
> 
> - __doc__ of bundletype() object (= "instancemethod") is read-only

Just curious. Any reason why we can't make the bundletype.__doc__ statically
formatted?

Patch

diff --git a/i18n/hggettext b/i18n/hggettext
--- a/i18n/hggettext
+++ b/i18n/hggettext
@@ -119,6 +119,8 @@  def docstrings(path):
 
     for func, rstrip in functions:
         if func.__doc__:
+            docobj = func # this might be a proxy to provide formatted doc
+            func = getattr(func, '_origfunc', func)
             funcmod = inspect.getmodule(func)
             extra = ''
             if funcmod.__package__ == funcmod.__name__:
@@ -128,8 +130,8 @@  def docstrings(path):
             src = inspect.getsource(func)
             name = "%s.%s" % (actualpath, func.__name__)
             lineno = inspect.getsourcelines(func)[1]
-            doc = func.__doc__
-            origdoc = getattr(func, '_origdoc', '')
+            doc = docobj.__doc__
+            origdoc = getattr(docobj, '_origdoc', '')
             if rstrip:
                 doc = doc.rstrip()
                 origdoc = origdoc.rstrip()
diff --git a/mercurial/util.py b/mercurial/util.py
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -3752,6 +3752,8 @@  def bundlecompressiontopics():
 
         value = docobject()
         value.__doc__ = doc
+        value._origdoc = engine.bundletype.__doc__
+        value._origfunc = engine.bundletype
 
         items[bt[0]] = value