From bf53b5fc4f32ab3d9636eff66e6265aec51e854d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andr=C3=A9=20Apitzsch?= <git@apitzsch.eu>
Date: Tue, 20 Oct 2020 22:24:52 +0200
Subject: [PATCH] setup.py: Port to pathlib

---
 setup.py | 97 +++++++++++++++++++++++++++-----------------------------
 1 file changed, 47 insertions(+), 50 deletions(-)

diff --git a/setup.py b/setup.py
index d151d60165..1490ea9b0c 100644
--- a/setup.py
+++ b/setup.py
@@ -11,37 +11,36 @@
 from setuptools.command.build_py import build_py as _build
 from setuptools.command.install import install as _install
 from distutils import log
-from distutils.util import convert_path, newer
+from distutils.util import newer
+from pathlib import Path
 
-import subprocess
-
-pos = [x for x in os.listdir('po') if x[-3:] == ".po"]
-ALL_LINGUAS = sorted([os.path.split(x)[-1][:-3] for x in pos])
+pos = Path('po').glob('*.po')
+ALL_LINGUAS = sorted([x.stem for x in pos])
 MAN_FILES = ['gajim.1', 'gajim-history-manager.1', 'gajim-remote.1']
 META_FILES = [('data/org.gajim.Gajim.desktop', 'share/applications', '--desktop'),
               ('data/org.gajim.Gajim.appdata.xml', 'share/metainfo', '--xml')]
-cwd = os.path.dirname(os.path.realpath(__file__))
-build_dir = os.path.join(cwd, "build")
+cwd = Path(__file__).resolve().parent
+build_dir = cwd / 'build'
 
 
 def update_trans():
     '''
     Update translation files
     '''
-    template = os.path.join('po', 'gajim.pot')
-    files = [os.path.join(root, f) for root, d, files in os.walk('gajim') for f in files if os.path.isfile(
-        os.path.join(root, f)) and (f.endswith('.py') or f.endswith('.ui'))]
-    files.append(os.path.join("data", "org.gajim.Gajim.desktop.in"))
-    files.append(os.path.join("data", "org.gajim.Gajim.appdata.xml.in"))
+    template = Path('po') / 'gajim.pot'
+    files = list(Path('gajim').rglob('*.py'))
+    files.extend(Path('gajim').rglob('*.ui'))
+    files.append(Path('data') / 'org.gajim.Gajim.desktop.in')
+    files.append(Path('data') / 'org.gajim.Gajim.appdata.xml.in')
     cmd = 'xgettext -c# --from-code=utf-8 --keyword=Q_ -o %s %s' % (
-        template, " ".join(files))
+        template, ' '.join([str(f) for f in files]))
     if os.system(cmd) != 0:
-        msg = "ERROR: %s could not be created!\n" % template
+        msg = f'ERROR: {template} could not be created!\n'
         raise SystemExit(msg)
 
     for lang in ALL_LINGUAS:
-        po_file = os.path.join('po', lang + '.po')
-        cmd = 'msgmerge -U %s %s' % (po_file, template)
+        po_file = Path('po') / (lang + '.po')
+        cmd = f'msgmerge -U {po_file} {template}'
         if os.system(cmd) != 0:
             msg = 'ERROR: Updating language translation file failed.'
             ask = msg + '\n Continue updating y/n [n] '
@@ -56,16 +55,16 @@ def build_trans(build_cmd):
     Translate the language files into gajim.mo
     '''
     for lang in ALL_LINGUAS:
-        po_file = os.path.join('po', lang + '.po')
-        mo_file = os.path.join(build_dir, 'mo', lang, 'LC_MESSAGES', 'gajim.mo')
-        mo_dir = os.path.dirname(mo_file)
-        if not (os.path.isdir(mo_dir) or os.path.islink(mo_dir)):
-            os.makedirs(mo_dir)
+        po_file = Path('po') / (lang + '.po')
+        mo_file = build_dir / 'mo' / lang / 'LC_MESSAGES' / 'gajim.mo'
+        mo_dir = mo_file.parent
+        if not (mo_dir.is_dir() or mo_dir.is_symlink()):
+            mo_dir.mkdir(parents=True)
 
         if newer(po_file, mo_file):
-            cmd = 'msgfmt %s -o %s' % (po_file, mo_file)
+            cmd = f'msgfmt {po_file} -o {mo_file}'
             if os.system(cmd) != 0:
-                os.remove(mo_file)
+                mo_file.unlink()
                 msg = 'ERROR: Building language translation files failed.'
                 ask = msg + '\n Continue building y/n [n] '
                 reply = input(ask)
@@ -77,8 +76,8 @@ def build_trans(build_cmd):
 def install_trans(install_cmd):
     data_files = install_cmd.distribution.data_files
     for lang in ALL_LINGUAS:
-        mo_file = os.path.join(build_dir, 'mo', lang, 'LC_MESSAGES', 'gajim.mo')
-        target = 'share/locale/' + lang + '/LC_MESSAGES'
+        mo_file = str(build_dir / 'mo' / lang / 'LC_MESSAGES' / 'gajim.mo')
+        target = f'share/locale/{lang}/LC_MESSAGES'
         data_files.append((target, [mo_file]))
 
 
@@ -86,35 +85,34 @@ def build_man(build_cmd):
     '''
     Compress Gajim manual files
     '''
-    newdir = os.path.join(build_dir, 'man')
-    if not (os.path.isdir(newdir) or os.path.islink(newdir)):
-        os.makedirs(newdir)
+    newdir = build_dir / 'man'
+    if not (newdir.is_dir() or newdir.is_symlink()):
+        newdir.mkdir()
 
     for man in MAN_FILES:
-        filename = os.path.join('data', man)
-        man_file_gz = os.path.join(newdir, man + '.gz')
-        if os.path.exists(man_file_gz):
+        filename = Path('data') / man
+        man_file_gz = newdir / (man + '.gz')
+        if man_file_gz.exists():
             if newer(filename, man_file_gz):
-                os.remove(man_file_gz)
+                man_file_gz.unlink()
             else:
-                filename = False
+                continue
 
-        if filename:
-            import gzip
-            # Binary io, so open is OK
-            with open(filename, 'rb') as f_in,\
-                    gzip.open(man_file_gz, 'wb') as f_out:
-                f_out.writelines(f_in)
-                log.info('Compiling %s >> %s', filename, man_file_gz)
+        import gzip
+        # Binary io, so open is OK
+        with open(filename, 'rb') as f_in,\
+                gzip.open(man_file_gz, 'wb') as f_out:
+            f_out.writelines(f_in)
+            log.info('Compiling %s >> %s', filename, man_file_gz)
 
 
 def install_man(install_cmd):
     data_files = install_cmd.distribution.data_files
-    man_dir = os.path.join(build_dir, 'man')
+    man_dir = build_dir / 'man'
     target = 'share/man/man1'
 
     for man in MAN_FILES:
-        man_file_gz = os.path.join(man_dir, man + '.gz')
+        man_file_gz = str(man_dir / (man + '.gz'))
         data_files.append((target, [man_file_gz]))
 
 
@@ -125,26 +123,25 @@ def build_intl(build_cmd):
     base = build_dir
 
     for filename, _, option in META_FILES:
-        filenamelocal = convert_path(filename)
-        newfile = os.path.join(base, filenamelocal)
-        newdir = os.path.dirname(newfile)
-        if not(os.path.isdir(newdir) or os.path.islink(newdir)):
-            os.makedirs(newdir)
-        merge(filenamelocal + '.in', newfile, option)
+        newfile = base / filename
+        newdir = newfile.parent
+        if not(newdir.is_dir() or newdir.is_symlink()):
+            newdir.mkdir()
+        merge(Path(filename + '.in'), newfile, option)
 
 
 def install_intl(install_cmd):
     data_files = install_cmd.distribution.data_files
 
     for filename, target, _ in META_FILES:
-        data_files.append((target, [build_dir + '/' + filename]))
+        data_files.append((target, [str(build_dir / filename)]))
 
 
 def merge(in_file, out_file, option, po_dir='po'):
     '''
     Run the msgfmt command.
     '''
-    if os.path.exists(in_file):
+    if in_file.exists():
         cmd = (('msgfmt %(opt)s -d %(po_dir)s --template %(in_file)s '
                 '-o %(out_file)s') %
                {'opt': option,
-- 
GitLab