##// END OF EJS Templates
scripts/i18n: let 'normalized-merge' leave 3-way conflict markers in output file...
scripts/i18n: let 'normalized-merge' leave 3-way conflict markers in output file 3-way conflict markers in the output file can be convenient ... and they do no harm when merge tools like kdiff3 will overwrite output anyway.

File last commit:

r8188:f8314738 default
r8188:f8314738 default
Show More
i18n
140 lines | 5.4 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
"""
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'.
"""
from mercurial import (
context,
simplemerge,
ui as uimod,
)
print('i18n normalized-merge: merging file %s' % output)
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)
i18n_utils._normalize_po_file(output, 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)
ret = simplemerge.simplemerge(uimod.ui.load(),
context.arbitraryfilectx(local.encode('utf-8')),
context.arbitraryfilectx(base.encode('utf-8')),
Mads Kiilerich
scripts/i18n: let 'normalized-merge' leave 3-way conflict markers in output file...
r8188 context.arbitraryfilectx(other.encode('utf-8')),
label=[b'local', b'other', b'base'],
mode='merge',
Thomas De Schampheleire
scripts/i18n: add command 'normalized-merge' for use with Mercurial's 'merge-tool' option...
r8185 )
Mads Kiilerich
scripts/i18n: let 'normalized-merge' leave 3-way conflict markers in output file...
r8188 shutil.copyfile(local, output) # simplemerge wrote to local - either resolved or with conflict markers
Thomas De Schampheleire
scripts/i18n: add command 'normalized-merge' for use with Mercurial's 'merge-tool' option...
r8185 if ret:
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: let 'normalized-merge' leave 3-way conflict markers in output file...
r8188 sys.stderr.write("Error: simple merge failed and %s is left with conflict markers. Resolve the conflics , 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))
sys.exit(ret)
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()