Add a new function to wait for arnied to be ready
[pyi2ncommon] / make_dist.py
1 #!/usr/bin/env python3
2
3 """
4 Create source tarball, create rpm from it together with spec file.
5
6 Create a source tarball that is compatbile with standard build pipelines. Then
7 run rpmbuild on it to create an installable rpm.
8
9 .. codeauthor:: Intra2net AG <info@intra2net.com>
10 """
11
12 import sys
13 from os.path import join, basename, dirname, expanduser
14 from re import compile as re_compile
15 import tarfile
16 from shutil import copy
17 from subprocess import run
18
19 # path to spec file
20 BASE_DIR = dirname(__file__)
21 SPEC_FILE = join(BASE_DIR, 'pyi2ncommon.spec')
22
23 # regular expressions extracting relevant information from spec file
24 VERSION_REGEX = re_compile(r'^Version:\s*(\S+)\s*$')
25 NAME_REGEX = re_compile(r'^Name:\s*(\S+)\s*$')
26 SOURCE_REGEX = re_compile(r'^Source0:\s*(\S+)\s*$')
27
28 # dir to contain tarball
29 DIST_DIR = join(BASE_DIR, 'dist')
30
31 # files and dirs to add to tarball; keep in sync with %files secion in spec
32 DATA = (
33     'COPYING.GPL', 'Linking-Exception.txt', 'README', 'CONTRIBUTING',
34     'setup.py', 'src', 'test', 'doc/about_docu.rst', 'doc/conf.py'
35 )
36
37 # dir where rpmbuild expects its tarballs
38 RPM_SOURCE_DIR = expanduser(join('~', 'rpmbuild', 'SOURCES'))
39
40
41 def get_spec_info():
42     """Extract name, version and source0 from spec file."""
43     name = None
44     version = None
45     source = None
46     with open(SPEC_FILE, 'rt') as reader:
47         for line in reader:
48             if name is not None and version is not None and source is not None:
49                 source = source.replace('%{name}', name)\
50                                .replace('%{version}', version)
51                 return name, version, source
52             match = NAME_REGEX.match(line)
53             if match:
54                 name = match.group(1)
55                 continue
56             match = VERSION_REGEX.match(line)
57             if match:
58                 version = match.group(1)
59                 continue
60             match = SOURCE_REGEX.match(line)
61             if match:
62                 source = match.group(1)
63                 continue
64
65
66 def tar_add_filter(tarinfo):
67     """
68     Filter function for adding files to tarball
69
70     Return `None` for pycache and pyc, meaning "do not add". Return input
71     otherwise to add the file.
72     """
73     if tarinfo.name.endswith('.pyc'):
74         print(f'Skip {tarinfo.name}')
75         return None
76     if '__pycache__' in tarinfo.name:
77         print(f'Skip {tarinfo.name}')
78         return None
79     print(f'Adding {tarinfo.name}')
80     return tarinfo
81
82
83 def create_tarball():
84     """Create tarball, return its full path."""
85     name, version, tarball_file = get_spec_info()
86     tarball_path = join(DIST_DIR, tarball_file)
87     print(f'Creating {tarball_path}')
88     dirname = f'{name}-{version}'
89     with tarfile.open(tarball_path, 'w:gz') as tarball:
90         for entry in DATA:
91             tarball.add(entry, join(dirname, entry), filter=tar_add_filter)
92     return tarball_path
93
94
95 def build_rpm(tarball_path):
96     """Create rpm using rpmbuild with spec file and newly created tarball."""
97     copy(tarball_path, RPM_SOURCE_DIR)
98     run(('rpmbuild', '-bb', SPEC_FILE))
99
100
101 def main():
102     """
103     Main function, called when running file as script.
104
105     See module doc for more info.
106     """
107     tarball_path = create_tarball()
108     build_rpm(tarball_path)
109     print(f'{basename(__file__)} finished successfully.')
110
111     return 0
112
113
114 if __name__ == '__main__':
115     sys.exit(main())
116