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