calibre/setup/win-ci.py
Kovid Goyal 5c7dc9613b
Automated conversion of % format specifiers
Using ruff. Does not change any translatable strings.
There are still several thousand usages of % left that ruff wont
auto-convert. Get to them someday.
2025-01-27 10:58:48 +05:30

106 lines
2.7 KiB
Python

#!/usr/bin/env python
# License: GPLv3 Copyright: 2016, Kovid Goyal <kovid at kovidgoyal.net>
import io
import os
import subprocess
import sys
import tarfile
import time
def printf(*args, **kw):
print(*args, **kw)
sys.stdout.flush()
def download_file(url):
from urllib.request import urlopen
count = 5
while count > 0:
count -= 1
try:
printf('Downloading', url)
return urlopen(url).read()
except Exception:
if count <= 0:
raise
print('Download failed retrying...')
time.sleep(1)
def sw():
sw = os.environ['SW']
os.chdir(sw)
url = 'https://download.calibre-ebook.com/ci/calibre7/windows-64.tar.xz'
tarball = download_file(url)
with tarfile.open(fileobj=io.BytesIO(tarball)) as tf:
tf.extractall()
printf('Download complete')
def sanitize_path():
needed_paths = []
executables = 'git.exe curl.exe rapydscript.cmd node.exe'.split()
for p in os.environ['PATH'].split(os.pathsep):
for x in tuple(executables):
if os.path.exists(os.path.join(p, x)):
needed_paths.append(p)
executables.remove(x)
sw = os.environ['SW']
paths = rf'{sw}\private\python\bin {sw}\private\python\Lib\site-packages\pywin32_system32 {sw}\bin {sw}\qt\bin C:\Windows\System32'.split() + needed_paths
os.environ['PATH'] = os.pathsep.join(paths)
print('PATH:', os.environ['PATH'])
def python_exe():
return os.path.join(os.environ['SW'], 'private', 'python', 'python.exe')
def build():
sanitize_path()
cmd = [python_exe(), 'setup.py', 'bootstrap', '--ephemeral']
printf(*cmd)
p = subprocess.Popen(cmd)
raise SystemExit(p.wait())
def test():
sanitize_path()
for q in ('test', 'test_rs'):
cmd = [python_exe(), 'setup.py', q]
printf(*cmd)
p = subprocess.Popen(cmd)
if p.wait() != 0:
raise SystemExit(p.returncode)
def setup_env():
os.environ['SW'] = SW = r'C:\r\sw64\sw'
os.makedirs(SW, exist_ok=True)
os.environ['QMAKE'] = os.path.join(SW, r'qt\bin\qmake')
os.environ['CALIBRE_QT_PREFIX'] = os.path.join(SW, r'qt')
os.environ['CI'] = 'true'
os.environ['OPENSSL_MODULES'] = os.path.join(SW, 'lib', 'ossl-modules')
os.environ['PIPER_TTS_DIR'] = os.path.join(SW, 'piper')
def main():
q = sys.argv[-1]
setup_env()
if q == 'bootstrap':
build()
elif q == 'test':
test()
elif q == 'install':
sw()
else:
if len(sys.argv) == 1:
raise SystemExit('Usage: win-ci.py sw|build|test')
raise SystemExit(f'{sys.argv[-1]!r} is not a valid action')
if __name__ == '__main__':
main()