##// END OF EJS Templates
hg: Redirect Mercurial stdout/stderr to logging when running as WSGI...
hg: Redirect Mercurial stdout/stderr to logging when running as WSGI Any "console" output from Mercurial when Kallithea is running from WSGI should end up in Kallithea's logs. That seems like a nice general feature. This will however also solve another rare but more critical problem: Mercurial is writing to sys.stdout / sys.stderr, using several layers of wrapping. Since Mercurial 5.5 (with https://repo.mercurial-scm.org/hg/rev/8e04607023e5 ), all writes are given a memoryview. Apache httpd mod_wsgi is invoking the WSGI with a custom mod_wsgi.Log injected in sys.stdout / sys.stderr . This logger can however not handle memoryview - https://github.com/GrahamDumpleton/mod_wsgi/issues/863 .

File last commit:

r8784:419329d4 stable
r8795:fe050a93 stable
Show More
i18n
134 lines | 5.3 KiB | text/plain | TextLexer
Thomas De Schampheleire
scripts/i18n: introduce new i18n maintenance script...
r8182 #!/usr/bin/env python3
# -*- coding: utf-8 -*-
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
Thomas De Schampheleire
scripts/i18n: add command 'normalized-merge' for use with Mercurial's 'merge-tool' option...
r8185 import os
import shutil
Thomas De Schampheleire
scripts/i18n: add command 'normalized-diff'...
r8184 import sys
Thomas De Schampheleire
scripts/i18n: introduce new i18n maintenance script...
r8182 import click
import i18n_utils
Mads Kiilerich
scripts: update i18n dev script to modern hg...
r8784 from mercurial import util
Thomas De Schampheleire
scripts/i18n: introduce new i18n maintenance script...
r8182
"""
Tool for maintenance of .po and .pot files
Thomas De Schampheleire
scripts/i18n: add command 'normalize-po-files'...
r8183
Normally, the i18n-related files contain for each translatable string a
reference to all the source code locations where this string is found. This
meta data is useful for translators to assess how strings are used, but is not
relevant for normal development nor for running Kallithea. Such meta data, or
derived data like kallithea.pot, will inherently be outdated, and create
unnecessary churn and repository growth, making it harder to spot actual and
important changes.
Thomas De Schampheleire
scripts/i18n: introduce new i18n maintenance script...
r8182 """
@click.group()
@click.option('--debug/--no-debug', default=False)
def cli(debug):
if (debug):
i18n_utils.do_debug = True
pass
Thomas De Schampheleire
scripts/i18n: add command 'normalize-po-files'...
r8183 @cli.command()
@click.argument('po_files', nargs=-1)
Mads Kiilerich
scripts/i18n: introduce --merge-pot-file to control normalization...
r8186 @click.option('--merge-pot-file', default=None)
@click.option('--strip/--no-strip', default=False)
def normalize_po_files(po_files, merge_pot_file, strip):
Thomas De Schampheleire
scripts/i18n: add command 'normalize-po-files'...
r8183 """Normalize the specified .po and .pot files.
Mads Kiilerich
scripts/i18n: introduce --merge-pot-file to control normalization...
r8186 By default, only actual translations and essential headers will be
preserved, just as we want it in the main branches with minimal noise.
If a .pot file is specified, the po files will instead be updated by
running GNU msgmerge with this .pot file, thus updating source code
references and preserving comments and outdated translations.
Thomas De Schampheleire
scripts/i18n: add command 'normalize-po-files'...
r8183 """
for po_file in po_files:
Mads Kiilerich
scripts/i18n: introduce --merge-pot-file to control normalization...
r8186 i18n_utils._normalize_po_file(po_file, merge_pot_file=merge_pot_file, strip=strip)
Thomas De Schampheleire
scripts/i18n: add command 'normalize-po-files'...
r8183
Thomas De Schampheleire
scripts/i18n: add command 'normalized-diff'...
r8184 @cli.command()
Thomas De Schampheleire
scripts/i18n: add command 'normalized-merge' for use with Mercurial's 'merge-tool' option...
r8185 @click.argument('local')
@click.argument('base')
@click.argument('other')
@click.argument('output')
Mads Kiilerich
scripts/i18n: introduce --merge-pot-file to control normalization...
r8186 @click.option('--merge-pot-file', default=None)
@click.option('--strip/--no-strip', default=False)
def normalized_merge(local, base, other, output, merge_pot_file, strip):
Thomas De Schampheleire
scripts/i18n: add command 'normalized-merge' for use with Mercurial's 'merge-tool' option...
r8185 """Merge tool for use with 'hg merge/rebase/graft --tool'
Mads Kiilerich
scripts/i18n: introduce --merge-pot-file to control normalization...
r8186 i18n files are partially manually editored original source of content, and
partially automatically generated and updated. That create a lot of churn
and often cause a lot of merge conflicts.
To avoid that, this merge tool wrapper will normalize .po content before
running the merge tool.
By default, only actual translations and essential headers will be
preserved, just as we want it in the main branches with minimal noise.
If a .pot file is specified, the po files will instead be updated by
running GNU msgmerge with this .pot file, thus updating source code
references and preserving comments and outdated translations.
Thomas De Schampheleire
scripts/i18n: add command 'normalized-merge' for use with Mercurial's 'merge-tool' option...
r8185
Add the following to your user or repository-specific .hgrc file to use it:
[merge-tools]
i18n.executable = /path/to/scripts/i18n
i18n.args = normalized-merge $local $base $other $output
and then invoke merge/rebase/graft with the additional argument '--tool i18n'.
"""
Mads Kiilerich
isort: upgrade to 5.1.2...
r8347 from mercurial import context, simplemerge
Thomas De Schampheleire
scripts/i18n: add command 'normalized-merge' for use with Mercurial's 'merge-tool' option...
r8185
Mads Kiilerich
scripts/i18n: tweak messages
r8204 print('i18n normalized-merge: normalizing and merging %s' % output)
Thomas De Schampheleire
scripts/i18n: add command 'normalized-merge' for use with Mercurial's 'merge-tool' option...
r8185
Mads Kiilerich
scripts/i18n: introduce --merge-pot-file to control normalization...
r8186 i18n_utils._normalize_po_file(local, merge_pot_file=merge_pot_file, strip=strip)
i18n_utils._normalize_po_file(base, merge_pot_file=merge_pot_file, strip=strip)
i18n_utils._normalize_po_file(other, merge_pot_file=merge_pot_file, strip=strip)
Thomas De Schampheleire
scripts/i18n: add command 'normalized-merge' for use with Mercurial's 'merge-tool' option...
r8185
# simplemerge will write markers to 'local' if it fails, keep a copy without markers
localkeep = local + '.keep'
shutil.copyfile(local, localkeep)
Mads Kiilerich
scripts: update i18n dev script to modern hg...
r8784 merged_text, conflicts = simplemerge.simplemerge(
simplemerge.MergeInput(context.arbitraryfilectx(local.encode('utf-8'), b'local')),
simplemerge.MergeInput(context.arbitraryfilectx(base.encode('utf-8'), b'base')),
simplemerge.MergeInput(context.arbitraryfilectx(other.encode('utf-8'), b'other')),
Mads Kiilerich
scripts/i18n: let 'normalized-merge' leave 3-way conflict markers in output file...
r8188 mode='merge',
Thomas De Schampheleire
scripts/i18n: add command 'normalized-merge' for use with Mercurial's 'merge-tool' option...
r8185 )
Mads Kiilerich
scripts: update i18n dev script to modern hg...
r8784 util.writefile(output, merged_text) # either resolved or with conflict markers
if conflicts:
Mads Kiilerich
scripts/i18n: let 'normalized-merge' leave 3-way conflict markers in output file...
r8188 shutil.copyfile(localkeep, local)
Thomas De Schampheleire
scripts/i18n: add command 'normalized-merge' for use with Mercurial's 'merge-tool' option...
r8185 basekeep = base + '.keep'
otherkeep = other + '.keep'
shutil.copyfile(base, basekeep)
shutil.copyfile(other, otherkeep)
Mads Kiilerich
scripts/i18n: tweak messages
r8204 sys.stderr.write("Error: simple merge failed and %s is left with conflict markers. Resolve the conflicts, then use 'hg resolve -m'.\n" % output)
Thomas De Schampheleire
scripts/i18n: add command 'normalized-merge' for use with Mercurial's 'merge-tool' option...
r8185 sys.stderr.write('Resolve with e.g.: kdiff3 %s %s %s -o %s\n' % (basekeep, localkeep, otherkeep, output))
Mads Kiilerich
scripts: update i18n dev script to modern hg...
r8784 sys.exit(1)
Thomas De Schampheleire
scripts/i18n: add command 'normalized-merge' for use with Mercurial's 'merge-tool' option...
r8185
os.remove(localkeep)
@cli.command()
Thomas De Schampheleire
scripts/i18n: add command 'normalized-diff'...
r8184 @click.argument('file1')
@click.argument('file2')
Mads Kiilerich
scripts/i18n: introduce --merge-pot-file to control normalization...
r8186 @click.option('--merge-pot-file', default=None)
@click.option('--strip/--no-strip', default=False)
def normalized_diff(file1, file2, merge_pot_file, strip):
Thomas De Schampheleire
scripts/i18n: add command 'normalized-diff'...
r8184 """Compare two files while transparently normalizing them."""
Mads Kiilerich
scripts/i18n: introduce --merge-pot-file to control normalization...
r8186 sys.exit(i18n_utils._normalized_diff(file1, file2, merge_pot_file=merge_pot_file, strip=strip))
Thomas De Schampheleire
scripts/i18n: add command 'normalize-po-files'...
r8183
Thomas De Schampheleire
scripts/i18n: introduce new i18n maintenance script...
r8182 if __name__ == '__main__':
cli()