Local packages do not have a version number. Fake it with 'HEAD' to indicate it's using whatever the working directory is pointing at. The Provides line will then look like: Provides: bundled(golang(../osbuild-images)) = HEAD which rpmbuild is happy to process into an rpm. This is ONLY for test builds on local systems and should never be seen in the wild.
63 lines
1.9 KiB
Python
Executable file
63 lines
1.9 KiB
Python
Executable file
#!/usr/bin/python3 -s
|
|
|
|
# Parse modules.txt files into rpm .spec file Provides for bundled dependencies.
|
|
# Written by Fabio "decathorpe" Valentini <decathorpe@fedoraproject.org> for
|
|
# the fedora syncthing package: https://src.fedoraproject.org/rpms/syncthing
|
|
# SPDX-License-Identifier: CC0-1.0 OR Unlicense
|
|
|
|
# Modified by @gotmax23 to be used as a dependency generator
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
# SPDX-FileCopyrightText: 2022 Maxwell G <gotmax@e.email>
|
|
#
|
|
# Minor modifications by Achilleas Koutsou <achilleas@koutsou.net> to be used in
|
|
# the rpm spec file generator for https://github.com/osbuild/osbuild-composer
|
|
|
|
import re
|
|
import sys
|
|
|
|
|
|
def process(path: str):
|
|
with open(path, encoding="utf-8") as file:
|
|
contents = file.read()
|
|
|
|
lines = contents.split("\n")
|
|
|
|
# dependencies = filter lines for "# package version"
|
|
dependencies = list(filter(lambda line: line.startswith("# "), lines))
|
|
|
|
# parse vendored dependencies into (import path, version) pairs
|
|
vendored = list()
|
|
# Handle => style replace directives
|
|
replace_regex = re.compile("^.+( v[0-9-\.]+)? => ")
|
|
for dep in dependencies:
|
|
fields = replace_regex.sub("", dep[2:]).split(" ")
|
|
if len(fields) == 2:
|
|
ipath, version = fields
|
|
elif len(fields) == 1:
|
|
ipath = fields[0]
|
|
version = "HEAD"
|
|
else:
|
|
raise RuntimeError(f"Failed to parse dependency: {dep}")
|
|
|
|
# check for git snapshots
|
|
if len(version) > 27:
|
|
# return only 7 digits of git commit hash
|
|
version = version[-12:-1][0:7]
|
|
else:
|
|
# strip off leading "v"
|
|
version = version.lstrip("v")
|
|
|
|
vendored.append((ipath, version))
|
|
|
|
for ipath, version in vendored:
|
|
print(f"Provides: bundled(golang({ipath})) = {version}")
|
|
|
|
|
|
def main() -> None:
|
|
files = sys.argv[1:]
|
|
for file in files:
|
|
process(file)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|