2020-05-01 16:57:17 +02:00
|
|
|
#!/usr/bin/python3
|
|
|
|
##
|
|
|
|
## Script to parse texlive.tlpdb and get list of files in a package
|
|
|
|
##
|
|
|
|
## Copyright (C) 2019-2020 Henrik Grimler
|
|
|
|
##
|
|
|
|
## This program is free software: you can redistribute it and/or modify
|
|
|
|
## it under the terms of the GNU General Public License as published by
|
|
|
|
## the Free Software Foundation, either version 3 of the License, or
|
|
|
|
## (at your option) any later version.
|
|
|
|
##
|
|
|
|
## This program is distributed in the hope that it will be useful,
|
|
|
|
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
## GNU General Public License for more details.
|
|
|
|
##
|
|
|
|
## You should have received a copy of the GNU General Public License
|
|
|
|
## along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
def parse_tlpdb_to_dict(tlpdb_path):
|
2020-05-01 23:27:41 +02:00
|
|
|
"""Reads given tlpdb database and creates dict with packages, their dependencies and files
|
2020-05-01 16:57:17 +02:00
|
|
|
"""
|
|
|
|
|
|
|
|
with open(tlpdb_path, "r") as f:
|
|
|
|
packages = f.read().split("\n\n")
|
|
|
|
|
|
|
|
pkg_dict = {}
|
|
|
|
for pkg in packages:
|
|
|
|
if not pkg == "":
|
|
|
|
pkg_lines = pkg.split("\n")
|
|
|
|
pkg_name = pkg_lines[0].split(" ")[1]
|
2020-05-01 23:27:41 +02:00
|
|
|
# We only care about files and depends
|
2020-05-01 16:57:17 +02:00
|
|
|
pkg_dict[pkg_name] = {"depends" : [], "files" : []}
|
2020-05-01 23:27:41 +02:00
|
|
|
i = 0
|
|
|
|
while i < len(pkg_lines):
|
|
|
|
if pkg_lines[i].split(" ")[0].startswith("runfiles"):
|
|
|
|
# Start of file list
|
|
|
|
i += 1
|
|
|
|
while i < len(pkg_lines) and pkg_lines[i].startswith(" "):
|
|
|
|
# files starts with space, for example
|
|
|
|
# " texmf-dist/tex/latex/collref/collref.sty"
|
|
|
|
pkg_dict[pkg_name]["files"].append(pkg_lines[i].split(" ")[1])
|
|
|
|
i += 1
|
|
|
|
|
|
|
|
if i == len(pkg_lines):
|
|
|
|
break
|
|
|
|
|
|
|
|
if pkg_lines[i].split(" ")[0] == "depend":
|
|
|
|
pkg_dict[pkg_name]["depends"].append(pkg_lines[i].split(" ")[1])
|
|
|
|
|
|
|
|
i += 1
|
|
|
|
|
2020-05-01 16:57:17 +02:00
|
|
|
return pkg_dict
|
|
|
|
|
|
|
|
def get_files_in_package(package, files_in_package, visited_pkgs, visit_collections=False):
|
|
|
|
"""Prints files in package and then run itself on each dependency. Doesn't visit collections unless argument visit_collections=True is passed.
|
|
|
|
"""
|
|
|
|
for f in pkg_dict[package]["files"]:
|
|
|
|
files_in_package.append(f)
|
|
|
|
for dep in pkg_dict[package]["depends"]:
|
|
|
|
if dep.split(".")[-1] == "ARCH":
|
|
|
|
# skip arch dependent packages, which we lack since we build our own binaries
|
|
|
|
continue
|
|
|
|
|
|
|
|
if dep.split("-")[0] == "collection" or visit_collections:
|
|
|
|
# skip collections unless explicitly told to go through them
|
|
|
|
continue
|
|
|
|
|
|
|
|
if not dep in visited_pkgs:
|
|
|
|
# avoid duplicates
|
|
|
|
visited_pkgs.append(dep)
|
|
|
|
files_in_package, visited_pkgs = get_files_in_package(dep, files_in_package, visited_pkgs)
|
|
|
|
return files_in_package, visited_pkgs
|
|
|
|
|
2020-05-01 23:27:41 +02:00
|
|
|
def Files(packages, bool_visit_collections = False):
|
|
|
|
"""
|
|
|
|
Wrapper around function get_files. Does not visit collections unless bool_.
|
2020-05-01 16:57:17 +02:00
|
|
|
"""
|
|
|
|
files = []
|
2020-05-01 23:27:41 +02:00
|
|
|
for pkg in packages:
|
|
|
|
files += get_files_in_package(pkg, [], [],
|
|
|
|
visit_collections=bool_visit_collections)[0]
|
2020-05-01 16:57:17 +02:00
|
|
|
return files
|
|
|
|
|
|
|
|
def get_conflicting_pkgs(package):
|
|
|
|
"""Returns list of packages that contain some files that are also found in 'package'.
|
|
|
|
These packages should be listed as dependencies.
|
|
|
|
"""
|
2020-05-01 23:27:41 +02:00
|
|
|
if package in ["collection-basic"]:
|
|
|
|
conflicting_pkgs = []
|
|
|
|
|
|
|
|
elif package in ["collection-latex"]:
|
|
|
|
conflicting_pkgs = ["collection-basic"]
|
|
|
|
|
|
|
|
elif package in ["collection-langeuropean",
|
|
|
|
"collection-langenglish",
|
|
|
|
"collection-langfrench",
|
|
|
|
"collection-langgerman",
|
|
|
|
"collection-binextra",
|
|
|
|
"collection-fontutils",
|
|
|
|
"collection-langarabic",
|
|
|
|
"collection-langgreek",
|
|
|
|
"collection-langitalian",
|
|
|
|
"collection-langother",
|
|
|
|
"collection-langpolish",
|
|
|
|
"collection-langportuguese",
|
|
|
|
"collection-langspanish",
|
|
|
|
"collection-metapost",
|
|
|
|
"collection-fontsrecommended",
|
|
|
|
"collection-games",
|
|
|
|
"collection-luatex",
|
|
|
|
"collection-music",
|
|
|
|
"collection-plaingeneric",
|
|
|
|
"collection-publishers",
|
|
|
|
"collection-texworks",
|
|
|
|
"collection-wintools"]:
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex"]
|
|
|
|
|
|
|
|
elif package == "collection-langczechslovak":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-fontsextra",
|
|
|
|
"collection-luatex"]
|
|
|
|
|
|
|
|
elif package == "collection-langcyrillic":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-fontsextra",
|
|
|
|
"collection-fontsrecommended",
|
|
|
|
"collection-langgreek",
|
|
|
|
"collection-latexrecommended"]
|
|
|
|
|
|
|
|
elif package == "collection-formatsextra":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-langcyrillic",
|
|
|
|
"collection-mathscience",
|
|
|
|
"collection-fontsrecommended",
|
|
|
|
"collection-plaingeneric"]
|
|
|
|
|
|
|
|
elif package == "collection-context":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-mathscience",
|
|
|
|
"collection-fontsrecommended",
|
|
|
|
"collection-metapost",
|
|
|
|
"collection-xetex"]
|
|
|
|
|
|
|
|
elif package == "collection-langjapanese":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-langcjk",
|
|
|
|
"collection-langchinese"]
|
|
|
|
|
|
|
|
elif package == "collection-langchinese":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-langcjk",
|
|
|
|
"collection-fontutils"]
|
|
|
|
|
|
|
|
elif package == "collection-bibtexextra":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-binextra"]
|
|
|
|
|
|
|
|
elif package == "collection-langcjk":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-langother"]
|
|
|
|
|
|
|
|
elif package == "collection-latexrecommended":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-fontsrecommended",
|
|
|
|
"collection-latexextra",
|
|
|
|
"collection-pictures",
|
|
|
|
"collection-plaingeneric"]
|
|
|
|
|
|
|
|
elif package == "collection-mathscience":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-langgreek"]
|
|
|
|
|
|
|
|
elif package == "collection-langkorean":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-langjapanese",
|
|
|
|
"collection-langcjk",
|
|
|
|
"collection-latexrecommended"]
|
|
|
|
|
|
|
|
elif package == "collection-latexextra":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-fontsextra"]
|
|
|
|
|
|
|
|
elif package == "collection-humanities":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-latexextra"]
|
|
|
|
|
|
|
|
elif package == "collection-pictures":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-latexextra"]
|
|
|
|
|
|
|
|
elif package == "collection-fontsextra":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-plaingeneric",
|
|
|
|
"noto",
|
|
|
|
"alegreya",
|
|
|
|
"montserrat",
|
|
|
|
"fira",
|
|
|
|
"lato",
|
|
|
|
"mpfonts",
|
|
|
|
"libertine",
|
|
|
|
"drm",
|
|
|
|
"poltawski",
|
|
|
|
"cm-unicode",
|
|
|
|
"roboto",
|
|
|
|
"dejavu",
|
|
|
|
"plex",
|
|
|
|
"stickstoo",
|
|
|
|
"ebgaramond",
|
|
|
|
"ipaex-type1",
|
|
|
|
"paratype",
|
|
|
|
"antt",
|
|
|
|
"cormorantgaramond",
|
|
|
|
"libertinus-type1"]
|
|
|
|
|
|
|
|
elif package == "collection-pstricks":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex",
|
|
|
|
"collection-plaingeneric"]
|
|
|
|
|
|
|
|
elif package == "collection-xetex":
|
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex"]
|
|
|
|
|
|
|
|
elif not package.startswith("collection-"):
|
2020-05-02 19:20:20 +02:00
|
|
|
conflicting_pkgs = ["collection-basic",
|
|
|
|
"collection-latex"]
|
2020-05-01 16:57:17 +02:00
|
|
|
else:
|
|
|
|
raise ValueError(sys.argv[1]+" isn't a known package name")
|
|
|
|
|
|
|
|
return conflicting_pkgs
|
|
|
|
|
2020-05-01 23:27:41 +02:00
|
|
|
if __name__ == '__main__':
|
|
|
|
import sys
|
|
|
|
tlpdb = sys.argv[2]
|
|
|
|
pkg_dict = parse_tlpdb_to_dict(tlpdb)
|
|
|
|
|
|
|
|
if len(sys.argv) > 2 and sys.argv[-1] == "print_names":
|
|
|
|
"""Generate dependencies to put into TERMUX_SUBPKG_DEPENDS"""
|
|
|
|
# Strip latex and basic since those are part of termux package "texlive"
|
|
|
|
pkgs_in_texlive = ["latex", "basic"]
|
|
|
|
dependencies = ["texlive-"+pkg for pkg in get_conflicting_pkgs(sys.argv[1]) if not pkg in pkgs_in_texlive]
|
|
|
|
if len(dependencies) > 0:
|
|
|
|
print("texlive, "+", ".join(dependencies))
|
|
|
|
else:
|
|
|
|
print("texlive")
|
2020-05-01 16:57:17 +02:00
|
|
|
else:
|
2020-05-01 23:27:41 +02:00
|
|
|
"""Print files which should be included in the subpackage"""
|
|
|
|
# The last set of packages are needed to make our texlive package able to
|
|
|
|
# generate pdflatex.fmt and compile a simple LaTeX test file, so they
|
|
|
|
# should be part of texlive.
|
|
|
|
print("\n".join(["share/texlive/"+line for line in
|
|
|
|
list( set(Files([sys.argv[1]])) -
|
|
|
|
set(Files(get_conflicting_pkgs(sys.argv[1]))) -
|
|
|
|
set(Files(["dehyph-exptl",
|
|
|
|
"hyphen-afrikaans",
|
|
|
|
"kpathsea",
|
|
|
|
"amsfonts",
|
|
|
|
"texlive-scripts-extra",
|
|
|
|
"l3backend",
|
|
|
|
"latexconfig",
|
|
|
|
"tex-ini-files"])) )]))
|