xfs_scrub_all: localize the strings in the program
authorDarrick J. Wong <djwong@kernel.org>
Tue, 1 Apr 2025 14:44:44 +0000 (07:44 -0700)
committerAndrey Albershteyn <aalbersh@kernel.org>
Tue, 8 Apr 2025 09:20:10 +0000 (11:20 +0200)
Use gettext to localize the output of this program.  While we're at it,
convert everything to f-strings to make it easier for translators to
understand the string.  f-strings introduce a runtime requirement of
Python 3.6, which includes Debian 10 and RHEL 7.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Andrey Albershteyn <aalbersh@kernel.org>
Reviewed-by: Bill O'Donnell <bodonnel@redhat.com>
scrub/Makefile
scrub/xfs_scrub_all.py.in

index b8105f69e4cc57f4ee36a6a6f53b8f53f0d1ece5..3636a47942e98e45e91266a6b6c99c465c90f342 100644 (file)
@@ -116,7 +116,7 @@ xfs_scrub_all.timer: xfs_scrub_all.timer.in $(builddefs)
        @echo "    [SED]    $@"
        $(Q)$(SED) -e "s|@pkg_state_dir@|$(PKG_STATE_DIR)|g" < $< > $@
 
-$(XFS_SCRUB_ALL_PROG): $(XFS_SCRUB_ALL_PROG).in $(builddefs)
+$(XFS_SCRUB_ALL_PROG): $(XFS_SCRUB_ALL_PROG).in $(builddefs) $(TOPDIR)/libfrog/gettext.py
        @echo "    [SED]    $@"
        $(Q)$(SED) -e "s|@sbindir@|$(PKG_SBIN_DIR)|g" \
                   -e "s|@scrub_svcname@|$(scrub_svcname)|g" \
@@ -124,7 +124,10 @@ $(XFS_SCRUB_ALL_PROG): $(XFS_SCRUB_ALL_PROG).in $(builddefs)
                   -e "s|@pkg_version@|$(PKG_VERSION)|g" \
                   -e "s|@stampfile@|$(XFS_SCRUB_ALL_AUTO_MEDIA_SCAN_STAMP)|g" \
                   -e "s|@scrub_service_args@|$(XFS_SCRUB_SERVICE_ARGS)|g" \
-                  -e "s|@scrub_args@|$(XFS_SCRUB_ARGS)|g" < $< > $@
+                  -e "s|@scrub_args@|$(XFS_SCRUB_ARGS)|g" \
+                  -e '/@INIT_GETTEXT@/r $(TOPDIR)/libfrog/gettext.py' \
+                  -e '/@INIT_GETTEXT@/d' \
+                  < $< > $@
        $(Q)chmod a+x $@
 
 xfs_scrub_fail: xfs_scrub_fail.in $(builddefs)
index fe4bca4b2edb11a89937a47280a9e64e5a6494b3..515cc144414de652d997a2a69ddaa38ed613130d 100644 (file)
@@ -7,6 +7,7 @@
 
 # Run online scrubbers in parallel, but avoid thrashing.
 
+@INIT_GETTEXT@
 import subprocess
 import json
 import threading
@@ -115,7 +116,7 @@ class scrub_subprocess(scrub_control):
                global debug
 
                if debug:
-                       print('run ', ' '.join(self.cmdline))
+                       print(_('run '), ' '.join(self.cmdline))
 
                try:
                        self.proc = subprocess.Popen(self.cmdline)
@@ -132,7 +133,7 @@ class scrub_subprocess(scrub_control):
                global debug
 
                if debug:
-                       print('kill ', ' '.join(self.cmdline))
+                       print(_('kill '), ' '.join(self.cmdline))
                if self.proc is not None:
                        self.proc.terminate()
 
@@ -270,7 +271,8 @@ class scrub_service(scrub_control):
                for i in range(0, int(wait_for / interval)):
                        s = self.state()
                        if debug:
-                               print('waiting for activation %s %s' % (self.unitname, s))
+                               msg = _("waiting for activation")
+                               print(f'{msg} {self.unitname} {s}')
                        if s == 'failed':
                                return 1
                        if s != 'inactive':
@@ -284,7 +286,8 @@ class scrub_service(scrub_control):
 
                s = self.state()
                if debug:
-                       print('waited for startup %s %s' % (self.unitname, s))
+                       msg = _('waited for startup')
+                       print(f'{msg} {self.unitname} {s}')
                if s == 'failed':
                        return 1
                if s != 'inactive':
@@ -307,11 +310,13 @@ class scrub_service(scrub_control):
                s = self.state()
                while s not in ['failed', 'inactive']:
                        if debug:
-                               print('waiting %s %s' % (self.unitname, s))
+                               msg = _("waiting for")
+                               print(f'{msg} {self.unitname} {s}')
                        time.sleep(interval)
                        s = self.state()
                if debug:
-                       print('waited %s %s' % (self.unitname, s))
+                       msg = _('waited for')
+                       print(f'{msg} {self.unitname} {s}')
                if s == 'failed':
                        return 1
                return 0
@@ -323,7 +328,8 @@ class scrub_service(scrub_control):
                global debug
 
                if debug:
-                       print('starting %s' % self.unitname)
+                       msg = _("starting")
+                       print(f'{msg} {self.unitname}')
 
                try:
                        last_active = self.last_activation()
@@ -348,7 +354,8 @@ class scrub_service(scrub_control):
                global debug
 
                if debug:
-                       print('stopping %s' % self.unitname)
+                       msg = _('stopping')
+                       print(f'{msg} {self.unitname}')
 
                try:
                        self.__dbusrun(lambda: self.unit.Stop('replace'))
@@ -387,11 +394,13 @@ def run_scrub(mnt, cond, running_devs, mntdevs, killfuncs):
                if 'SERVICE_MODE' in os.environ:
                        ret = run_service(mnt, scrub_media, killfuncs)
                        if ret == 32:
-                               print("Scrubbing %s disabled by administrator, (err=%d)" % (mnt, ret))
+                               msg = _("Scrubbing disabled by administrator")
+                               print(f"{mnt}: {msg}, (err={ret})")
                                sys.stdout.flush()
                                return
                        if ret == 0 or ret == 1:
-                               print("Scrubbing %s done, (err=%d)" % (mnt, ret))
+                               msg = _("Scrubbing done")
+                               print(f"{mnt}: {msg}, (err={ret})")
                                sys.stdout.flush()
                                retcode |= ret
                                return
@@ -404,7 +413,8 @@ def run_scrub(mnt, cond, running_devs, mntdevs, killfuncs):
                # systemd services are unavailable.
                ret = run_subprocess(mnt, scrub_media, killfuncs)
                if ret >= 0:
-                       print("Scrubbing %s done, (err=%d)" % (mnt, ret))
+                       msg = _("Scrubbing done")
+                       print(f"{mnt}: {msg}, (err={ret})")
                        sys.stdout.flush()
                        retcode |= ret
                        return
@@ -412,7 +422,7 @@ def run_scrub(mnt, cond, running_devs, mntdevs, killfuncs):
                if terminate:
                        return
 
-               print("Unable to start scrub tool.")
+               print(_("Unable to start scrub tool."))
                sys.stdout.flush()
        finally:
                running_devs -= mntdevs
@@ -426,7 +436,7 @@ def signal_scrubs(signum, cond):
        global terminate
 
        if debug:
-               print('Signal handler called with signal', signum)
+               print(_('Signal handler called with signal'), signum)
                sys.stdout.flush()
 
        terminate = True
@@ -441,7 +451,7 @@ def wait_for_termination(cond, killfuncs):
        global terminate
 
        if debug:
-               print('waiting for threads to terminate')
+               print(_('waiting for threads to terminate'))
                sys.stdout.flush()
 
        cond.acquire()
@@ -454,7 +464,7 @@ def wait_for_termination(cond, killfuncs):
        if not terminate:
                return False
 
-       print("Terminating...")
+       print(_("Terminating..."))
        sys.stdout.flush()
        while len(killfuncs) > 0:
                fn = killfuncs.pop()
@@ -496,8 +506,8 @@ def enable_automatic_media_scan(args):
        try:
                interval = scan_interval(args.auto_media_scan_interval)
        except Exception as e:
-               raise Exception('%s: Invalid media scan interval.' % \
-                               args.auto_media_scan_interval)
+               msg = _("Invalid media scan interval.")
+               raise Exception(f'{args.auto_media_scan_interval}: {msg}')
 
        p = Path(args.auto_media_scan_stamp)
        if already_enabled:
@@ -515,7 +525,7 @@ def enable_automatic_media_scan(args):
                with p.open('w') as f:
                        pass
                if not already_enabled:
-                       print('Automatically enabling file data scrub.')
+                       print(_('Automatically enabling file data scrub.'))
                        sys.stdout.flush()
 
        return res
@@ -532,21 +542,23 @@ def main():
        global debug
 
        parser = argparse.ArgumentParser( \
-                       description = "Scrub all mounted XFS filesystems.")
-       parser.add_argument("--debug", help = "Enabling debugging messages.", \
+                       description = _("Scrub all mounted XFS filesystems."))
+       parser.add_argument("--debug", help = _("Enabling debugging messages."), \
                        action = "store_true")
-       parser.add_argument("-V", help = "Report version and exit.", \
+       parser.add_argument("-V", help = _("Report version and exit."), \
                        action = "store_true")
-       parser.add_argument("-x", help = "Scrub file data after filesystem metadata.", \
+       parser.add_argument("-x", help = _("Scrub file data after filesystem metadata."), \
                        action = "store_true")
-       parser.add_argument("--auto-media-scan-interval", help = "Automatically scrub file data at this interval.", \
+       parser.add_argument("--auto-media-scan-interval", help = _("Automatically scrub file data at this interval."), \
                        default = None)
-       parser.add_argument("--auto-media-scan-stamp", help = "Stamp file for automatic file data scrub.", \
+       parser.add_argument("--auto-media-scan-stamp", help = _("Stamp file for automatic file data scrub."), \
                        default = '@stampfile@')
        args = parser.parse_args()
 
        if args.V:
-               print("xfs_scrub_all version @pkg_version@")
+               msg = _("xfs_scrub_all version")
+               pkgver = "@pkg_version@"
+               print(f"{msg} {pkgver}")
                sys.exit(0)
 
        if args.debug: