diff --git a/fdroidserver/deploy.py b/fdroidserver/deploy.py index 54496f78..7cc709d6 100644 --- a/fdroidserver/deploy.py +++ b/fdroidserver/deploy.py @@ -277,6 +277,12 @@ def update_serverwebroot(serverwebroot, repo_section): has a low resolution timestamp """ + try: + subprocess.run(['rsync', '--version'], capture_output=True, check=True) + except Exception as e: + raise FDroidException( + _('rsync is missing or broken: {error}').format(error=e) + ) from e rsyncargs = ['rsync', '--archive', '--delete-after', '--safe-links'] if not options.no_checksum: rsyncargs.append('--checksum') diff --git a/tests/deploy.TestCase b/tests/deploy.TestCase index d35200be..5539af4c 100755 --- a/tests/deploy.TestCase +++ b/tests/deploy.TestCase @@ -18,6 +18,7 @@ if localmodule not in sys.path: import fdroidserver.common import fdroidserver.deploy +from fdroidserver.exception import FDroidException from testcommon import TmpCwd, mkdtemp @@ -56,6 +57,13 @@ class DeployTest(unittest.TestCase): fdroidserver.deploy.update_serverwebroot(str(serverwebroot), 'repo') self.assertTrue(dest_apk.is_file()) + @mock.patch.dict(os.environ, clear=True) + def test_update_serverwebroot_no_rsync_error(self): + os.environ['PATH'] = self.testdir + os.chdir(self.testdir) + with self.assertRaises(FDroidException): + fdroidserver.deploy.update_serverwebroot('serverwebroot', 'repo') + def test_update_serverwebroot_make_cur_version_link(self): # setup parameters for this test run fdroidserver.deploy.options.no_checksum = True