/tools/pick-complete-translations.py

https://gitlab.com/AntoninCurtit/fdroid-website · Python · 107 lines · 85 code · 19 blank · 3 comment · 20 complexity · 7a6cb3f99a0da0bc2782cdd4686fa014 MD5 · raw file

  1. #!/usr/bin/python3
  2. #
  3. # cherry-pick complete translations from weblate
  4. import git
  5. import json
  6. import os
  7. import re
  8. import requests
  9. import yaml
  10. LOCALE_REGEX = re.compile(
  11. r'(?:_data/|po/_(?:docs|pages|posts)\.)(.*)(?:/(?:strings|tutorials)\.json|\.po)'
  12. )
  13. def get_paths_tuple(locale):
  14. return (
  15. '_data/%s/strings.json' % locale,
  16. '_data/%s/tutorials.json' % locale,
  17. 'po/_docs.%s.po' % locale,
  18. 'po/_pages.%s.po' % locale,
  19. 'po/_posts.%s.po' % locale,
  20. )
  21. projectbasedir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
  22. repo = git.Repo(projectbasedir)
  23. weblate = repo.remotes.weblate
  24. weblate.fetch()
  25. upstream = repo.remotes.upstream
  26. upstream.fetch()
  27. url = 'https://hosted.weblate.org/exports/stats/f-droid/website/?format=json'
  28. r = requests.get(url)
  29. r.raise_for_status()
  30. strings = r.json()
  31. url = 'https://hosted.weblate.org/exports/stats/f-droid/website-pages/?format=json'
  32. r = requests.get(url)
  33. r.raise_for_status()
  34. pages = r.json()
  35. with open(os.path.join(projectbasedir, '_config.yml')) as fp:
  36. site_languages = yaml.load(fp)['languages']
  37. strings_entries = dict()
  38. pages_entries = dict()
  39. merge_locales = []
  40. for entry in strings:
  41. strings_entries[entry['code']] = entry
  42. for entry in pages:
  43. pages_entries[entry['code']] = entry
  44. for locale in site_languages:
  45. s = strings_entries.get(locale)
  46. p = pages_entries.get(locale)
  47. if (
  48. s is not None
  49. and s['translated_percent'] == 100
  50. and s['failing'] == 0
  51. and p is not None
  52. and p['translated_percent'] > 98
  53. and p['failing'] == 0
  54. ):
  55. merge_locales.append(locale)
  56. if not merge_locales:
  57. exit()
  58. if 'merge_weblate' in repo.heads:
  59. merge_weblate = repo.heads['merge_weblate']
  60. repo.create_tag(
  61. 'previous_merge_weblate',
  62. ref=merge_weblate,
  63. message=('Automatically created by %s' % __file__),
  64. )
  65. else:
  66. merge_weblate = repo.create_head('merge_weblate')
  67. merge_weblate.set_commit(upstream.refs.master)
  68. merge_weblate.checkout()
  69. email_pattern = re.compile(r'by (.*?) <(.*)>$')
  70. for commit in reversed(
  71. list(
  72. repo.iter_commits(str(weblate.refs.master) + '...' + str(upstream.refs.master))
  73. )
  74. ):
  75. pick = False
  76. for f in commit.stats.files.keys():
  77. if f == '_data/zh_Hans/strings.json': # ignore edit war
  78. continue
  79. m = LOCALE_REGEX.match(f)
  80. if m and m.group(1) in merge_locales:
  81. pick = True
  82. break
  83. if pick:
  84. print('git cherry-pick', commit)
  85. repo.git.cherry_pick(str(commit))
  86. m = email_pattern.search(commit.summary)
  87. if m:
  88. email = m.group(1) + ' <' + m.group(2) + '>'